cosmos-sdk/schema/indexer/start_test.go

221 lines
4.9 KiB
Go

package indexer
import (
"context"
"encoding/json"
"reflect"
"sync"
"testing"
"cosmossdk.io/schema/appdata"
)
func TestStart(t *testing.T) {
ctx, cancelFn := context.WithCancel(context.Background())
var test1CommitCalled, test2CommitCalled int
Register("test1", Initializer{
InitFunc: func(params InitParams) (InitResult, error) {
if params.Config.Config.(testConfig).SomeParam != "foobar" {
t.Fatalf("expected %q, got %q", "foobar", params.Config.Config.(testConfig).SomeParam)
}
return InitResult{
Listener: appdata.Listener{
Commit: func(data appdata.CommitData) (completionCallback func() error, err error) {
test1CommitCalled++
return nil, nil
},
},
}, nil
},
ConfigType: testConfig{},
})
Register("test2", Initializer{
InitFunc: func(params InitParams) (InitResult, error) {
if params.Config.Config.(testConfig2).Foo != "bar" {
t.Fatalf("expected %q, got %q", "bar", params.Config.Config.(testConfig2).Foo)
}
return InitResult{
Listener: appdata.Listener{
Commit: func(data appdata.CommitData) (completionCallback func() error, err error) {
test2CommitCalled++
return nil, nil
},
},
}, nil
},
ConfigType: testConfig2{},
})
var wg sync.WaitGroup
target, err := StartIndexing(IndexingOptions{
Config: IndexingConfig{Target: map[string]Config{
"t1": {Type: "test1", Config: testConfig{SomeParam: "foobar"}},
"t2": {Type: "test2", Config: testConfig2{Foo: "bar"}},
}},
Resolver: nil,
SyncSource: nil,
Logger: nil,
Context: ctx,
AddressCodec: nil,
DoneWaitGroup: &wg,
})
if err != nil {
t.Fatal(err)
}
const COMMIT_COUNT = 10
for i := 0; i < COMMIT_COUNT; i++ {
callCommit(t, target.Listener)
}
cancelFn()
wg.Wait()
if test1CommitCalled != COMMIT_COUNT {
t.Fatalf("expected %d, got %d", COMMIT_COUNT, test1CommitCalled)
}
if test2CommitCalled != COMMIT_COUNT {
t.Fatalf("expected %d, got %d", COMMIT_COUNT, test2CommitCalled)
}
}
func callCommit(t *testing.T, listener appdata.Listener) {
t.Helper()
cb, err := listener.Commit(appdata.CommitData{})
if err != nil {
t.Fatal(err)
}
if cb != nil {
err = cb()
if err != nil {
t.Fatal(err)
}
}
}
func TestUnmarshalIndexingConfig(t *testing.T) {
cfg := &IndexingConfig{Target: map[string]Config{"target": {Type: "type"}}}
jsonBz, err := json.Marshal(cfg)
if err != nil {
t.Fatal(err)
}
t.Run("json", func(t *testing.T) {
res, err := unmarshalIndexingConfig(json.RawMessage(jsonBz))
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(res, cfg) {
t.Fatalf("expected %v, got %v", cfg, res)
}
})
t.Run("map", func(t *testing.T) {
var m map[string]interface{}
err := json.Unmarshal(jsonBz, &m)
if err != nil {
t.Fatal(err)
}
res, err := unmarshalIndexingConfig(m)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(res, cfg) {
t.Fatalf("expected %v, got %v", cfg, res)
}
})
t.Run("ptr", func(t *testing.T) {
res, err := unmarshalIndexingConfig(cfg)
if err != nil {
t.Fatal(err)
}
if res != cfg {
t.Fatalf("expected %v, got %v", cfg, res)
}
})
t.Run("struct", func(t *testing.T) {
res, err := unmarshalIndexingConfig(*cfg)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(res, cfg) {
t.Fatalf("expected %v, got %v", cfg, res)
}
})
}
func TestUnmarshalIndexerConfig(t *testing.T) {
t.Run("struct", func(t *testing.T) {
cfg := testConfig{SomeParam: "foobar"}
cfg2, err := unmarshalIndexerCustomConfig(cfg, testConfig{})
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(cfg, cfg2) {
t.Fatalf("expected %v, got %v", cfg, cfg2)
}
})
t.Run("ptr", func(t *testing.T) {
cfg := &testConfig{SomeParam: "foobar"}
cfg2, err := unmarshalIndexerCustomConfig(cfg, &testConfig{})
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(cfg, cfg2) {
t.Fatalf("expected %v, got %v", cfg, cfg2)
}
})
t.Run("map -> struct", func(t *testing.T) {
cfg := testConfig{SomeParam: "foobar"}
jzonBz, err := json.Marshal(cfg)
if err != nil {
t.Fatal(err)
}
var m map[string]interface{}
err = json.Unmarshal(jzonBz, &m)
if err != nil {
t.Fatal(err)
}
cfg2, err := unmarshalIndexerCustomConfig(m, testConfig{})
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(cfg, cfg2) {
t.Fatalf("expected %v, got %v", cfg, cfg2)
}
})
t.Run("map -> ptr", func(t *testing.T) {
cfg := &testConfig{SomeParam: "foobar"}
jzonBz, err := json.Marshal(cfg)
if err != nil {
t.Fatal(err)
}
var m map[string]interface{}
err = json.Unmarshal(jzonBz, &m)
if err != nil {
t.Fatal(err)
}
cfg2, err := unmarshalIndexerCustomConfig(m, &testConfig{})
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(cfg, cfg2) {
t.Fatalf("expected %v, got %v", cfg, cfg2)
}
})
}
type testConfig struct {
SomeParam string `json:"some_param"`
}
type testConfig2 struct {
Foo string `json:"foo"`
}