// newApp creates a new application. function can only be called once func newApp() *app { a := new(app) var err error // make sure env var CS_DSN is set and points to the appropriate database if a.dbc, err = csdb.Connect(); err != nil { log.Fatal("MySQL Connect", "err", err) } if err := config.TableCollection.Init(a.dbc.NewSession()); err != nil { log.Fatal("config.TableCollection.Init", "err", err) } if err := store.TableCollection.Init(a.dbc.NewSession()); err != nil { log.Fatal("store.TableCollection.Init", "err", err) } a.config = config.NewService(config.WithDBStorage(a.dbc.DB)) // create JSON web token instance if a.jwtSrv, err = ctxjwt.NewService(); err != nil { log.Fatal("ctxjwt.NewService", "err", err) } a.jwtSrv.EnableJTI = true return a }
func TestPubSubBubbling(t *testing.T) { defer debugLogBuf.Reset() testPath := "a/b/c" s := config.NewService() _, err := s.Subscribe("", nil) assert.EqualError(t, err, config.ErrPathEmpty.Error()) subID, err := s.Subscribe(testPath, &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { assert.Equal(t, testPath, path) if sg == scope.DefaultID { assert.Equal(t, int64(0), id) } else { assert.Equal(t, int64(123), id) } return nil }, }) assert.NoError(t, err) assert.Equal(t, 1, subID, "The very first subscription ID should be 1") assert.NoError(t, s.Write(config.Value(1), config.Path(testPath), config.Scope(scope.WebsiteID, 123))) assert.NoError(t, s.Close()) // send on closed channel assert.NoError(t, s.Write(config.Value(1), config.Path(testPath+"Doh"), config.Scope(scope.WebsiteID, 3))) assert.EqualError(t, s.Close(), config.ErrPublisherClosed.Error()) }
// TestApplyCoreConfigData reads from the MySQL core_config_data table and applies // these value to the underlying storage. tries to get back the values from the // underlying storage func TestApplyCoreConfigData(t *testing.T) { defer debugLogBuf.Reset() defer infoLogBuf.Reset() dbc := csdb.MustConnectTest() defer func() { assert.NoError(t, dbc.Close()) }() sess := dbc.NewSession(nil) // nil tricks the NewSession ;-) s := config.NewService() defer func() { assert.NoError(t, s.Close()) }() loadedRows, writtenRows, err := s.ApplyCoreConfigData(sess) if err != nil { t.Fatal(err) } assert.True(t, loadedRows > 9, "loadedRows %d", loadedRows) assert.True(t, writtenRows > 9, "writtenRows %d", writtenRows) // println("\n", debugLogBuf.String(), "\n") // println("\n", infoLogBuf.String(), "\n") assert.NoError(t, s.Write(config.Path("web/secure/offloader_header"), config.ScopeDefault(), config.Value("SSL_OFFLOADED"))) h, err := s.String(config.Path("web/secure/offloader_header"), config.ScopeDefault()) assert.NoError(t, err) assert.Exactly(t, "SSL_OFFLOADED", h) assert.Len(t, s.Storage.AllKeys(), writtenRows) }
func TestScopeApplyDefaults(t *testing.T) { defer debugLogBuf.Reset() defer infoLogBuf.Reset() pkgCfg := element.MustNewConfiguration( &element.Section{ ID: "contact", Groups: element.NewGroupSlice( &element.Group{ ID: "contact", Fields: element.NewFieldSlice( &element.Field{ // Path: `contact/contact/enabled`, ID: "enabled", Default: true, }, ), }, &element.Group{ ID: "email", Fields: element.NewFieldSlice( &element.Field{ // Path: `contact/email/recipient_email`, ID: "recipient_email", Default: `[email protected]`, }, &element.Field{ // Path: `contact/email/sender_email_identity`, ID: "sender_email_identity", Default: 2.7182818284590452353602874713527, }, &element.Field{ // Path: `contact/email/email_template`, ID: "email_template", Default: 4711, }, ), }, ), }, ) s := config.NewService() s.ApplyDefaults(pkgCfg) cer, err := pkgCfg.FindFieldByPath("contact", "email", "recipient_email") if err != nil { t.Error(err) return } sval, err := s.String(config.Path("contact/email/recipient_email")) assert.NoError(t, err) assert.Exactly(t, cer.Default.(string), sval) assert.NoError(t, s.Close()) }
func TestPubSubPanicSimple(t *testing.T) { defer debugLogBuf.Reset() testPath := "x/y/z" s := config.NewService() subID, err := s.Subscribe(testPath, &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { panic("Don't panic!") }, }) assert.NoError(t, err) assert.Equal(t, 1, subID, "The very first subscription ID should be 1") assert.NoError(t, s.Write(config.Value(321), config.Path(testPath), config.ScopeStore(123))) assert.NoError(t, s.Close()) assert.Contains(t, debugLogBuf.String(), `config.pubSub.publish.recover.r recover: "Don't panic!"`) }
func TestPubSubEvict(t *testing.T) { defer debugLogBuf.Reset() levelCall := new(levelCalls) var pErr = errors.New("WTF Eviction? Panic!") s := config.NewService() subID, err := s.Subscribe("x/y", &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { assert.Contains(t, path, "x/y") // this function gets called 3 times levelCall.Lock() levelCall.level2Calls++ levelCall.Unlock() return nil }, }) assert.NoError(t, err) assert.Equal(t, 1, subID) subID, err = s.Subscribe("x/y/z", &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { levelCall.Lock() levelCall.level3Calls++ levelCall.Unlock() // this function gets called 1 times and then gets removed panic(pErr) }, }) assert.NoError(t, err) assert.Equal(t, 2, subID) assert.NoError(t, s.Write(config.Value(321), config.Path("x/y/z"), config.ScopeStore(123))) assert.NoError(t, s.Write(config.Value(321), config.Path("x/y/a"), config.ScopeStore(123))) assert.NoError(t, s.Write(config.Value(321), config.Path("x/y/z"), config.ScopeStore(123))) assert.NoError(t, s.Close()) assert.Contains(t, debugLogBuf.String(), "config.pubSub.publish.recover.err err: WTF Eviction? Panic!") levelCall.Lock() assert.Equal(t, 3, levelCall.level2Calls) assert.Equal(t, 1, levelCall.level3Calls) levelCall.Unlock() assert.EqualError(t, s.Close(), config.ErrPublisherClosed.Error()) }
func TestPubSubUnsubscribe(t *testing.T) { defer debugLogBuf.Reset() var pErr = errors.New("WTF? Panic!") s := config.NewService() subID, err := s.Subscribe("x/y/z", &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { panic(pErr) }, }) assert.NoError(t, err) assert.Equal(t, 1, subID, "The very first subscription ID should be 1") assert.NoError(t, s.Unsubscribe(subID)) assert.NoError(t, s.Write(config.Value(321), config.Path("x/y/z"), config.ScopeStore(123))) assert.NoError(t, s.Close()) assert.Contains(t, debugLogBuf.String(), `config.Service.Write path: "stores/123/x/y/z" val: 321`) }
func TestPubSubPanicMultiple(t *testing.T) { defer debugLogBuf.Reset() s := config.NewService() subID, err := s.Subscribe("x", &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { assert.Equal(t, "x/y/z", path) panic("One: Don't panic!") }, }) assert.NoError(t, err) assert.True(t, subID > 0) subID, err = s.Subscribe("x/y", &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { assert.Equal(t, "x/y/z", path) panic("Two: Don't panic!") }, }) assert.NoError(t, err) assert.True(t, subID > 0) subID, err = s.Subscribe("x/y/z", &testSubscriber{ f: func(path string, sg scope.Scope, id int64) error { assert.Equal(t, "x/y/z", path) panic("Three: Don't panic!") }, }) assert.NoError(t, err) assert.True(t, subID > 0) assert.NoError(t, s.Write(config.Value(789), config.Path("x/y/z"), config.ScopeStore(987))) assert.NoError(t, s.Close()) assert.Contains(t, debugLogBuf.String(), `config.pubSub.publish.recover.r recover: "One: Don't panic!`) assert.Contains(t, debugLogBuf.String(), `config.pubSub.publish.recover.r recover: "Two: Don't panic!"`) assert.Contains(t, debugLogBuf.String(), `config.pubSub.publish.recover.r recover: "Three: Don't panic!"`) }