github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/backups/archive_data_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package backups_test 5 6 import ( 7 "bytes" 8 "compress/gzip" 9 "io" 10 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/state/backups" 16 bt "github.com/juju/juju/state/backups/testing" 17 ) 18 19 type archiveDataSuiteV0 struct { 20 testing.IsolationSuite 21 baseArchiveDataSuite 22 } 23 24 var _ = gc.Suite(&archiveDataSuiteV0{}) 25 var _ = gc.Suite(&archiveDataSuite{}) 26 27 func (s *archiveDataSuiteV0) SetUpTest(c *gc.C) { 28 s.IsolationSuite.SetUpTest(c) 29 s.baseArchiveDataSuite.setupMetadata(c, testMetadataV0) 30 } 31 32 func newArchiveFile(c *gc.C, meta *backups.Metadata) io.Reader { 33 files := []bt.File{ 34 { 35 Name: "var/lib/juju/tools/1.21-alpha2.1-trusty-amd64/jujud", 36 Content: "<some binary data goes here>", 37 }, 38 { 39 Name: "var/lib/juju/system-identity", 40 Content: "<an ssh key goes here>", 41 }, 42 } 43 dump := []bt.File{ 44 { 45 Name: "juju", 46 IsDir: true, 47 }, 48 { 49 Name: "juju/machines.bson", 50 Content: "<BSON data goes here>", 51 }, 52 { 53 Name: "oplog.bson", 54 Content: "<BSON data goes here>", 55 }, 56 } 57 var archiveFile io.Reader 58 var err error 59 if meta != nil && meta.FormatVersion == 0 { 60 archiveFile, err = bt.NewArchiveV0(meta, files, dump) 61 } else { 62 archiveFile, err = bt.NewArchive(meta, files, dump) 63 } 64 c.Assert(err, jc.ErrorIsNil) 65 return archiveFile 66 } 67 68 func (s *archiveDataSuiteV0) TestNewArchiveData(c *gc.C) { 69 ad := backups.NewArchiveData([]byte("<uncompressed>")) 70 data := ad.NewBuffer().String() 71 72 c.Check(ad.ContentDir, gc.Equals, "juju-backup") 73 c.Check(data, gc.Equals, "<uncompressed>") 74 } 75 76 func (s *archiveDataSuiteV0) TestNewArchiveDataReader(c *gc.C) { 77 ad, err := backups.NewArchiveDataReader(s.archiveFile) 78 c.Assert(err, jc.ErrorIsNil) 79 data := ad.NewBuffer().Bytes() 80 81 c.Check(ad.ContentDir, gc.Equals, "juju-backup") 82 c.Check(data, jc.DeepEquals, s.data) 83 } 84 85 func (s *archiveDataSuiteV0) TestNewBuffer(c *gc.C) { 86 ad, err := backups.NewArchiveDataReader(s.archiveFile) 87 c.Assert(err, jc.ErrorIsNil) 88 buf := ad.NewBuffer() 89 90 c.Check(buf.Bytes(), jc.DeepEquals, s.data) 91 } 92 93 func (s *archiveDataSuiteV0) TestNewBufferMultiple(c *gc.C) { 94 ad, err := backups.NewArchiveDataReader(s.archiveFile) 95 c.Assert(err, jc.ErrorIsNil) 96 97 buf1 := ad.NewBuffer() 98 buf2 := ad.NewBuffer() 99 100 c.Check(buf2, gc.Not(gc.Equals), buf1) 101 c.Check(buf2.Bytes(), jc.DeepEquals, buf1.Bytes()) 102 } 103 104 func (s *archiveDataSuiteV0) TestMetadata(c *gc.C) { 105 ad, err := backups.NewArchiveDataReader(s.archiveFile) 106 c.Assert(err, jc.ErrorIsNil) 107 108 meta, err := ad.Metadata() 109 c.Assert(err, jc.ErrorIsNil) 110 c.Check(meta, jc.DeepEquals, s.meta) 111 } 112 113 func (s *archiveDataSuiteV0) TestVersionFound(c *gc.C) { 114 ad, err := backups.NewArchiveDataReader(s.archiveFile) 115 c.Assert(err, jc.ErrorIsNil) 116 117 version, err := ad.Version() 118 c.Assert(err, jc.ErrorIsNil) 119 120 c.Check(version, jc.DeepEquals, &s.meta.Origin.Version) 121 } 122 123 func (s *archiveDataSuiteV0) TestVersionNotFound(c *gc.C) { 124 archiveFile := newArchiveFile(c, nil) 125 ad, err := backups.NewArchiveDataReader(archiveFile) 126 c.Assert(err, jc.ErrorIsNil) 127 128 version, err := ad.Version() 129 c.Assert(err, jc.ErrorIsNil) 130 131 c.Check(version.String(), jc.DeepEquals, "1.20.0") 132 } 133 134 type baseArchiveDataSuite struct { 135 archiveFile *bytes.Buffer 136 data []byte 137 meta *backups.Metadata 138 } 139 140 const ( 141 testMetadataV0 = `{` + 142 `"ID":"20140909-115934.asdf-zxcv-qwe",` + 143 `"Checksum":"123af2cef",` + 144 `"ChecksumFormat":"SHA-1, base64 encoded",` + 145 `"Size":10,` + 146 `"Stored":"0001-01-01T00:00:00Z",` + 147 `"Started":"2014-09-09T11:59:34Z",` + 148 `"Finished":"2014-09-09T12:00:34Z",` + 149 `"Notes":"",` + 150 `"Environment":"asdf-zxcv-qwe",` + 151 `"Machine":"0",` + 152 `"Hostname":"myhost",` + 153 `"Version":"1.21-alpha3"` + 154 `}` + "\n" 155 156 testMetadataV1 = `{` + 157 `"ID":"20140909-115934.asdf-zxcv-qwe",` + 158 `"FormatVersion":1,` + 159 `"Checksum":"123af2cef",` + 160 `"ChecksumFormat":"SHA-1, base64 encoded",` + 161 `"Size":10,` + 162 `"Stored":"0001-01-01T00:00:00Z",` + 163 `"Started":"2014-09-09T11:59:34Z",` + 164 `"Finished":"2014-09-09T12:00:34Z",` + 165 `"Notes":"",` + 166 `"ModelUUID":"asdf-zxcv-qwe",` + 167 `"Machine":"0",` + 168 `"Hostname":"myhost",` + 169 `"Version":"1.21-alpha3",` + 170 `"ControllerUUID":"controller-uuid",` + 171 `"HANodes":3,` + 172 `"ControllerMachineID":"10",` + 173 `"ControllerMachineInstanceID":"inst-10101010"` + 174 `}` + "\n" 175 ) 176 177 func (s *baseArchiveDataSuite) setupMetadata(c *gc.C, metadata string) { 178 meta, err := backups.NewMetadataJSONReader(bytes.NewBufferString(metadata)) 179 c.Assert(err, jc.ErrorIsNil) 180 181 archiveFile := newArchiveFile(c, meta) 182 compressed, err := io.ReadAll(archiveFile) 183 c.Assert(err, jc.ErrorIsNil) 184 gzr, err := gzip.NewReader(bytes.NewBuffer(compressed)) 185 c.Assert(err, jc.ErrorIsNil) 186 data, err := io.ReadAll(gzr) 187 c.Assert(err, jc.ErrorIsNil) 188 189 s.archiveFile = bytes.NewBuffer(compressed) 190 s.data = data 191 s.meta = meta 192 } 193 194 type archiveDataSuite struct { 195 archiveDataSuiteV0 196 } 197 198 func (s *archiveDataSuite) SetUpTest(c *gc.C) { 199 s.archiveDataSuiteV0.SetUpTest(c) 200 s.setupMetadata(c, testMetadataV1) 201 }