github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/testing/factory/factory_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package factory_test
     5  
     6  import (
     7  	"fmt"
     8  	"regexp"
     9  	"time"
    10  
    11  	"github.com/juju/errors"
    12  	"github.com/juju/names"
    13  	jc "github.com/juju/testing/checkers"
    14  	"github.com/juju/utils"
    15  	gc "gopkg.in/check.v1"
    16  	"gopkg.in/juju/charm.v5"
    17  
    18  	"github.com/juju/juju/instance"
    19  	"github.com/juju/juju/state"
    20  	statetesting "github.com/juju/juju/state/testing"
    21  	"github.com/juju/juju/storage/provider"
    22  	"github.com/juju/juju/storage/provider/registry"
    23  	"github.com/juju/juju/testing"
    24  	"github.com/juju/juju/testing/factory"
    25  )
    26  
    27  type factorySuite struct {
    28  	statetesting.StateSuite
    29  	Factory *factory.Factory
    30  }
    31  
    32  var _ = gc.Suite(&factorySuite{})
    33  
    34  func (s *factorySuite) SetUpTest(c *gc.C) {
    35  	s.Policy = new(statetesting.MockPolicy)
    36  	s.StateSuite.SetUpTest(c)
    37  	s.Factory = factory.NewFactory(s.State)
    38  }
    39  
    40  func (s *factorySuite) TestMakeUserNil(c *gc.C) {
    41  	user := s.Factory.MakeUser(c, nil)
    42  	c.Assert(user.IsDisabled(), jc.IsFalse)
    43  
    44  	saved, err := s.State.User(user.UserTag())
    45  	c.Assert(err, jc.ErrorIsNil)
    46  	c.Assert(saved.Tag(), gc.Equals, user.Tag())
    47  	c.Assert(saved.Name(), gc.Equals, user.Name())
    48  	c.Assert(saved.DisplayName(), gc.Equals, user.DisplayName())
    49  	c.Assert(saved.CreatedBy(), gc.Equals, user.CreatedBy())
    50  	c.Assert(saved.DateCreated(), gc.Equals, user.DateCreated())
    51  	c.Assert(saved.LastLogin(), gc.Equals, user.LastLogin())
    52  	c.Assert(saved.IsDisabled(), gc.Equals, user.IsDisabled())
    53  }
    54  
    55  func (s *factorySuite) TestMakeUserParams(c *gc.C) {
    56  	username := "bob"
    57  	displayName := "Bob the Builder"
    58  	creator := s.Factory.MakeUser(c, nil)
    59  	password := "sekrit"
    60  	user := s.Factory.MakeUser(c, &factory.UserParams{
    61  		Name:        username,
    62  		DisplayName: displayName,
    63  		Creator:     creator.Tag(),
    64  		Password:    password,
    65  	})
    66  	c.Assert(user.IsDisabled(), jc.IsFalse)
    67  	c.Assert(user.Name(), gc.Equals, username)
    68  	c.Assert(user.DisplayName(), gc.Equals, displayName)
    69  	c.Assert(user.CreatedBy(), gc.Equals, creator.UserTag().Name())
    70  	c.Assert(user.PasswordValid(password), jc.IsTrue)
    71  
    72  	saved, err := s.State.User(user.UserTag())
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	c.Assert(saved.Tag(), gc.Equals, user.Tag())
    75  	c.Assert(saved.Name(), gc.Equals, user.Name())
    76  	c.Assert(saved.DisplayName(), gc.Equals, user.DisplayName())
    77  	c.Assert(saved.CreatedBy(), gc.Equals, user.CreatedBy())
    78  	c.Assert(saved.DateCreated(), gc.Equals, user.DateCreated())
    79  	c.Assert(saved.LastLogin(), gc.Equals, user.LastLogin())
    80  	c.Assert(saved.IsDisabled(), gc.Equals, user.IsDisabled())
    81  
    82  	_, err = s.State.EnvironmentUser(user.UserTag())
    83  	c.Assert(err, jc.ErrorIsNil)
    84  }
    85  
    86  func (s *factorySuite) TestMakeUserInvalidCreator(c *gc.C) {
    87  	invalidFunc := func() {
    88  		s.Factory.MakeUser(c, &factory.UserParams{
    89  			Name:        "bob",
    90  			DisplayName: "Bob",
    91  			Creator:     names.NewMachineTag("0"),
    92  			Password:    "bob",
    93  		})
    94  	}
    95  
    96  	c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`)
    97  	saved, err := s.State.User(names.NewUserTag("bob"))
    98  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    99  	c.Assert(saved, gc.IsNil)
   100  }
   101  
   102  func (s *factorySuite) TestMakeUserNoEnvUser(c *gc.C) {
   103  	username := "bob"
   104  	displayName := "Bob the Builder"
   105  	creator := names.NewLocalUserTag("eric")
   106  	password := "sekrit"
   107  	user := s.Factory.MakeUser(c, &factory.UserParams{
   108  		Name:        username,
   109  		DisplayName: displayName,
   110  		Creator:     creator,
   111  		Password:    password,
   112  		NoEnvUser:   true,
   113  	})
   114  
   115  	_, err := s.State.User(user.UserTag())
   116  	c.Assert(err, jc.ErrorIsNil)
   117  	_, err = s.State.EnvironmentUser(user.UserTag())
   118  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   119  }
   120  
   121  func (s *factorySuite) TestMakeEnvUserNil(c *gc.C) {
   122  	envUser := s.Factory.MakeEnvUser(c, nil)
   123  	saved, err := s.State.EnvironmentUser(envUser.UserTag())
   124  	c.Assert(err, jc.ErrorIsNil)
   125  	c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id())
   126  	c.Assert(saved.UserName(), gc.Equals, envUser.UserName())
   127  	c.Assert(saved.DisplayName(), gc.Equals, envUser.DisplayName())
   128  	c.Assert(saved.CreatedBy(), gc.Equals, envUser.CreatedBy())
   129  }
   130  
   131  func (s *factorySuite) TestMakeEnvUserPartialParams(c *gc.C) {
   132  	s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar123", NoEnvUser: true})
   133  	envUser := s.Factory.MakeEnvUser(c, &factory.EnvUserParams{
   134  		User: "foobar123"})
   135  
   136  	saved, err := s.State.EnvironmentUser(envUser.UserTag())
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id())
   139  	c.Assert(saved.UserName(), gc.Equals, "foobar123@local")
   140  	c.Assert(saved.DisplayName(), gc.Equals, envUser.DisplayName())
   141  	c.Assert(saved.CreatedBy(), gc.Equals, envUser.CreatedBy())
   142  }
   143  
   144  func (s *factorySuite) TestMakeEnvUserParams(c *gc.C) {
   145  	s.Factory.MakeUser(c, &factory.UserParams{Name: "createdby"})
   146  	s.Factory.MakeUser(c, &factory.UserParams{
   147  		Name:      "foobar",
   148  		Creator:   names.NewUserTag("createdby"),
   149  		NoEnvUser: true,
   150  	})
   151  
   152  	envUser := s.Factory.MakeEnvUser(c, &factory.EnvUserParams{
   153  		User:        "foobar",
   154  		CreatedBy:   names.NewUserTag("createdby"),
   155  		DisplayName: "Foo Bar",
   156  	})
   157  
   158  	saved, err := s.State.EnvironmentUser(envUser.UserTag())
   159  	c.Assert(err, jc.ErrorIsNil)
   160  	c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id())
   161  	c.Assert(saved.UserName(), gc.Equals, "foobar@local")
   162  	c.Assert(saved.CreatedBy(), gc.Equals, "createdby@local")
   163  	c.Assert(saved.DisplayName(), gc.Equals, "Foo Bar")
   164  }
   165  
   166  func (s *factorySuite) TestMakeEnvUserInvalidCreatedBy(c *gc.C) {
   167  	invalidFunc := func() {
   168  		s.Factory.MakeEnvUser(c, &factory.EnvUserParams{
   169  			User:      "bob",
   170  			CreatedBy: names.NewMachineTag("0"),
   171  		})
   172  	}
   173  
   174  	c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`)
   175  	saved, err := s.State.EnvironmentUser(names.NewLocalUserTag("bob"))
   176  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   177  	c.Assert(saved, gc.IsNil)
   178  }
   179  
   180  func (s *factorySuite) TestMakeEnvUserNonLocalUser(c *gc.C) {
   181  	creator := s.Factory.MakeUser(c, &factory.UserParams{Name: "created-by"})
   182  	envUser := s.Factory.MakeEnvUser(c, &factory.EnvUserParams{
   183  		User:        "foobar@ubuntuone",
   184  		DisplayName: "Foo Bar",
   185  		CreatedBy:   creator.UserTag(),
   186  	})
   187  
   188  	saved, err := s.State.EnvironmentUser(envUser.UserTag())
   189  	c.Assert(err, jc.ErrorIsNil)
   190  	c.Assert(saved.EnvironmentTag().Id(), gc.Equals, envUser.EnvironmentTag().Id())
   191  	c.Assert(saved.UserName(), gc.Equals, "foobar@ubuntuone")
   192  	c.Assert(saved.DisplayName(), gc.Equals, "Foo Bar")
   193  	c.Assert(saved.CreatedBy(), gc.Equals, creator.UserTag().Username())
   194  }
   195  
   196  func (s *factorySuite) TestMakeMachineNil(c *gc.C) {
   197  	machine, password := s.Factory.MakeMachineReturningPassword(c, nil)
   198  	c.Assert(machine, gc.NotNil)
   199  
   200  	saved, err := s.State.Machine(machine.Id())
   201  	c.Assert(err, jc.ErrorIsNil)
   202  
   203  	c.Assert(saved.Series(), gc.Equals, machine.Series())
   204  	c.Assert(saved.Id(), gc.Equals, machine.Id())
   205  	c.Assert(saved.Series(), gc.Equals, machine.Series())
   206  	c.Assert(saved.Tag(), gc.Equals, machine.Tag())
   207  	c.Assert(saved.Life(), gc.Equals, machine.Life())
   208  	c.Assert(saved.Jobs(), gc.DeepEquals, machine.Jobs())
   209  	c.Assert(saved.PasswordValid(password), jc.IsTrue)
   210  	savedInstanceId, err := saved.InstanceId()
   211  	c.Assert(err, jc.ErrorIsNil)
   212  	machineInstanceId, err := machine.InstanceId()
   213  	c.Assert(err, jc.ErrorIsNil)
   214  	c.Assert(savedInstanceId, gc.Equals, machineInstanceId)
   215  	c.Assert(saved.Clean(), gc.Equals, machine.Clean())
   216  }
   217  
   218  func (s *factorySuite) TestMakeMachine(c *gc.C) {
   219  	registry.RegisterEnvironStorageProviders("someprovider", provider.LoopProviderType)
   220  	series := "quantal"
   221  	jobs := []state.MachineJob{state.JobManageEnviron}
   222  	password, err := utils.RandomPassword()
   223  	c.Assert(err, jc.ErrorIsNil)
   224  	nonce := "some-nonce"
   225  	id := instance.Id("some-id")
   226  	volumes := []state.MachineVolumeParams{{Volume: state.VolumeParams{Size: 1024}}}
   227  	filesystems := []state.MachineFilesystemParams{{
   228  		Filesystem: state.FilesystemParams{Pool: "loop", Size: 2048},
   229  	}}
   230  
   231  	machine, pwd := s.Factory.MakeMachineReturningPassword(c, &factory.MachineParams{
   232  		Series:      series,
   233  		Jobs:        jobs,
   234  		Password:    password,
   235  		Nonce:       nonce,
   236  		InstanceId:  id,
   237  		Volumes:     volumes,
   238  		Filesystems: filesystems,
   239  	})
   240  	c.Assert(machine, gc.NotNil)
   241  	c.Assert(pwd, gc.Equals, password)
   242  
   243  	c.Assert(machine.Series(), gc.Equals, series)
   244  	c.Assert(machine.Jobs(), gc.DeepEquals, jobs)
   245  	machineInstanceId, err := machine.InstanceId()
   246  	c.Assert(err, jc.ErrorIsNil)
   247  	c.Assert(machineInstanceId, gc.Equals, id)
   248  	c.Assert(machine.CheckProvisioned(nonce), jc.IsTrue)
   249  	c.Assert(machine.PasswordValid(password), jc.IsTrue)
   250  
   251  	assertVolume := func(name string, size uint64) {
   252  		volume, err := s.State.Volume(names.NewVolumeTag(name))
   253  		c.Assert(err, jc.ErrorIsNil)
   254  		volParams, ok := volume.Params()
   255  		c.Assert(ok, jc.IsTrue)
   256  		c.Assert(volParams, jc.DeepEquals, state.VolumeParams{Pool: "loop", Size: size})
   257  		volAttachments, err := s.State.VolumeAttachments(volume.VolumeTag())
   258  		c.Assert(err, jc.ErrorIsNil)
   259  		c.Assert(volAttachments, gc.HasLen, 1)
   260  		c.Assert(volAttachments[0].Machine(), gc.Equals, machine.Tag())
   261  	}
   262  	assertVolume(machine.Id()+"/0", 2048) // backing the filesystem
   263  	assertVolume(machine.Id()+"/1", 1024)
   264  
   265  	filesystem, err := s.State.Filesystem(names.NewFilesystemTag(machine.Id() + "/0"))
   266  	c.Assert(err, jc.ErrorIsNil)
   267  	fsParams, ok := filesystem.Params()
   268  	c.Assert(ok, jc.IsTrue)
   269  	c.Assert(fsParams, jc.DeepEquals, state.FilesystemParams{Pool: "loop", Size: 2048})
   270  	fsAttachments, err := s.State.MachineFilesystemAttachments(machine.Tag().(names.MachineTag))
   271  	c.Assert(err, jc.ErrorIsNil)
   272  	c.Assert(fsAttachments, gc.HasLen, 1)
   273  	c.Assert(fsAttachments[0].Machine(), gc.Equals, machine.Tag())
   274  
   275  	saved, err := s.State.Machine(machine.Id())
   276  	c.Assert(err, jc.ErrorIsNil)
   277  
   278  	c.Assert(saved.Id(), gc.Equals, machine.Id())
   279  	c.Assert(saved.Series(), gc.Equals, machine.Series())
   280  	c.Assert(saved.Tag(), gc.Equals, machine.Tag())
   281  	c.Assert(saved.Life(), gc.Equals, machine.Life())
   282  	c.Assert(saved.Jobs(), gc.DeepEquals, machine.Jobs())
   283  	savedInstanceId, err := saved.InstanceId()
   284  	c.Assert(err, jc.ErrorIsNil)
   285  	c.Assert(savedInstanceId, gc.Equals, machineInstanceId)
   286  	c.Assert(saved.Clean(), gc.Equals, machine.Clean())
   287  }
   288  
   289  func (s *factorySuite) TestMakeCharmNil(c *gc.C) {
   290  	charm := s.Factory.MakeCharm(c, nil)
   291  	c.Assert(charm, gc.NotNil)
   292  
   293  	saved, err := s.State.Charm(charm.URL())
   294  	c.Assert(err, jc.ErrorIsNil)
   295  
   296  	c.Assert(saved.URL(), gc.DeepEquals, charm.URL())
   297  	c.Assert(saved.Meta(), gc.DeepEquals, charm.Meta())
   298  	c.Assert(saved.StoragePath(), gc.Equals, charm.StoragePath())
   299  	c.Assert(saved.BundleSha256(), gc.Equals, charm.BundleSha256())
   300  }
   301  
   302  func (s *factorySuite) TestMakeCharm(c *gc.C) {
   303  	series := "quantal"
   304  	name := "wordpress"
   305  	revision := 13
   306  	url := fmt.Sprintf("cs:%s/%s-%d", series, name, revision)
   307  	ch := s.Factory.MakeCharm(c, &factory.CharmParams{
   308  		Name: name,
   309  		URL:  url,
   310  	})
   311  	c.Assert(ch, gc.NotNil)
   312  
   313  	c.Assert(ch.URL(), gc.DeepEquals, charm.MustParseURL(url))
   314  
   315  	saved, err := s.State.Charm(ch.URL())
   316  	c.Assert(err, jc.ErrorIsNil)
   317  
   318  	c.Assert(saved.URL(), gc.DeepEquals, ch.URL())
   319  	c.Assert(saved.Meta(), gc.DeepEquals, ch.Meta())
   320  	c.Assert(saved.Meta().Name, gc.Equals, name)
   321  	c.Assert(saved.StoragePath(), gc.Equals, ch.StoragePath())
   322  	c.Assert(saved.BundleSha256(), gc.Equals, ch.BundleSha256())
   323  }
   324  
   325  func (s *factorySuite) TestMakeServiceNil(c *gc.C) {
   326  	service := s.Factory.MakeService(c, nil)
   327  	c.Assert(service, gc.NotNil)
   328  
   329  	saved, err := s.State.Service(service.Name())
   330  	c.Assert(err, jc.ErrorIsNil)
   331  
   332  	c.Assert(saved.Name(), gc.Equals, service.Name())
   333  	c.Assert(saved.Tag(), gc.Equals, service.Tag())
   334  	c.Assert(saved.Life(), gc.Equals, service.Life())
   335  }
   336  
   337  func (s *factorySuite) TestMakeService(c *gc.C) {
   338  	charm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "wordpress"})
   339  	creator := s.Factory.MakeUser(c, &factory.UserParams{Name: "bill"}).Tag()
   340  	service := s.Factory.MakeService(c, &factory.ServiceParams{
   341  		Charm:   charm,
   342  		Creator: creator,
   343  	})
   344  	c.Assert(service, gc.NotNil)
   345  
   346  	c.Assert(service.Name(), gc.Equals, "wordpress")
   347  	c.Assert(service.GetOwnerTag(), gc.Equals, creator.String())
   348  	curl, _ := service.CharmURL()
   349  	c.Assert(curl, gc.DeepEquals, charm.URL())
   350  
   351  	saved, err := s.State.Service(service.Name())
   352  	c.Assert(err, jc.ErrorIsNil)
   353  
   354  	c.Assert(saved.Name(), gc.Equals, service.Name())
   355  	c.Assert(saved.Tag(), gc.Equals, service.Tag())
   356  	c.Assert(saved.Life(), gc.Equals, service.Life())
   357  }
   358  
   359  func (s *factorySuite) TestMakeServiceInvalidCreator(c *gc.C) {
   360  	serviceName := "mysql"
   361  	invalidFunc := func() {
   362  		s.Factory.MakeService(c, &factory.ServiceParams{
   363  			Name:    serviceName,
   364  			Creator: names.NewMachineTag("0"),
   365  		})
   366  	}
   367  	c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`)
   368  	saved, err := s.State.Service(serviceName)
   369  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   370  	c.Assert(saved, gc.IsNil)
   371  }
   372  
   373  func (s *factorySuite) TestMakeUnitNil(c *gc.C) {
   374  	unit := s.Factory.MakeUnit(c, nil)
   375  	c.Assert(unit, gc.NotNil)
   376  
   377  	saved, err := s.State.Unit(unit.Name())
   378  	c.Assert(err, jc.ErrorIsNil)
   379  
   380  	c.Assert(saved.Name(), gc.Equals, unit.Name())
   381  	c.Assert(saved.ServiceName(), gc.Equals, unit.ServiceName())
   382  	c.Assert(saved.Series(), gc.Equals, unit.Series())
   383  	c.Assert(saved.Life(), gc.Equals, unit.Life())
   384  }
   385  
   386  func (s *factorySuite) TestMakeUnit(c *gc.C) {
   387  	service := s.Factory.MakeService(c, nil)
   388  	unit := s.Factory.MakeUnit(c, &factory.UnitParams{
   389  		Service:     service,
   390  		SetCharmURL: true,
   391  	})
   392  	c.Assert(unit, gc.NotNil)
   393  
   394  	c.Assert(unit.ServiceName(), gc.Equals, service.Name())
   395  
   396  	saved, err := s.State.Unit(unit.Name())
   397  	c.Assert(err, jc.ErrorIsNil)
   398  
   399  	c.Assert(saved.Name(), gc.Equals, unit.Name())
   400  	c.Assert(saved.ServiceName(), gc.Equals, unit.ServiceName())
   401  	c.Assert(saved.Series(), gc.Equals, unit.Series())
   402  	c.Assert(saved.Life(), gc.Equals, unit.Life())
   403  
   404  	serviceCharmURL, _ := service.CharmURL()
   405  	unitCharmURL, _ := saved.CharmURL()
   406  	c.Assert(unitCharmURL, gc.DeepEquals, serviceCharmURL)
   407  }
   408  
   409  func (s *factorySuite) TestMakeRelationNil(c *gc.C) {
   410  	relation := s.Factory.MakeRelation(c, nil)
   411  	c.Assert(relation, gc.NotNil)
   412  
   413  	saved, err := s.State.Relation(relation.Id())
   414  	c.Assert(err, jc.ErrorIsNil)
   415  
   416  	c.Assert(saved.Id(), gc.Equals, relation.Id())
   417  	c.Assert(saved.Tag(), gc.Equals, relation.Tag())
   418  	c.Assert(saved.Life(), gc.Equals, relation.Life())
   419  	c.Assert(saved.Endpoints(), gc.DeepEquals, relation.Endpoints())
   420  }
   421  
   422  func (s *factorySuite) TestMakeRelation(c *gc.C) {
   423  	s1 := s.Factory.MakeService(c, &factory.ServiceParams{
   424  		Name: "service1",
   425  		Charm: s.Factory.MakeCharm(c, &factory.CharmParams{
   426  			Name: "wordpress",
   427  		}),
   428  	})
   429  	e1, err := s1.Endpoint("db")
   430  	c.Assert(err, jc.ErrorIsNil)
   431  
   432  	s2 := s.Factory.MakeService(c, &factory.ServiceParams{
   433  		Name: "service2",
   434  		Charm: s.Factory.MakeCharm(c, &factory.CharmParams{
   435  			Name: "mysql",
   436  		}),
   437  	})
   438  	e2, err := s2.Endpoint("server")
   439  	c.Assert(err, jc.ErrorIsNil)
   440  
   441  	relation := s.Factory.MakeRelation(c, &factory.RelationParams{
   442  		Endpoints: []state.Endpoint{e1, e2},
   443  	})
   444  	c.Assert(relation, gc.NotNil)
   445  
   446  	saved, err := s.State.Relation(relation.Id())
   447  	c.Assert(err, jc.ErrorIsNil)
   448  
   449  	c.Assert(saved.Id(), gc.Equals, relation.Id())
   450  	c.Assert(saved.Tag(), gc.Equals, relation.Tag())
   451  	c.Assert(saved.Life(), gc.Equals, relation.Life())
   452  	c.Assert(saved.Endpoints(), gc.DeepEquals, relation.Endpoints())
   453  }
   454  
   455  func (s *factorySuite) TestMakeMetricNil(c *gc.C) {
   456  	metric := s.Factory.MakeMetric(c, nil)
   457  	c.Assert(metric, gc.NotNil)
   458  
   459  	saved, err := s.State.MetricBatch(metric.UUID())
   460  	c.Assert(err, jc.ErrorIsNil)
   461  
   462  	c.Assert(saved.UUID(), gc.Equals, metric.UUID())
   463  	c.Assert(saved.Unit(), gc.Equals, metric.Unit())
   464  	c.Assert(saved.Sent(), gc.Equals, metric.Sent())
   465  	c.Assert(saved.CharmURL(), gc.Equals, metric.CharmURL())
   466  	c.Assert(saved.Sent(), gc.Equals, metric.Sent())
   467  	c.Assert(saved.Metrics(), gc.HasLen, 1)
   468  	c.Assert(saved.Metrics()[0].Key, gc.Equals, metric.Metrics()[0].Key)
   469  	c.Assert(saved.Metrics()[0].Value, gc.Equals, metric.Metrics()[0].Value)
   470  	c.Assert(saved.Metrics()[0].Time.Equal(metric.Metrics()[0].Time), jc.IsTrue)
   471  }
   472  
   473  func (s *factorySuite) TestMakeMetric(c *gc.C) {
   474  	now := time.Now().Round(time.Second).UTC()
   475  	meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "cs:quantal/metered"})
   476  	meteredService := s.Factory.MakeService(c, &factory.ServiceParams{Charm: meteredCharm})
   477  	unit := s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true})
   478  	metric := s.Factory.MakeMetric(c, &factory.MetricParams{
   479  		Unit:    unit,
   480  		Time:    &now,
   481  		Sent:    true,
   482  		Metrics: []state.Metric{{"pings", "1", now}},
   483  	})
   484  	c.Assert(metric, gc.NotNil)
   485  
   486  	saved, err := s.State.MetricBatch(metric.UUID())
   487  	c.Assert(err, jc.ErrorIsNil)
   488  
   489  	c.Assert(saved.UUID(), gc.Equals, metric.UUID())
   490  	c.Assert(saved.Unit(), gc.Equals, metric.Unit())
   491  	c.Assert(saved.CharmURL(), gc.Equals, metric.CharmURL())
   492  	c.Assert(metric.Sent(), jc.IsTrue)
   493  	c.Assert(saved.Sent(), jc.IsTrue)
   494  	c.Assert(saved.Metrics(), gc.HasLen, 1)
   495  	c.Assert(saved.Metrics()[0].Key, gc.Equals, "pings")
   496  	c.Assert(saved.Metrics()[0].Value, gc.Equals, "1")
   497  	c.Assert(saved.Metrics()[0].Time.Equal(now), jc.IsTrue)
   498  }
   499  
   500  func (s *factorySuite) TestMakeEnvironmentNil(c *gc.C) {
   501  	st := s.Factory.MakeEnvironment(c, nil)
   502  	defer st.Close()
   503  
   504  	env, err := st.Environment()
   505  	c.Assert(err, jc.ErrorIsNil)
   506  	re := regexp.MustCompile(`^testenv-\d+$`)
   507  	c.Assert(re.MatchString(env.Name()), jc.IsTrue)
   508  	c.Assert(env.UUID() == s.State.EnvironUUID(), jc.IsFalse)
   509  	origEnv, err := s.State.Environment()
   510  	c.Assert(err, jc.ErrorIsNil)
   511  	c.Assert(env.Owner(), gc.Equals, origEnv.Owner())
   512  
   513  	cfg, err := st.EnvironConfig()
   514  	c.Assert(err, jc.ErrorIsNil)
   515  	c.Assert(cfg.AllAttrs()["default-series"], gc.Equals, "trusty")
   516  }
   517  
   518  func (s *factorySuite) TestMakeEnvironment(c *gc.C) {
   519  	owner := s.Factory.MakeUser(c, &factory.UserParams{
   520  		Name: "owner",
   521  	})
   522  	params := &factory.EnvParams{
   523  		Name:        "foo",
   524  		Owner:       owner.UserTag(),
   525  		ConfigAttrs: testing.Attrs{"default-series": "precise"},
   526  	}
   527  
   528  	st := s.Factory.MakeEnvironment(c, params)
   529  	defer st.Close()
   530  
   531  	env, err := st.Environment()
   532  	c.Assert(err, jc.ErrorIsNil)
   533  	c.Assert(env.Name(), gc.Equals, "foo")
   534  	c.Assert(env.UUID() == s.State.EnvironUUID(), jc.IsFalse)
   535  	c.Assert(env.Owner(), gc.Equals, owner.UserTag())
   536  
   537  	cfg, err := st.EnvironConfig()
   538  	c.Assert(err, jc.ErrorIsNil)
   539  	c.Assert(cfg.AllAttrs()["default-series"], gc.Equals, "precise")
   540  }