19
20
"github.com/juju/juju/state"
21
"github.com/juju/juju/state/storage"
20
22
"github.com/juju/juju/testcharms"
23
"github.com/juju/juju/testing/factory"
23
26
type CharmSuite struct {
28
32
var _ = gc.Suite(&CharmSuite{})
30
34
func (s *CharmSuite) SetUpTest(c *gc.C) {
31
35
s.ConnSuite.SetUpTest(c)
32
added := s.AddTestingCharm(c, "dummy")
36
func (s *CharmSuite) TestCharm(c *gc.C) {
36
s.charm = s.AddTestingCharm(c, "dummy")
37
s.curl = s.charm.URL()
40
func (s *CharmSuite) destroy(c *gc.C) {
41
err := s.charm.Destroy()
42
c.Assert(err, jc.ErrorIsNil)
45
func (s *CharmSuite) remove(c *gc.C) {
47
err := s.charm.Remove()
48
c.Assert(err, jc.ErrorIsNil)
51
func (s *CharmSuite) checkRemoved(c *gc.C) {
52
_, err := s.State.Charm(s.curl)
53
c.Check(err, gc.ErrorMatches, `charm ".*" not found`)
54
c.Check(err, jc.Satisfies, errors.IsNotFound)
57
func (s *CharmSuite) TestAliveCharm(c *gc.C) {
61
func (s *CharmSuite) TestDyingCharm(c *gc.C) {
66
func (s *CharmSuite) testCharm(c *gc.C) {
37
67
dummy, err := s.State.Charm(s.curl)
38
68
c.Assert(err, jc.ErrorIsNil)
39
69
c.Assert(dummy.URL().String(), gc.Equals, s.curl.String())
147
func (s *CharmSuite) TestDestroyStoreCharm(c *gc.C) {
148
info := s.dummyCharm(c, "cs:precise/dummy-2")
149
sch, err := s.State.AddCharm(info)
150
c.Assert(err, jc.ErrorIsNil)
152
c.Assert(err, gc.ErrorMatches, "cannot destroy non-local charms")
155
func (s *CharmSuite) TestRemoveDeletesStorage(c *gc.C) {
156
// We normally don't actually set up charm storage in state
157
// tests, but we need it here.
158
path := s.charm.StoragePath()
159
stor := storage.NewStorage(s.State.ModelUUID(), s.State.MongoSession())
160
err := stor.Put(path, strings.NewReader("abc"), 3)
161
c.Assert(err, jc.ErrorIsNil)
164
closer, _, err := stor.Get(path)
165
c.Assert(err, jc.ErrorIsNil)
169
_, _, err = stor.Get(path)
170
c.Assert(err, jc.Satisfies, errors.IsNotFound)
173
func (s *CharmSuite) TestReferenceDyingCharm(c *gc.C) {
177
args := state.AddApplicationArgs{
181
_, err := s.State.AddApplication(args)
182
c.Check(err, gc.ErrorMatches, `cannot add application "blah": charm: not found or not alive`)
185
func (s *CharmSuite) TestReferenceDyingCharmRace(c *gc.C) {
187
defer state.SetBeforeHooks(c, s.State, func() {
191
args := state.AddApplicationArgs{
195
_, err := s.State.AddApplication(args)
196
// bad message: see lp:1621754. should match
197
// TestReferenceDyingCharm above.
198
c.Check(err, gc.ErrorMatches, `cannot add application "blah": application already exists`)
201
func (s *CharmSuite) TestDestroyReferencedCharm(c *gc.C) {
202
s.Factory.MakeApplication(c, &factory.ApplicationParams{
206
err := s.charm.Destroy()
207
c.Check(err, gc.ErrorMatches, "charm in use")
210
func (s *CharmSuite) TestDestroyReferencedCharmRace(c *gc.C) {
212
defer state.SetBeforeHooks(c, s.State, func() {
213
s.Factory.MakeApplication(c, &factory.ApplicationParams{
218
err := s.charm.Destroy()
219
c.Check(err, gc.ErrorMatches, "charm in use")
222
func (s *CharmSuite) TestDestroyUnreferencedCharm(c *gc.C) {
223
app := s.Factory.MakeApplication(c, &factory.ApplicationParams{
227
c.Assert(err, jc.ErrorIsNil)
229
err = s.charm.Destroy()
230
c.Assert(err, jc.ErrorIsNil)
233
func (s *CharmSuite) TestDestroyUnitReferencedCharm(c *gc.C) {
234
app := s.Factory.MakeApplication(c, &factory.ApplicationParams{
237
unit := s.Factory.MakeUnit(c, &factory.UnitParams{
242
// set app charm to something different
243
info := s.dummyCharm(c, "cs:quantal/dummy-2")
244
newCh, err := s.State.AddCharm(info)
245
c.Assert(err, jc.ErrorIsNil)
246
err = app.SetCharm(state.SetCharmConfig{Charm: newCh})
247
c.Assert(err, jc.ErrorIsNil)
249
// unit should still reference original charm until updated
250
err = s.charm.Destroy()
251
c.Assert(err, gc.ErrorMatches, "charm in use")
252
err = unit.SetCharmURL(info.ID)
253
c.Assert(err, jc.ErrorIsNil)
254
err = s.charm.Destroy()
255
c.Assert(err, jc.ErrorIsNil)
258
func (s *CharmSuite) TestDestroyFinalUnitReference(c *gc.C) {
259
app := s.Factory.MakeApplication(c, &factory.ApplicationParams{
262
unit := s.Factory.MakeUnit(c, &factory.UnitParams{
268
c.Assert(err, jc.ErrorIsNil)
271
assertCleanupCount(c, s.State, 1)
100
275
func (s *CharmSuite) TestAddCharm(c *gc.C) {
101
276
// Check that adding charms from scratch works correctly.
102
277
info := s.dummyCharm(c, "")