xref: /aosp_15_r20/build/soong/cmd/zip2zip/zip2zip_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage main
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"bytes"
19*333d2b36SAndroid Build Coastguard Worker	"fmt"
20*333d2b36SAndroid Build Coastguard Worker	"reflect"
21*333d2b36SAndroid Build Coastguard Worker	"testing"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/third_party/zip"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workervar testCases = []struct {
27*333d2b36SAndroid Build Coastguard Worker	name string
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Worker	inputFiles   []string
30*333d2b36SAndroid Build Coastguard Worker	sortGlobs    bool
31*333d2b36SAndroid Build Coastguard Worker	sortJava     bool
32*333d2b36SAndroid Build Coastguard Worker	args         []string
33*333d2b36SAndroid Build Coastguard Worker	excludes     []string
34*333d2b36SAndroid Build Coastguard Worker	includes     []string
35*333d2b36SAndroid Build Coastguard Worker	uncompresses []string
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Worker	outputFiles []string
38*333d2b36SAndroid Build Coastguard Worker	storedFiles []string
39*333d2b36SAndroid Build Coastguard Worker	err         error
40*333d2b36SAndroid Build Coastguard Worker}{
41*333d2b36SAndroid Build Coastguard Worker	{ // This is modelled after the update package build rules in build/make/core/Makefile
42*333d2b36SAndroid Build Coastguard Worker		name: "filter globs",
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
45*333d2b36SAndroid Build Coastguard Worker			"RADIO/a",
46*333d2b36SAndroid Build Coastguard Worker			"IMAGES/system.img",
47*333d2b36SAndroid Build Coastguard Worker			"IMAGES/b.txt",
48*333d2b36SAndroid Build Coastguard Worker			"IMAGES/recovery.img",
49*333d2b36SAndroid Build Coastguard Worker			"IMAGES/vendor.img",
50*333d2b36SAndroid Build Coastguard Worker			"OTA/android-info.txt",
51*333d2b36SAndroid Build Coastguard Worker			"OTA/b",
52*333d2b36SAndroid Build Coastguard Worker		},
53*333d2b36SAndroid Build Coastguard Worker		args: []string{"OTA/android-info.txt:android-info.txt", "IMAGES/*.img:."},
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
56*333d2b36SAndroid Build Coastguard Worker			"android-info.txt",
57*333d2b36SAndroid Build Coastguard Worker			"system.img",
58*333d2b36SAndroid Build Coastguard Worker			"recovery.img",
59*333d2b36SAndroid Build Coastguard Worker			"vendor.img",
60*333d2b36SAndroid Build Coastguard Worker		},
61*333d2b36SAndroid Build Coastguard Worker	},
62*333d2b36SAndroid Build Coastguard Worker	{
63*333d2b36SAndroid Build Coastguard Worker		name: "sorted filter globs",
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
66*333d2b36SAndroid Build Coastguard Worker			"RADIO/a",
67*333d2b36SAndroid Build Coastguard Worker			"IMAGES/system.img",
68*333d2b36SAndroid Build Coastguard Worker			"IMAGES/b.txt",
69*333d2b36SAndroid Build Coastguard Worker			"IMAGES/recovery.img",
70*333d2b36SAndroid Build Coastguard Worker			"IMAGES/vendor.img",
71*333d2b36SAndroid Build Coastguard Worker			"OTA/android-info.txt",
72*333d2b36SAndroid Build Coastguard Worker			"OTA/b",
73*333d2b36SAndroid Build Coastguard Worker		},
74*333d2b36SAndroid Build Coastguard Worker		sortGlobs: true,
75*333d2b36SAndroid Build Coastguard Worker		args:      []string{"IMAGES/*.img:.", "OTA/android-info.txt:android-info.txt"},
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
78*333d2b36SAndroid Build Coastguard Worker			"recovery.img",
79*333d2b36SAndroid Build Coastguard Worker			"system.img",
80*333d2b36SAndroid Build Coastguard Worker			"vendor.img",
81*333d2b36SAndroid Build Coastguard Worker			"android-info.txt",
82*333d2b36SAndroid Build Coastguard Worker		},
83*333d2b36SAndroid Build Coastguard Worker	},
84*333d2b36SAndroid Build Coastguard Worker	{
85*333d2b36SAndroid Build Coastguard Worker		name: "sort all",
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
88*333d2b36SAndroid Build Coastguard Worker			"RADIO/",
89*333d2b36SAndroid Build Coastguard Worker			"RADIO/a",
90*333d2b36SAndroid Build Coastguard Worker			"IMAGES/",
91*333d2b36SAndroid Build Coastguard Worker			"IMAGES/system.img",
92*333d2b36SAndroid Build Coastguard Worker			"IMAGES/b.txt",
93*333d2b36SAndroid Build Coastguard Worker			"IMAGES/recovery.img",
94*333d2b36SAndroid Build Coastguard Worker			"IMAGES/vendor.img",
95*333d2b36SAndroid Build Coastguard Worker			"OTA/",
96*333d2b36SAndroid Build Coastguard Worker			"OTA/b",
97*333d2b36SAndroid Build Coastguard Worker			"OTA/android-info.txt",
98*333d2b36SAndroid Build Coastguard Worker		},
99*333d2b36SAndroid Build Coastguard Worker		sortGlobs: true,
100*333d2b36SAndroid Build Coastguard Worker		args:      []string{"**/*"},
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
103*333d2b36SAndroid Build Coastguard Worker			"IMAGES/b.txt",
104*333d2b36SAndroid Build Coastguard Worker			"IMAGES/recovery.img",
105*333d2b36SAndroid Build Coastguard Worker			"IMAGES/system.img",
106*333d2b36SAndroid Build Coastguard Worker			"IMAGES/vendor.img",
107*333d2b36SAndroid Build Coastguard Worker			"OTA/android-info.txt",
108*333d2b36SAndroid Build Coastguard Worker			"OTA/b",
109*333d2b36SAndroid Build Coastguard Worker			"RADIO/a",
110*333d2b36SAndroid Build Coastguard Worker		},
111*333d2b36SAndroid Build Coastguard Worker	},
112*333d2b36SAndroid Build Coastguard Worker	{
113*333d2b36SAndroid Build Coastguard Worker		name: "sort all implicit",
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
116*333d2b36SAndroid Build Coastguard Worker			"RADIO/",
117*333d2b36SAndroid Build Coastguard Worker			"RADIO/a",
118*333d2b36SAndroid Build Coastguard Worker			"IMAGES/",
119*333d2b36SAndroid Build Coastguard Worker			"IMAGES/system.img",
120*333d2b36SAndroid Build Coastguard Worker			"IMAGES/b.txt",
121*333d2b36SAndroid Build Coastguard Worker			"IMAGES/recovery.img",
122*333d2b36SAndroid Build Coastguard Worker			"IMAGES/vendor.img",
123*333d2b36SAndroid Build Coastguard Worker			"OTA/",
124*333d2b36SAndroid Build Coastguard Worker			"OTA/b",
125*333d2b36SAndroid Build Coastguard Worker			"OTA/android-info.txt",
126*333d2b36SAndroid Build Coastguard Worker		},
127*333d2b36SAndroid Build Coastguard Worker		sortGlobs: true,
128*333d2b36SAndroid Build Coastguard Worker		args:      nil,
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
131*333d2b36SAndroid Build Coastguard Worker			"IMAGES/",
132*333d2b36SAndroid Build Coastguard Worker			"IMAGES/b.txt",
133*333d2b36SAndroid Build Coastguard Worker			"IMAGES/recovery.img",
134*333d2b36SAndroid Build Coastguard Worker			"IMAGES/system.img",
135*333d2b36SAndroid Build Coastguard Worker			"IMAGES/vendor.img",
136*333d2b36SAndroid Build Coastguard Worker			"OTA/",
137*333d2b36SAndroid Build Coastguard Worker			"OTA/android-info.txt",
138*333d2b36SAndroid Build Coastguard Worker			"OTA/b",
139*333d2b36SAndroid Build Coastguard Worker			"RADIO/",
140*333d2b36SAndroid Build Coastguard Worker			"RADIO/a",
141*333d2b36SAndroid Build Coastguard Worker		},
142*333d2b36SAndroid Build Coastguard Worker	},
143*333d2b36SAndroid Build Coastguard Worker	{
144*333d2b36SAndroid Build Coastguard Worker		name: "sort jar",
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
147*333d2b36SAndroid Build Coastguard Worker			"MANIFEST.MF",
148*333d2b36SAndroid Build Coastguard Worker			"META-INF/MANIFEST.MF",
149*333d2b36SAndroid Build Coastguard Worker			"META-INF/aaa/",
150*333d2b36SAndroid Build Coastguard Worker			"META-INF/aaa/aaa",
151*333d2b36SAndroid Build Coastguard Worker			"META-INF/AAA",
152*333d2b36SAndroid Build Coastguard Worker			"META-INF.txt",
153*333d2b36SAndroid Build Coastguard Worker			"META-INF/",
154*333d2b36SAndroid Build Coastguard Worker			"AAA",
155*333d2b36SAndroid Build Coastguard Worker			"aaa",
156*333d2b36SAndroid Build Coastguard Worker		},
157*333d2b36SAndroid Build Coastguard Worker		sortJava: true,
158*333d2b36SAndroid Build Coastguard Worker		args:     nil,
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
161*333d2b36SAndroid Build Coastguard Worker			"META-INF/",
162*333d2b36SAndroid Build Coastguard Worker			"META-INF/MANIFEST.MF",
163*333d2b36SAndroid Build Coastguard Worker			"META-INF/AAA",
164*333d2b36SAndroid Build Coastguard Worker			"META-INF/aaa/",
165*333d2b36SAndroid Build Coastguard Worker			"META-INF/aaa/aaa",
166*333d2b36SAndroid Build Coastguard Worker			"AAA",
167*333d2b36SAndroid Build Coastguard Worker			"MANIFEST.MF",
168*333d2b36SAndroid Build Coastguard Worker			"META-INF.txt",
169*333d2b36SAndroid Build Coastguard Worker			"aaa",
170*333d2b36SAndroid Build Coastguard Worker		},
171*333d2b36SAndroid Build Coastguard Worker	},
172*333d2b36SAndroid Build Coastguard Worker	{
173*333d2b36SAndroid Build Coastguard Worker		name: "double input",
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
176*333d2b36SAndroid Build Coastguard Worker			"b",
177*333d2b36SAndroid Build Coastguard Worker			"a",
178*333d2b36SAndroid Build Coastguard Worker		},
179*333d2b36SAndroid Build Coastguard Worker		args: []string{"a:a2", "**/*"},
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
182*333d2b36SAndroid Build Coastguard Worker			"a2",
183*333d2b36SAndroid Build Coastguard Worker			"b",
184*333d2b36SAndroid Build Coastguard Worker			"a",
185*333d2b36SAndroid Build Coastguard Worker		},
186*333d2b36SAndroid Build Coastguard Worker	},
187*333d2b36SAndroid Build Coastguard Worker	{
188*333d2b36SAndroid Build Coastguard Worker		name: "multiple matches",
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
191*333d2b36SAndroid Build Coastguard Worker			"a/a",
192*333d2b36SAndroid Build Coastguard Worker		},
193*333d2b36SAndroid Build Coastguard Worker		args: []string{"a/a", "a/*"},
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
196*333d2b36SAndroid Build Coastguard Worker			"a/a",
197*333d2b36SAndroid Build Coastguard Worker		},
198*333d2b36SAndroid Build Coastguard Worker	},
199*333d2b36SAndroid Build Coastguard Worker	{
200*333d2b36SAndroid Build Coastguard Worker		name: "multiple conflicting matches",
201*333d2b36SAndroid Build Coastguard Worker
202*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
203*333d2b36SAndroid Build Coastguard Worker			"a/a",
204*333d2b36SAndroid Build Coastguard Worker			"a/b",
205*333d2b36SAndroid Build Coastguard Worker		},
206*333d2b36SAndroid Build Coastguard Worker		args: []string{"a/b:a/a", "a/*"},
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Worker		err: fmt.Errorf(`multiple entries for "a/a" with different contents`),
209*333d2b36SAndroid Build Coastguard Worker	},
210*333d2b36SAndroid Build Coastguard Worker	{
211*333d2b36SAndroid Build Coastguard Worker		name: "excludes",
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
214*333d2b36SAndroid Build Coastguard Worker			"a/a",
215*333d2b36SAndroid Build Coastguard Worker			"a/b",
216*333d2b36SAndroid Build Coastguard Worker		},
217*333d2b36SAndroid Build Coastguard Worker		args:     nil,
218*333d2b36SAndroid Build Coastguard Worker		excludes: []string{"a/a"},
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
221*333d2b36SAndroid Build Coastguard Worker			"a/b",
222*333d2b36SAndroid Build Coastguard Worker		},
223*333d2b36SAndroid Build Coastguard Worker	},
224*333d2b36SAndroid Build Coastguard Worker	{
225*333d2b36SAndroid Build Coastguard Worker		name: "excludes with args",
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
228*333d2b36SAndroid Build Coastguard Worker			"a/a",
229*333d2b36SAndroid Build Coastguard Worker			"a/b",
230*333d2b36SAndroid Build Coastguard Worker		},
231*333d2b36SAndroid Build Coastguard Worker		args:     []string{"a/*"},
232*333d2b36SAndroid Build Coastguard Worker		excludes: []string{"a/a"},
233*333d2b36SAndroid Build Coastguard Worker
234*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
235*333d2b36SAndroid Build Coastguard Worker			"a/b",
236*333d2b36SAndroid Build Coastguard Worker		},
237*333d2b36SAndroid Build Coastguard Worker	},
238*333d2b36SAndroid Build Coastguard Worker	{
239*333d2b36SAndroid Build Coastguard Worker		name: "excludes over args",
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
242*333d2b36SAndroid Build Coastguard Worker			"a/a",
243*333d2b36SAndroid Build Coastguard Worker			"a/b",
244*333d2b36SAndroid Build Coastguard Worker		},
245*333d2b36SAndroid Build Coastguard Worker		args:     []string{"a/a"},
246*333d2b36SAndroid Build Coastguard Worker		excludes: []string{"a/*"},
247*333d2b36SAndroid Build Coastguard Worker
248*333d2b36SAndroid Build Coastguard Worker		outputFiles: nil,
249*333d2b36SAndroid Build Coastguard Worker	},
250*333d2b36SAndroid Build Coastguard Worker	{
251*333d2b36SAndroid Build Coastguard Worker		name: "excludes with includes",
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
254*333d2b36SAndroid Build Coastguard Worker			"a/a",
255*333d2b36SAndroid Build Coastguard Worker			"a/b",
256*333d2b36SAndroid Build Coastguard Worker		},
257*333d2b36SAndroid Build Coastguard Worker		args:     nil,
258*333d2b36SAndroid Build Coastguard Worker		excludes: []string{"a/*"},
259*333d2b36SAndroid Build Coastguard Worker		includes: []string{"a/b"},
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{"a/b"},
262*333d2b36SAndroid Build Coastguard Worker	},
263*333d2b36SAndroid Build Coastguard Worker	{
264*333d2b36SAndroid Build Coastguard Worker		name: "excludes with glob",
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
267*333d2b36SAndroid Build Coastguard Worker			"a/a",
268*333d2b36SAndroid Build Coastguard Worker			"a/b",
269*333d2b36SAndroid Build Coastguard Worker		},
270*333d2b36SAndroid Build Coastguard Worker		args:     []string{"a/*"},
271*333d2b36SAndroid Build Coastguard Worker		excludes: []string{"a/*"},
272*333d2b36SAndroid Build Coastguard Worker
273*333d2b36SAndroid Build Coastguard Worker		outputFiles: nil,
274*333d2b36SAndroid Build Coastguard Worker	},
275*333d2b36SAndroid Build Coastguard Worker	{
276*333d2b36SAndroid Build Coastguard Worker		name: "uncompress one",
277*333d2b36SAndroid Build Coastguard Worker
278*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
279*333d2b36SAndroid Build Coastguard Worker			"a/a",
280*333d2b36SAndroid Build Coastguard Worker			"a/b",
281*333d2b36SAndroid Build Coastguard Worker		},
282*333d2b36SAndroid Build Coastguard Worker		uncompresses: []string{"a/a"},
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
285*333d2b36SAndroid Build Coastguard Worker			"a/a",
286*333d2b36SAndroid Build Coastguard Worker			"a/b",
287*333d2b36SAndroid Build Coastguard Worker		},
288*333d2b36SAndroid Build Coastguard Worker		storedFiles: []string{
289*333d2b36SAndroid Build Coastguard Worker			"a/a",
290*333d2b36SAndroid Build Coastguard Worker		},
291*333d2b36SAndroid Build Coastguard Worker	},
292*333d2b36SAndroid Build Coastguard Worker	{
293*333d2b36SAndroid Build Coastguard Worker		name: "uncompress two",
294*333d2b36SAndroid Build Coastguard Worker
295*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
296*333d2b36SAndroid Build Coastguard Worker			"a/a",
297*333d2b36SAndroid Build Coastguard Worker			"a/b",
298*333d2b36SAndroid Build Coastguard Worker		},
299*333d2b36SAndroid Build Coastguard Worker		uncompresses: []string{"a/a", "a/b"},
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
302*333d2b36SAndroid Build Coastguard Worker			"a/a",
303*333d2b36SAndroid Build Coastguard Worker			"a/b",
304*333d2b36SAndroid Build Coastguard Worker		},
305*333d2b36SAndroid Build Coastguard Worker		storedFiles: []string{
306*333d2b36SAndroid Build Coastguard Worker			"a/a",
307*333d2b36SAndroid Build Coastguard Worker			"a/b",
308*333d2b36SAndroid Build Coastguard Worker		},
309*333d2b36SAndroid Build Coastguard Worker	},
310*333d2b36SAndroid Build Coastguard Worker	{
311*333d2b36SAndroid Build Coastguard Worker		name: "uncompress glob",
312*333d2b36SAndroid Build Coastguard Worker
313*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
314*333d2b36SAndroid Build Coastguard Worker			"a/a",
315*333d2b36SAndroid Build Coastguard Worker			"a/b",
316*333d2b36SAndroid Build Coastguard Worker			"a/c.so",
317*333d2b36SAndroid Build Coastguard Worker			"a/d.so",
318*333d2b36SAndroid Build Coastguard Worker		},
319*333d2b36SAndroid Build Coastguard Worker		uncompresses: []string{"a/*.so"},
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
322*333d2b36SAndroid Build Coastguard Worker			"a/a",
323*333d2b36SAndroid Build Coastguard Worker			"a/b",
324*333d2b36SAndroid Build Coastguard Worker			"a/c.so",
325*333d2b36SAndroid Build Coastguard Worker			"a/d.so",
326*333d2b36SAndroid Build Coastguard Worker		},
327*333d2b36SAndroid Build Coastguard Worker		storedFiles: []string{
328*333d2b36SAndroid Build Coastguard Worker			"a/c.so",
329*333d2b36SAndroid Build Coastguard Worker			"a/d.so",
330*333d2b36SAndroid Build Coastguard Worker		},
331*333d2b36SAndroid Build Coastguard Worker	},
332*333d2b36SAndroid Build Coastguard Worker	{
333*333d2b36SAndroid Build Coastguard Worker		name: "uncompress rename",
334*333d2b36SAndroid Build Coastguard Worker
335*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
336*333d2b36SAndroid Build Coastguard Worker			"a/a",
337*333d2b36SAndroid Build Coastguard Worker		},
338*333d2b36SAndroid Build Coastguard Worker		args:         []string{"a/a:a/b"},
339*333d2b36SAndroid Build Coastguard Worker		uncompresses: []string{"a/b"},
340*333d2b36SAndroid Build Coastguard Worker
341*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
342*333d2b36SAndroid Build Coastguard Worker			"a/b",
343*333d2b36SAndroid Build Coastguard Worker		},
344*333d2b36SAndroid Build Coastguard Worker		storedFiles: []string{
345*333d2b36SAndroid Build Coastguard Worker			"a/b",
346*333d2b36SAndroid Build Coastguard Worker		},
347*333d2b36SAndroid Build Coastguard Worker	},
348*333d2b36SAndroid Build Coastguard Worker	{
349*333d2b36SAndroid Build Coastguard Worker		name: "recursive glob",
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
352*333d2b36SAndroid Build Coastguard Worker			"a/a/a",
353*333d2b36SAndroid Build Coastguard Worker			"a/a/b",
354*333d2b36SAndroid Build Coastguard Worker		},
355*333d2b36SAndroid Build Coastguard Worker		args: []string{"a/**/*:b"},
356*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
357*333d2b36SAndroid Build Coastguard Worker			"b/a/a",
358*333d2b36SAndroid Build Coastguard Worker			"b/a/b",
359*333d2b36SAndroid Build Coastguard Worker		},
360*333d2b36SAndroid Build Coastguard Worker	},
361*333d2b36SAndroid Build Coastguard Worker	{
362*333d2b36SAndroid Build Coastguard Worker		name: "glob",
363*333d2b36SAndroid Build Coastguard Worker
364*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
365*333d2b36SAndroid Build Coastguard Worker			"a/a/a",
366*333d2b36SAndroid Build Coastguard Worker			"a/a/b",
367*333d2b36SAndroid Build Coastguard Worker			"a/b",
368*333d2b36SAndroid Build Coastguard Worker			"a/c",
369*333d2b36SAndroid Build Coastguard Worker		},
370*333d2b36SAndroid Build Coastguard Worker		args: []string{"a/*:b"},
371*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
372*333d2b36SAndroid Build Coastguard Worker			"b/b",
373*333d2b36SAndroid Build Coastguard Worker			"b/c",
374*333d2b36SAndroid Build Coastguard Worker		},
375*333d2b36SAndroid Build Coastguard Worker	},
376*333d2b36SAndroid Build Coastguard Worker	{
377*333d2b36SAndroid Build Coastguard Worker		name: "top level glob",
378*333d2b36SAndroid Build Coastguard Worker
379*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
380*333d2b36SAndroid Build Coastguard Worker			"a",
381*333d2b36SAndroid Build Coastguard Worker			"b",
382*333d2b36SAndroid Build Coastguard Worker		},
383*333d2b36SAndroid Build Coastguard Worker		args: []string{"*:b"},
384*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
385*333d2b36SAndroid Build Coastguard Worker			"b/a",
386*333d2b36SAndroid Build Coastguard Worker			"b/b",
387*333d2b36SAndroid Build Coastguard Worker		},
388*333d2b36SAndroid Build Coastguard Worker	},
389*333d2b36SAndroid Build Coastguard Worker	{
390*333d2b36SAndroid Build Coastguard Worker		name: "multilple glob",
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Worker		inputFiles: []string{
393*333d2b36SAndroid Build Coastguard Worker			"a/a/a",
394*333d2b36SAndroid Build Coastguard Worker			"a/a/b",
395*333d2b36SAndroid Build Coastguard Worker		},
396*333d2b36SAndroid Build Coastguard Worker		args: []string{"a/*/*:b"},
397*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{
398*333d2b36SAndroid Build Coastguard Worker			"b/a/a",
399*333d2b36SAndroid Build Coastguard Worker			"b/a/b",
400*333d2b36SAndroid Build Coastguard Worker		},
401*333d2b36SAndroid Build Coastguard Worker	},
402*333d2b36SAndroid Build Coastguard Worker	{
403*333d2b36SAndroid Build Coastguard Worker		name: "escaping",
404*333d2b36SAndroid Build Coastguard Worker
405*333d2b36SAndroid Build Coastguard Worker		inputFiles:  []string{"a"},
406*333d2b36SAndroid Build Coastguard Worker		args:        []string{"\\a"},
407*333d2b36SAndroid Build Coastguard Worker		outputFiles: []string{"a"},
408*333d2b36SAndroid Build Coastguard Worker	},
409*333d2b36SAndroid Build Coastguard Worker}
410*333d2b36SAndroid Build Coastguard Worker
411*333d2b36SAndroid Build Coastguard Workerfunc errorString(e error) string {
412*333d2b36SAndroid Build Coastguard Worker	if e == nil {
413*333d2b36SAndroid Build Coastguard Worker		return ""
414*333d2b36SAndroid Build Coastguard Worker	}
415*333d2b36SAndroid Build Coastguard Worker	return e.Error()
416*333d2b36SAndroid Build Coastguard Worker}
417*333d2b36SAndroid Build Coastguard Worker
418*333d2b36SAndroid Build Coastguard Workerfunc TestZip2Zip(t *testing.T) {
419*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range testCases {
420*333d2b36SAndroid Build Coastguard Worker		t.Run(testCase.name, func(t *testing.T) {
421*333d2b36SAndroid Build Coastguard Worker			inputBuf := &bytes.Buffer{}
422*333d2b36SAndroid Build Coastguard Worker			outputBuf := &bytes.Buffer{}
423*333d2b36SAndroid Build Coastguard Worker
424*333d2b36SAndroid Build Coastguard Worker			inputWriter := zip.NewWriter(inputBuf)
425*333d2b36SAndroid Build Coastguard Worker			for _, file := range testCase.inputFiles {
426*333d2b36SAndroid Build Coastguard Worker				w, err := inputWriter.Create(file)
427*333d2b36SAndroid Build Coastguard Worker				if err != nil {
428*333d2b36SAndroid Build Coastguard Worker					t.Fatal(err)
429*333d2b36SAndroid Build Coastguard Worker				}
430*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintln(w, "test")
431*333d2b36SAndroid Build Coastguard Worker			}
432*333d2b36SAndroid Build Coastguard Worker			inputWriter.Close()
433*333d2b36SAndroid Build Coastguard Worker			inputBytes := inputBuf.Bytes()
434*333d2b36SAndroid Build Coastguard Worker			inputReader, err := zip.NewReader(bytes.NewReader(inputBytes), int64(len(inputBytes)))
435*333d2b36SAndroid Build Coastguard Worker			if err != nil {
436*333d2b36SAndroid Build Coastguard Worker				t.Fatal(err)
437*333d2b36SAndroid Build Coastguard Worker			}
438*333d2b36SAndroid Build Coastguard Worker
439*333d2b36SAndroid Build Coastguard Worker			outputWriter := zip.NewWriter(outputBuf)
440*333d2b36SAndroid Build Coastguard Worker			err = zip2zip(inputReader, outputWriter, testCase.sortGlobs, testCase.sortJava, false,
441*333d2b36SAndroid Build Coastguard Worker				testCase.args, testCase.excludes, testCase.includes, testCase.uncompresses)
442*333d2b36SAndroid Build Coastguard Worker			if errorString(testCase.err) != errorString(err) {
443*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("Unexpected error:\n got: %q\nwant: %q", errorString(err), errorString(testCase.err))
444*333d2b36SAndroid Build Coastguard Worker			}
445*333d2b36SAndroid Build Coastguard Worker
446*333d2b36SAndroid Build Coastguard Worker			outputWriter.Close()
447*333d2b36SAndroid Build Coastguard Worker			outputBytes := outputBuf.Bytes()
448*333d2b36SAndroid Build Coastguard Worker			outputReader, err := zip.NewReader(bytes.NewReader(outputBytes), int64(len(outputBytes)))
449*333d2b36SAndroid Build Coastguard Worker			if err != nil {
450*333d2b36SAndroid Build Coastguard Worker				t.Fatal(err)
451*333d2b36SAndroid Build Coastguard Worker			}
452*333d2b36SAndroid Build Coastguard Worker			var outputFiles []string
453*333d2b36SAndroid Build Coastguard Worker			var storedFiles []string
454*333d2b36SAndroid Build Coastguard Worker			if len(outputReader.File) > 0 {
455*333d2b36SAndroid Build Coastguard Worker				outputFiles = make([]string, len(outputReader.File))
456*333d2b36SAndroid Build Coastguard Worker				for i, file := range outputReader.File {
457*333d2b36SAndroid Build Coastguard Worker					outputFiles[i] = file.Name
458*333d2b36SAndroid Build Coastguard Worker					if file.Method == zip.Store {
459*333d2b36SAndroid Build Coastguard Worker						storedFiles = append(storedFiles, file.Name)
460*333d2b36SAndroid Build Coastguard Worker					}
461*333d2b36SAndroid Build Coastguard Worker				}
462*333d2b36SAndroid Build Coastguard Worker			}
463*333d2b36SAndroid Build Coastguard Worker
464*333d2b36SAndroid Build Coastguard Worker			if !reflect.DeepEqual(testCase.outputFiles, outputFiles) {
465*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("Output file list does not match:\nwant: %v\n got: %v", testCase.outputFiles, outputFiles)
466*333d2b36SAndroid Build Coastguard Worker			}
467*333d2b36SAndroid Build Coastguard Worker			if !reflect.DeepEqual(testCase.storedFiles, storedFiles) {
468*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("Stored file list does not match:\nwant: %v\n got: %v", testCase.storedFiles, storedFiles)
469*333d2b36SAndroid Build Coastguard Worker			}
470*333d2b36SAndroid Build Coastguard Worker		})
471*333d2b36SAndroid Build Coastguard Worker	}
472*333d2b36SAndroid Build Coastguard Worker}
473*333d2b36SAndroid Build Coastguard Worker
474*333d2b36SAndroid Build Coastguard Worker// TestZip2Zip64 tests that zip2zip on zip file larger than 4GB produces a valid zip file.
475*333d2b36SAndroid Build Coastguard Workerfunc TestZip2Zip64(t *testing.T) {
476*333d2b36SAndroid Build Coastguard Worker	if testing.Short() {
477*333d2b36SAndroid Build Coastguard Worker		t.Skip("skipping slow test in short mode")
478*333d2b36SAndroid Build Coastguard Worker	}
479*333d2b36SAndroid Build Coastguard Worker	inputBuf := &bytes.Buffer{}
480*333d2b36SAndroid Build Coastguard Worker	outputBuf := &bytes.Buffer{}
481*333d2b36SAndroid Build Coastguard Worker
482*333d2b36SAndroid Build Coastguard Worker	inputWriter := zip.NewWriter(inputBuf)
483*333d2b36SAndroid Build Coastguard Worker	w, err := inputWriter.CreateHeaderAndroid(&zip.FileHeader{
484*333d2b36SAndroid Build Coastguard Worker		Name:   "a",
485*333d2b36SAndroid Build Coastguard Worker		Method: zip.Store,
486*333d2b36SAndroid Build Coastguard Worker	})
487*333d2b36SAndroid Build Coastguard Worker	if err != nil {
488*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
489*333d2b36SAndroid Build Coastguard Worker	}
490*333d2b36SAndroid Build Coastguard Worker	buf := make([]byte, 4*1024*1024)
491*333d2b36SAndroid Build Coastguard Worker	for i := 0; i < 1025; i++ {
492*333d2b36SAndroid Build Coastguard Worker		w.Write(buf)
493*333d2b36SAndroid Build Coastguard Worker	}
494*333d2b36SAndroid Build Coastguard Worker	w, err = inputWriter.CreateHeaderAndroid(&zip.FileHeader{
495*333d2b36SAndroid Build Coastguard Worker		Name:   "b",
496*333d2b36SAndroid Build Coastguard Worker		Method: zip.Store,
497*333d2b36SAndroid Build Coastguard Worker	})
498*333d2b36SAndroid Build Coastguard Worker	for i := 0; i < 1025; i++ {
499*333d2b36SAndroid Build Coastguard Worker		w.Write(buf)
500*333d2b36SAndroid Build Coastguard Worker	}
501*333d2b36SAndroid Build Coastguard Worker	inputWriter.Close()
502*333d2b36SAndroid Build Coastguard Worker	inputBytes := inputBuf.Bytes()
503*333d2b36SAndroid Build Coastguard Worker
504*333d2b36SAndroid Build Coastguard Worker	inputReader, err := zip.NewReader(bytes.NewReader(inputBytes), int64(len(inputBytes)))
505*333d2b36SAndroid Build Coastguard Worker	if err != nil {
506*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
507*333d2b36SAndroid Build Coastguard Worker	}
508*333d2b36SAndroid Build Coastguard Worker
509*333d2b36SAndroid Build Coastguard Worker	outputWriter := zip.NewWriter(outputBuf)
510*333d2b36SAndroid Build Coastguard Worker	err = zip2zip(inputReader, outputWriter, false, false, false,
511*333d2b36SAndroid Build Coastguard Worker		nil, nil, nil, nil)
512*333d2b36SAndroid Build Coastguard Worker	if err != nil {
513*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
514*333d2b36SAndroid Build Coastguard Worker	}
515*333d2b36SAndroid Build Coastguard Worker
516*333d2b36SAndroid Build Coastguard Worker	outputWriter.Close()
517*333d2b36SAndroid Build Coastguard Worker	outputBytes := outputBuf.Bytes()
518*333d2b36SAndroid Build Coastguard Worker	_, err = zip.NewReader(bytes.NewReader(outputBytes), int64(len(outputBytes)))
519*333d2b36SAndroid Build Coastguard Worker	if err != nil {
520*333d2b36SAndroid Build Coastguard Worker		t.Fatal(err)
521*333d2b36SAndroid Build Coastguard Worker	}
522*333d2b36SAndroid Build Coastguard Worker}
523*333d2b36SAndroid Build Coastguard Worker
524*333d2b36SAndroid Build Coastguard Workerfunc TestConstantPartOfPattern(t *testing.T) {
525*333d2b36SAndroid Build Coastguard Worker	testCases := []struct{ in, out string }{
526*333d2b36SAndroid Build Coastguard Worker		{
527*333d2b36SAndroid Build Coastguard Worker			in:  "",
528*333d2b36SAndroid Build Coastguard Worker			out: "",
529*333d2b36SAndroid Build Coastguard Worker		},
530*333d2b36SAndroid Build Coastguard Worker		{
531*333d2b36SAndroid Build Coastguard Worker			in:  "a",
532*333d2b36SAndroid Build Coastguard Worker			out: "a",
533*333d2b36SAndroid Build Coastguard Worker		},
534*333d2b36SAndroid Build Coastguard Worker		{
535*333d2b36SAndroid Build Coastguard Worker			in:  "*",
536*333d2b36SAndroid Build Coastguard Worker			out: "",
537*333d2b36SAndroid Build Coastguard Worker		},
538*333d2b36SAndroid Build Coastguard Worker		{
539*333d2b36SAndroid Build Coastguard Worker			in:  "a/a",
540*333d2b36SAndroid Build Coastguard Worker			out: "a/a",
541*333d2b36SAndroid Build Coastguard Worker		},
542*333d2b36SAndroid Build Coastguard Worker		{
543*333d2b36SAndroid Build Coastguard Worker			in:  "a/*",
544*333d2b36SAndroid Build Coastguard Worker			out: "a",
545*333d2b36SAndroid Build Coastguard Worker		},
546*333d2b36SAndroid Build Coastguard Worker		{
547*333d2b36SAndroid Build Coastguard Worker			in:  "a/*/a",
548*333d2b36SAndroid Build Coastguard Worker			out: "a",
549*333d2b36SAndroid Build Coastguard Worker		},
550*333d2b36SAndroid Build Coastguard Worker		{
551*333d2b36SAndroid Build Coastguard Worker			in:  "a/**/*",
552*333d2b36SAndroid Build Coastguard Worker			out: "a",
553*333d2b36SAndroid Build Coastguard Worker		},
554*333d2b36SAndroid Build Coastguard Worker	}
555*333d2b36SAndroid Build Coastguard Worker
556*333d2b36SAndroid Build Coastguard Worker	for _, test := range testCases {
557*333d2b36SAndroid Build Coastguard Worker		t.Run(test.in, func(t *testing.T) {
558*333d2b36SAndroid Build Coastguard Worker			got := constantPartOfPattern(test.in)
559*333d2b36SAndroid Build Coastguard Worker			if got != test.out {
560*333d2b36SAndroid Build Coastguard Worker				t.Errorf("want %q, got %q", test.out, got)
561*333d2b36SAndroid Build Coastguard Worker			}
562*333d2b36SAndroid Build Coastguard Worker		})
563*333d2b36SAndroid Build Coastguard Worker	}
564*333d2b36SAndroid Build Coastguard Worker}
565