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