2019-05-30 23:11:13 +01:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2020-06-17 00:10:52 +08:00
|
|
|
"runtime"
|
2019-05-30 23:11:13 +01:00
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2020-06-17 00:10:52 +08:00
|
|
|
"github.com/micro/go-micro/v2/config/source"
|
2020-01-30 14:39:00 +03:00
|
|
|
"github.com/micro/go-micro/v2/config/source/env"
|
|
|
|
"github.com/micro/go-micro/v2/config/source/file"
|
2020-06-17 00:10:52 +08:00
|
|
|
"github.com/micro/go-micro/v2/config/source/memory"
|
2019-05-30 23:11:13 +01:00
|
|
|
)
|
|
|
|
|
2019-07-28 19:52:01 +01:00
|
|
|
func createFileForIssue18(t *testing.T, content string) *os.File {
|
|
|
|
data := []byte(content)
|
|
|
|
path := filepath.Join(os.TempDir(), fmt.Sprintf("file.%d", time.Now().UnixNano()))
|
|
|
|
fh, err := os.Create(path)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
_, err = fh.Write(data)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return fh
|
|
|
|
}
|
|
|
|
|
2019-05-30 23:11:13 +01:00
|
|
|
func createFileForTest(t *testing.T) *os.File {
|
|
|
|
data := []byte(`{"foo": "bar"}`)
|
|
|
|
path := filepath.Join(os.TempDir(), fmt.Sprintf("file.%d", time.Now().UnixNano()))
|
|
|
|
fh, err := os.Create(path)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
_, err = fh.Write(data)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return fh
|
|
|
|
}
|
|
|
|
|
2019-07-28 19:52:01 +01:00
|
|
|
func TestConfigLoadWithGoodFile(t *testing.T) {
|
2019-05-30 23:11:13 +01:00
|
|
|
fh := createFileForTest(t)
|
|
|
|
path := fh.Name()
|
|
|
|
defer func() {
|
|
|
|
fh.Close()
|
|
|
|
os.Remove(path)
|
|
|
|
}()
|
|
|
|
|
|
|
|
// Create new config
|
2020-01-19 16:31:02 +08:00
|
|
|
conf, err := NewConfig()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Expected no error but got %v", err)
|
|
|
|
}
|
2019-05-30 23:11:13 +01:00
|
|
|
// Load file source
|
|
|
|
if err := conf.Load(file.NewSource(
|
|
|
|
file.WithPath(path),
|
|
|
|
)); err != nil {
|
|
|
|
t.Fatalf("Expected no error but got %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-28 19:52:01 +01:00
|
|
|
func TestConfigLoadWithInvalidFile(t *testing.T) {
|
2019-05-30 23:11:13 +01:00
|
|
|
fh := createFileForTest(t)
|
|
|
|
path := fh.Name()
|
|
|
|
defer func() {
|
|
|
|
fh.Close()
|
|
|
|
os.Remove(path)
|
|
|
|
}()
|
|
|
|
|
|
|
|
// Create new config
|
2020-01-19 16:31:02 +08:00
|
|
|
conf, err := NewConfig()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Expected no error but got %v", err)
|
|
|
|
}
|
2019-05-30 23:11:13 +01:00
|
|
|
// Load file source
|
2020-01-19 16:31:02 +08:00
|
|
|
err = conf.Load(file.NewSource(
|
2019-05-30 23:11:13 +01:00
|
|
|
file.WithPath(path),
|
|
|
|
file.WithPath("/i/do/not/exists.json"),
|
|
|
|
))
|
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected error but none !")
|
|
|
|
}
|
|
|
|
if !strings.Contains(fmt.Sprintf("%v", err), "/i/do/not/exists.json") {
|
|
|
|
t.Fatalf("Expected error to contain the unexisting file but got %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-28 19:52:01 +01:00
|
|
|
func TestConfigMerge(t *testing.T) {
|
|
|
|
fh := createFileForIssue18(t, `{
|
|
|
|
"amqp": {
|
|
|
|
"host": "rabbit.platform",
|
|
|
|
"port": 80
|
|
|
|
},
|
|
|
|
"handler": {
|
|
|
|
"exchange": "springCloudBus"
|
|
|
|
}
|
|
|
|
}`)
|
|
|
|
path := fh.Name()
|
|
|
|
defer func() {
|
|
|
|
fh.Close()
|
|
|
|
os.Remove(path)
|
|
|
|
}()
|
|
|
|
os.Setenv("AMQP_HOST", "rabbit.testing.com")
|
2019-05-30 23:11:13 +01:00
|
|
|
|
2020-01-19 16:31:02 +08:00
|
|
|
conf, err := NewConfig()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Expected no error but got %v", err)
|
|
|
|
}
|
|
|
|
if err := conf.Load(
|
2019-07-28 19:52:01 +01:00
|
|
|
file.NewSource(
|
|
|
|
file.WithPath(path),
|
|
|
|
),
|
|
|
|
env.NewSource(),
|
2020-01-19 16:31:02 +08:00
|
|
|
); err != nil {
|
|
|
|
t.Fatalf("Expected no error but got %v", err)
|
|
|
|
}
|
2019-05-30 23:11:13 +01:00
|
|
|
|
2019-07-28 19:52:01 +01:00
|
|
|
actualHost := conf.Get("amqp", "host").String("backup")
|
|
|
|
if actualHost != "rabbit.testing.com" {
|
|
|
|
t.Fatalf("Expected %v but got %v",
|
|
|
|
"rabbit.testing.com",
|
|
|
|
actualHost)
|
2019-05-30 23:11:13 +01:00
|
|
|
}
|
|
|
|
}
|
2020-06-17 00:10:52 +08:00
|
|
|
|
|
|
|
func equalS(t *testing.T, actual, expect string) {
|
|
|
|
if actual != expect {
|
|
|
|
t.Errorf("Expected %s but got %s", actual, expect)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestConfigWatcherDirtyOverrite(t *testing.T) {
|
|
|
|
n := runtime.GOMAXPROCS(0)
|
|
|
|
defer runtime.GOMAXPROCS(n)
|
|
|
|
|
|
|
|
runtime.GOMAXPROCS(1)
|
|
|
|
|
|
|
|
l := 100
|
|
|
|
|
|
|
|
ss := make([]source.Source, l, l)
|
|
|
|
|
|
|
|
for i := 0; i < l; i++ {
|
|
|
|
ss[i] = memory.NewSource(memory.WithJSON([]byte(fmt.Sprintf(`{"key%d": "val%d"}`, i, i))))
|
|
|
|
}
|
|
|
|
|
|
|
|
conf, _ := NewConfig()
|
|
|
|
|
|
|
|
for _, s := range ss {
|
|
|
|
_ = conf.Load(s)
|
|
|
|
}
|
|
|
|
runtime.Gosched()
|
|
|
|
|
|
|
|
for i, _ := range ss {
|
|
|
|
k := fmt.Sprintf("key%d", i)
|
|
|
|
v := fmt.Sprintf("val%d", i)
|
|
|
|
equalS(t, conf.Get(k).String(""), v)
|
|
|
|
}
|
|
|
|
}
|