github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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 "io" 9 "io/ioutil" 10 "os" 11 "strings" 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 "github.com/juju/juju/apiserver/params" 20 "github.com/juju/juju/cmd/juju/backups" 21 jujutesting "github.com/juju/juju/testing" 22 ) 23 24 // MetaResultString is the expected output of running dumpMetadata() on 25 // s.metaresult. 26 var MetaResultString = ` 27 backup ID: "spam" 28 checksum: "" 29 checksum format: "" 30 size (B): 0 31 stored: 0001-01-01 00:00:00 +0000 UTC 32 started: 0001-01-01 00:00:00 +0000 UTC 33 finished: 0001-01-01 00:00:00 +0000 UTC 34 notes: "" 35 environment ID: "" 36 machine ID: "" 37 created on host: "" 38 juju version: 0.0.0 39 `[1:] 40 41 func TestPackage(t *testing.T) { 42 gc.TestingT(t) 43 } 44 45 type BaseBackupsSuite struct { 46 jujutesting.FakeJujuHomeSuite 47 48 command *backups.Command 49 metaresult *params.BackupsMetadataResult 50 data string 51 52 filename string 53 } 54 55 func (s *BaseBackupsSuite) SetUpTest(c *gc.C) { 56 s.FakeJujuHomeSuite.SetUpTest(c) 57 58 s.command = backups.NewCommand().(*backups.Command) 59 s.metaresult = ¶ms.BackupsMetadataResult{ 60 ID: "spam", 61 } 62 s.data = "<compressed archive data>" 63 } 64 65 func (s *BaseBackupsSuite) TearDownTest(c *gc.C) { 66 if s.filename != "" { 67 err := os.Remove(s.filename) 68 if !os.IsNotExist(err) { 69 c.Check(err, jc.ErrorIsNil) 70 } 71 } 72 73 s.FakeJujuHomeSuite.TearDownTest(c) 74 } 75 76 func (s *BaseBackupsSuite) patchAPIClient(client backups.APIClient) { 77 s.PatchValue(backups.NewAPIClient, 78 func(c *backups.CommandBase) (backups.APIClient, error) { 79 return client, nil 80 }, 81 ) 82 } 83 84 func (s *BaseBackupsSuite) setSuccess() *fakeAPIClient { 85 client := &fakeAPIClient{metaresult: s.metaresult} 86 s.patchAPIClient(client) 87 return client 88 } 89 90 func (s *BaseBackupsSuite) setFailure(failure string) *fakeAPIClient { 91 client := &fakeAPIClient{err: errors.New(failure)} 92 s.patchAPIClient(client) 93 return client 94 } 95 96 func (s *BaseBackupsSuite) setDownload() *fakeAPIClient { 97 client := s.setSuccess() 98 client.archive = ioutil.NopCloser(bytes.NewBufferString(s.data)) 99 return client 100 } 101 102 func (s *BaseBackupsSuite) checkArchive(c *gc.C) { 103 c.Assert(s.filename, gc.Not(gc.Equals), "") 104 archive, err := os.Open(s.filename) 105 c.Assert(err, jc.ErrorIsNil) 106 defer archive.Close() 107 108 data, err := ioutil.ReadAll(archive) 109 c.Check(string(data), gc.Equals, s.data) 110 } 111 112 func (s *BaseBackupsSuite) diffStrings(c *gc.C, value, expected string) { 113 // If only Go had a diff library. 114 vlines := strings.Split(value, "\n") 115 elines := strings.Split(expected, "\n") 116 vsize := len(vlines) 117 esize := len(elines) 118 119 if vsize < 2 || esize < 2 { 120 return 121 } 122 123 smaller := elines 124 if vsize < esize { 125 smaller = vlines 126 } 127 128 for i := range smaller { 129 vline := vlines[i] 130 eline := elines[i] 131 if vline != eline { 132 c.Log("first mismatched line:") 133 c.Log("expected: " + eline) 134 c.Log("got: " + vline) 135 break 136 } 137 } 138 139 } 140 141 func (s *BaseBackupsSuite) checkString(c *gc.C, value, expected string) { 142 if !c.Check(value, gc.Equals, expected) { 143 s.diffStrings(c, value, expected) 144 } 145 } 146 147 func (s *BaseBackupsSuite) checkStd(c *gc.C, ctx *cmd.Context, out, err string) { 148 c.Check(ctx.Stdin.(*bytes.Buffer).String(), gc.Equals, "") 149 s.checkString(c, ctx.Stdout.(*bytes.Buffer).String(), out) 150 s.checkString(c, ctx.Stderr.(*bytes.Buffer).String(), err) 151 } 152 153 type fakeAPIClient struct { 154 metaresult *params.BackupsMetadataResult 155 archive io.ReadCloser 156 err error 157 158 calls []string 159 args []string 160 idArg string 161 notes string 162 } 163 164 func (f *fakeAPIClient) Check(c *gc.C, id, notes string, calls ...string) { 165 c.Check(f.calls, jc.DeepEquals, calls) 166 c.Check(f.idArg, gc.Equals, id) 167 c.Check(f.notes, gc.Equals, notes) 168 } 169 170 func (c *fakeAPIClient) Create(notes string) (*params.BackupsMetadataResult, error) { 171 c.calls = append(c.calls, "Create") 172 c.args = append(c.args, "notes") 173 c.notes = notes 174 if c.err != nil { 175 return nil, c.err 176 } 177 return c.metaresult, nil 178 } 179 180 func (c *fakeAPIClient) Info(id string) (*params.BackupsMetadataResult, error) { 181 c.calls = append(c.calls, "Info") 182 c.args = append(c.args, "id") 183 c.idArg = id 184 if c.err != nil { 185 return nil, c.err 186 } 187 return c.metaresult, nil 188 } 189 190 func (c *fakeAPIClient) List() (*params.BackupsListResult, error) { 191 c.calls = append(c.calls, "List") 192 if c.err != nil { 193 return nil, c.err 194 } 195 var result params.BackupsListResult 196 result.List = []params.BackupsMetadataResult{*c.metaresult} 197 return &result, nil 198 } 199 200 func (c *fakeAPIClient) Download(id string) (io.ReadCloser, error) { 201 c.calls = append(c.calls, "Download") 202 c.args = append(c.args, "id") 203 c.idArg = id 204 if c.err != nil { 205 return nil, c.err 206 } 207 return c.archive, nil 208 } 209 210 func (c *fakeAPIClient) Upload(ar io.Reader, meta params.BackupsMetadataResult) (string, error) { 211 c.args = append(c.args, "ar", "meta") 212 if c.err != nil { 213 return "", c.err 214 } 215 return c.metaresult.ID, nil 216 } 217 218 func (c *fakeAPIClient) Remove(id string) error { 219 c.calls = append(c.calls, "Remove") 220 c.args = append(c.args, "id") 221 c.idArg = id 222 if c.err != nil { 223 return c.err 224 } 225 return nil 226 } 227 228 func (c *fakeAPIClient) Close() error { 229 return nil 230 }