github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/backups/package_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 "fmt" 9 "io" 10 "io/ioutil" 11 "os" 12 "testing" 13 14 "github.com/juju/cmd" 15 "github.com/juju/errors" 16 jc "github.com/juju/testing/checkers" 17 gc "gopkg.in/check.v1" 18 19 apibackups "github.com/juju/juju/api/backups" 20 "github.com/juju/juju/apiserver/params" 21 "github.com/juju/juju/cmd/juju/backups" 22 jujutesting "github.com/juju/juju/testing" 23 ) 24 25 // MetaResultString is the expected output of running dumpMetadata() on 26 // s.metaresult. 27 var MetaResultString = ` 28 backup ID: "spam" 29 checksum: "" 30 checksum format: "" 31 size (B): 0 32 stored: 0001-01-01 00:00:00 +0000 UTC 33 started: 0001-01-01 00:00:00 +0000 UTC 34 finished: 0001-01-01 00:00:00 +0000 UTC 35 notes: "" 36 model ID: "" 37 machine ID: "" 38 created on host: "" 39 juju version: 0.0.0 40 `[1:] 41 42 func TestPackage(t *testing.T) { 43 gc.TestingT(t) 44 } 45 46 type BaseBackupsSuite struct { 47 jujutesting.FakeJujuXDGDataHomeSuite 48 49 command cmd.Command 50 metaresult *params.BackupsMetadataResult 51 data string 52 apiVersion int 53 54 filename string 55 } 56 57 func (s *BaseBackupsSuite) SetUpTest(c *gc.C) { 58 s.FakeJujuXDGDataHomeSuite.SetUpTest(c) 59 60 s.metaresult = ¶ms.BackupsMetadataResult{ 61 ID: "spam", 62 Filename: "filename", 63 } 64 s.data = "<compressed archive data>" 65 66 s.apiVersion = 2 67 } 68 69 func (s *BaseBackupsSuite) TearDownTest(c *gc.C) { 70 if s.filename != "" { 71 err := os.Remove(s.filename) 72 if !os.IsNotExist(err) { 73 c.Check(err, jc.ErrorIsNil) 74 } 75 } 76 77 s.FakeJujuXDGDataHomeSuite.TearDownTest(c) 78 } 79 80 func (s *BaseBackupsSuite) patchAPIClient(client backups.APIClient) { 81 s.PatchValue(backups.NewAPIClient, 82 func(c *backups.CommandBase) (backups.APIClient, error) { 83 return client, nil 84 }, 85 ) 86 } 87 88 func (s *BaseBackupsSuite) patchGetAPI(client backups.APIClient) { 89 s.PatchValue(backups.NewGetAPI, 90 func(c *backups.CommandBase) (backups.APIClient, int, error) { 91 return client, s.apiVersion, nil 92 }, 93 ) 94 } 95 96 func (s *BaseBackupsSuite) setSuccess() *fakeAPIClient { 97 client := &fakeAPIClient{metaresult: s.metaresult} 98 s.patchAPIClient(client) 99 return client 100 } 101 102 func (s *BaseBackupsSuite) setFailure(failure string) *fakeAPIClient { 103 client := &fakeAPIClient{err: errors.New(failure)} 104 s.patchAPIClient(client) 105 return client 106 } 107 108 func (s *BaseBackupsSuite) setDownload() *fakeAPIClient { 109 client := s.setSuccess() 110 client.archive = ioutil.NopCloser(bytes.NewBufferString(s.data)) 111 return client 112 } 113 114 func (s *BaseBackupsSuite) checkArchive(c *gc.C) { 115 c.Assert(s.filename, gc.Not(gc.Equals), "") 116 archive, err := os.Open(s.filename) 117 c.Assert(err, jc.ErrorIsNil) 118 defer archive.Close() 119 120 // Test file created successfully. Clean it up after the test is run. 121 s.AddCleanup(func(c *gc.C) { 122 err := os.Remove(s.filename) 123 if !os.IsNotExist(err) { 124 c.Fatalf("could not remove test file %v: %v", s.filename, err) 125 } 126 }) 127 128 data, err := ioutil.ReadAll(archive) 129 c.Check(string(data), gc.Equals, s.data) 130 } 131 132 func (s *BaseBackupsSuite) checkStd(c *gc.C, ctx *cmd.Context, out, err string) { 133 c.Check(ctx.Stdin.(*bytes.Buffer).Len(), gc.Equals, 0) 134 jujutesting.CheckString(c, ctx.Stdout.(*bytes.Buffer).String(), out) 135 jujutesting.CheckString(c, ctx.Stderr.(*bytes.Buffer).String(), err) 136 } 137 138 // TODO (hml) 2018-05-01 139 // Replace this fakeAPIClient with MockAPIClient for all tests. 140 type fakeAPIClient struct { 141 metaresult *params.BackupsMetadataResult 142 archive io.ReadCloser 143 err error 144 145 calls []string 146 args []string 147 idArg string 148 notes string 149 } 150 151 func (f *fakeAPIClient) Check(c *gc.C, id, notes string, calls ...string) { 152 c.Check(f.calls, jc.DeepEquals, calls) 153 c.Check(f.idArg, gc.Equals, id) 154 c.Check(f.notes, gc.Equals, notes) 155 } 156 157 func (f *fakeAPIClient) CheckCalls(c *gc.C, calls ...string) { 158 c.Check(f.calls, jc.DeepEquals, calls) 159 } 160 161 func (f *fakeAPIClient) CheckArgs(c *gc.C, args ...string) { 162 c.Check(f.args, jc.DeepEquals, args) 163 } 164 165 func (c *fakeAPIClient) Create(notes string, keepCopy, noDownload bool) (*params.BackupsMetadataResult, error) { 166 c.calls = append(c.calls, "Create") 167 c.args = append(c.args, notes, fmt.Sprintf("%t", keepCopy), fmt.Sprintf("%t", noDownload)) 168 c.notes = notes 169 if c.err != nil { 170 return nil, c.err 171 } 172 createResult := c.metaresult 173 174 return createResult, nil 175 } 176 177 func (c *fakeAPIClient) Info(id string) (*params.BackupsMetadataResult, error) { 178 c.calls = append(c.calls, "Info") 179 c.args = append(c.args, id) 180 c.idArg = id 181 if c.err != nil { 182 return nil, c.err 183 } 184 return c.metaresult, nil 185 } 186 187 func (c *fakeAPIClient) List() (*params.BackupsListResult, error) { 188 c.calls = append(c.calls, "List") 189 if c.err != nil { 190 return nil, c.err 191 } 192 var result params.BackupsListResult 193 result.List = []params.BackupsMetadataResult{*c.metaresult} 194 return &result, nil 195 } 196 197 func (c *fakeAPIClient) Download(id string) (io.ReadCloser, error) { 198 c.calls = append(c.calls, "Download") 199 c.args = append(c.args, id) 200 if c.err != nil { 201 return nil, c.err 202 } 203 return c.archive, nil 204 } 205 206 func (c *fakeAPIClient) Upload(ar io.ReadSeeker, meta params.BackupsMetadataResult) (string, error) { 207 c.args = append(c.args, "ar", "meta") 208 if c.err != nil { 209 return "", c.err 210 } 211 return c.metaresult.ID, nil 212 } 213 214 func (c *fakeAPIClient) Remove(id ...string) ([]params.ErrorResult, error) { 215 c.calls = append(c.calls, "Remove") 216 c.args = append(c.args, "id") 217 c.idArg = id[0] 218 if c.err != nil { 219 return []params.ErrorResult{ 220 {Error: ¶ms.Error{Message: c.err.Error()}}, 221 }, nil 222 } 223 return nil, nil 224 } 225 226 func (c *fakeAPIClient) Close() error { 227 return nil 228 } 229 230 func (c *fakeAPIClient) RestoreReader(io.ReadSeeker, *params.BackupsMetadataResult, apibackups.ClientConnection) error { 231 return nil 232 } 233 234 func (c *fakeAPIClient) Restore(string, apibackups.ClientConnection) error { 235 return nil 236 }