func (s *PublishSuite) TestNoBranch(c *gc.C) { dir := c.MkDir() _, err := testing.RunCommandInDir(c, newPublishCommand(), []string{"cs:precise/wordpress"}, dir) // We need to do this here because \U is outputed on windows // and it's an invalid regex escape sequence c.Assert(err.Error(), gc.Equals, fmt.Sprintf("not a charm branch: %s", dir)) }
func (s *PublishSuite) TestFullPublish(c *gc.C) { addMeta(c, s.branch, "") digest, err := s.branch.RevisionId() c.Assert(err, jc.ErrorIsNil) pushBranch := bzr.New(c.MkDir()) err = pushBranch.Init() c.Assert(err, jc.ErrorIsNil) cmd := &publishCommand{} cmd.ChangePushLocation(func(location string) string { c.Assert(location, gc.Equals, "lp:~user/charms/precise/wordpress/trunk") return pushBranch.Location() }) cmd.SetPollDelay(testing.ShortWait) var body string // The local digest isn't found. body = `{"cs:~user/precise/wordpress": {"kind": "", "errors": ["entry not found"]}}` gitjujutesting.Server.Response(200, nil, []byte(body)) // But the charm exists with an arbitrary non-matching digest. body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": "other-digest"}}` gitjujutesting.Server.Response(200, nil, []byte(body)) // After the branch is pushed we fake the publishing delay. body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": "other-digest"}}` gitjujutesting.Server.Response(200, nil, []byte(body)) // And finally report success. body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": %q, "revision": 42}}` gitjujutesting.Server.Response(200, nil, []byte(fmt.Sprintf(body, digest))) ctx, err := testing.RunCommandInDir(c, modelcmd.Wrap(cmd), []string{"cs:~user/precise/wordpress"}, s.dir) c.Assert(err, jc.ErrorIsNil) c.Assert(testing.Stdout(ctx), gc.Equals, "cs:~user/precise/wordpress-42\n") // Ensure the branch was actually pushed. pushDigest, err := pushBranch.RevisionId() c.Assert(err, jc.ErrorIsNil) c.Assert(pushDigest, gc.Equals, digest) // And that all the requests were sent with the proper data. req := gitjujutesting.Server.WaitRequest() c.Assert(req.URL.Path, gc.Equals, "/charm-event") c.Assert(req.Form.Get("charms"), gc.Equals, "cs:~user/precise/wordpress@"+digest) for i := 0; i < 3; i++ { // The second request grabs tip to see the current state, and the // following requests are done after pushing to see when it changes. req = gitjujutesting.Server.WaitRequest() c.Assert(req.URL.Path, gc.Equals, "/charm-event") c.Assert(req.Form.Get("charms"), gc.Equals, "cs:~user/precise/wordpress") } }
func (s *PublishSuite) TestFullPublishRace(c *gc.C) { addMeta(c, s.branch, "") digest, err := s.branch.RevisionId() c.Assert(err, jc.ErrorIsNil) pushBranch := bzr.New(c.MkDir()) err = pushBranch.Init() c.Assert(err, jc.ErrorIsNil) cmd := &publishCommand{} cmd.ChangePushLocation(func(location string) string { c.Assert(location, gc.Equals, "lp:~user/charms/precise/wordpress/trunk") return pushBranch.Location() }) cmd.SetPollDelay(pollDelay) var body string // The local digest isn't found. body = `{"cs:~user/precise/wordpress": {"kind": "", "errors": ["entry not found"]}}` gitjujutesting.Server.Response(200, nil, []byte(body)) // And tip isn't found either, meaning the charm was never published. gitjujutesting.Server.Response(200, nil, []byte(body)) // After the branch is pushed we fake the publishing delay. gitjujutesting.Server.Response(200, nil, []byte(body)) // But, surprisingly, the digest changed to something else entirely. body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": "surprising-digest", "revision": 42}}` gitjujutesting.Server.Response(200, nil, []byte(body)) _, err = testing.RunCommandInDir(c, modelcmd.Wrap(cmd), []string{"cs:~user/precise/wordpress"}, s.dir) c.Assert(err, gc.ErrorMatches, `charm changed but not to local charm digest; publishing race\?`) // Ensure the branch was actually pushed. pushDigest, err := pushBranch.RevisionId() c.Assert(err, jc.ErrorIsNil) c.Assert(pushDigest, gc.Equals, digest) // And that all the requests were sent with the proper data. req := gitjujutesting.Server.WaitRequest() c.Assert(req.URL.Path, gc.Equals, "/charm-event") c.Assert(req.Form.Get("charms"), gc.Equals, "cs:~user/precise/wordpress@"+digest) for i := 0; i < 3; i++ { // The second request grabs tip to see the current state, and the // following requests are done after pushing to see when it changes. req = gitjujutesting.Server.WaitRequest() c.Assert(req.URL.Path, gc.Equals, "/charm-event") c.Assert(req.Form.Get("charms"), gc.Equals, "cs:~user/precise/wordpress") } }
func (s *PublishSuite) TestParseReference(c *gc.C) { addMeta(c, s.branch, "") cmd := &publishCommand{} cmd.ChangePushLocation(func(location string) string { c.Assert(location, gc.Equals, "lp:charms/precise/wordpress") c.SucceedNow() panic("unreachable") }) _, err := testing.RunCommandInDir(c, modelcmd.Wrap(cmd), []string{"precise/wordpress"}, s.dir) c.Assert(err, jc.ErrorIsNil) c.Fatal("shouldn't get here; location closure didn't run?") }
func (s *PublishSuite) runPublish(c *gc.C, args ...string) (*cmd.Context, error) { return testing.RunCommandInDir(c, newPublishCommand(), args, s.dir) }
func (s *PublishSuite) TestFrom(c *gc.C) { _, err := testing.RunCommandInDir(c, newPublishCommand(), []string{"--from", s.dir, "cs:precise/wordpress"}, c.MkDir()) c.Assert(err, gc.ErrorMatches, `cannot obtain local digest: branch has no content`) }
func (s *PublishSuite) TestNoBranch(c *gc.C) { dir := c.MkDir() _, err := testing.RunCommandInDir(c, envcmd.Wrap(&PublishCommand{}), []string{"cs:precise/wordpress"}, dir) c.Assert(err, gc.ErrorMatches, fmt.Sprintf("not a charm branch: %s", dir)) }