diff options
author | Yohann Roussel <yroussel@google.com> | 2014-11-20 11:47:03 +0100 |
---|---|---|
committer | Yohann Roussel <yroussel@google.com> | 2014-11-21 16:56:08 +0000 |
commit | 06e3d7bd48713308e9a742dfae7080b7112ef654 (patch) | |
tree | ffaa52f445bd2eb5e752c33c4ed2d5aaf2cb7a49 | |
parent | c9be1c224cdbd52aa34aab203199d62fca16f296 (diff) | |
download | toolchain_jack-06e3d7bd48713308e9a742dfae7080b7112ef654.zip toolchain_jack-06e3d7bd48713308e9a742dfae7080b7112ef654.tar.gz toolchain_jack-06e3d7bd48713308e9a742dfae7080b7112ef654.tar.bz2 |
Do not fail because of bad classpath entry
Just warn unless option for strict classpath is set.
Bug: 18369562
Change-Id: I82abef63b78a9291fd6a68081b033a25c9d23e2f
-rw-r--r-- | jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java | 21 | ||||
-rw-r--r-- | jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jack | bin | 0 -> 283 bytes | |||
-rw-r--r-- | jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zip | bin | 0 -> 618 bytes | |||
-rw-r--r-- | jack/src/com/android/jack/Jack.java | 45 | ||||
-rw-r--r-- | jack/tests/com/android/jack/ClasspathTest.java | 54 |
5 files changed, 117 insertions, 3 deletions
diff --git a/jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java b/jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java new file mode 100644 index 0000000..075af20 --- /dev/null +++ b/jack-tests/tests/com/android/jack/classpath/test004/jack/Classpath004.java @@ -0,0 +1,21 @@ +/* + * 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.jack.classpath.test004.jack; + +public class Classpath004 { + +} diff --git a/jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jack b/jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jack Binary files differnew file mode 100644 index 0000000..3a1084c --- /dev/null +++ b/jack-tests/tests/com/android/jack/classpath/test004/jack/invalid.jack diff --git a/jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zip b/jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zip Binary files differnew file mode 100644 index 0000000..2b145d3 --- /dev/null +++ b/jack-tests/tests/com/android/jack/classpath/test004/jack/notjack.zip diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java index be369ab..cb06b20 100644 --- a/jack/src/com/android/jack/Jack.java +++ b/jack/src/com/android/jack/Jack.java @@ -104,6 +104,7 @@ import com.android.jack.optimizations.UnusedDefinitionRemover; import com.android.jack.optimizations.UseDefsChainsSimplifier; import com.android.jack.preprocessor.PreProcessor; import com.android.jack.preprocessor.PreProcessorApplier; +import com.android.jack.reporting.Reportable; import com.android.jack.reporting.Reporter.Severity; import com.android.jack.resource.LibraryResourceWriter; import com.android.jack.resource.ResourceImporter; @@ -265,6 +266,7 @@ import com.android.sched.util.config.ConfigurationException; import com.android.sched.util.config.HasKeyId; import com.android.sched.util.config.ReflectFactory; import com.android.sched.util.config.ThreadConfig; +import com.android.sched.util.config.id.BooleanPropertyId; import com.android.sched.util.config.id.ObjectId; import com.android.sched.util.config.id.ReflectFactoryPropertyId; import com.android.sched.util.file.Directory; @@ -302,6 +304,27 @@ import javax.annotation.Nonnull; */ @HasKeyId public abstract class Jack { + private static final class ClasspathEntryIgnoredReportable implements Reportable { + @Nonnull + private final Exception cause; + + private ClasspathEntryIgnoredReportable(@Nonnull Exception cause) { + this.cause = cause; + } + + @Override + @Nonnull + public String getMessage() { + return "Bad classpath entry ignored: " + cause.getMessage(); + } + + @Override + @Nonnull + public ProblemLevel getDefaultProblemLevel() { + return ProblemLevel.WARNING; + } + } + static { LoggerFactory.loadLoggerConfiguration(Jack.class, "/initial.logging.properties"); } @@ -348,6 +371,11 @@ public abstract class Jack { .addDefaultValue("full"); @Nonnull + public static final BooleanPropertyId STRICT_CLASSPATH = BooleanPropertyId.create( + "jack.classpath.strict", "Do not ignore missing or malformed class path entries") + .addDefaultValue(Boolean.FALSE); + + @Nonnull public static JSession getSession() { return ThreadConfig.get(Jack.SESSION); } @@ -811,10 +839,21 @@ public abstract class Jack { session.getTopLevelPackage().addLoader(rootPLoader); session.addLibraryOnClasspath(inputJackLibrary); } catch (IOException ioException) { - // Ignore bad entry - logger.log(Level.WARNING, "Bad classpath entry ignored: {0}", ioException.getMessage()); + if (ThreadConfig.get(STRICT_CLASSPATH).booleanValue()) { + throw new LibraryReadingException(ioException); + } else { + // Ignore bad entry + session.getReporter().report(Severity.NON_FATAL, + new ClasspathEntryIgnoredReportable(ioException)); + } } catch (LibraryException e) { - throw new LibraryReadingException(e); + if (ThreadConfig.get(STRICT_CLASSPATH).booleanValue()) { + throw new LibraryReadingException(e); + } else { + // Ignore bad entry + session.getReporter().report(Severity.NON_FATAL, + new ClasspathEntryIgnoredReportable(e)); + } } } } diff --git a/jack/tests/com/android/jack/ClasspathTest.java b/jack/tests/com/android/jack/ClasspathTest.java index 3870062..021c81e 100644 --- a/jack/tests/com/android/jack/ClasspathTest.java +++ b/jack/tests/com/android/jack/ClasspathTest.java @@ -17,6 +17,7 @@ package com.android.jack; import com.android.jack.library.FileType; +import com.android.jack.library.LibraryReadingException; import junit.framework.Assert; @@ -24,6 +25,7 @@ import org.junit.BeforeClass; import org.junit.Test; import java.io.File; +import java.io.IOException; public class ClasspathTest { @@ -153,4 +155,56 @@ public class ClasspathTest { TestTools.compileSourceToJack( new Options(), sourceDir3, classpath, mainOut, true); } + + @Test + public void testMissingClasspathEntry() throws Exception { + String defaultClasspath = TestTools.getDefaultBootclasspathString(); + File srcDir = TestTools.getJackTestsWithJackFolder("classpath/test004"); + String classpathWithMissingEntry = defaultClasspath + File.pathSeparator + + new File(srcDir, "missing.jack").getAbsolutePath(); + + File testOut = TestTools.createTempFile("ClasspathTest", "missing"); + TestTools.compileSourceToJack(new Options(), srcDir, classpathWithMissingEntry, + testOut, true); + + Options strict = new Options(); + strict.addProperty(Jack.STRICT_CLASSPATH.getName(), "true"); + try { + TestTools.compileSourceToJack(strict, srcDir, classpathWithMissingEntry, + testOut, true); + Assert.fail(); + } catch (JackAbortException e) { + Assert.assertTrue(e.getCause() instanceof LibraryReadingException); + } + } + + @Test + public void testInvalidClasspathEntry() throws Exception { + File srcDir = TestTools.getJackTestsWithJackFolder("classpath/test004"); + compileWithInvalidClasspathEntry(srcDir, new File(srcDir, "Classpath004.java")); + compileWithInvalidClasspathEntry(srcDir, new File(srcDir, "invalid.jack")); + compileWithInvalidClasspathEntry(srcDir, new File(srcDir, "notjack.zip")); + } + + private void compileWithInvalidClasspathEntry(File srcDir, File invalidJack) throws IOException, + Exception { + Assert.assertTrue(invalidJack.isFile()); + String classpathWithInvalidEntry = TestTools.getDefaultBootclasspathString() + + File.pathSeparator + invalidJack.getAbsolutePath(); + + File testOut = TestTools.createTempFile("ClasspathTest", "invalid"); + TestTools.compileSourceToJack(new Options(), srcDir, classpathWithInvalidEntry, + testOut, true); + + Options strict = new Options(); + strict.addProperty(Jack.STRICT_CLASSPATH.getName(), "true"); + try { + TestTools.compileSourceToJack(strict, srcDir, classpathWithInvalidEntry, + testOut, true); + Assert.fail(); + } catch (JackAbortException e) { + Assert.assertTrue(e.getCause() instanceof LibraryReadingException); + } + } + } |