| // Copyright (c) 2017, 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.naming; |
| |
| import com.android.tools.r8.TestBase; |
| import com.android.tools.r8.ToolHelper; |
| import com.android.tools.r8.graph.AppView; |
| import com.android.tools.r8.graph.DexItemFactory; |
| import com.android.tools.r8.shaking.AppInfoWithLiveness; |
| import com.android.tools.r8.utils.AndroidApp; |
| import com.android.tools.r8.utils.Timing; |
| import com.google.common.collect.ImmutableList; |
| import java.io.File; |
| import java.nio.file.Path; |
| import java.nio.file.Paths; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.concurrent.ExecutorService; |
| import java.util.concurrent.Executors; |
| import java.util.function.BiConsumer; |
| import java.util.function.Consumer; |
| |
| public abstract class NamingTestBase extends TestBase { |
| |
| private final String appFileName; |
| protected final List<String> keepRulesFiles; |
| protected final Consumer<NamingLens> inspection; |
| |
| private DexItemFactory dexItemFactory = null; |
| |
| protected NamingTestBase( |
| String test, List<String> keepRulesFiles, BiConsumer<DexItemFactory, NamingLens> inspection) { |
| appFileName = ToolHelper.EXAMPLES_BUILD_DIR + test + "/classes.dex"; |
| this.keepRulesFiles = keepRulesFiles; |
| this.inspection = lens -> inspection.accept(dexItemFactory, lens); |
| } |
| |
| protected NamingLens runMinifier(List<Path> configPaths) throws Exception { |
| AppView<AppInfoWithLiveness> appView = |
| computeAppViewWithLiveness( |
| AndroidApp.builder().addProgramFile(Paths.get(appFileName)).build(), |
| factory -> ToolHelper.loadProguardConfiguration(factory, configPaths)); |
| dexItemFactory = appView.dexItemFactory(); |
| ExecutorService executor = Executors.newSingleThreadExecutor(); |
| try { |
| return new Minifier(appView).run(executor, Timing.empty()); |
| } finally { |
| executor.shutdown(); |
| } |
| } |
| |
| protected static <T> Collection<Object[]> createTests( |
| List<String> tests, Map<String, T> inspections) { |
| List<Object[]> testCases = new ArrayList<>(); |
| Set<String> usedInspections = new HashSet<>(); |
| for (String test : tests) { |
| File[] keepFiles = new File(ToolHelper.EXAMPLES_DIR + test) |
| .listFiles(file -> file.isFile() && file.getName().endsWith(".txt")); |
| for (File keepFile : keepFiles) { |
| String keepName = keepFile.getName(); |
| T inspection = getTestOptionalParameter(inspections, usedInspections, test, keepName); |
| if (inspection != null) { |
| testCases.add(new Object[]{test, ImmutableList.of(keepFile.getPath()), inspection}); |
| } |
| } |
| } |
| assert usedInspections.size() == inspections.size(); |
| return testCases; |
| } |
| |
| private static <T> T getTestOptionalParameter( |
| Map<String, T> specifications, |
| Set<String> usedSpecifications, |
| String test, |
| String keepName) { |
| T parameter = specifications.get(test); |
| if (parameter == null) { |
| parameter = specifications.get(test + ":" + keepName); |
| if (parameter != null) { |
| usedSpecifications.add(test + ":" + keepName); |
| } |
| } else { |
| usedSpecifications.add(test); |
| } |
| return parameter; |
| } |
| } |