func testEntityFine(c *gc.C, life apiagent.Life) { stub := &testing.Stub{} expectConn := &mockConn{stub: stub} apiOpen := func(info *api.Info, opts api.DialOpts) (api.Connection, error) { // no apiOpen stub calls necessary in this suite; covered // by RetrySuite, just an extra complication here. return expectConn, nil } // to make the point that this code should be entity-agnostic, // use an entity that doesn't correspond to an agent at all. entity := names.NewServiceTag("omg") connect := func() (api.Connection, error) { return apicaller.ScaryConnect(&mockAgent{ stub: stub, model: coretesting.ModelTag, entity: entity, }, apiOpen) } conn, err := lifeTest(c, stub, apiagent.Alive, connect) c.Check(conn, gc.Equals, expectConn) c.Check(err, jc.ErrorIsNil) stub.CheckCalls(c, []testing.StubCall{{ FuncName: "Life", Args: []interface{}{entity}, }, { FuncName: "SetPassword", Args: []interface{}{entity, "new"}, }}) }
func checkChangePassword(c *gc.C, errs ...error) (*testing.Stub, error) { // We prepend the unauth/success pair that triggers password // change, and consume them in apiOpen below... errUnauth := ¶ms.Error{Code: params.CodeUnauthorized} allErrs := append([]error{errUnauth, nil}, errs...) stub := &testing.Stub{} stub.SetErrors(allErrs...) expectConn := &mockConn{stub: stub} apiOpen := func(info *api.Info, opts api.DialOpts) (api.Connection, error) { // ...but we *don't* record the calls themselves; they // are tested plenty elsewhere, and hiding them makes // client code simpler. if err := stub.NextErr(); err != nil { return nil, err } return expectConn, nil } entity := names.NewServiceTag("omg") connect := func() (api.Connection, error) { return apicaller.ScaryConnect(&mockAgent{ stub: stub, model: coretesting.ModelTag, entity: entity, }, apiOpen) } conn, err := lifeTest(c, stub, apiagent.Alive, connect) c.Check(conn, gc.IsNil) return stub, err }
func (*ScaryConnectSuite) TestEntityDenied(c *gc.C) { // permanent failure case stub := &testing.Stub{} stub.SetErrors(apiagent.ErrDenied) expectConn := &mockConn{stub: stub} apiOpen := func(info *api.Info, opts api.DialOpts) (api.Connection, error) { return expectConn, nil } entity := names.NewServiceTag("omg") connect := func() (api.Connection, error) { return apicaller.ScaryConnect(&mockAgent{ stub: stub, model: coretesting.ModelTag, entity: entity, }, apiOpen) } conn, err := lifeTest(c, stub, apiagent.Dead, connect) c.Check(conn, gc.IsNil) c.Check(err, gc.Equals, apicaller.ErrConnectImpossible) stub.CheckCalls(c, []testing.StubCall{{ FuncName: "Life", Args: []interface{}{entity}, }, { FuncName: "Close", }}) }
func (*ScaryConnectSuite) TestEntityUnknownLife(c *gc.C) { // "random" failure case stub := &testing.Stub{} expectConn := &mockConn{stub: stub} apiOpen := func(info *api.Info, opts api.DialOpts) (api.Connection, error) { return expectConn, nil } entity := names.NewServiceTag("omg") connect := func() (api.Connection, error) { return apicaller.ScaryConnect(&mockAgent{ stub: stub, model: coretesting.ModelTag, entity: entity, }, apiOpen) } conn, err := lifeTest(c, stub, apiagent.Life("zombie"), connect) c.Check(conn, gc.IsNil) c.Check(err, gc.ErrorMatches, `unknown life value "zombie"`) stub.CheckCalls(c, []testing.StubCall{{ FuncName: "Life", Args: []interface{}{entity}, }, { FuncName: "Close", }}) }
func checkModelTagUpdate(c *gc.C, errs ...error) *testing.Stub { // success case; just a little failure we don't mind, otherwise // equivalent to testEntityFine. stub := &testing.Stub{} stub.SetErrors(errs...) // from ChangeConfig expectConn := &mockConn{stub: stub} apiOpen := func(info *api.Info, opts api.DialOpts) (api.Connection, error) { return expectConn, nil } entity := names.NewServiceTag("omg") connect := func() (api.Connection, error) { return apicaller.ScaryConnect(&mockAgent{ stub: stub, // no model set; triggers ChangeConfig entity: entity, }, apiOpen) } conn, err := lifeTest(c, stub, apiagent.Alive, connect) c.Check(conn, gc.Equals, expectConn) c.Check(err, jc.ErrorIsNil) return stub }