| // 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); | |
| } | |
| } |