aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools/singlejar/javatests/com/google/devtools/build/singlejar/ZipFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java_tools/singlejar/javatests/com/google/devtools/build/singlejar/ZipFactory.java')
-rw-r--r--src/java_tools/singlejar/javatests/com/google/devtools/build/singlejar/ZipFactory.java106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/java_tools/singlejar/javatests/com/google/devtools/build/singlejar/ZipFactory.java b/src/java_tools/singlejar/javatests/com/google/devtools/build/singlejar/ZipFactory.java
new file mode 100644
index 0000000000..a6474fa704
--- /dev/null
+++ b/src/java_tools/singlejar/javatests/com/google/devtools/build/singlejar/ZipFactory.java
@@ -0,0 +1,106 @@
+// Copyright 2015 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.singlejar;
+
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.CRC32;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * A helper class to create zip files for testing.
+ */
+public class ZipFactory {
+
+ static class Entry {
+ private final String name;
+ private final byte[] content;
+ private final boolean compressed;
+ private Entry(String name, byte[] content, boolean compressed) {
+ this.name = name;
+ this.content = content;
+ this.compressed = compressed;
+ }
+ }
+
+ private final List<Entry> entries = new ArrayList<>();
+
+ // Assumes that content was created locally. Does not perform a defensive copy!
+ private void addEntry(String name, byte[] content, boolean compressed) {
+ entries.add(new Entry(name, content, compressed));
+ }
+
+ public ZipFactory addFile(String name, String content) {
+ addEntry(name, content.getBytes(ISO_8859_1), true);
+ return this;
+ }
+
+ public ZipFactory addFile(String name, byte[] content) {
+ addEntry(name, content.clone(), true);
+ return this;
+ }
+
+ public ZipFactory addFile(String name, String content, boolean compressed) {
+ addEntry(name, content.getBytes(ISO_8859_1), compressed);
+ return this;
+ }
+
+ public ZipFactory addFile(String name, byte[] content, boolean compressed) {
+ addEntry(name, content.clone(), compressed);
+ return this;
+ }
+
+ public byte[] toByteArray() {
+ try {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ZipOutputStream zipper = new ZipOutputStream(out);
+ for (Entry entry : entries) {
+ ZipEntry zipEntry = new ZipEntry(entry.name);
+ if (entry.compressed) {
+ zipEntry.setMethod(ZipEntry.DEFLATED);
+ } else {
+ zipEntry.setMethod(ZipEntry.STORED);
+ zipEntry.setSize(entry.content.length);
+ zipEntry.setCrc(calculateCrc32(entry.content));
+ }
+ zipEntry.setTime(ZipCombiner.DOS_EPOCH.getTime());
+ zipper.putNextEntry(zipEntry);
+ zipper.write(entry.content);
+ zipper.closeEntry();
+ }
+ zipper.close();
+ return out.toByteArray();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public InputStream toInputStream() {
+ return new ByteArrayInputStream(toByteArray());
+ }
+
+ public static long calculateCrc32(byte[] content) {
+ CRC32 crc = new CRC32();
+ crc.update(content);
+ return crc.getValue();
+ }
+}