blob: 81a4b31c3c22422318268e89a91a1822fb5405ee [file] [log] [blame]
// 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();
}
}