Complete tests checking serializable lambdas

Bug: 27807939
Change-Id: Id7489e8e87f1d2dd7e35d88ba25736e5d65d5aeb
(cherry picked from commit b6726609c0ad112fbffa67a150d06fa2c9a058cf)
diff --git a/jack-tests/tests/com/android/jack/java8/LambdaTest.java b/jack-tests/tests/com/android/jack/java8/LambdaTest.java
index db5baf2..e8d3006 100644
--- a/jack-tests/tests/com/android/jack/java8/LambdaTest.java
+++ b/jack-tests/tests/com/android/jack/java8/LambdaTest.java
@@ -419,8 +419,11 @@
     run(LAMBDA036);
   }
 
+  /**
+   * Test that warnings are printed when compiling a Serializable lambda directly to a dex.
+   */
   @Test
-  public void testLamba037() throws Exception {
+  public void testLamba037Direct() throws Exception {
     List<Class<? extends IToolchain>> excludedToolchains =
         new ArrayList<Class<? extends IToolchain>>();
     excludedToolchains.add(JillBasedToolchain.class);
@@ -444,6 +447,106 @@
     Assert.assertTrue(errString.contains("Tests.java:55: Serializable lambda is not supported"));
   }
 
+  /**
+   * Test that warnings are NOT printed when compiling a Serializable lambda directly to a Jack
+   * library but are printed when compiling the library to a dex.
+   */
+  @Test
+  public void testLamba037ThroughLib() throws Exception {
+    List<Class<? extends IToolchain>> excludedToolchains =
+        new ArrayList<Class<? extends IToolchain>>();
+    excludedToolchains.add(JillBasedToolchain.class);
+    excludedToolchains.add(JackApiV01.class);
+
+    File lib = AbstractTestTools.createTempFile("lib", ".jack");
+
+    // src to lib
+    {
+      JackBasedToolchain toolchain =
+          AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludedToolchains);
+      ByteArrayOutputStream err = new ByteArrayOutputStream();
+      toolchain.setErrorStream(err);
+      toolchain.setSourceLevel(SourceLevel.JAVA_8);
+      toolchain.addToClasspath(toolchain.getDefaultBootClasspath()).srcToLib(lib,
+          /* zipFile = */ true,
+          AbstractTestTools.getTestRootDir("com.android.jack.java8.lambda.test037.jack"));
+      String errString = err.toString();
+      Assert.assertTrue(errString.isEmpty());
+    }
+
+    // lib to dex
+    {
+      JackBasedToolchain toolchain =
+          AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludedToolchains);
+      ByteArrayOutputStream err = new ByteArrayOutputStream();
+      toolchain.setErrorStream(err);
+      toolchain.setSourceLevel(SourceLevel.JAVA_8);
+      toolchain.addProperty(Options.ANDROID_MIN_API_LEVEL.getName(),
+          String.valueOf(AndroidCompatibilityChecker.N_API_LEVEL));
+
+      toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
+          .libToExe(lib, AbstractTestTools.createTempDir(), /* zipFile = */ false);
+      String errString = err.toString();
+      Assert.assertTrue(errString.contains("Tests.java:34: Serializable lambda is not supported"));
+      Assert.assertTrue(errString.contains("Tests.java:43: Serializable lambda is not supported"));
+      Assert.assertTrue(errString.contains("Tests.java:55: Serializable lambda is not supported"));
+    }
+  }
+
+  /**
+   * Test that warnings are printed when compiling a Serializable lambda directly to a Jack
+   * library with checks manually enabled, as well as when compiling the library to a dex.
+   */
+  @Test
+  public void testLamba037ThroughLibPlusCheck() throws Exception {
+    List<Class<? extends IToolchain>> excludedToolchains =
+        new ArrayList<Class<? extends IToolchain>>();
+    excludedToolchains.add(JillBasedToolchain.class);
+    excludedToolchains.add(JackApiV01.class);
+
+    File lib = AbstractTestTools.createTempFile("lib", ".jack");
+
+    // src to lib
+    {
+      JackBasedToolchain toolchain =
+          AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludedToolchains);
+      ByteArrayOutputStream err = new ByteArrayOutputStream();
+      toolchain.setErrorStream(err);
+      toolchain.setSourceLevel(SourceLevel.JAVA_8);
+      toolchain.addProperty(Options.ANDROID_MIN_API_LEVEL.getName(),
+          String.valueOf(AndroidCompatibilityChecker.N_API_LEVEL));
+      // we need to enable the compatibility check manually since we haven't specified an Android
+      // API level or a dex output
+      toolchain.addProperty(AndroidCompatibilityChecker.CHECK_COMPATIBILITY.getName(), "true");
+
+      toolchain.addToClasspath(toolchain.getDefaultBootClasspath()).srcToLib(lib,
+          /* zipFile = */ true,
+          AbstractTestTools.getTestRootDir("com.android.jack.java8.lambda.test037.jack"));
+      String errString = err.toString();
+      Assert.assertTrue(errString.contains("Tests.java:34: Serializable lambda is not supported"));
+      Assert.assertTrue(errString.contains("Tests.java:43: Serializable lambda is not supported"));
+      Assert.assertTrue(errString.contains("Tests.java:55: Serializable lambda is not supported"));
+    }
+
+    // lib to dex
+    {
+      JackBasedToolchain toolchain =
+          AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludedToolchains);
+      ByteArrayOutputStream err = new ByteArrayOutputStream();
+      toolchain.setErrorStream(err);
+      toolchain.setSourceLevel(SourceLevel.JAVA_8);
+      toolchain.addProperty(Options.ANDROID_MIN_API_LEVEL.getName(),
+          String.valueOf(AndroidCompatibilityChecker.N_API_LEVEL));
+
+      toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
+          .libToExe(lib, AbstractTestTools.createTempDir(), /* zipFile = */ false);
+      String errString = err.toString();
+      Assert.assertTrue(errString.contains("Tests.java:34: Serializable lambda is not supported"));
+      Assert.assertTrue(errString.contains("Tests.java:43: Serializable lambda is not supported"));
+      Assert.assertTrue(errString.contains("Tests.java:55: Serializable lambda is not supported"));
+    }
+  }
+
   private void run(@Nonnull RuntimeTestInfo rti) throws Exception {
     new RuntimeTestHelper(rti)
         .setSourceLevel(SourceLevel.JAVA_8)
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test037/jack/Tests.java b/jack-tests/tests/com/android/jack/java8/lambda/test037/jack/Tests.java
index 6bdbd64..3b1d7d5 100644
--- a/jack-tests/tests/com/android/jack/java8/lambda/test037/jack/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test037/jack/Tests.java
@@ -46,12 +46,12 @@
   interface I3 extends Serializable {
   }
 
-  interface I2 {
+  interface I2 extends I3 {
     int getLength();
   }
 
   @Test
   public void test003() {
-    I1 i = () -> 10;
+    I2 i = () -> 10;
   }
 }