diff --git a/config/config_test.go b/config/config_test.go index f066aa353..7bdacd8b7 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1,12 +1,171 @@ package config import ( + "errors" "reflect" "testing" + "github.com/go-kratos/kratos/v2/log" "github.com/stretchr/testify/assert" ) +const ( + _testJSON = ` +{ + "server":{ + "http":{ + "addr":"0.0.0.0", + "port":80, + "timeout":0.5, + "enable_ssl":true + }, + "grpc":{ + "addr":"0.0.0.0", + "port":10080, + "timeout":0.2 + } + }, + "data":{ + "database":{ + "driver":"mysql", + "source":"root:root@tcp(127.0.0.1:3306)/karta_id?parseTime=true" + } + }, + "endpoints":[ + "www.aaa.com", + "www.bbb.org" + ] +}` +) + +type testConfigStruct struct { + Server struct { + Http struct { + Addr string `json:"addr"` + Port int `json:"port"` + Timeout float64 `json:"timeout"` + EnableSSL bool `json:"enable_ssl"` + } `json:"http"` + GRpc struct { + Addr string `json:"addr"` + Port int `json:"port"` + Timeout float64 `json:"timeout"` + } `json:"grpc"` + } `json:"server"` + Data struct { + Database struct { + Driver string `json:"driver"` + Source string `json:"source"` + } `json:"database"` + } `json:"data"` + Endpoints []string `json:"endpoints"` +} + +type testJsonSource struct { + data string + sig chan struct{} + err chan struct{} +} + +func newTestJsonSource(data string) *testJsonSource { + return &testJsonSource{data: data, sig: make(chan struct{}), err: make(chan struct{})} +} + +func (p *testJsonSource) Load() ([]*KeyValue, error) { + kv := &KeyValue{ + Key: "json", + Value: []byte(p.data), + Format: "json", + } + return []*KeyValue{kv}, nil +} + +func (p *testJsonSource) Watch() (Watcher, error) { + return newTestWatcher(p.sig, p.err), nil +} + +type testWatcher struct { + sig chan struct{} + err chan struct{} + exit chan struct{} +} + +func newTestWatcher(sig, err chan struct{}) Watcher { + return &testWatcher{sig: sig, err: err, exit: make(chan struct{})} +} + +func (w *testWatcher) Next() ([]*KeyValue, error) { + select { + case <-w.sig: + return nil, nil + case <-w.err: + return nil, errors.New("error") + case <-w.exit: + return nil, nil + } +} + +func (w *testWatcher) Stop() error { + close(w.exit) + return nil +} + +func TestConfig(t *testing.T) { + var ( + err error + httpAddr = "0.0.0.0" + httpTimeout = 0.5 + grpcPort = 10080 + enableSSL = true + endpoint1 = "www.aaa.com" + databaseDriver = "mysql" + ) + + c := New( + WithSource(newTestJsonSource(_testJSON)), + WithDecoder(defaultDecoder), + WithResolver(defaultResolver), + WithLogger(log.DefaultLogger), + ) + err = c.Close() + assert.Nil(t, err) + + jSource := newTestJsonSource(_testJSON) + opts := options{ + sources: []Source{jSource}, + decoder: defaultDecoder, + resolver: defaultResolver, + logger: log.DefaultLogger, + } + cf := &config{} + cf.opts = opts + cf.reader = newReader(opts) + + err = cf.Load() + assert.Nil(t, err) + + val, err := cf.Value("data.database.driver").String() + assert.Nil(t, err) + assert.Equal(t, databaseDriver, val) + + err = cf.Watch("endpoints", func(key string, value Value) { + }) + assert.Nil(t, err) + + jSource.sig <- struct{}{} + jSource.err <- struct{}{} + + var testConf testConfigStruct + err = cf.Scan(&testConf) + assert.Nil(t, err) + assert.Equal(t, httpAddr, testConf.Server.Http.Addr) + assert.Equal(t, httpTimeout, testConf.Server.Http.Timeout) + assert.Equal(t, enableSSL, testConf.Server.Http.EnableSSL) + assert.Equal(t, grpcPort, testConf.Server.GRpc.Port) + assert.Equal(t, endpoint1, testConf.Endpoints[0]) + assert.Equal(t, 2, len(testConf.Endpoints)) +} + func TestDefaultResolver(t *testing.T) { var ( portString = "8080"