github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/cmd/zip2zip/zip2zip_test.go (about) 1 // Copyright 2017 Google Inc. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package main 16 17 import ( 18 "bytes" 19 "fmt" 20 "reflect" 21 "testing" 22 23 "android/soong/third_party/zip" 24 ) 25 26 var testCases = []struct { 27 name string 28 29 inputFiles []string 30 sortGlobs bool 31 sortJava bool 32 args []string 33 excludes []string 34 35 outputFiles []string 36 err error 37 }{ 38 { 39 name: "unsupported \\", 40 41 args: []string{"a\\b:b"}, 42 43 err: fmt.Errorf("\\ characters are not currently supported"), 44 }, 45 { // This is modelled after the update package build rules in build/make/core/Makefile 46 name: "filter globs", 47 48 inputFiles: []string{ 49 "RADIO/a", 50 "IMAGES/system.img", 51 "IMAGES/b.txt", 52 "IMAGES/recovery.img", 53 "IMAGES/vendor.img", 54 "OTA/android-info.txt", 55 "OTA/b", 56 }, 57 args: []string{"OTA/android-info.txt:android-info.txt", "IMAGES/*.img:."}, 58 59 outputFiles: []string{ 60 "android-info.txt", 61 "system.img", 62 "recovery.img", 63 "vendor.img", 64 }, 65 }, 66 { 67 name: "sorted filter globs", 68 69 inputFiles: []string{ 70 "RADIO/a", 71 "IMAGES/system.img", 72 "IMAGES/b.txt", 73 "IMAGES/recovery.img", 74 "IMAGES/vendor.img", 75 "OTA/android-info.txt", 76 "OTA/b", 77 }, 78 sortGlobs: true, 79 args: []string{"IMAGES/*.img:.", "OTA/android-info.txt:android-info.txt"}, 80 81 outputFiles: []string{ 82 "recovery.img", 83 "system.img", 84 "vendor.img", 85 "android-info.txt", 86 }, 87 }, 88 { 89 name: "sort all", 90 91 inputFiles: []string{ 92 "RADIO/", 93 "RADIO/a", 94 "IMAGES/", 95 "IMAGES/system.img", 96 "IMAGES/b.txt", 97 "IMAGES/recovery.img", 98 "IMAGES/vendor.img", 99 "OTA/", 100 "OTA/b", 101 "OTA/android-info.txt", 102 }, 103 sortGlobs: true, 104 args: []string{"**/*"}, 105 106 outputFiles: []string{ 107 "IMAGES/b.txt", 108 "IMAGES/recovery.img", 109 "IMAGES/system.img", 110 "IMAGES/vendor.img", 111 "OTA/android-info.txt", 112 "OTA/b", 113 "RADIO/a", 114 }, 115 }, 116 { 117 name: "sort all implicit", 118 119 inputFiles: []string{ 120 "RADIO/", 121 "RADIO/a", 122 "IMAGES/", 123 "IMAGES/system.img", 124 "IMAGES/b.txt", 125 "IMAGES/recovery.img", 126 "IMAGES/vendor.img", 127 "OTA/", 128 "OTA/b", 129 "OTA/android-info.txt", 130 }, 131 sortGlobs: true, 132 args: nil, 133 134 outputFiles: []string{ 135 "IMAGES/", 136 "IMAGES/b.txt", 137 "IMAGES/recovery.img", 138 "IMAGES/system.img", 139 "IMAGES/vendor.img", 140 "OTA/", 141 "OTA/android-info.txt", 142 "OTA/b", 143 "RADIO/", 144 "RADIO/a", 145 }, 146 }, 147 { 148 name: "sort jar", 149 150 inputFiles: []string{ 151 "MANIFEST.MF", 152 "META-INF/MANIFEST.MF", 153 "META-INF/aaa/", 154 "META-INF/aaa/aaa", 155 "META-INF/AAA", 156 "META-INF.txt", 157 "META-INF/", 158 "AAA", 159 "aaa", 160 }, 161 sortJava: true, 162 args: nil, 163 164 outputFiles: []string{ 165 "META-INF/", 166 "META-INF/MANIFEST.MF", 167 "META-INF/AAA", 168 "META-INF/aaa/", 169 "META-INF/aaa/aaa", 170 "AAA", 171 "MANIFEST.MF", 172 "META-INF.txt", 173 "aaa", 174 }, 175 }, 176 { 177 name: "double input", 178 179 inputFiles: []string{ 180 "b", 181 "a", 182 }, 183 args: []string{"a:a2", "**/*"}, 184 185 outputFiles: []string{ 186 "a2", 187 "b", 188 "a", 189 }, 190 }, 191 { 192 name: "multiple matches", 193 194 inputFiles: []string{ 195 "a/a", 196 }, 197 args: []string{"a/a", "a/*"}, 198 199 outputFiles: []string{ 200 "a/a", 201 }, 202 }, 203 { 204 name: "multiple conflicting matches", 205 206 inputFiles: []string{ 207 "a/a", 208 "a/b", 209 }, 210 args: []string{"a/b:a/a", "a/*"}, 211 212 err: fmt.Errorf(`multiple entries for "a/a" with different contents`), 213 }, 214 { 215 name: "excludes", 216 217 inputFiles: []string{ 218 "a/a", 219 "a/b", 220 }, 221 args: nil, 222 excludes: []string{"a/a"}, 223 224 outputFiles: []string{ 225 "a/b", 226 }, 227 }, 228 { 229 name: "excludes with include", 230 231 inputFiles: []string{ 232 "a/a", 233 "a/b", 234 }, 235 args: []string{"a/*"}, 236 excludes: []string{"a/a"}, 237 238 outputFiles: []string{ 239 "a/b", 240 }, 241 }, 242 { 243 name: "excludes with glob", 244 245 inputFiles: []string{ 246 "a/a", 247 "a/b", 248 }, 249 args: []string{"a/*"}, 250 excludes: []string{"a/*"}, 251 252 outputFiles: nil, 253 }, 254 } 255 256 func errorString(e error) string { 257 if e == nil { 258 return "" 259 } 260 return e.Error() 261 } 262 263 func TestZip2Zip(t *testing.T) { 264 for _, testCase := range testCases { 265 t.Run(testCase.name, func(t *testing.T) { 266 inputBuf := &bytes.Buffer{} 267 outputBuf := &bytes.Buffer{} 268 269 inputWriter := zip.NewWriter(inputBuf) 270 for _, file := range testCase.inputFiles { 271 w, err := inputWriter.Create(file) 272 if err != nil { 273 t.Fatal(err) 274 } 275 fmt.Fprintln(w, "test") 276 } 277 inputWriter.Close() 278 inputBytes := inputBuf.Bytes() 279 inputReader, err := zip.NewReader(bytes.NewReader(inputBytes), int64(len(inputBytes))) 280 if err != nil { 281 t.Fatal(err) 282 } 283 284 outputWriter := zip.NewWriter(outputBuf) 285 err = zip2zip(inputReader, outputWriter, testCase.sortGlobs, testCase.sortJava, false, testCase.args, testCase.excludes) 286 if errorString(testCase.err) != errorString(err) { 287 t.Fatalf("Unexpected error:\n got: %q\nwant: %q", errorString(err), errorString(testCase.err)) 288 } 289 290 outputWriter.Close() 291 outputBytes := outputBuf.Bytes() 292 outputReader, err := zip.NewReader(bytes.NewReader(outputBytes), int64(len(outputBytes))) 293 if err != nil { 294 t.Fatal(err) 295 } 296 var outputFiles []string 297 if len(outputReader.File) > 0 { 298 outputFiles = make([]string, len(outputReader.File)) 299 for i, file := range outputReader.File { 300 outputFiles[i] = file.Name 301 } 302 } 303 304 if !reflect.DeepEqual(testCase.outputFiles, outputFiles) { 305 t.Fatalf("Output file list does not match:\n got: %v\nwant: %v", outputFiles, testCase.outputFiles) 306 } 307 }) 308 } 309 }