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