OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package cipd | |
6 | |
7 import ( | |
8 "bytes" | |
9 "io" | |
10 "io/ioutil" | |
11 "os" | |
12 "testing" | |
13 | |
14 . "github.com/smartystreets/goconvey/convey" | |
15 ) | |
16 | |
17 func TestPackageReading(t *testing.T) { | |
18 goodManifest := `{ | |
19 "format_version": "1", | |
20 "package_name": "testing" | |
21 }` | |
22 | |
23 Convey("Open empty package works", t, func() { | |
24 // Build an empty package. | |
25 out := bytes.Buffer{} | |
26 err := BuildInstance(BuildInstanceOptions{ | |
27 Output: &out, | |
28 PackageName: "testing", | |
29 }) | |
30 So(err, ShouldBeNil) | |
31 | |
32 // Open it. | |
33 inst, err := OpenInstance(bytes.NewReader(out.Bytes()), "") | |
34 if inst != nil { | |
35 defer inst.Close() | |
36 } | |
37 So(inst, ShouldNotBeNil) | |
38 So(err, ShouldBeNil) | |
39 So(inst.PackageName(), ShouldEqual, "testing") | |
40 So(inst.InstanceID(), ShouldEqual, "23f2c4900785ac8faa2f38e47392
5b840e574ccc") | |
41 So(len(inst.Files()), ShouldEqual, 1) | |
42 | |
43 // Contains single manifest file. | |
44 f := inst.Files()[0] | |
45 So(f.Name(), ShouldEqual, ".cipdpkg/manifest.json") | |
46 So(f.Size(), ShouldEqual, uint64(len(goodManifest))) | |
47 So(f.Executable(), ShouldBeFalse) | |
48 r, err := f.Open() | |
49 if r != nil { | |
50 defer r.Close() | |
51 } | |
52 So(err, ShouldBeNil) | |
53 manifest, err := ioutil.ReadAll(r) | |
54 So(err, ShouldBeNil) | |
55 So(string(manifest), ShouldEqual, goodManifest) | |
56 }) | |
57 | |
58 Convey("Open empty package with unexpected instance ID", t, func() { | |
59 // Build an empty package. | |
60 out := bytes.Buffer{} | |
61 err := BuildInstance(BuildInstanceOptions{ | |
62 Output: &out, | |
63 PackageName: "testing", | |
64 }) | |
65 So(err, ShouldBeNil) | |
66 | |
67 // Attempt to open it, providing correct instance ID, should wor
k. | |
68 source := bytes.NewReader(out.Bytes()) | |
69 inst, err := OpenInstance(source, "23f2c4900785ac8faa2f38e473925
b840e574ccc") | |
70 So(err, ShouldBeNil) | |
71 So(inst, ShouldNotBeNil) | |
72 inst.Close() | |
73 | |
74 // Attempt to open it, providing incorrect instance ID. | |
75 inst, err = OpenInstance(source, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaa") | |
76 So(err, ShouldNotBeNil) | |
77 So(inst, ShouldBeNil) | |
78 }) | |
79 | |
80 Convey("OpenInstanceFile works", t, func() { | |
81 // Open temp file. | |
82 tempFile, err := ioutil.TempFile("", "cipdtest") | |
83 So(err, ShouldBeNil) | |
84 tempFilePath := tempFile.Name() | |
85 defer os.Remove(tempFilePath) | |
86 | |
87 // Write empty package to it. | |
88 err = BuildInstance(BuildInstanceOptions{ | |
89 Output: tempFile, | |
90 PackageName: "testing", | |
91 }) | |
92 So(err, ShouldBeNil) | |
93 tempFile.Close() | |
94 | |
95 // Read the package. | |
96 inst, err := OpenInstanceFile(tempFilePath, "") | |
97 if inst != nil { | |
98 defer inst.Close() | |
99 } | |
100 So(inst, ShouldNotBeNil) | |
101 So(err, ShouldBeNil) | |
102 }) | |
103 | |
104 Convey("ExtractInstance works", t, func() { | |
105 // Add a bunch of files to a package. | |
106 out := bytes.Buffer{} | |
107 err := BuildInstance(BuildInstanceOptions{ | |
108 Input: []File{ | |
109 makeTestFile("testing/qwerty", "12345", false), | |
110 makeTestFile("abc", "duh", true), | |
111 makeTestSymlink("rel_symlink", "abc"), | |
112 makeTestSymlink("abs_symlink", "/abc/def"), | |
113 }, | |
114 Output: &out, | |
115 PackageName: "testing", | |
116 }) | |
117 So(err, ShouldBeNil) | |
118 | |
119 // Extract files. | |
120 inst, err := OpenInstance(bytes.NewReader(out.Bytes()), "") | |
121 if inst != nil { | |
122 defer inst.Close() | |
123 } | |
124 So(err, ShouldBeNil) | |
125 dest := &testDestination{} | |
126 err = ExtractInstance(inst, dest) | |
127 So(err, ShouldBeNil) | |
128 So(dest.beginCalls, ShouldEqual, 1) | |
129 So(dest.endCalls, ShouldEqual, 1) | |
130 | |
131 // Verify file list, file data and flags are correct. | |
132 names := []string{} | |
133 for _, f := range dest.files { | |
134 names = append(names, f.name) | |
135 } | |
136 So(names, ShouldResemble, []string{ | |
137 "testing/qwerty", | |
138 "abc", | |
139 "rel_symlink", | |
140 "abs_symlink", | |
141 ".cipdpkg/manifest.json", | |
142 }) | |
143 So(string(dest.files[0].Bytes()), ShouldEqual, "12345") | |
144 So(dest.files[1].executable, ShouldBeTrue) | |
145 So(dest.files[2].symlinkTarget, ShouldEqual, "abc") | |
146 So(dest.files[3].symlinkTarget, ShouldEqual, "/abc/def") | |
147 }) | |
148 } | |
149 | |
150 //////////////////////////////////////////////////////////////////////////////// | |
151 | |
152 type testDestination struct { | |
153 beginCalls int | |
154 endCalls int | |
155 files []*testDestinationFile | |
156 } | |
157 | |
158 type testDestinationFile struct { | |
159 bytes.Buffer | |
160 name string | |
161 executable bool | |
162 symlinkTarget string | |
163 } | |
164 | |
165 func (d *testDestinationFile) Close() error { return nil } | |
166 | |
167 func (d *testDestination) Begin() error { | |
168 d.beginCalls++ | |
169 return nil | |
170 } | |
171 | |
172 func (d *testDestination) CreateFile(name string, executable bool) (io.WriteClos
er, error) { | |
173 f := &testDestinationFile{ | |
174 name: name, | |
175 executable: executable, | |
176 } | |
177 d.files = append(d.files, f) | |
178 return f, nil | |
179 } | |
180 | |
181 func (d *testDestination) CreateSymlink(name string, target string) error { | |
182 f := &testDestinationFile{ | |
183 name: name, | |
184 symlinkTarget: target, | |
185 } | |
186 d.files = append(d.files, f) | |
187 return nil | |
188 } | |
189 | |
190 func (d *testDestination) End(success bool) error { | |
191 d.endCalls++ | |
192 return nil | |
193 } | |
OLD | NEW |