github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/state/backups/backups_test.go (about) 1 // Copyright 2013,2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package backups_test 5 6 import ( 7 "bytes" 8 "io/ioutil" 9 "time" // Only used for time types. 10 11 "github.com/juju/errors" 12 jc "github.com/juju/testing/checkers" 13 "github.com/juju/utils/set" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/mongo" 17 "github.com/juju/juju/state/backups" 18 backupstesting "github.com/juju/juju/state/backups/testing" 19 "github.com/juju/juju/testing" 20 ) 21 22 type backupsSuite struct { 23 backupstesting.BaseSuite 24 25 api backups.Backups 26 } 27 28 var _ = gc.Suite(&backupsSuite{}) // Register the suite. 29 30 func (s *backupsSuite) SetUpTest(c *gc.C) { 31 s.BaseSuite.SetUpTest(c) 32 33 s.api = backups.NewBackups(s.Storage) 34 } 35 36 func (s *backupsSuite) setStored(id string) *time.Time { 37 s.Storage.ID = id 38 s.Storage.Meta = backupstesting.NewMetadataStarted() 39 s.Storage.Meta.SetID(id) 40 stored := testing.NonZeroTime().UTC() 41 s.Storage.Meta.SetStored(&stored) 42 return &stored 43 } 44 45 type fakeDumper struct{} 46 47 func (*fakeDumper) Dump(dumpDir string) error { 48 return nil 49 } 50 51 func (s *backupsSuite) checkFailure(c *gc.C, expected string) { 52 s.PatchValue(backups.GetDBDumper, func(*backups.DBInfo) (backups.DBDumper, error) { 53 return &fakeDumper{}, nil 54 }) 55 56 paths := backups.Paths{DataDir: "/var/lib/juju"} 57 targets := set.NewStrings("juju", "admin") 58 dbInfo := backups.DBInfo{"a", "b", "c", targets, mongo.Mongo32wt} 59 meta := backupstesting.NewMetadataStarted() 60 meta.Notes = "some notes" 61 err := s.api.Create(meta, &paths, &dbInfo) 62 63 c.Check(err, gc.ErrorMatches, expected) 64 } 65 66 func (s *backupsSuite) TestNewBackups(c *gc.C) { 67 api := backups.NewBackups(s.Storage) 68 69 c.Check(api, gc.NotNil) 70 } 71 72 func (s *backupsSuite) TestCreateOkay(c *gc.C) { 73 74 // Patch the internals. 75 archiveFile := ioutil.NopCloser(bytes.NewBufferString("<compressed tarball>")) 76 result := backups.NewTestCreateResult(archiveFile, 10, "<checksum>") 77 received, testCreate := backups.NewTestCreate(result) 78 s.PatchValue(backups.RunCreate, testCreate) 79 80 rootDir := "<was never set>" 81 s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) { 82 rootDir = root 83 return []string{"<some file>"}, nil 84 }) 85 86 var receivedDBInfo *backups.DBInfo 87 s.PatchValue(backups.GetDBDumper, func(info *backups.DBInfo) (backups.DBDumper, error) { 88 receivedDBInfo = info 89 return nil, nil 90 }) 91 92 stored := s.setStored("spam") 93 94 // Run the backup. 95 paths := backups.Paths{DataDir: "/var/lib/juju"} 96 targets := set.NewStrings("juju", "admin") 97 dbInfo := backups.DBInfo{"a", "b", "c", targets, mongo.Mongo32wt} 98 meta := backupstesting.NewMetadataStarted() 99 backupstesting.SetOrigin(meta, "<model ID>", "<machine ID>", "<hostname>") 100 meta.Notes = "some notes" 101 err := s.api.Create(meta, &paths, &dbInfo) 102 103 // Test the call values. 104 s.Storage.CheckCalled(c, "spam", meta, archiveFile, "Add", "Metadata") 105 filesToBackUp, _ := backups.ExposeCreateArgs(received) 106 c.Check(filesToBackUp, jc.SameContents, []string{"<some file>"}) 107 108 c.Check(receivedDBInfo.Address, gc.Equals, "a") 109 c.Check(receivedDBInfo.Username, gc.Equals, "b") 110 c.Check(receivedDBInfo.Password, gc.Equals, "c") 111 c.Check(receivedDBInfo.Targets, gc.DeepEquals, targets) 112 113 c.Check(rootDir, gc.Equals, "") 114 115 // Check the resulting metadata. 116 c.Check(meta, gc.Equals, s.Storage.MetaArg) 117 c.Check(meta.ID(), gc.Equals, "spam") 118 c.Check(meta.Size(), gc.Equals, int64(10)) 119 c.Check(meta.Checksum(), gc.Equals, "<checksum>") 120 c.Check(meta.Stored().Unix(), gc.Equals, stored.Unix()) 121 c.Check(meta.Origin.Model, gc.Equals, "<model ID>") 122 c.Check(meta.Origin.Machine, gc.Equals, "<machine ID>") 123 c.Check(meta.Origin.Hostname, gc.Equals, "<hostname>") 124 c.Check(meta.Notes, gc.Equals, "some notes") 125 126 // Check the file storage. 127 s.Storage.Meta = meta 128 s.Storage.File = archiveFile 129 storedMeta, storedFile, err := s.Storage.Get(meta.ID()) 130 c.Check(err, jc.ErrorIsNil) 131 c.Check(storedMeta, gc.DeepEquals, meta) 132 data, err := ioutil.ReadAll(storedFile) 133 c.Assert(err, jc.ErrorIsNil) 134 c.Check(string(data), gc.Equals, "<compressed tarball>") 135 } 136 137 func (s *backupsSuite) TestCreateFailToListFiles(c *gc.C) { 138 s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) { 139 return nil, errors.New("failed!") 140 }) 141 142 s.checkFailure(c, "while listing files to back up: failed!") 143 } 144 145 func (s *backupsSuite) TestCreateFailToCreate(c *gc.C) { 146 s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) { 147 return []string{}, nil 148 }) 149 s.PatchValue(backups.RunCreate, backups.NewTestCreateFailure("failed!")) 150 151 s.checkFailure(c, "while creating backup archive: failed!") 152 } 153 154 func (s *backupsSuite) TestCreateFailToFinishMeta(c *gc.C) { 155 s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) { 156 return []string{}, nil 157 }) 158 _, testCreate := backups.NewTestCreate(nil) 159 s.PatchValue(backups.RunCreate, testCreate) 160 s.PatchValue(backups.FinishMeta, backups.NewTestMetaFinisher("failed!")) 161 162 s.checkFailure(c, "while updating metadata: failed!") 163 } 164 165 func (s *backupsSuite) TestCreateFailToStoreArchive(c *gc.C) { 166 s.PatchValue(backups.TestGetFilesToBackUp, func(root string, paths *backups.Paths, oldmachine string) ([]string, error) { 167 return []string{}, nil 168 }) 169 _, testCreate := backups.NewTestCreate(nil) 170 s.PatchValue(backups.RunCreate, testCreate) 171 s.PatchValue(backups.FinishMeta, backups.NewTestMetaFinisher("")) 172 s.PatchValue(backups.StoreArchiveRef, backups.NewTestArchiveStorer("failed!")) 173 174 s.checkFailure(c, "while storing backup archive: failed!") 175 } 176 177 func (s *backupsSuite) TestStoreArchive(c *gc.C) { 178 stored := s.setStored("spam") 179 180 meta := backupstesting.NewMetadataStarted() 181 c.Assert(meta.ID(), gc.Equals, "") 182 c.Assert(meta.Stored(), gc.IsNil) 183 archive := &bytes.Buffer{} 184 err := backups.StoreArchive(s.Storage, meta, archive) 185 c.Assert(err, jc.ErrorIsNil) 186 187 s.Storage.CheckCalled(c, "spam", meta, archive, "Add", "Metadata") 188 c.Assert(meta.ID(), gc.Equals, "spam") 189 c.Assert(meta.Stored(), jc.DeepEquals, stored) 190 }