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