blob: e46166635ea33c6f9418b82a0fd7baad0787afd5 [file] [log] [blame]
// 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;
}
}