// Copyright 2017 The Bazel Authors. 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.android.desugar.io; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; import java.io.File; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Test that exercises the behavior of the IndexedInputs class. */ @RunWith(JUnit4.class) public final class IndexedInputsTest { private static File lib1; private static String lib1Name; private static File lib2; private static String lib2Name; private static InputFileProvider lib1InputFileProvider; private static InputFileProvider lib2InputFileProvider; @BeforeClass public static void setUpClass() throws Exception { lib1 = File.createTempFile("lib1", ".jar"); lib1Name = lib1.getName(); try (ZipOutputStream zos1 = new ZipOutputStream(new FileOutputStream(lib1))) { zos1.putNextEntry(new ZipEntry("a/b/C.class")); zos1.putNextEntry(new ZipEntry("a/b/D.class")); zos1.closeEntry(); } lib2 = File.createTempFile("lib2", ".jar"); lib2Name = lib2.getName(); try (ZipOutputStream zos2 = new ZipOutputStream(new FileOutputStream(lib2))) { zos2.putNextEntry(new ZipEntry("a/b/C.class")); zos2.putNextEntry(new ZipEntry("a/b/E.class")); zos2.closeEntry(); } } @Before public void createProviders() throws Exception { lib1InputFileProvider = new ZipInputFileProvider(lib1.toPath()); lib2InputFileProvider = new ZipInputFileProvider(lib2.toPath()); } @After public void closeProviders() throws Exception { lib1InputFileProvider.close(); lib2InputFileProvider.close(); } @AfterClass public static void tearDownClass() throws Exception { lib1.delete(); lib2.delete(); } @Test public void testClassFoundWithParentLibrary() throws Exception { IndexedInputs indexedLib2 = new IndexedInputs(ImmutableList.of(lib2InputFileProvider)); IndexedInputs indexedLib1 = new IndexedInputs(ImmutableList.of(lib1InputFileProvider)); IndexedInputs indexedLib2AndLib1 = indexedLib1.withParent(indexedLib2); assertThat(indexedLib2AndLib1.getInputFileProvider("a/b/C.class").toString()) .isEqualTo(lib2Name); assertThat(indexedLib2AndLib1.getInputFileProvider("a/b/D.class").toString()) .isEqualTo(lib1Name); assertThat(indexedLib2AndLib1.getInputFileProvider("a/b/E.class").toString()) .isEqualTo(lib2Name); indexedLib2 = new IndexedInputs(ImmutableList.of(lib2InputFileProvider)); indexedLib1 = new IndexedInputs(ImmutableList.of(lib1InputFileProvider)); IndexedInputs indexedLib1AndLib2 = indexedLib2.withParent(indexedLib1); assertThat(indexedLib1AndLib2.getInputFileProvider("a/b/C.class").toString()) .isEqualTo(lib1Name); assertThat(indexedLib1AndLib2.getInputFileProvider("a/b/D.class").toString()) .isEqualTo(lib1Name); assertThat(indexedLib1AndLib2.getInputFileProvider("a/b/E.class").toString()) .isEqualTo(lib2Name); } @Test public void testClassFoundWithoutParentLibrary() throws Exception { IndexedInputs ijLib1Lib2 = new IndexedInputs(ImmutableList.of(lib1InputFileProvider, lib2InputFileProvider)); assertThat(ijLib1Lib2.getInputFileProvider("a/b/C.class").toString()) .isEqualTo(lib1Name); assertThat(ijLib1Lib2.getInputFileProvider("a/b/D.class").toString()) .isEqualTo(lib1Name); assertThat(ijLib1Lib2.getInputFileProvider("a/b/E.class").toString()) .isEqualTo(lib2Name); IndexedInputs ijLib2Lib1 = new IndexedInputs(ImmutableList.of(lib2InputFileProvider, lib1InputFileProvider)); assertThat(ijLib2Lib1.getInputFileProvider("a/b/C.class").toString()) .isEqualTo(lib2Name); assertThat(ijLib2Lib1.getInputFileProvider("a/b/D.class").toString()) .isEqualTo(lib1Name); assertThat(ijLib2Lib1.getInputFileProvider("a/b/E.class").toString()) .isEqualTo(lib2Name); } @Test public void testClassNotFound() throws Exception { IndexedInputs ijLib1Lib2 = new IndexedInputs(ImmutableList.of(lib1InputFileProvider, lib2InputFileProvider)); assertThat(ijLib1Lib2.getInputFileProvider("a/b/F.class")).isNull(); } }