diff options
35 files changed, 441 insertions, 469 deletions
diff --git a/jack-launcher/rsc/jack-launcher.properties b/jack-api/rsc/jack-api-version.properties index be45bd3..9a505b2 100644 --- a/jack-launcher/rsc/jack-launcher.properties +++ b/jack-api/rsc/jack-api-version.properties @@ -13,4 +13,14 @@ # See the License for the specific language governing permissions and # limitations under the License. # -jack-launcher.version=1.1-rc4 +version-file.version.code=1 + +version=1.1-rc4 +version.release.name=Brest +version.release.code=2 +version.sub-release.kind=CANDIDATE +version.sub-release.code=17 + +# These properties are added by the release step +# version.buildid=<BUILDID> +# version.sha=<SHA> diff --git a/jack-launcher/rsc/jack-launcher-version.properties b/jack-launcher/rsc/jack-launcher-version.properties new file mode 100644 index 0000000..9a505b2 --- /dev/null +++ b/jack-launcher/rsc/jack-launcher-version.properties @@ -0,0 +1,26 @@ +# +# Copyright (C) 2015 The Android Open Source Project +# +# 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. +# +version-file.version.code=1 + +version=1.1-rc4 +version.release.name=Brest +version.release.code=2 +version.sub-release.kind=CANDIDATE +version.sub-release.code=17 + +# These properties are added by the release step +# version.buildid=<BUILDID> +# version.sha=<SHA> diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java index 5593472..6e69be5 100644 --- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java +++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java @@ -184,6 +184,7 @@ public class JackApiV01Toolchain extends JackApiToolchainBase { apiV01Config.setImportedJackLibraryFiles(staticLibs); apiV01Config.setSourceEntries(Lists.newArrayList(sources)); apiV01Config.setResourceDirs(resImport); + apiV01Config.setMetaDirs(metaImport); apiV01Config.setProguardConfigFiles(proguardFlags); if (!jarjarRules.isEmpty()) { apiV01Config.setJarJarConfigFiles(jarjarRules); @@ -210,6 +211,7 @@ public class JackApiV01Toolchain extends JackApiToolchainBase { Collections.addAll(importedLibs, in); apiV01Config.setImportedJackLibraryFiles(importedLibs); apiV01Config.setResourceDirs(resImport); + apiV01Config.setMetaDirs(metaImport); apiV01Config.setProguardConfigFiles(proguardFlags); if (jarjarRules != null) { apiV01Config.setJarJarConfigFiles(jarjarRules); diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackBasedToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackBasedToolchain.java index a08fe71..92bd82a 100644 --- a/jack-tests/src/com/android/jack/test/toolchain/JackBasedToolchain.java +++ b/jack-tests/src/com/android/jack/test/toolchain/JackBasedToolchain.java @@ -47,6 +47,8 @@ public abstract class JackBasedToolchain extends AndroidToolchain { @Nonnull protected List<File> resImport = new ArrayList<File>(); @Nonnull + protected List<File> metaImport = new ArrayList<File>(); + @Nonnull protected final Map<String, String> annotationProcessorOptions = new HashMap<String, String>(); @CheckForNull protected String processorPath; @@ -87,8 +89,14 @@ public abstract class JackBasedToolchain extends AndroidToolchain { } @Nonnull - public JackBasedToolchain addResource(@Nonnull File resource) { - resImport.add(resource); + public JackBasedToolchain addResourceDir(@Nonnull File resourceDir) { + resImport.add(resourceDir); + return this; + } + + @Nonnull + public JackBasedToolchain addMetaDir(@Nonnull File metaDir) { + metaImport.add(metaDir); return this; } diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java index fdcfedc..b9de041 100644 --- a/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java +++ b/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java @@ -163,6 +163,11 @@ public class JackCliToolchain extends JackBasedToolchain { args.add(res.getPath()); } + for (File meta : metaImport) { + args.add("--import-meta"); + args.add(meta.getPath()); + } + args.addAll(extraJackArgs); for (File jarjarFile : jarjarRules) { @@ -266,6 +271,11 @@ public class JackCliToolchain extends JackBasedToolchain { args.add(res.getPath()); } + for (File meta : metaImport) { + args.add("--import-meta"); + args.add(meta.getPath()); + } + addProperties(properties, args); if (!classpath.equals("")) { diff --git a/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java index 8592ee6..98004b4 100644 --- a/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java +++ b/jack-tests/src/com/android/jack/test/toolchain/LegacyJillToolchain.java @@ -114,7 +114,7 @@ public class LegacyJillToolchain extends JillBasedToolchain { if (resImport.size() > 0) { resDestDir = new File(classesDir, FileType.RSC.getPrefix()); if (!resDestDir.exists() && !resDestDir.mkdir()) { - throw new AssertionError("Could not create rsc dir"); + throw new AssertionError("Could not create resource dir"); } for (File res : resImport) { @@ -122,6 +122,18 @@ public class LegacyJillToolchain extends JillBasedToolchain { } } + File metaDestDir; + if (metaImport.size() > 0) { + metaDestDir = new File(classesDir, FileType.JPP.getPrefix()); + if (!metaDestDir.exists() && !metaDestDir.mkdir()) { + throw new AssertionError("Could not create meta dir"); + } + + for (File meta : metaImport) { + AbstractTestTools.copyDirectory(meta, metaDestDir); + } + } + File tmpJarsDir = AbstractTestTools.createTempDir(); File jarFile = new File(tmpJarsDir, "legacyLib.jar"); File jarFileJarjar = new File(tmpJarsDir, "legacyLibJarjar.jar"); diff --git a/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java b/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java index cc65221..9b1e7cc 100644 --- a/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java +++ b/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java @@ -239,7 +239,7 @@ public class AnnotationProcessorTests { { JackBasedToolchain jack = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); jack.setAnnotationProcessorPath(processors.getPath()); - jack.addResource(classesOut); + jack.addResourceDir(classesOut); jack.addToClasspath(jack.getDefaultBootClasspath()); jack.srcToLib(jackOut, /*zipFiles=*/false, @@ -250,7 +250,7 @@ public class AnnotationProcessorTests { { JackBasedToolchain jack = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); jack.setAnnotationProcessorPath(processors.getPath()); - jack.addResource(classesOut); + jack.addResourceDir(classesOut); jack.addToClasspath(jack.getDefaultBootClasspath()); jack.srcToLib(jackOut, /*zipFiles=*/false, diff --git a/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java b/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java index 99b58f2..9eb04ed 100644 --- a/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java +++ b/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java @@ -84,7 +84,7 @@ public class AnnotationProcessorErrorTest { Collections.singletonList(ResourceAnnotationProcessor.class.getName())); ByteArrayOutputStream errOut = new ByteArrayOutputStream(); jackApiToolchain.setErrorStream(errOut); - jackApiToolchain.addResource(te.getOutputDexFolder()); + jackApiToolchain.addResourceDir(te.getOutputDexFolder()); jackApiToolchain.addProperty(ResourceImporter.RESOURCE_COLLISION_POLICY.getName(), CollisionPolicy.FAIL.name()); diff --git a/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java b/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java index 9537ffe..eb90ff2 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java +++ b/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java @@ -20,7 +20,8 @@ import com.android.jack.JackAbortException; import com.android.jack.backend.jayce.JayceFileImporter; import com.android.jack.backend.jayce.TypeImportConflictException; import com.android.jack.library.FileType; -import com.android.jack.library.JackLibrary; +import com.android.jack.library.FileTypeDoesNotExistException; +import com.android.jack.library.InputJackLibrary; import com.android.jack.library.LibraryReadingException; import com.android.jack.resource.ResourceImportConflictException; import com.android.jack.resource.ResourceImporter; @@ -32,78 +33,48 @@ import com.android.jack.test.toolchain.JackApiToolchainBase; import com.android.jack.test.toolchain.JackBasedToolchain; import com.android.jack.test.toolchain.JackCliToolchain; import com.android.jack.test.toolchain.LegacyJillToolchain; +import com.android.sched.util.location.FileLocation; +import com.android.sched.vfs.InputVFile; +import com.android.sched.vfs.VPath; import junit.framework.Assert; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; /** - * JUnit tests for resource support. + * JUnit tests for conflicts between Jayce files and resources. */ public class FileConflictTests { @Nonnull - private static final String COMMON_PATH_001 = "com/android/jack/fileconflict/test001/jack/"; + private static final VPath TYPE1_PATH = + new VPath("com/android/jack/fileconflict/test001/jack/MyClass", '/'); @Nonnull - private static final String COMMON_PATH_002 = "com/android/jack/fileconflict/test002/jack/"; + private static final VPath TYPE2_PATH = + new VPath("com/android/jack/fileconflict/test001/jack/MyClass2", '/'); @Nonnull - private static final String JACK_FILE_PATH_1 = - FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass.jayce"; + private static final VPath TYPE3_PATH = + new VPath("com/android/jack/fileconflict/test001/jack/MyClass3", '/'); @Nonnull - private static final String JACK_FILE_PATH_2 = - FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass2.jayce"; + private static final VPath RESOURCE1_PATH = new VPath("rsc/Resource1", '/'); @Nonnull - private static final String JACK_FILE_PATH_3 = - FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass3.jayce"; + private static final VPath RESOURCE2_PATH = new VPath("rsc/Resource2", '/'); @Nonnull - private static final String DEX_FILE_PATH_1 = - FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass.dex"; - @Nonnull - private static final String DEX_FILE_PATH_2 = - FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass2.dex"; - @Nonnull - private static final String DEX_FILE_PATH_3 = - FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass3.dex"; - @Nonnull - private static final String JACK_FILE_PATH_002_1 = - FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_002 + "IrrelevantForTest.jayce"; - @Nonnull - private static final String JACK_FILE_PATH_002_2 = - FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_002 + "IrrelevantForTest2.jayce"; - @Nonnull - private static final String RESOURCE1_SHORTPATH = "Resource1"; - @Nonnull - private static final String RESOURCE2_SHORTPATH = "Resource2"; - @Nonnull - private static final String RESOURCE3_SHORTPATH = "Resource3"; - @Nonnull - private static final String RESOURCE1_LONGPATH = FileType.RSC.getPrefix() + "/" - + RESOURCE1_SHORTPATH; - @Nonnull - private static final String RESOURCE2_LONGPATH = FileType.RSC.getPrefix() + "/" - + RESOURCE2_SHORTPATH; - @Nonnull - private static final String RESOURCE3_LONGPATH = FileType.RSC.getPrefix() + "/" - + RESOURCE3_SHORTPATH; + private static final VPath RESOURCE3_PATH = new VPath("rsc/Resource3", '/'); @Nonnull private static final File TEST001_DIR = @@ -124,7 +95,6 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test001a() throws Exception { File jackOutput = AbstractTestTools.createTempDir(); ByteArrayOutputStream errOut = new ByteArrayOutputStream(); @@ -147,7 +117,6 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test001b() throws Exception { File jackOutput = AbstractTestTools.createTempDir(); ByteArrayOutputStream errOut = new ByteArrayOutputStream(); @@ -171,19 +140,28 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test001c() throws Exception { File jackOutput = AbstractTestTools.createTempDir(); ByteArrayOutputStream errOut = new ByteArrayOutputStream(); runTest001(jackOutput, "keep-first", errOut /* errorStream */, /* isApiTest = */ false, /* verbose = */ false); - File myClass1 = new File(jackOutput, JACK_FILE_PATH_1); - File myClass2 = new File(jackOutput, JACK_FILE_PATH_2); - File myClass3 = new File(jackOutput, JACK_FILE_PATH_3); - Assert.assertTrue(myClass1.exists()); - Assert.assertTrue(myClass2.exists()); - Assert.assertTrue(myClass3.exists()); - Assert.assertTrue(errOut.toString().isEmpty()); + InputJackLibrary outputLib = null; + try { + outputLib = AbstractTestTools.getInputJackLibrary(jackOutput); + InputVFile myClass1 = outputLib.getFile(FileType.JAYCE, TYPE1_PATH); + InputVFile myClass2 = outputLib.getFile(FileType.JAYCE, TYPE2_PATH); + InputVFile myClass3 = outputLib.getFile(FileType.JAYCE, TYPE3_PATH); + checkJayceNotEmpty(myClass1); + checkJayceNotEmpty(myClass2); + checkJayceNotEmpty(myClass3); + } catch (FileTypeDoesNotExistException e) { + Assert.fail(); + } finally { + if (outputLib != null) { + outputLib.close(); + } + Assert.assertTrue(errOut.toString().isEmpty()); + } } /** @@ -199,20 +177,30 @@ public class FileConflictTests { ByteArrayOutputStream errOut = new ByteArrayOutputStream(); runTest001(jackOutput, "keep-first", errOut /* errorStream */, /* isApiTest = */ false, /* verbose = */ true); - File myClass1 = new File(jackOutput, JACK_FILE_PATH_1); - File myClass2 = new File(jackOutput, JACK_FILE_PATH_2); - File myClass3 = new File(jackOutput, JACK_FILE_PATH_3); - Assert.assertTrue(myClass1.exists()); - Assert.assertTrue(myClass2.exists()); - Assert.assertTrue(myClass3.exists()); - String errString = errOut.toString(); - Assert.assertTrue( - errString.contains("Type com.android.jack.fileconflict.test001.jack.MyClass")); - Assert.assertTrue( - errString.contains("Type com.android.jack.fileconflict.test001.jack.MyClass2")); - Assert.assertTrue( - errString.contains("Type com.android.jack.fileconflict.test001.jack.MyClass3")); - Assert.assertTrue(errString.contains("has already been imported")); + InputJackLibrary outputLib = null; + try { + outputLib = AbstractTestTools.getInputJackLibrary(jackOutput); + InputVFile myClass1 = outputLib.getFile(FileType.JAYCE, TYPE1_PATH); + InputVFile myClass2 = outputLib.getFile(FileType.JAYCE, TYPE2_PATH); + InputVFile myClass3 = outputLib.getFile(FileType.JAYCE, TYPE3_PATH); + checkJayceNotEmpty(myClass1); + checkJayceNotEmpty(myClass2); + checkJayceNotEmpty(myClass3); + } catch (FileTypeDoesNotExistException e) { + Assert.fail(); + } finally { + if (outputLib != null) { + outputLib.close(); + } + String errString = errOut.toString(); + Assert.assertTrue( + errString.contains("Type com.android.jack.fileconflict.test001.jack.MyClass")); + Assert.assertTrue( + errString.contains("Type com.android.jack.fileconflict.test001.jack.MyClass2")); + Assert.assertTrue( + errString.contains("Type com.android.jack.fileconflict.test001.jack.MyClass3")); + Assert.assertTrue(errString.contains("has already been imported")); + } } /** @@ -221,7 +209,6 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test002a() throws Exception { File jackOutput; ByteArrayOutputStream errOut = new ByteArrayOutputStream(); @@ -233,7 +220,6 @@ public class FileConflictTests { Assert.assertTrue(e.getCause() instanceof LibraryReadingException); Assert.assertTrue(e.getCause().getCause() instanceof ResourceImportConflictException); String errString = errOut.toString(); - Assert.assertTrue(errString.contains("Resource in")); Assert.assertTrue(errString.contains("rsc/Resource1")); Assert.assertTrue(errString.contains("has already been imported")); } @@ -245,7 +231,6 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test002b() throws Exception { File jackOutput; ByteArrayOutputStream errOut = new ByteArrayOutputStream(); @@ -257,7 +242,6 @@ public class FileConflictTests { Assert.assertTrue(e.getCause() instanceof LibraryReadingException); Assert.assertTrue(e.getCause().getCause() instanceof ResourceImportConflictException); String errString = errOut.toString(); - Assert.assertTrue(errString.contains("Resource in")); Assert.assertTrue(errString.contains("rsc/Resource1")); Assert.assertTrue(errString.contains("has already been imported")); } @@ -270,15 +254,22 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test002c() throws Exception { File jackOutput; ByteArrayOutputStream errOut = new ByteArrayOutputStream(); jackOutput = runTest002(false /* non-zipped */, "keep-first", errOut, /* isApiTest = */ false, /* verbose = */ false); - checkResourceContent(jackOutput, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(jackOutput, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(jackOutput, RESOURCE3_LONGPATH, "Res3"); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(jackOutput); + checkResourceContent(lib, RESOURCE1_PATH, "Res1"); + checkResourceContent(lib, RESOURCE2_PATH, "Res2"); + checkResourceContent(lib, RESOURCE3_PATH, "Res3"); + } finally { + if (lib != null) { + lib.close(); + } + } Assert.assertTrue(errOut.toString().isEmpty()); } @@ -288,7 +279,6 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test002d() throws Exception { File jackOutput; ByteArrayOutputStream errOut = new ByteArrayOutputStream(); @@ -300,7 +290,6 @@ public class FileConflictTests { Assert.assertTrue(e.getCause() instanceof LibraryReadingException); Assert.assertTrue(e.getCause().getCause() instanceof ResourceImportConflictException); String errString = errOut.toString(); - Assert.assertTrue(errString.contains("Resource in")); Assert.assertTrue(errString.contains("rsc/Resource1")); Assert.assertTrue(errString.contains("has already been imported")); } @@ -312,7 +301,6 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore public void test002e() throws Exception { File jackOutput; ByteArrayOutputStream errOut = new ByteArrayOutputStream(); @@ -324,7 +312,6 @@ public class FileConflictTests { Assert.assertTrue(e.getCause() instanceof LibraryReadingException); Assert.assertTrue(e.getCause().getCause() instanceof ResourceImportConflictException); String errString = errOut.toString(); - Assert.assertTrue(errString.contains("Resource in")); Assert.assertTrue(errString.contains("rsc/Resource1")); Assert.assertTrue(errString.contains("has already been imported")); } @@ -342,10 +329,17 @@ public class FileConflictTests { ByteArrayOutputStream errOut = new ByteArrayOutputStream(); jackOutput = runTest002(true /* zipped */, "keep-first", errOut, /* isApiTest = */ false, /* verbose = */ false); - ZipFile zipFile = new ZipFile(jackOutput); - checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3"); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(jackOutput); + checkResourceContent(lib, RESOURCE1_PATH, "Res1"); + checkResourceContent(lib, RESOURCE2_PATH, "Res2"); + checkResourceContent(lib, RESOURCE3_PATH, "Res3"); + } finally { + if (lib != null) { + lib.close(); + } + } Assert.assertTrue(errOut.toString().isEmpty()); } @@ -362,12 +356,18 @@ public class FileConflictTests { ByteArrayOutputStream errOut = new ByteArrayOutputStream(); jackOutput = runTest002(true /* zipped */, "keep-first", errOut, /* isApiTest = */ false, /* verbose = */ true); - ZipFile zipFile = new ZipFile(jackOutput); - checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3"); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(jackOutput); + checkResourceContent(lib, RESOURCE1_PATH, "Res1"); + checkResourceContent(lib, RESOURCE2_PATH, "Res2"); + checkResourceContent(lib, RESOURCE3_PATH, "Res3"); + } finally { + if (lib != null) { + lib.close(); + } + } String errString = errOut.toString(); - Assert.assertTrue(errString.contains("Resource in")); Assert.assertTrue(errString.contains("rsc/Resource1")); Assert.assertTrue(errString.contains("has already been imported")); } @@ -378,9 +378,8 @@ public class FileConflictTests { * @throws Exception */ @Test - @Ignore - public void test003a() throws Exception { - // compile source files to a Jack dir + public void test003() throws Exception { + File jackOutput = AbstractTestTools.createTempDir(); File testSrcDir = AbstractTestTools.getTestRootDir("com.android.jack.fileconflict.test003"); File tempJackFolder = AbstractTestTools.createTempDir(); @@ -389,141 +388,99 @@ public class FileConflictTests { exclude.add(LegacyJillToolchain.class); JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, exclude); - toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) + toolchain.addResourceDir(new File(testSrcDir, "jack/rsc1")) + .addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( tempJackFolder, /* zipFiles = */ false, testSrcDir); - // get paths for Jack files - String jackFilePath = - FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.jayce"; - File myClass1 = new File(tempJackFolder, jackFilePath); - - // get paths for Dex files - String dexFilePath = - FileType.DEX.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.dex"; - File myClass1Dex = new File(tempJackFolder, dexFilePath); - - String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); - File libProperties = new File(tempJackFolder, libPropName); - File digestFile = new File(tempJackFolder, FileType.DEX.getPrefix() + "/digest"); - - - // create Jack dirs to import - File jackImport1 = AbstractTestTools.createTempDir(); - AbstractTestTools.copyFileToDir(libProperties, libPropName, jackImport1); - AbstractTestTools.copyFileToDir(myClass1, jackFilePath, jackImport1); - AbstractTestTools.copyFileToDir(myClass1Dex, dexFilePath, jackImport1); - AbstractTestTools.copyFileToDir(digestFile, FileType.DEX.getPrefix() + "/digest", jackImport1); - - // copy Jack file to output dir - AbstractTestTools.copyFileToDir(myClass1, jackFilePath, jackOutput); - AbstractTestTools.copyFileToDir(myClass1Dex, dexFilePath, jackOutput); - - toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, exclude); - toolchain.addProguardFlags(new File(testSrcDir, "proguard.flags")); - toolchain.libToLib(jackImport1, jackOutput, false); - } - - /** - * Test the behavior of Jack when outputting a resource to a Jack folder where a file of the - * same name already exists. We expect the previous file to be overridden. - * @throws Exception - */ - @Test - @Ignore("Now jack generate library, a previous file can not exists") - public void test003b() throws Exception { - File jackOutput = AbstractTestTools.createTempDir(); - - // compile source files to a Jack dir - File testSrcDir = AbstractTestTools.getTestRootDir("com.android.jack.fileconflict.test003.jack"); - File tempJackFolder = AbstractTestTools.createTempDir(); - JackBasedToolchain toolchain = - AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) + toolchain = + AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, exclude); + toolchain.addResourceDir(new File(testSrcDir, "jack/rsc2")) + .addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( tempJackFolder, /* zipFiles = */ false, testSrcDir); - // get paths for Jack files - String jackFilePath = - FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.jayce"; - File myClass1 = new File(tempJackFolder, jackFilePath); - - String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); - File libProperties = new File(tempJackFolder, libPropName); - - // create Jack dirs to import - File jackImport1 = AbstractTestTools.createTempDir(); - String resourcePath = "com/android/jack/fileconflict/test003/jack/Resource"; - File resource = new File(testSrcDir, "Resource"); - AbstractTestTools.copyFileToDir(libProperties, libPropName, jackImport1); - AbstractTestTools.copyFileToDir(myClass1, jackFilePath, jackImport1); - AbstractTestTools.copyFileToDir(resource, resourcePath, jackImport1); - - // copy a different resource to output dir with the same name - File resource2 = new File(testSrcDir, "Resource2"); - AbstractTestTools.copyFileToDir(resource2, resourcePath, jackOutput); - - // run Jack on Jack dir - toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.libToLib(jackImport1, jackOutput, /* zipFiles = */ false); + VPath typePath = new VPath("com/android/jack/fileconflict/test003/jack/MyClass", '/'); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(tempJackFolder); - checkResourceContent(jackOutput, resourcePath, "Res1"); + // check Jayce file is not empty + InputVFile jayceFile = lib.getFile(FileType.JAYCE, typePath); + checkJayceNotEmpty(jayceFile); + // check Resource file content + checkResourceContent(lib, new VPath("Resource", '/'), "Res2"); + } finally { + if (lib != null) { + lib.close(); + } + } } /** - * Test the behavior of Jack when renaming a Jack file along with the resource with a matching + * Test the behavior of Jack when renaming a Jayce file along with the resource with a matching * name, and when a resource with the same name (after renaming) already exists. * @throws Exception */ @Test - @Category(KnownBugs.class) public void test004() throws Exception { File jackOutput = AbstractTestTools.createTempDir(); + VPath pathToType = new VPath("com/android/jack/fileconflict/test004/jack/MyClass", '/'); + VPath pathToRenamedType = new VPath("pcz/nbqfcvq/wnpx/svyrpcbsyvph/hrgh004/wnpx/ZmPyngg", '/'); + VPath pathToResource2 = pathToRenamedType.clone().addSuffix(".txt"); - // compile source files to a Jack dir - File testSrcDir = AbstractTestTools.getTestRootDir("com.android.jack.fileconflict.test004.jack"); - File tempJackFolder = AbstractTestTools.createTempDir(); + // compile source files to a lib dir while importing ZmPyngg.txt + File testSrcDir = + AbstractTestTools.getTestRootDir("com.android.jack.fileconflict.test004.jack"); + File jackImport1 = AbstractTestTools.createTempDir(); JackApiToolchainBase toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); - toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) + toolchain.addResourceDir(new File(testSrcDir, "rsc2")) + .addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( - tempJackFolder, + jackImport1, /* zipFiles = */ false, testSrcDir); - // get paths for Jack files - String jackFilePath = - FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test004/jack/MyClass.jayce"; - File myClass1 = new File(tempJackFolder, jackFilePath); - - String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); - File libProperties = new File(tempJackFolder, libPropName); - - // create Jack dirs to import - File jackImport1 = AbstractTestTools.createTempDir(); - File resource = new File(testSrcDir, "MyClass.txt"); - AbstractTestTools.copyFileToDir(libProperties, libPropName, jackImport1); - AbstractTestTools.copyFileToDir(myClass1, jackFilePath, jackImport1); - AbstractTestTools.copyFileToDir(resource, "com/android/jack/fileconflict/test004/jack/MyClass.txt", jackImport1); - - // copy a different resource to output dir with the same name - File resource2 = new File(testSrcDir, "a.txt"); - AbstractTestTools.copyFileToDir(resource2, "pcz/nbqfcvq/wnpx/svyrpcbsyvph/hrgh004/wnpx/ZmPyngg.txt", jackOutput); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(jackImport1); + checkResourceContent(lib, pathToResource2, "a"); + checkJayceNotEmpty(lib.getFile(FileType.JAYCE, pathToType)); + } finally { + if (lib != null) { + lib.close(); + } + } - // run Jack on Jack dir + // compile source files to the same lib dir while importing MyClass.txt which should be + // obfuscated as ZmPyngg.txt toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); + toolchain.addResourceDir(new File(testSrcDir, "rsc1")); toolchain.addProguardFlags(new File(testSrcDir, "proguard.flags")); toolchain.addProperty(NameProviderFactory.NAMEPROVIDER.getName(), "rot13"); - toolchain.libToLib(jackImport1, jackOutput, /* zipFiles = */ false); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) + .srcToLib( + jackImport1, + /* zipFiles = */ false, + testSrcDir); - checkResourceContent(jackOutput, "pcz/nbqfcvq/wnpx/svyrpcbsyvph/hrgh004/wnpx/ZmPyngg.txt", - "MyClass"); + try { + lib = AbstractTestTools.getInputJackLibrary(jackImport1); + checkResourceContent(lib, pathToResource2, "MyClass"); + checkJayceNotEmpty(lib.getFile(FileType.JAYCE, pathToRenamedType)); + checkJayceNotEmpty(lib.getFile(FileType.JAYCE, pathToType)); // still here from 1st run + } finally { + if (lib != null) { + lib.close(); + } + } } @Nonnull @@ -538,54 +495,39 @@ public class FileConflictTests { private void runTest001(@Nonnull File jackOutput, @CheckForNull String collisionPolicy, @CheckForNull OutputStream errorStream, boolean isApiTest, boolean verbose) throws Exception { - // compile source files to a Jack dir - File tempJackFolder = AbstractTestTools.createTempDir(); - JackBasedToolchain toolchain = getToolchain(isApiTest); + // create Jack dirs to import + File jackLib1 = AbstractTestTools.createTempDir(); + File jackLib2 = AbstractTestTools.createTempDir(); + + File srcFile1 = new File(TEST001_DIR, "MyClass.java"); + File srcFile2 = new File(TEST001_DIR, "MyClass2.java"); + File srcFile3 = new File(TEST001_DIR, "MyClass3.java"); + JackBasedToolchain toolchain = getToolchain(isApiTest); if (errorStream != null) { toolchain.setErrorStream(errorStream); } toolchain.setVerbose(verbose); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()).srcToLib( - tempJackFolder, + jackLib1, /* zipFile = */ false, - TEST001_DIR); - - // get paths for Jack files - File myClass1 = new File(tempJackFolder, JACK_FILE_PATH_1); - File myClass2 = new File(tempJackFolder, JACK_FILE_PATH_2); - File myClass3 = new File(tempJackFolder, JACK_FILE_PATH_3); - - // get paths for dex files - File myClass1Dex = new File(tempJackFolder, DEX_FILE_PATH_1); - File myClass2Dex = new File(tempJackFolder, DEX_FILE_PATH_2); - File myClass3Dex = new File(tempJackFolder, DEX_FILE_PATH_3); + srcFile1, srcFile2); - String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); - File libProperties = new File(tempJackFolder, libPropName); - File digestFile = new File(tempJackFolder, FileType.DEX.getPrefix() + "/digest"); - - // create Jack dirs to import - File jackImport1 = AbstractTestTools.createTempDir(); - File jackImport2 = AbstractTestTools.createTempDir(); - AbstractTestTools.copyFileToDir(digestFile, FileType.DEX.getPrefix() + "/digest", jackImport1); - AbstractTestTools.copyFileToDir(digestFile, FileType.DEX.getPrefix() + "/digest", jackImport2); - AbstractTestTools.copyFileToDir(libProperties, libPropName, jackImport1); - AbstractTestTools.copyFileToDir(myClass1, JACK_FILE_PATH_1, jackImport1); - AbstractTestTools.copyFileToDir(myClass1Dex, DEX_FILE_PATH_1, jackImport1); - AbstractTestTools.copyFileToDir(myClass2, JACK_FILE_PATH_2, jackImport1); - AbstractTestTools.copyFileToDir(myClass2Dex, DEX_FILE_PATH_2, jackImport1); - AbstractTestTools.copyFileToDir(libProperties, libPropName, jackImport2); - AbstractTestTools.copyFileToDir(myClass1, JACK_FILE_PATH_1, jackImport2); - AbstractTestTools.copyFileToDir(myClass1Dex, DEX_FILE_PATH_1, jackImport2); - AbstractTestTools.copyFileToDir(myClass3, JACK_FILE_PATH_3, jackImport2); - AbstractTestTools.copyFileToDir(myClass3Dex, DEX_FILE_PATH_3, jackImport2); + toolchain = getToolchain(isApiTest); + if (errorStream != null) { + toolchain.setErrorStream(errorStream); + } + toolchain.setVerbose(verbose); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()).srcToLib( + jackLib2, + /* zipFile = */ false, + srcFile1, srcFile3); // run Jack on Jack dirs toolchain = getToolchain(isApiTest); toolchain.addProguardFlags(new File(TEST001_DIR, "proguard.flags")); - toolchain.addStaticLibs(jackImport1, jackImport2); + toolchain.addStaticLibs(jackLib1, jackLib2); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); if (collisionPolicy != null) { toolchain.addProperty(JayceFileImporter.COLLISION_POLICY.getName(), collisionPolicy); @@ -593,7 +535,7 @@ public class FileConflictTests { if (errorStream != null) { toolchain.setErrorStream(errorStream); } - toolchain.libToLib(new File [] {jackImport1, jackImport2}, jackOutput, /* zipFiles = */ false); + toolchain.libToLib(new File [] {jackLib1, jackLib2}, jackOutput, /* zipFiles = */ false); } @Nonnull @@ -604,7 +546,7 @@ public class FileConflictTests { File lib1 = new File(TEST002_DIR, "lib1"); JackBasedToolchain toolchain = getToolchain(isApiTest); - toolchain.addResource(new File(lib1, "rsc")); + toolchain.addResourceDir(new File(lib1, "rsc")); if (errorStream != null) { toolchain.setErrorStream(errorStream); } @@ -618,7 +560,7 @@ public class FileConflictTests { File jackImport2 = AbstractTestTools.createTempDir(); File lib2 = new File(TEST002_DIR, "lib2"); toolchain = getToolchain(isApiTest); - toolchain.addResource(new File(lib2, "rsc")); + toolchain.addResourceDir(new File(lib2, "rsc")); if (errorStream != null) { toolchain.setErrorStream(errorStream); } @@ -647,15 +589,12 @@ public class FileConflictTests { return jackOutput; } - private void checkResourceContent(@Nonnull File dir, @Nonnull String path, - @Nonnull String expectedContent) throws IOException { - assert dir.isDirectory(); - File file = new File(dir, path); - Assert.assertTrue(file.exists()); + private void checkResourceContent(@Nonnull InputJackLibrary lib, @Nonnull VPath path, + @Nonnull String expectedContent) throws IOException, FileTypeDoesNotExistException { BufferedReader reader = null; try { - InputStream in = new FileInputStream(file); - reader = new BufferedReader(new InputStreamReader(in)); + reader = new BufferedReader( + new InputStreamReader(lib.getFile(FileType.RSC, path).getInputStream())); String line = reader.readLine(); Assert.assertEquals(expectedContent, line); } finally { @@ -665,20 +604,8 @@ public class FileConflictTests { } } - private void checkResourceContent(@Nonnull ZipFile zipFile, @Nonnull String entryName, - @Nonnull String expectedContent) throws IOException { - ZipEntry entry = zipFile.getEntry(entryName); - Assert.assertNotNull(entry); - BufferedReader reader = null; - try { - InputStream in = zipFile.getInputStream(entry); - reader = new BufferedReader(new InputStreamReader(in)); - String line = reader.readLine(); - Assert.assertEquals(expectedContent, line); - } finally { - if (reader != null) { - reader.close(); - } - } + private void checkJayceNotEmpty(@Nonnull InputVFile jayceFile) { + File file = new File(((FileLocation) jayceFile.getLocation()).getPath()); + Assert.assertTrue(file.length() > 0); } } diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource1 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/rsc/Resource1 index b98ccd9..b98ccd9 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource1 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/rsc/Resource1 diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource2 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/rsc/Resource2 index 1bcdbc0..1bcdbc0 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource2 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/rsc/Resource2 diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource1 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/rsc/Resource1 index b98ccd9..b98ccd9 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource1 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/rsc/Resource1 diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource3 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/rsc/Resource3 index d0da24e..d0da24e 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource3 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/rsc/Resource3 diff --git a/jack-tests/tests/com/android/jack/fileconflict/test003/jack/proguard.flags b/jack-tests/tests/com/android/jack/fileconflict/test003/jack/proguard.flags deleted file mode 100644 index b46ee55..0000000 --- a/jack-tests/tests/com/android/jack/fileconflict/test003/jack/proguard.flags +++ /dev/null @@ -1,2 +0,0 @@ --keep class com.android.jack.fileconflict.test003.jack.* --dontobfuscate diff --git a/jack-tests/tests/com/android/jack/fileconflict/test003/jack/Resource b/jack-tests/tests/com/android/jack/fileconflict/test003/jack/rsc1/Resource index b98ccd9..b98ccd9 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test003/jack/Resource +++ b/jack-tests/tests/com/android/jack/fileconflict/test003/jack/rsc1/Resource diff --git a/jack-tests/tests/com/android/jack/fileconflict/test003/jack/Resource2 b/jack-tests/tests/com/android/jack/fileconflict/test003/jack/rsc2/Resource index 1bcdbc0..1bcdbc0 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test003/jack/Resource2 +++ b/jack-tests/tests/com/android/jack/fileconflict/test003/jack/rsc2/Resource diff --git a/jack-tests/tests/com/android/jack/fileconflict/test004/jack/MyClass.txt b/jack-tests/tests/com/android/jack/fileconflict/test004/jack/rsc1/com/android/jack/fileconflict/test004/jack/MyClass.txt index cc5c81f..cc5c81f 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test004/jack/MyClass.txt +++ b/jack-tests/tests/com/android/jack/fileconflict/test004/jack/rsc1/com/android/jack/fileconflict/test004/jack/MyClass.txt diff --git a/jack-tests/tests/com/android/jack/fileconflict/test004/jack/a.txt b/jack-tests/tests/com/android/jack/fileconflict/test004/jack/rsc2/pcz/nbqfcvq/wnpx/svyrpcbsyvph/hrgh004/wnpx/ZmPyngg.txt index 7898192..7898192 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test004/jack/a.txt +++ b/jack-tests/tests/com/android/jack/fileconflict/test004/jack/rsc2/pcz/nbqfcvq/wnpx/svyrpcbsyvph/hrgh004/wnpx/ZmPyngg.txt diff --git a/jack-tests/tests/com/android/jack/library/LibraryTests.java b/jack-tests/tests/com/android/jack/library/LibraryTests.java index a9bb144..c482827 100644 --- a/jack-tests/tests/com/android/jack/library/LibraryTests.java +++ b/jack-tests/tests/com/android/jack/library/LibraryTests.java @@ -121,7 +121,7 @@ public class LibraryTests { AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); File emptyLib = AbstractTestTools.createTempFile("rsc", toolchain.getLibraryExtension()); - toolchain.addResource(AbstractTestTools.getTestRootDir("com.android.jack.library.test001.lib")); + toolchain.addResourceDir(AbstractTestTools.getTestRootDir("com.android.jack.library.test001.lib")); toolchain.srcToLib(emptyLib, /* zipFiles = */ true); return emptyLib; diff --git a/jack-tests/tests/com/android/jack/multidex/MultiDexTests.java b/jack-tests/tests/com/android/jack/multidex/MultiDexTests.java index 303a672..e9ec887 100644 --- a/jack-tests/tests/com/android/jack/multidex/MultiDexTests.java +++ b/jack-tests/tests/com/android/jack/multidex/MultiDexTests.java @@ -16,15 +16,12 @@ package com.android.jack.multidex; -import com.google.common.io.Files; - import com.android.jack.Options; import com.android.jack.backend.dex.DexFileWriter; import com.android.jack.backend.dex.MultiDexLegacy; import com.android.jack.comparator.DifferenceFoundException; import com.android.jack.dx.io.ClassDef; import com.android.jack.dx.io.DexBuffer; -import com.android.jack.library.FileType; import com.android.jack.preprocessor.PreProcessor; import com.android.jack.shrob.ListingComparator; import com.android.jack.test.category.KnownBugs; @@ -45,19 +42,15 @@ import com.android.sched.util.TextUtils; import junit.framework.Assert; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Properties; import javax.annotation.Nonnull; @@ -263,7 +256,8 @@ public class MultiDexTests { } @Nonnull - private static File prepareLib(@Nonnull File sources, @Nonnull File... classpath) throws Exception { + private static File prepareLib(@Nonnull File sources, @Nonnull File... classpath) + throws Exception { File outDir = AbstractTestTools.createTempDir(); List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>(); exclude.add(LegacyJillToolchain.class); @@ -289,37 +283,27 @@ public class MultiDexTests { } @Nonnull - private static File prepareLibrary(@Nonnull File frameworks) throws IOException, Exception { + private static File prepareLibrary(@Nonnull File classpath) throws IOException, Exception { return prepareLib(AbstractTestTools.getTestRootDir("com.android.jack.multidex.fakelibrary"), - frameworks); + classpath); } - private static void setMetaIntoJackProperties(@Nonnull File library) throws IOException { - File jackProperties = new File(library, "jack.properties"); - Properties libraryProperties = new Properties(); - FileInputStream fis = null; - FileOutputStream fos = null; - try { - fis = new FileInputStream(jackProperties); - libraryProperties.load(fis); - } catch (IOException e) { - Assert.fail(); - } finally { - if (fis != null) { - fis.close(); - } - } - try { - fos = new FileOutputStream(jackProperties); - libraryProperties.put(FileType.JPP.buildPropertyName(null /*suffix*/), "true"); - libraryProperties.store(fos, "Library properties"); - } catch (IOException e) { - Assert.fail(); - } finally { - if (fos != null) { - fos.close(); - } - } + @Nonnull + private static File prepareAutoLibrary() throws Exception { + File jppDir = AbstractTestTools.getTestRootDir("com.android.jack.multidex.jpp"); + File autoLibrary = AbstractTestTools.createTempDir(); + List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>(); + exclude.add(LegacyJillToolchain.class); + JackBasedToolchain toolchain = + AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, exclude); + toolchain.addMetaDir(jppDir) + .addToClasspath(toolchain.getDefaultBootClasspath()) + .addToClasspath(frameworks) + .srcToLib( + autoLibrary, + /* zipFiles = */ false, + AbstractTestTools.getTestRootDir("com.android.jack.multidex.fakelibrary")); + return autoLibrary; } @Test @@ -330,7 +314,8 @@ public class MultiDexTests { JackApiToolchainBase toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); - addCommonOptionsForMultiDex(toolchain, new File(testFolder, "config-001.jpp")); + File jppDir = AbstractTestTools.getTestRootDir("com.android.jack.multidex.jpp"); + addCommonOptionsForMultiDex(toolchain, new File(jppDir, "config-001.jpp")); toolchain.addProperty(DexFileWriter.DEX_WRITING_POLICY.getName(), "multidex"); toolchain.addProperty(Options.USE_DEFAULT_LIBRARIES.getName(), "false"); @@ -361,7 +346,8 @@ public class MultiDexTests { JackApiToolchainBase toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); - addCommonOptionsForMultiDex(toolchain, new File(testFolder, "config-001.jpp")); + File jppDir = AbstractTestTools.getTestRootDir("com.android.jack.multidex.jpp"); + addCommonOptionsForMultiDex(toolchain, new File(jppDir, "config-001.jpp")); toolchain.addProperty(DexFileWriter.DEX_WRITING_POLICY.getName(), "minimal-multidex"); toolchain.addStaticLibs(library); toolchain.addProperty(Options.USE_DEFAULT_LIBRARIES.getName(), "false"); @@ -388,14 +374,9 @@ public class MultiDexTests { @Test @Category(SlowTests.class) - @Ignore public void legacyAppTest002b_auto() throws Exception { File testFolder = AbstractTestTools.getTestRootDir("com.android.jack.multidex.test002.jack"); - File autoLibrary = prepareLibrary(frameworks); - setMetaIntoJackProperties(autoLibrary); - File jackInf = new File(autoLibrary, FileType.JPP.getPrefix()); - Assert.assertTrue(jackInf.mkdir()); - Files.copy(new File(testFolder,"config-001.jpp"), new File(jackInf, "config-001.jpp")); + File autoLibrary = prepareAutoLibrary(); JackApiToolchainBase toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); @@ -479,14 +460,9 @@ public class MultiDexTests { } @Test - @Ignore public void legacyAppTest002b_auto_withoutAnnotations() throws Exception { File testFolder = AbstractTestTools.getTestRootDir("com.android.jack.multidex.test002.jack"); - File autoLibrary = prepareLibrary(frameworks); - setMetaIntoJackProperties(autoLibrary); - File jackInf = new File(autoLibrary, FileType.JPP.getPrefix()); - Assert.assertTrue(jackInf.mkdir()); - Files.copy(new File(testFolder,"config-001.jpp"), new File(jackInf, "config-001.jpp")); + File autoLibrary = prepareAutoLibrary(); File out = AbstractTestTools.createTempDir(); List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>(); diff --git a/jack-tests/tests/com/android/jack/multidex/test002/jack/config-001.jpp b/jack-tests/tests/com/android/jack/multidex/jpp/config-001.jpp index cbcfdf5..2a3eb03 100644 --- a/jack-tests/tests/com/android/jack/multidex/test002/jack/config-001.jpp +++ b/jack-tests/tests/com/android/jack/multidex/jpp/config-001.jpp @@ -1,4 +1,4 @@ -multidexInstanciable: +multidexInstantiable: @@com.android.jack.annotations.MultiDexInstaller class * is { diff --git a/jack-tests/tests/com/android/jack/resource/ResourceTests.java b/jack-tests/tests/com/android/jack/resource/ResourceTests.java index 7098d91..edac93e 100644 --- a/jack-tests/tests/com/android/jack/resource/ResourceTests.java +++ b/jack-tests/tests/com/android/jack/resource/ResourceTests.java @@ -115,7 +115,7 @@ public class ResourceTests { // compile source file to a Jack dir File jackFolder = AbstractTestTools.createTempDir(); JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.addResource(new File(FILE, "rsc")); + toolchain.addResourceDir(new File(FILE, "rsc")); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( jackFolder, @@ -168,7 +168,7 @@ public class ResourceTests { // compile source file to a Jack dir File jackFolder = AbstractTestTools.createTempDir(); JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.addResource(new File(FILE, "rsc")); + toolchain.addResourceDir(new File(FILE, "rsc")); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( jackFolder, @@ -230,7 +230,7 @@ public class ResourceTests { // compile source file to a Jack dir File jackFolder = AbstractTestTools.createTempDir(); JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.addResource(new File(FILE, "rsc")); + toolchain.addResourceDir(new File(FILE, "rsc")); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( jackFolder, @@ -264,7 +264,7 @@ public class ResourceTests { // compile source file to a Jack dir File jackFolder = AbstractTestTools.createTempDir(); JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.addResource(new File(FILE, "rsc")); + toolchain.addResourceDir(new File(FILE, "rsc")); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( jackFolder, @@ -288,7 +288,7 @@ public class ResourceTests { // compile source file to a Jack dir File jackFolder = AbstractTestTools.createTempDir(); JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.addResource(new File(FILE, "rsc")); + toolchain.addResourceDir(new File(FILE, "rsc")); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( jackFolder, @@ -321,7 +321,7 @@ public class ResourceTests { String resource2LongPath = "com/android/jack/resource/test003/jack/A.txt"; JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); - toolchain.addResource(rscFolder).addToClasspath(toolchain.getDefaultBootClasspath()) + toolchain.addResourceDir(rscFolder).addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( jackOutputFolder, /* zipFiles = */ false, @@ -370,7 +370,7 @@ public class ResourceTests { // compile source file to a Jack file JackBasedToolchain toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); File jackAr = AbstractTestTools.createTempFile("resourcetestjack", toolchain.getLibraryExtension()); - toolchain.addResource(new File(FILE, "rsc")); + toolchain.addResourceDir(new File(FILE, "rsc")); toolchain.addToClasspath(toolchain.getDefaultBootClasspath()) .srcToLib( jackAr, diff --git a/jack-tests/tests/com/android/jack/withphantom/WithPhantomTests.java b/jack-tests/tests/com/android/jack/withphantom/WithPhantomTests.java index 98f8bca..368e2ab 100644 --- a/jack-tests/tests/com/android/jack/withphantom/WithPhantomTests.java +++ b/jack-tests/tests/com/android/jack/withphantom/WithPhantomTests.java @@ -18,21 +18,20 @@ package com.android.jack.withphantom; import com.android.jack.ProguardFlags; import com.android.jack.library.FileType; -import com.android.jack.test.category.KnownBugs; +import com.android.jack.library.InputJackLibrary; import com.android.jack.test.toolchain.AbstractTestTools; import com.android.jack.test.toolchain.IToolchain; import com.android.jack.test.toolchain.JackBasedToolchain; import com.android.jack.test.toolchain.LegacyJillToolchain; +import com.android.sched.vfs.InputVFile; +import com.android.sched.vfs.VPath; -import junit.framework.Assert; - -import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import java.io.File; -import java.io.FilenameFilter; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import javax.annotation.Nonnull; @@ -50,13 +49,7 @@ public class WithPhantomTests { @Nonnull private static final String TEST002_JACK = TEST002 + ".jack"; - @Nonnull - private static String fixPath(@Nonnull String unixPath) { - return unixPath.replace('/', File.separatorChar); - } - @Test - @Ignore public void testPhantomOuter() throws Exception { File tempJackFolder = AbstractTestTools.createTempDir(); List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>(); @@ -69,10 +62,16 @@ public class WithPhantomTests { /* zipFiles = */ false, AbstractTestTools.getTestRootDir(TEST001_JACK)); - boolean deleted = - new File(tempJackFolder, FileType.JAYCE.getPrefix() + File.separatorChar - + fixPath("com/android/jack/withphantom/test001/jack/A.jayce")).delete(); - Assert.assertTrue(deleted); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(tempJackFolder); + lib.getFile(FileType.JAYCE, new VPath("com/android/jack/withphantom/test001/jack/A", '/')) + .delete(); + } finally { + if (lib != null) { + lib.close(); + } + } File testFolder = AbstractTestTools.getTestRootDir(TEST001); @@ -93,6 +92,7 @@ public class WithPhantomTests { File tempOut4 = AbstractTestTools.createTempDir(); toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, exclude); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); toolchain.addProguardFlags(new ProguardFlags(testFolder, "obf2.flags")) .libToLib(tempJackFolder, tempOut4, /* zipFiles = */ false); @@ -102,7 +102,6 @@ public class WithPhantomTests { } @Test - @Ignore public void testPhantomInner() throws Exception { File tempJackFolder = AbstractTestTools.createTempDir(); List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>(); @@ -115,19 +114,22 @@ public class WithPhantomTests { /* zipFiles = */ false, AbstractTestTools.getTestRootDir(TEST001_JACK)); - boolean deleted = - new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar - + "com/android/jack/withphantom/test001/jack/A$Inner1.jayce")).delete(); - Assert.assertTrue(deleted); - deleted = - new File(tempJackFolder, fixPath(FileType.DEX.getPrefix() + File.separatorChar - + "com/android/jack/withphantom/test001/jack/A$Inner1.dex")).delete(); - Assert.assertTrue(deleted); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(tempJackFolder); + lib.getFile(FileType.JAYCE, + new VPath("com/android/jack/withphantom/test001/jack/A$Inner1", '/')).delete(); + } finally { + if (lib != null) { + lib.close(); + } + } File testFolder = AbstractTestTools.getTestRootDir(TEST001); File tempOut1 = AbstractTestTools.createTempDir(); toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); toolchain.addProguardFlags(new ProguardFlags(testFolder, "shrink1.flags")) .libToLib(tempJackFolder, tempOut1, /* zipFiles = */ false); @@ -138,6 +140,7 @@ public class WithPhantomTests { File tempOut3 = AbstractTestTools.createTempDir(); toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); toolchain.addProguardFlags(new ProguardFlags(testFolder, "obf1.flags")) .libToLib(tempJackFolder, tempOut3, /* zipFiles = */ false); @@ -151,7 +154,6 @@ public class WithPhantomTests { toolchain.libToExe(tempJackFolder, tempOutFolder, /* zipFile = */ false); } - @Category(KnownBugs.class) @Test public void testPhantomLocal() throws Exception { File tempJackFolder = AbstractTestTools.createTempDir(); @@ -163,22 +165,28 @@ public class WithPhantomTests { /* zipFiles = */ false, AbstractTestTools.getTestRootDir(TEST002_JACK)); - File[] inners = - new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar - + "com/android/jack/withphantom/test002/jack/")).listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.startsWith("A$"); - } - }); - for (File file : inners) { - Assert.assertTrue(file.delete()); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(tempJackFolder); + Iterator<InputVFile> libIter = lib.iterator(FileType.JAYCE); + while (libIter.hasNext()) { + InputVFile jayceFile = libIter.next(); + String path = jayceFile.getPathFromRoot().getPathAsString('/'); + if (path.startsWith("com/android/jack/withphantom/test002/jack/A$")) { + jayceFile.delete(); + } + } + } finally { + if (lib != null) { + lib.close(); + } } File testFolder = AbstractTestTools.getTestRootDir(TEST002); File tempOut1 = AbstractTestTools.createTempDir(); toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); toolchain.addProguardFlags(new ProguardFlags(testFolder, "obf1.flags")) .libToLib(tempJackFolder, tempOut1, /* zipFiles = */ false); @@ -188,7 +196,6 @@ public class WithPhantomTests { } @Test - @Ignore public void testPhantomLocalOuter() throws Exception { File tempJackFolder = AbstractTestTools.createTempDir(); List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>(); @@ -201,10 +208,16 @@ public class WithPhantomTests { /* zipFiles = */ false, AbstractTestTools.getTestRootDir(TEST002_JACK)); - boolean deleted = - new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar - + "com/android/jack/withphantom/test002/jack/A.jayce")).delete(); - Assert.assertTrue(deleted); + InputJackLibrary lib = null; + try { + lib = AbstractTestTools.getInputJackLibrary(tempJackFolder); + lib.getFile(FileType.JAYCE, new VPath("com/android/jack/withphantom/test002/jack/A", '/')) + .delete(); + } finally { + if (lib != null) { + lib.close(); + } + } File testFolder = AbstractTestTools.getTestRootDir(TEST002); diff --git a/jack/rsc/jack-version.properties b/jack/rsc/jack-version.properties new file mode 100644 index 0000000..9a505b2 --- /dev/null +++ b/jack/rsc/jack-version.properties @@ -0,0 +1,26 @@ +# +# Copyright (C) 2015 The Android Open Source Project +# +# 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. +# +version-file.version.code=1 + +version=1.1-rc4 +version.release.name=Brest +version.release.code=2 +version.sub-release.kind=CANDIDATE +version.sub-release.code=17 + +# These properties are added by the release step +# version.buildid=<BUILDID> +# version.sha=<SHA> diff --git a/jack/src/com/android/jack/api/v01/impl/Api01ConfigImpl.java b/jack/src/com/android/jack/api/v01/impl/Api01ConfigImpl.java index 3d96cc7..94a570f 100644 --- a/jack/src/com/android/jack/api/v01/impl/Api01ConfigImpl.java +++ b/jack/src/com/android/jack/api/v01/impl/Api01ConfigImpl.java @@ -76,23 +76,26 @@ public class Api01ConfigImpl implements Api01Config { throw new ConfigurationException(e.getMessage(), e); } - return new Api01CompilationTaskImpl(options); + return new Api01CompilationTaskImpl(options, configHooks); } private static class Api01CompilationTaskImpl implements Api01CompilationTask { @Nonnull private final Options options; + @Nonnull + private final RunnableHooks runSessionHooks; - public Api01CompilationTaskImpl(@Nonnull Options options) { + public Api01CompilationTaskImpl(@Nonnull Options options, + @Nonnull RunnableHooks runSessionHooks) { this.options = options; + this.runSessionHooks = runSessionHooks; } @Override public void run() throws CompilationException, UnrecoverableException { ProcessException pe = null; - RunnableHooks runSessionHooks = new RunnableHooks(); try { try { Jack.run(options, runSessionHooks); diff --git a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java index 796f760..783791c 100644 --- a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java +++ b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java @@ -206,8 +206,7 @@ public class JayceFileImporter { Resource newResource = new Resource(path, file); for (Resource existingResource : session.getResources()) { if (existingResource.getPath().equals(path)) { - throw new ResourceImportConflictException(newResource.getLocation(), - existingResource.getLocation()); + throw new ResourceImportConflictException(existingResource, newResource.getLocation()); } } session.addResource(newResource); diff --git a/jack/src/com/android/jack/library/InputJackLibraryCodec.java b/jack/src/com/android/jack/library/InputJackLibraryCodec.java index 4dbc3f9..f8ba636 100644 --- a/jack/src/com/android/jack/library/InputJackLibraryCodec.java +++ b/jack/src/com/android/jack/library/InputJackLibraryCodec.java @@ -87,7 +87,8 @@ public class InputJackLibraryCodec implements StringCodec<InputJackLibrary> { ChangePermission.NOCHANGE), Permission.READ | Permission.WRITE); try { Service service = messageDigestCodec.checkString(context, "SHA"); - vfs = new CaseInsensitiveFS(directFS, /* nbGroup = */ 1, /* szGroup = */ 2, + vfs = new CaseInsensitiveFS(directFS, /* numGroups = */ JackLibrary.NUM_GROUPS_FOR_DIRS, + /* groupSize = */ JackLibrary.GROUP_SIZE_FOR_DIRS, new MessageDigestFactory(service), /* debug = */ false); } catch (WrongVFSFormatException e) { vfs = directFS; diff --git a/jack/src/com/android/jack/library/JackLibrary.java b/jack/src/com/android/jack/library/JackLibrary.java index 3f98f4d..d91b66b 100644 --- a/jack/src/com/android/jack/library/JackLibrary.java +++ b/jack/src/com/android/jack/library/JackLibrary.java @@ -44,6 +44,10 @@ public interface JackLibrary extends Library { @Nonnull public static final String KEY_LIB_EMITTER_VERSION = "lib.emitter.version"; + public static final int GROUP_SIZE_FOR_DIRS = 2; + + public static final int NUM_GROUPS_FOR_DIRS = 1; + @Nonnull public String getProperty(@Nonnull String key) throws LibraryFormatException; diff --git a/jack/src/com/android/jack/resource/ResourceImportConflictException.java b/jack/src/com/android/jack/resource/ResourceImportConflictException.java index fcac334..ff8c828 100644 --- a/jack/src/com/android/jack/resource/ResourceImportConflictException.java +++ b/jack/src/com/android/jack/resource/ResourceImportConflictException.java @@ -17,6 +17,7 @@ package com.android.jack.resource; import com.android.jack.backend.jayce.ImportConflictException; +import com.android.jack.ir.ast.Resource; import com.android.sched.util.location.Location; import javax.annotation.Nonnull; @@ -31,20 +32,20 @@ public class ResourceImportConflictException extends ImportConflictException { @Nonnull private final Location newResourceLocation; @Nonnull - private final Location existingResourceLocation; + private final Resource existingResource; - public ResourceImportConflictException(@Nonnull Location newResourceLocation, - @Nonnull Location existingResourceLocation) { + public ResourceImportConflictException(@Nonnull Resource existingResource, + @Nonnull Location newResourceLocation) { this.newResourceLocation = newResourceLocation; - this.existingResourceLocation = existingResourceLocation; + this.existingResource = existingResource; } @Override @Nonnull public String getMessage() { - return "Resource in " + return "Resource \'" + existingResource.getPath().getPathAsString('/') + "\' from " + newResourceLocation.getDescription() + " has already been imported from " - + existingResourceLocation.getDescription() + + existingResource.getLocation().getDescription() + " (see property '" + ResourceImporter.RESOURCE_COLLISION_POLICY.getName() + "' for resource collision policy)"; } diff --git a/jack/src/com/android/jack/resource/ResourceImporter.java b/jack/src/com/android/jack/resource/ResourceImporter.java index 68e6f9b..d4a6d14 100644 --- a/jack/src/com/android/jack/resource/ResourceImporter.java +++ b/jack/src/com/android/jack/resource/ResourceImporter.java @@ -72,8 +72,7 @@ public class ResourceImporter extends ResourceOrMetaImporter { for (Resource existingResource : session.getResources()) { if (existingResource.getPath().equals(path)) { if (resourceCollisionPolicy == CollisionPolicy.FAIL) { - throw new ResourceImportConflictException(newResource.getLocation(), - existingResource.getLocation()); + throw new ResourceImportConflictException(existingResource, newResource.getLocation()); } else { session.getUserLogger().log(Level.INFO, "Resource in {0} has already been imported from {1}: ignoring import", new Object[] { diff --git a/sched/src/com/android/sched/util/codec/ZipFSCodec.java b/sched/src/com/android/sched/util/codec/ZipFSCodec.java index 4cc8bce..835a9f1 100644 --- a/sched/src/com/android/sched/util/codec/ZipFSCodec.java +++ b/sched/src/com/android/sched/util/codec/ZipFSCodec.java @@ -19,6 +19,7 @@ package com.android.sched.util.codec; import com.android.sched.util.RunnableHooks; import com.android.sched.util.config.ConfigurationError; +import com.android.sched.util.config.MessageDigestFactory; import com.android.sched.util.file.FileOrDirectory.ChangePermission; import com.android.sched.util.file.FileOrDirectory.Existence; import com.android.sched.util.file.FileOrDirectory.Permission; @@ -27,6 +28,7 @@ import com.android.sched.vfs.ReadWriteZipFS; import com.android.sched.vfs.VFS; import java.io.IOException; +import java.security.Provider.Service; import javax.annotation.Nonnull; @@ -36,6 +38,9 @@ import javax.annotation.Nonnull; */ public class ZipFSCodec extends FileOrDirCodec<VFS> { + @Nonnull + private final MessageDigestCodec messageDigestCodec = new MessageDigestCodec(); + public ZipFSCodec(@Nonnull Existence existence) { super(existence, Permission.READ | Permission.WRITE); } @@ -92,8 +97,11 @@ public class ZipFSCodec extends FileOrDirCodec<VFS> { @Nonnull final String string) throws ParsingException { RunnableHooks hooks = context.getRunnableHooks(); try { + Service service = messageDigestCodec.checkString(context, "SHA"); return new ReadWriteZipFS( - new OutputZipFile(context.getWorkingDirectory(), string, hooks, existence, change)); + new OutputZipFile(context.getWorkingDirectory(), string, hooks, existence, change), + /* numGroups = */ 1, /* groupSize = */ 2, + new MessageDigestFactory(service), /* debug = */ false); } catch (IOException e) { throw new ParsingException(e.getMessage(), e); } diff --git a/sched/src/com/android/sched/util/codec/ZipInputOutputVFSCodec.java b/sched/src/com/android/sched/util/codec/ZipInputOutputVFSCodec.java deleted file mode 100644 index 6c6da20..0000000 --- a/sched/src/com/android/sched/util/codec/ZipInputOutputVFSCodec.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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.android.sched.util.codec; - - -import com.android.sched.util.RunnableHooks; -import com.android.sched.util.file.FileOrDirectory.Existence; -import com.android.sched.util.file.OutputZipFile; -import com.android.sched.util.log.LoggerFactory; -import com.android.sched.vfs.GenericInputOutputVFS; -import com.android.sched.vfs.InputOutputVFS; -import com.android.sched.vfs.ReadWriteZipFS; - -import java.io.IOException; -import java.util.logging.Logger; - -import javax.annotation.Nonnull; - -/** - * This {@link StringCodec} is used to create an instance of {@link InputOutputVFS} backed by a - * filesystem directory, which is then zipped when closed. - */ -public class ZipInputOutputVFSCodec extends InputOutputVFSCodec - implements StringCodec<InputOutputVFS> { - - @Nonnull - private final Logger logger = LoggerFactory.getLogger(); - - public ZipInputOutputVFSCodec(@Nonnull Existence existence) { - super(existence); - } - - @Override - @Nonnull - public String getUsage() { - return "a path to a zip archive (" + getUsageDetails() + ")"; - } - - @Override - @Nonnull - public String getVariableName() { - return "zip"; - } - - @Override - @Nonnull - public InputOutputVFS checkString(@Nonnull CodecContext context, - @Nonnull final String string) throws ParsingException { - RunnableHooks hooks = context.getRunnableHooks(); - try { - final ReadWriteZipFS vfs = new ReadWriteZipFS( - new OutputZipFile(context.getWorkingDirectory(), string, hooks, existence, change)); - return new GenericInputOutputVFS(vfs); - } catch (IOException e) { - throw new ParsingException(e.getMessage(), e); - } - } -} diff --git a/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java b/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java index 00f2f03..12f7868 100644 --- a/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java +++ b/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java @@ -47,6 +47,7 @@ import java.util.EnumSet; import java.util.Set; import javax.annotation.CheckForNull; +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; /** @@ -81,8 +82,10 @@ public class CaseInsensitiveFS extends BaseVFS<CaseInsensitiveVDir, CaseInsensit "sched.vfs.case-insensitive.debug", "generate an index file '" + DEBUG_NAME + "' for debugging purpose").addDefaultValue(false); - private final int nbGroup; - private final int szGroup; + @Nonnegative + private final int numGroups; + @Nonnegative + private final int groupSize; @Nonnull private final MessageDigestFactory mdf; private final boolean debug; @@ -198,7 +201,7 @@ public class CaseInsensitiveFS extends BaseVFS<CaseInsensitiveVDir, CaseInsensit } @SuppressWarnings("unchecked") - public CaseInsensitiveFS(@Nonnull VFS vfs, int nbGroup, int szGroup, + public CaseInsensitiveFS(@Nonnull VFS vfs, int numGroups, int groupSize, @Nonnull MessageDigestFactory mdf, boolean debug) throws WrongVFSFormatException { this.vfs = (BaseVFS<BaseVDir, BaseVFile>) vfs; @@ -207,8 +210,8 @@ public class CaseInsensitiveFS extends BaseVFS<CaseInsensitiveVDir, CaseInsensit capabilities.add(Capabilities.UNIQUE_ELEMENT); this.capabilities = Collections.unmodifiableSet(capabilities); - this.nbGroup = nbGroup; - this.szGroup = szGroup; + this.numGroups = numGroups; + this.groupSize = groupSize; this.mdf = mdf; this.debug = debug; @@ -568,8 +571,8 @@ public class CaseInsensitiveFS extends BaseVFS<CaseInsensitiveVDir, CaseInsensit StringBuffer sb = new StringBuffer(); int idx = 0; try { - for (int groupIdx = 0; groupIdx < nbGroup; groupIdx++) { - for (int letterIdx = 0; letterIdx < szGroup; letterIdx++) { + for (int groupIdx = 0; groupIdx < numGroups; groupIdx++) { + for (int letterIdx = 0; letterIdx < groupSize; letterIdx++) { sb.append(digest[idx++]); } sb.append('/'); diff --git a/sched/src/com/android/sched/vfs/ReadWriteZipFS.java b/sched/src/com/android/sched/vfs/ReadWriteZipFS.java index 56159c7..7d4e88c 100644 --- a/sched/src/com/android/sched/vfs/ReadWriteZipFS.java +++ b/sched/src/com/android/sched/vfs/ReadWriteZipFS.java @@ -16,6 +16,7 @@ package com.android.sched.vfs; +import com.android.sched.util.config.MessageDigestFactory; import com.android.sched.util.file.CannotCreateFileException; import com.android.sched.util.file.CannotDeleteFileException; import com.android.sched.util.file.CannotSetPermissionException; @@ -52,7 +53,8 @@ public class ReadWriteZipFS extends BaseVFS<BaseVDir, BaseVFile> implements VFS @Nonnull private final File dir; - public ReadWriteZipFS(@Nonnull OutputZipFile file) + public ReadWriteZipFS(@Nonnull OutputZipFile file, int numGroups, int groupSize, + @Nonnull MessageDigestFactory mdf, boolean debug) throws NotDirectoryException, WrongPermissionException, CannotSetPermissionException, @@ -61,8 +63,15 @@ public class ReadWriteZipFS extends BaseVFS<BaseVDir, BaseVFile> implements VFS CannotCreateFileException { int permissions = Permission.READ | Permission.WRITE; dir = Files.createTempDir(); - CachedDirectFS workVFS = new CachedDirectFS(new Directory(dir.getPath(), null, - Existence.MUST_EXIST, permissions, ChangePermission.NOCHANGE), permissions); + VFS workVFS; + try { + workVFS = new CaseInsensitiveFS(new CachedDirectFS(new Directory(dir.getPath(), + null, Existence.MUST_EXIST, permissions, ChangePermission.NOCHANGE), permissions), + numGroups, groupSize, mdf, debug); + } catch (WrongVFSFormatException e) { + // Directory is empty, so this cannot happen + throw new AssertionError(e); + } WriteZipFS finalVFS = new WriteZipFS(file); this.vfs = new VFSToVFSWrapper(workVFS, finalVFS); } diff --git a/sched/tests/com/android/sched/vfs/VFSTest.java b/sched/tests/com/android/sched/vfs/VFSTest.java index 45a4b04..b056e42 100644 --- a/sched/tests/com/android/sched/vfs/VFSTest.java +++ b/sched/tests/com/android/sched/vfs/VFSTest.java @@ -269,19 +269,11 @@ public class VFSTest { String path = file.getAbsolutePath(); Assert.assertTrue(file.delete()); - Provider.Service sha1 = null; - for (Provider provider : Security.getProviders()) { - for (Provider.Service service : provider.getServices()) { - if (service.getType().equals("MessageDigest") && service.getAlgorithm().equals("SHA")) { - sha1 = service; - } - } - } - Assert.assertNotNull(sha1); + Provider.Service sha1 = getSha1Service(); ioVFS1 = new GenericInputOutputVFS(new MessageDigestFS(new DirectFS(new Directory(path, null, Existence.NOT_EXIST, Permission.WRITE, ChangePermission.NOCHANGE), - Permission.READ | Permission.WRITE), new MessageDigestFactory(sha1))); + Permission.READ | Permission.WRITE), new MessageDigestFactory(getSha1Service()))); testOutputVFS(ioVFS1); testDelete(ioVFS1); @@ -787,8 +779,11 @@ public class VFSTest { try { file = File.createTempFile("vfs", ".zip"); String path = file.getAbsolutePath(); + Provider.Service sha1 = getSha1Service(); zipVFS = new GenericInputOutputVFS(new ReadWriteZipFS( - new OutputZipFile(path, null, Existence.MAY_EXIST, ChangePermission.NOCHANGE))); + new OutputZipFile(path, null, Existence.MAY_EXIST, ChangePermission.NOCHANGE), + /* numGroups = */ 1, /* groupSize = */ 2, + new MessageDigestFactory(sha1), /* debug = */ false)); testOutputVFS(zipVFS); testDelete(zipVFS); // checkZipLocations(zipVFS); @@ -997,4 +992,18 @@ public class VFSTest { return string; } + @Nonnull + private static Provider.Service getSha1Service() { + Provider.Service sha1 = null; + for (Provider provider : Security.getProviders()) { + for (Provider.Service service : provider.getServices()) { + if (service.getType().equals("MessageDigest") && service.getAlgorithm().equals("SHA")) { + sha1 = service; + } + } + } + Assert.assertNotNull(sha1); + return sha1; + } + } |