From 43554244c8f0f1f6bcc3152d11d5cc9375edf824 Mon Sep 17 00:00:00 2001 From: Cody Soyland Date: Tue, 26 Nov 2013 11:13:26 -0600 Subject: [PATCH] Add config and config tests. --- config/config.go | 42 +++++++++++++++++++++++++++++------------- config/config_test.go | 36 ++++++++++++++++++++++++++++++++++++ config/test.yaml | 3 +++ 3 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 config/config_test.go create mode 100644 config/test.yaml diff --git a/config/config.go b/config/config.go index 103d8e3d2..2d8f4264e 100644 --- a/config/config.go +++ b/config/config.go @@ -1,20 +1,48 @@ package config import ( - "flag" "log" "io/ioutil" "launchpad.net/goyaml" + "os" + "sync" ) var config map[string]interface{} +var lock sync.RWMutex +var loaded bool + +func ensureLoaded() { + if !loaded { + loadConfig() + } +} + +func loadConfig() { + config = make(map[string]interface{}) + config_file := os.Getenv("PILOSA_CONFIG") + if config_file == "" { + config_file = "pilosa.yaml" + } + data, err := ioutil.ReadFile(config_file) + if err != nil { + log.Fatal("Problem with config file. ", err) + } + goyaml.Unmarshal(data, &config) +} func GetSafe(key string) (interface{}, bool) { + lock.RLock() + ensureLoaded() + defer lock.RUnlock() value, ok := config[key] return value, ok } func Get(key string) interface{} { + lock.RLock() + ensureLoaded() + defer lock.RUnlock() return config[key] } @@ -39,15 +67,3 @@ func GetString(key string) string { } return "" } - -func init() { - log.Println("Start config") - config = make(map[string]interface{}) - config_file := flag.String("config", "pilosa.yaml", "Path to config file.") - flag.Parse() - data, err := ioutil.ReadFile(*config_file) - if err != nil { - log.Fatal("Problem with config file. ", err) - } - goyaml.Unmarshal(data, &config) -} diff --git a/config/config_test.go b/config/config_test.go new file mode 100644 index 000000000..12bb08d4e --- /dev/null +++ b/config/config_test.go @@ -0,0 +1,36 @@ +package config + +import ( + "testing" + "os" + . "github.com/smartystreets/goconvey/convey" +) + +func TestConfig(t *testing.T) { + err := os.Setenv("PILOSA_CONFIG", "test.yaml") + if err != nil { + t.Fatal("Error setting PILOSA_CONFIG") + } + Convey("config.Get()", t, func() { + So(Get("port_tcp").(int), ShouldEqual, 12000) + So(Get("port_http").(int), ShouldEqual, 15000) + So(Get("temp").(string), ShouldEqual, "/tmp") + So(Get("notfound"), ShouldEqual, nil) + }) + Convey("config.GetSafe()", t, func() { + val, ok := GetSafe("port_tcp") + So(ok, ShouldEqual, true) + So(val.(int), ShouldEqual, 12000) + val, ok = GetSafe("derp") + So(ok, ShouldEqual, false) + So(val, ShouldEqual, nil) + }) + Convey("config.GetInt()", t, func() { + So(GetInt("port_tcp"), ShouldEqual, 12000) + So(GetInt("port_http"), ShouldEqual, 15000) + So(GetInt("notfound"), ShouldEqual, 0) + }) + Convey("config.GetString()", t, func() { + So(GetString("temp"), ShouldEqual, "/tmp") + }) +} diff --git a/config/test.yaml b/config/test.yaml new file mode 100644 index 000000000..32bc32da8 --- /dev/null +++ b/config/test.yaml @@ -0,0 +1,3 @@ +port_tcp: 12000 +port_http: 15000 +temp: /tmp