func (s *S) SetUpTest(c *C) { var ( err error msg *queue.Message ) for err == nil { if msg, err = queue.Get(1e6); err == nil { err = queue.Delete(msg) } } }
// TODO(fss): simplify this test. Right now, it's a little monster. func (s *S) TestCreateApp(c *C) { patchRandomReader() defer unpatchRandomReader() h := testHandler{} ts := s.t.StartGandalfTestServer(&h) defer ts.Close() a := App{ Name: "appname", Framework: "django", Units: []Unit{{Machine: 3}}, } expectedHost := "localhost" config.Set("host", expectedHost) err := CreateApp(&a, 3) c.Assert(err, IsNil) defer a.Destroy() c.Assert(a.State, Equals, "pending") var retrievedApp App err = db.Session.Apps().Find(bson.M{"name": a.Name}).One(&retrievedApp) c.Assert(err, IsNil) c.Assert(retrievedApp.Name, Equals, a.Name) c.Assert(retrievedApp.Framework, Equals, a.Framework) c.Assert(retrievedApp.State, Equals, a.State) env := a.InstanceEnv(s3InstanceName) c.Assert(env["TSURU_S3_ENDPOINT"].Value, Equals, s.t.S3Server.URL()) c.Assert(env["TSURU_S3_ENDPOINT"].Public, Equals, false) c.Assert(env["TSURU_S3_LOCATIONCONSTRAINT"].Value, Equals, "true") c.Assert(env["TSURU_S3_LOCATIONCONSTRAINT"].Public, Equals, false) e, ok := env["TSURU_S3_ACCESS_KEY_ID"] c.Assert(ok, Equals, true) c.Assert(e.Public, Equals, false) e, ok = env["TSURU_S3_SECRET_KEY"] c.Assert(ok, Equals, true) c.Assert(e.Public, Equals, false) c.Assert(env["TSURU_S3_BUCKET"].Value, HasLen, maxBucketSize) c.Assert(env["TSURU_S3_BUCKET"].Value, Equals, "appnamee3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3") c.Assert(env["TSURU_S3_BUCKET"].Public, Equals, false) env = a.InstanceEnv("") c.Assert(env["APPNAME"].Value, Equals, a.Name) c.Assert(env["APPNAME"].Public, Equals, false) c.Assert(env["TSURU_HOST"].Value, Equals, expectedHost) c.Assert(env["TSURU_HOST"].Public, Equals, false) expectedMessage := queue.Message{ Action: RegenerateApprc, Args: []string{a.Name}, } message, err := queue.Get(1e6) c.Assert(err, IsNil) defer queue.Delete(message) c.Assert(message.Action, Equals, expectedMessage.Action) c.Assert(message.Args, DeepEquals, expectedMessage.Args) c.Assert(s.provisioner.GetUnits(&a), HasLen, 3) }
func ensureAppIsStarted(msg *queue.Message) (app.App, error) { a := app.App{Name: msg.Args[0]} err := a.Get() if err != nil { return a, fmt.Errorf("Error handling %q: app %q does not exist.", msg.Action, a.Name) } units := getUnits(&a, msg.Args[1:]) if a.State != "started" || !units.Started() { format := "Error handling %q for the app %q:" switch a.State { case "error": format += " the app is in %q state." queue.Delete(msg) case "down": format += " the app is %s." queue.Delete(msg) default: format += ` The status of the app and all units should be "started" (the app is %q).` } return a, fmt.Errorf(format, msg.Action, a.Name, a.State) } return a, nil }
func (s *S) TestCreateBucketForward(c *C) { patchRandomReader() defer unpatchRandomReader() a := App{ Name: "appname", Framework: "django", Units: []Unit{{Machine: 3}}, } expectedHost := "localhost" config.Set("host", expectedHost) insert := new(insertApp) err := insert.forward(&a) c.Assert(err, IsNil) defer insert.backward(&a) bucket := new(createBucketIam) err = bucket.forward(&a) c.Assert(err, IsNil) defer bucket.backward(&a) err = a.Get() c.Assert(err, IsNil) env := a.InstanceEnv(s3InstanceName) c.Assert(env["TSURU_S3_ENDPOINT"].Value, Equals, s.t.S3Server.URL()) c.Assert(env["TSURU_S3_ENDPOINT"].Public, Equals, false) c.Assert(env["TSURU_S3_LOCATIONCONSTRAINT"].Value, Equals, "true") c.Assert(env["TSURU_S3_LOCATIONCONSTRAINT"].Public, Equals, false) e, ok := env["TSURU_S3_ACCESS_KEY_ID"] c.Assert(ok, Equals, true) c.Assert(e.Public, Equals, false) e, ok = env["TSURU_S3_SECRET_KEY"] c.Assert(ok, Equals, true) c.Assert(e.Public, Equals, false) c.Assert(env["TSURU_S3_BUCKET"].Value, HasLen, maxBucketSize) c.Assert(env["TSURU_S3_BUCKET"].Value, Equals, "appnamee3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3") c.Assert(env["TSURU_S3_BUCKET"].Public, Equals, false) env = a.InstanceEnv("") c.Assert(env["APPNAME"].Value, Equals, a.Name) c.Assert(env["APPNAME"].Public, Equals, false) c.Assert(env["TSURU_HOST"].Value, Equals, expectedHost) c.Assert(env["TSURU_HOST"].Public, Equals, false) expected := queue.Message{ Action: RegenerateApprc, Args: []string{a.Name}, } message, err := queue.Get(2e9) c.Assert(err, IsNil) defer queue.Delete(message) c.Assert(message.Action, Equals, expected.Action) c.Assert(message.Args, DeepEquals, expected.Args) }
func (s *S) TestAddUnits(c *C) { app := App{Name: "warpaint", Framework: "python"} err := db.Session.Apps().Insert(app) c.Assert(err, IsNil) defer db.Session.Apps().Remove(bson.M{"name": app.Name}) s.provisioner.Provision(&app) defer s.provisioner.Destroy(&app) err = app.AddUnits(5) c.Assert(err, IsNil) units := s.provisioner.GetUnits(&app) c.Assert(units, HasLen, 6) err = app.AddUnits(2) c.Assert(err, IsNil) units = s.provisioner.GetUnits(&app) c.Assert(units, HasLen, 8) for _, unit := range units { c.Assert(unit.AppName, Equals, app.Name) } err = app.Get() c.Assert(err, IsNil) c.Assert(app.Units, HasLen, 7) var expectedMessages MessageList names := make([]string, len(app.Units)) for i, unit := range app.Units { names[i] = unit.Name expected := fmt.Sprintf("%s/%d", app.Name, i+1) c.Assert(unit.Name, Equals, expected) messages := []queue.Message{ {Action: RegenerateApprc, Args: []string{app.Name, unit.Name}}, {Action: StartApp, Args: []string{app.Name, unit.Name}}, } expectedMessages = append(expectedMessages, messages...) } gotMessages := make(MessageList, expectedMessages.Len()) for i := range expectedMessages { message, err := queue.Get(1e6) c.Assert(err, IsNil) defer queue.Delete(message) gotMessages[i] = queue.Message{ Action: message.Action, Args: message.Args, } } sort.Sort(expectedMessages) sort.Sort(gotMessages) c.Assert(gotMessages, DeepEquals, expectedMessages) }
func (s *S) TestHandleMessageErrors(c *C) { var data = []struct { action string args []string unitName string expectedLog string }{ { action: "unknown-action", args: []string{"does not matter"}, expectedLog: `Error handling "unknown-action": invalid action.`, }, { action: app.StartApp, args: []string{"nemesis"}, expectedLog: `Error handling "start-app" for the app "nemesis":` + ` The status of the app and all units should be "started" (the app is "pending").`, }, { action: app.StartApp, args: []string{"totem", "totem/0", "totem/1"}, expectedLog: `Error handling "start-app" for the app "totem":` + ` The status of the app and all units should be "started" (the app is "started").`, }, { action: app.RegenerateApprc, args: []string{"nemesis"}, expectedLog: `Error handling "regenerate-apprc" for the app "nemesis":` + ` The status of the app and all units should be "started" (the app is "pending").`, }, { action: app.RegenerateApprc, args: []string{"totem", "totem/0", "totem/1"}, expectedLog: `Error handling "regenerate-apprc" for the app "totem":` + ` The status of the app and all units should be "started" (the app is "started").`, }, { action: app.RegenerateApprc, args: []string{"unknown-app"}, expectedLog: `Error handling "regenerate-apprc": app "unknown-app" does not exist.`, }, { action: app.RegenerateApprc, expectedLog: `Error handling "regenerate-apprc": this action requires at least 1 argument.`, }, { action: app.RegenerateApprc, args: []string{"marathon"}, expectedLog: `Error handling "regenerate-apprc" for the app "marathon":` + ` the app is in "error" state.`, }, { action: app.RegenerateApprc, args: []string{"territories"}, expectedLog: `Error handling "regenerate-apprc" for the app "territories":` + ` the app is down.`, }, } var buf bytes.Buffer a := app.App{Name: "nemesis", State: "pending"} err := db.Session.Apps().Insert(a) c.Assert(err, IsNil) defer db.Session.Apps().Remove(bson.M{"name": a.Name}) a = app.App{ Name: "totem", State: "started", Units: []app.Unit{ {Name: "totem/0", State: "pending"}, {Name: "totem/1", State: "started"}, }, } err = db.Session.Apps().Insert(a) c.Assert(err, IsNil) defer db.Session.Apps().Remove(bson.M{"name": a.Name}) a = app.App{Name: "marathon", State: "error"} err = db.Session.Apps().Insert(a) c.Assert(err, IsNil) defer db.Session.Apps().Remove(bson.M{"name": a.Name}) a = app.App{Name: "territories", State: "down"} err = db.Session.Apps().Insert(a) c.Assert(err, IsNil) defer db.Session.Apps().Remove(bson.M{"name": a.Name}) log.SetLogger(stdlog.New(&buf, "", 0)) for _, d := range data { message := queue.Message{Action: d.action} if len(d.args) > 0 { message.Args = d.args } handle(&message) defer queue.Delete(&message) // Sanity } content := buf.String() lines := strings.Split(content, "\n") for i, d := range data { var found bool for j := i; j < len(lines); j++ { if lines[j] == d.expectedLog { found = true break } } if !found { c.Errorf("\nWant: %q.\nGot:\n%s", d.expectedLog, content) } } }