func (s *PublishSuite) TestFullPublish(c *C) { addMeta(c, s.branch, "") digest, err := s.branch.RevisionId() c.Assert(err, IsNil) pushBranch := bzr.New(c.MkDir()) err = pushBranch.Init() c.Assert(err, IsNil) cmd := &PublishCommand{} cmd.ChangePushLocation(func(location string) string { c.Assert(location, 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"]}}` testing.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"}}` testing.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"}}` testing.Server.Response(200, nil, []byte(body)) // And finally report success. body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": %q, "revision": 42}}` testing.Server.Response(200, nil, []byte(fmt.Sprintf(body, digest))) ctx, err := testing.RunCommandInDir(c, cmd, []string{"cs:~user/precise/wordpress"}, s.dir) c.Assert(err, IsNil) c.Assert(testing.Stdout(ctx), Equals, "cs:~user/precise/wordpress-42\n") // Ensure the branch was actually pushed. pushDigest, err := pushBranch.RevisionId() c.Assert(err, IsNil) c.Assert(pushDigest, Equals, digest) // And that all the requests were sent with the proper data. req := testing.Server.WaitRequest() c.Assert(req.URL.Path, Equals, "/charm-event") c.Assert(req.Form.Get("charms"), 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 = testing.Server.WaitRequest() c.Assert(req.URL.Path, Equals, "/charm-event") c.Assert(req.Form.Get("charms"), Equals, "cs:~user/precise/wordpress") } }
func (s *PublishSuite) TestFullPublishRace(c *C) { addMeta(c, s.branch, "") digest, err := s.branch.RevisionId() c.Assert(err, IsNil) pushBranch := bzr.New(c.MkDir()) err = pushBranch.Init() c.Assert(err, IsNil) cmd := &PublishCommand{} cmd.ChangePushLocation(func(location string) string { c.Assert(location, 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"]}}` testing.Server.Response(200, nil, []byte(body)) // And tip isn't found either, meaning the charm was never published. testing.Server.Response(200, nil, []byte(body)) // After the branch is pushed we fake the publishing delay. testing.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}}` testing.Server.Response(200, nil, []byte(body)) _, err = testing.RunCommandInDir(c, cmd, []string{"cs:~user/precise/wordpress"}, s.dir) c.Assert(err, ErrorMatches, `charm changed but not to local charm digest; publishing race\?`) // Ensure the branch was actually pushed. pushDigest, err := pushBranch.RevisionId() c.Assert(err, IsNil) c.Assert(pushDigest, Equals, digest) // And that all the requests were sent with the proper data. req := testing.Server.WaitRequest() c.Assert(req.URL.Path, Equals, "/charm-event") c.Assert(req.Form.Get("charms"), 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 = testing.Server.WaitRequest() c.Assert(req.URL.Path, Equals, "/charm-event") c.Assert(req.Form.Get("charms"), Equals, "cs:~user/precise/wordpress") } }
func (s *PublishSuite) TestInferURL(c *C) { addMeta(c, s.branch, "") cmd := &PublishCommand{} cmd.ChangePushLocation(func(location string) string { c.Assert(location, Equals, "lp:charms/precise/wordpress") c.SucceedNow() panic("unreachable") }) _, err := testing.RunCommandInDir(c, cmd, []string{"precise/wordpress"}, s.dir) c.Assert(err, IsNil) c.Fatal("shouldn't get here; location closure didn't run?") }
func (s *PublishSuite) TestNoBranch(c *C) { dir := c.MkDir() _, err := testing.RunCommandInDir(c, &PublishCommand{}, []string{"cs:precise/wordpress"}, dir) c.Assert(err, ErrorMatches, fmt.Sprintf("not a charm branch: %s", dir)) }
func (s *PublishSuite) runPublish(c *C, args ...string) (*cmd.Context, error) { return testing.RunCommandInDir(c, &PublishCommand{}, args, s.dir) }
func (s *PublishSuite) TestFrom(c *C) { _, err := testing.RunCommandInDir(c, &PublishCommand{}, []string{"--from", s.dir, "cs:precise/wordpress"}, c.MkDir()) c.Assert(err, ErrorMatches, `cannot obtain local digest: branch has no content`) }