github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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"
    16  	"gopkg.in/juju/names.v2"
    17  
    18  	"github.com/juju/juju/core/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  }
    31  
    32  var _ = gc.Suite(&factorySuite{})
    33  
    34  func (s *factorySuite) SetUpTest(c *gc.C) {
    35  	s.NewPolicy = func(*state.State) state.Policy {
    36  		return &statetesting.MockPolicy{
    37  			GetStorageProviderRegistry: func() (storage.ProviderRegistry, error) {
    38  				return provider.CommonStorageProviders(), nil
    39  			},
    40  		}
    41  	}
    42  	s.StateSuite.SetUpTest(c)
    43  }
    44  
    45  func (s *factorySuite) TestMakeUserNil(c *gc.C) {
    46  	user := s.Factory.MakeUser(c, nil)
    47  	c.Assert(user.IsDisabled(), jc.IsFalse)
    48  
    49  	saved, err := s.State.User(user.UserTag())
    50  	c.Assert(err, jc.ErrorIsNil)
    51  	c.Assert(saved.Tag(), gc.Equals, user.Tag())
    52  	c.Assert(saved.Name(), gc.Equals, user.Name())
    53  	c.Assert(saved.DisplayName(), gc.Equals, user.DisplayName())
    54  	c.Assert(saved.CreatedBy(), gc.Equals, user.CreatedBy())
    55  	c.Assert(saved.DateCreated(), gc.Equals, user.DateCreated())
    56  	c.Assert(saved.IsDisabled(), gc.Equals, user.IsDisabled())
    57  
    58  	savedLastLogin, err := saved.LastLogin()
    59  	c.Assert(err, jc.Satisfies, state.IsNeverLoggedInError)
    60  	lastLogin, err := user.LastLogin()
    61  	c.Assert(err, jc.Satisfies, state.IsNeverLoggedInError)
    62  	c.Assert(savedLastLogin, gc.Equals, lastLogin)
    63  }
    64  
    65  func (s *factorySuite) TestMakeUserParams(c *gc.C) {
    66  	username := "bob"
    67  	displayName := "Bob the Builder"
    68  	creator := s.Factory.MakeUser(c, nil)
    69  	password := "sekrit"
    70  	user := s.Factory.MakeUser(c, &factory.UserParams{
    71  		Name:        username,
    72  		DisplayName: displayName,
    73  		Creator:     creator.Tag(),
    74  		Password:    password,
    75  	})
    76  	c.Assert(user.IsDisabled(), jc.IsFalse)
    77  	c.Assert(user.Name(), gc.Equals, username)
    78  	c.Assert(user.DisplayName(), gc.Equals, displayName)
    79  	c.Assert(user.CreatedBy(), gc.Equals, creator.UserTag().Name())
    80  	c.Assert(user.PasswordValid(password), jc.IsTrue)
    81  
    82  	saved, err := s.State.User(user.UserTag())
    83  	c.Assert(err, jc.ErrorIsNil)
    84  	c.Assert(saved.Tag(), gc.Equals, user.Tag())
    85  	c.Assert(saved.Name(), gc.Equals, user.Name())
    86  	c.Assert(saved.DisplayName(), gc.Equals, user.DisplayName())
    87  	c.Assert(saved.CreatedBy(), gc.Equals, user.CreatedBy())
    88  	c.Assert(saved.DateCreated(), gc.Equals, user.DateCreated())
    89  	c.Assert(saved.IsDisabled(), gc.Equals, user.IsDisabled())
    90  
    91  	savedLastLogin, err := saved.LastLogin()
    92  	c.Assert(err, jc.Satisfies, state.IsNeverLoggedInError)
    93  	lastLogin, err := user.LastLogin()
    94  	c.Assert(err, jc.Satisfies, state.IsNeverLoggedInError)
    95  	c.Assert(savedLastLogin, gc.Equals, lastLogin)
    96  
    97  	_, err = s.State.UserAccess(user.UserTag(), s.Model.ModelTag())
    98  	c.Assert(err, jc.ErrorIsNil)
    99  }
   100  
   101  func (s *factorySuite) TestMakeUserInvalidCreator(c *gc.C) {
   102  	invalidFunc := func() {
   103  		s.Factory.MakeUser(c, &factory.UserParams{
   104  			Name:        "bob",
   105  			DisplayName: "Bob",
   106  			Creator:     names.NewMachineTag("0"),
   107  			Password:    "bob",
   108  		})
   109  	}
   110  
   111  	c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`)
   112  	saved, err := s.State.User(names.NewUserTag("bob"))
   113  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   114  	c.Assert(saved, gc.IsNil)
   115  }
   116  
   117  func (s *factorySuite) TestMakeUserNoModelUser(c *gc.C) {
   118  	username := "bob"
   119  	displayName := "Bob the Builder"
   120  	creator := names.NewLocalUserTag("eric")
   121  	password := "sekrit"
   122  	user := s.Factory.MakeUser(c, &factory.UserParams{
   123  		Name:        username,
   124  		DisplayName: displayName,
   125  		Creator:     creator,
   126  		Password:    password,
   127  		NoModelUser: true,
   128  	})
   129  
   130  	_, err := s.State.User(user.UserTag())
   131  	c.Assert(err, jc.ErrorIsNil)
   132  	_, err = s.State.UserAccess(user.UserTag(), s.Model.ModelTag())
   133  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   134  }
   135  
   136  func (s *factorySuite) TestMakeModelUserNil(c *gc.C) {
   137  	modelUser := s.Factory.MakeModelUser(c, nil)
   138  	saved, err := s.State.UserAccess(modelUser.UserTag, modelUser.Object)
   139  	c.Assert(err, jc.ErrorIsNil)
   140  	c.Assert(saved.Object.Id(), gc.Equals, modelUser.Object.Id())
   141  	c.Assert(saved.UserName, gc.Equals, modelUser.UserName)
   142  	c.Assert(saved.DisplayName, gc.Equals, modelUser.DisplayName)
   143  	c.Assert(saved.CreatedBy, gc.Equals, modelUser.CreatedBy)
   144  }
   145  
   146  func (s *factorySuite) TestMakeModelUserPartialParams(c *gc.C) {
   147  	s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar123", NoModelUser: true})
   148  	modelUser := s.Factory.MakeModelUser(c, &factory.ModelUserParams{
   149  		User: "foobar123"})
   150  
   151  	saved, err := s.State.UserAccess(modelUser.UserTag, modelUser.Object)
   152  	c.Assert(err, jc.ErrorIsNil)
   153  	c.Assert(saved.Object.Id(), gc.Equals, modelUser.Object.Id())
   154  	c.Assert(saved.UserName, gc.Equals, "foobar123")
   155  	c.Assert(saved.DisplayName, gc.Equals, modelUser.DisplayName)
   156  	c.Assert(saved.CreatedBy, gc.Equals, modelUser.CreatedBy)
   157  }
   158  
   159  func (s *factorySuite) TestMakeModelUserParams(c *gc.C) {
   160  	s.Factory.MakeUser(c, &factory.UserParams{Name: "createdby"})
   161  	s.Factory.MakeUser(c, &factory.UserParams{
   162  		Name:        "foobar",
   163  		Creator:     names.NewUserTag("createdby"),
   164  		NoModelUser: true,
   165  	})
   166  
   167  	modelUser := s.Factory.MakeModelUser(c, &factory.ModelUserParams{
   168  		User:        "foobar",
   169  		CreatedBy:   names.NewUserTag("createdby"),
   170  		DisplayName: "Foo Bar",
   171  	})
   172  
   173  	saved, err := s.State.UserAccess(modelUser.UserTag, s.Model.ModelTag())
   174  	c.Assert(err, jc.ErrorIsNil)
   175  	c.Assert(saved.Object.Id(), gc.Equals, modelUser.Object.Id())
   176  	c.Assert(saved.UserName, gc.Equals, "foobar")
   177  	c.Assert(saved.CreatedBy.Id(), gc.Equals, "createdby")
   178  	c.Assert(saved.DisplayName, gc.Equals, "Foo Bar")
   179  }
   180  
   181  func (s *factorySuite) TestMakeModelUserInvalidCreatedBy(c *gc.C) {
   182  	invalidFunc := func() {
   183  		s.Factory.MakeModelUser(c, &factory.ModelUserParams{
   184  			User:      "bob",
   185  			CreatedBy: names.NewMachineTag("0"),
   186  		})
   187  	}
   188  
   189  	c.Assert(invalidFunc, gc.PanicMatches, `interface conversion: .*`)
   190  	saved, err := s.State.UserAccess(names.NewLocalUserTag("bob"), s.Model.ModelTag())
   191  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   192  	c.Assert(saved, gc.DeepEquals, permission.UserAccess{})
   193  }
   194  
   195  func (s *factorySuite) TestMakeModelUserNonLocalUser(c *gc.C) {
   196  	creator := s.Factory.MakeUser(c, &factory.UserParams{Name: "created-by"})
   197  	modelUser := s.Factory.MakeModelUser(c, &factory.ModelUserParams{
   198  		User:        "foobar@ubuntuone",
   199  		DisplayName: "Foo Bar",
   200  		CreatedBy:   creator.UserTag(),
   201  	})
   202  
   203  	saved, err := s.State.UserAccess(modelUser.UserTag, s.Model.ModelTag())
   204  	c.Assert(err, jc.ErrorIsNil)
   205  	c.Assert(saved.Object.Id(), gc.Equals, modelUser.Object.Id())
   206  	c.Assert(saved.UserName, gc.Equals, "foobar@ubuntuone")
   207  	c.Assert(saved.DisplayName, gc.Equals, "Foo Bar")
   208  	c.Assert(saved.CreatedBy.Id(), gc.Equals, creator.UserTag().Id())
   209  }
   210  
   211  func (s *factorySuite) TestMakeMachineNil(c *gc.C) {
   212  	machine, password := s.Factory.MakeMachineReturningPassword(c, nil)
   213  	c.Assert(machine, gc.NotNil)
   214  
   215  	saved, err := s.State.Machine(machine.Id())
   216  	c.Assert(err, jc.ErrorIsNil)
   217  
   218  	c.Assert(saved.Series(), gc.Equals, machine.Series())
   219  	c.Assert(saved.Id(), gc.Equals, machine.Id())
   220  	c.Assert(saved.Series(), gc.Equals, machine.Series())
   221  	c.Assert(saved.Tag(), gc.Equals, machine.Tag())
   222  	c.Assert(saved.Life(), gc.Equals, machine.Life())
   223  	c.Assert(saved.Jobs(), gc.DeepEquals, machine.Jobs())
   224  	c.Assert(saved.PasswordValid(password), jc.IsTrue)
   225  	savedInstanceId, err := saved.InstanceId()
   226  	c.Assert(err, jc.ErrorIsNil)
   227  	machineInstanceId, err := machine.InstanceId()
   228  	c.Assert(err, jc.ErrorIsNil)
   229  	c.Assert(savedInstanceId, gc.Equals, machineInstanceId)
   230  	c.Assert(saved.Clean(), gc.Equals, machine.Clean())
   231  }
   232  
   233  func (s *factorySuite) TestMakeMachine(c *gc.C) {
   234  	series := "quantal"
   235  	jobs := []state.MachineJob{state.JobManageModel}
   236  	password, err := utils.RandomPassword()
   237  	c.Assert(err, jc.ErrorIsNil)
   238  	nonce := "some-nonce"
   239  	id := instance.Id("some-id")
   240  	volumes := []state.HostVolumeParams{{Volume: state.VolumeParams{Size: 1024}}}
   241  	filesystems := []state.HostFilesystemParams{{
   242  		Filesystem: state.FilesystemParams{Pool: "loop", Size: 2048},
   243  	}}
   244  
   245  	machine, pwd := s.Factory.MakeMachineReturningPassword(c, &factory.MachineParams{
   246  		Series:      series,
   247  		Jobs:        jobs,
   248  		Password:    password,
   249  		Nonce:       nonce,
   250  		InstanceId:  id,
   251  		Volumes:     volumes,
   252  		Filesystems: filesystems,
   253  	})
   254  	c.Assert(machine, gc.NotNil)
   255  	c.Assert(pwd, gc.Equals, password)
   256  
   257  	c.Assert(machine.Series(), gc.Equals, series)
   258  	c.Assert(machine.Jobs(), gc.DeepEquals, jobs)
   259  	machineInstanceId, err := machine.InstanceId()
   260  	c.Assert(err, jc.ErrorIsNil)
   261  	c.Assert(machineInstanceId, gc.Equals, id)
   262  	c.Assert(machine.CheckProvisioned(nonce), jc.IsTrue)
   263  	c.Assert(machine.PasswordValid(password), jc.IsTrue)
   264  
   265  	sb, err := state.NewStorageBackend(s.State)
   266  	c.Assert(err, jc.ErrorIsNil)
   267  	assertVolume := func(name string, size uint64) {
   268  		volume, err := sb.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 := sb.VolumeAttachments(volume.VolumeTag())
   274  		c.Assert(err, jc.ErrorIsNil)
   275  		c.Assert(volAttachments, gc.HasLen, 1)
   276  		c.Assert(volAttachments[0].Host(), gc.Equals, machine.Tag())
   277  	}
   278  	assertVolume(machine.Id()+"/0", 2048) // backing the filesystem
   279  	assertVolume(machine.Id()+"/1", 1024)
   280  
   281  	filesystem, err := sb.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 := sb.MachineFilesystemAttachments(machine.Tag().(names.MachineTag))
   287  	c.Assert(err, jc.ErrorIsNil)
   288  	c.Assert(fsAttachments, gc.HasLen, 1)
   289  	c.Assert(fsAttachments[0].Host(), 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{{Key: "pings", Value: "1", Time: 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(`^testmodel-\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  	m, err := st.Model()
   513  	c.Assert(err, jc.ErrorIsNil)
   514  
   515  	cfg, err := m.ModelConfig()
   516  	c.Assert(err, jc.ErrorIsNil)
   517  	c.Assert(cfg.AllAttrs()["default-series"], gc.Equals, "bionic")
   518  }
   519  
   520  func (s *factorySuite) TestMakeModel(c *gc.C) {
   521  	owner := s.Factory.MakeUser(c, &factory.UserParams{
   522  		Name: "owner",
   523  	})
   524  	params := &factory.ModelParams{
   525  		Name:        "foo",
   526  		Owner:       owner.UserTag(),
   527  		ConfigAttrs: testing.Attrs{"default-series": "precise"},
   528  	}
   529  
   530  	st := s.Factory.MakeModel(c, params)
   531  	defer st.Close()
   532  
   533  	env, err := st.Model()
   534  	c.Assert(err, jc.ErrorIsNil)
   535  	c.Assert(env.Name(), gc.Equals, "foo")
   536  	c.Assert(env.UUID() == s.State.ModelUUID(), jc.IsFalse)
   537  	c.Assert(env.Owner(), gc.Equals, owner.UserTag())
   538  
   539  	m, err := st.Model()
   540  	c.Assert(err, jc.ErrorIsNil)
   541  	cfg, err := m.ModelConfig()
   542  	c.Assert(err, jc.ErrorIsNil)
   543  	c.Assert(cfg.AllAttrs()["default-series"], gc.Equals, "precise")
   544  }