|  | // Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package com.android.tools.r8; | 
|  |  | 
|  | import static org.hamcrest.CoreMatchers.startsWith; | 
|  | import static org.hamcrest.MatcherAssert.assertThat; | 
|  | import static org.junit.Assert.assertNull; | 
|  | import static org.junit.Assert.assertTrue; | 
|  | import static org.junit.Assert.fail; | 
|  |  | 
|  | import com.android.tools.r8.naming.ClassNameMapper; | 
|  | import com.android.tools.r8.utils.ZipUtils; | 
|  | import java.io.IOException; | 
|  | import java.nio.charset.StandardCharsets; | 
|  | import java.nio.file.Files; | 
|  | import java.nio.file.NoSuchFileException; | 
|  | import java.nio.file.Path; | 
|  | import java.util.Enumeration; | 
|  | import java.util.function.Predicate; | 
|  | import java.util.zip.ZipEntry; | 
|  | import java.util.zip.ZipFile; | 
|  | import org.junit.Test; | 
|  |  | 
|  | public class SanityCheck extends TestBase { | 
|  |  | 
|  | private static final String SRV_PREFIX = "META-INF/services/"; | 
|  | private static final String METADATA_EXTENSION = | 
|  | "com.android.tools.r8.jetbrains.kotlinx.metadata.impl.extensions.MetadataExtensions"; | 
|  | private static final String EXT_IN_SRV = SRV_PREFIX + METADATA_EXTENSION; | 
|  |  | 
|  | private void checkJarContent( | 
|  | Path jar, boolean allowDirectories, Predicate<String> entryTester) | 
|  | throws Exception { | 
|  | ZipFile zipFile; | 
|  | try { | 
|  | zipFile = new ZipFile(jar.toFile(), StandardCharsets.UTF_8); | 
|  | } catch (IOException e) { | 
|  | if (!Files.exists(jar)) { | 
|  | throw new NoSuchFileException(jar.toString()); | 
|  | } else { | 
|  | throw e; | 
|  | } | 
|  | } | 
|  | boolean licenseSeen = false; | 
|  | final Enumeration<? extends ZipEntry> entries = zipFile.entries(); | 
|  | while (entries.hasMoreElements()) { | 
|  | ZipEntry entry = entries.nextElement(); | 
|  | String name = entry.getName(); | 
|  | if (ZipUtils.isClassFile(name) || name.endsWith(".kotlin_builtins")) { | 
|  | assertThat(name, startsWith("com/android/tools/r8/")); | 
|  | } else if (name.equals("META-INF/MANIFEST.MF")) { | 
|  | // Allow. | 
|  | } else if (name.equals("LICENSE")) { | 
|  | licenseSeen = true; | 
|  | } else if (entryTester.test(name)) { | 
|  | // Allow. | 
|  | } else if (name.endsWith("/")) { | 
|  | assertTrue("Unexpected directory entry in" + jar, allowDirectories); | 
|  | } else { | 
|  | fail("Unexpected entry '" + name + "' in " + jar); | 
|  | } | 
|  | } | 
|  | assertTrue("No LICENSE entry found in " + jar, licenseSeen); | 
|  | } | 
|  |  | 
|  | private void checkLibJarContent(Path jar, Path map) throws Exception { | 
|  | if (!Files.exists(jar)) { | 
|  | return; | 
|  | } | 
|  | assertTrue(Files.exists(map)); | 
|  | ClassNameMapper mapping = ClassNameMapper.mapperFromFile(map); | 
|  | checkJarContent(jar, false, name -> metadataExtensionTester(name, mapping)); | 
|  | } | 
|  |  | 
|  | private void checkJarContent(Path jar) throws Exception { | 
|  | if (!Files.exists(jar)) { | 
|  | return; | 
|  | } | 
|  | checkJarContent(jar, true, name -> metadataExtensionTester(name, null)); | 
|  | } | 
|  |  | 
|  | private boolean metadataExtensionTester(String name, ClassNameMapper mapping) { | 
|  | if (name.equals(EXT_IN_SRV)) { | 
|  | assertNull(mapping); | 
|  | return true; | 
|  | } | 
|  | if (mapping != null && name.startsWith(SRV_PREFIX)) { | 
|  | String obfuscatedName = name.substring(SRV_PREFIX.length()); | 
|  | String originalName = | 
|  | mapping.getObfuscatedToOriginalMapping().original | 
|  | .getOrDefault(obfuscatedName, obfuscatedName); | 
|  | if (originalName.equals(METADATA_EXTENSION)) { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void testLibJarsContent() throws Exception { | 
|  | checkLibJarContent(ToolHelper.R8LIB_JAR, ToolHelper.R8LIB_MAP); | 
|  | checkLibJarContent(ToolHelper.R8LIB_EXCLUDE_DEPS_JAR, ToolHelper.R8LIB_EXCLUDE_DEPS_MAP); | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void testJarsContent() throws Exception { | 
|  | checkJarContent(ToolHelper.D8_JAR); | 
|  | checkJarContent(ToolHelper.R8_JAR); | 
|  | } | 
|  | } |