Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate parameterized DroidBench tests from JUnit 4 to JUnit 5 #1298

Merged
merged 1 commit into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dalvik/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ dependencies {

testImplementation(libs.android.tools)
testImplementation(libs.dexlib2)
testImplementation(libs.junit.jupiter.params)
testImplementation(projects.core)
testImplementation(projects.dalvik)
testImplementation(projects.shrike)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
package com.ibm.wala.dalvik.test.callGraph;

import static com.ibm.wala.dalvik.test.util.Util.walaProperties;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod;
Expand All @@ -30,13 +30,12 @@
import com.ibm.wala.util.io.FileUtil;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;

public abstract class DroidBenchCGTest extends DalvikCallGraphTestBase {

Expand Down Expand Up @@ -105,28 +104,13 @@ public static Set<IMethod> assertUserCodeReachable(CallGraph cg, Set<MethodRefer
return result;
}

private final URI[] androidLibs;
protected void runTest(final TestParameters testParameters) throws Exception {

private final File androidJavaJar;
final var androidLibs = testParameters.getAndroidLibs();
final var androidJavaJar = testParameters.getAndroidJavaJar();
final var apkFile = testParameters.getApkFile();
final var uncalled = testParameters.getUncalled();

private final String apkFile;

private final Set<MethodReference> uncalled;

protected DroidBenchCGTest(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
this.androidLibs = androidLibs;
this.androidJavaJar = androidJavaJar;
this.apkFile = apkFile;
this.uncalled = uncalled;
}

public String apkFile() {
return apkFile;
}

@Test
public void runTest() throws Exception {
System.err.println("testing " + apkFile + "...");
Pair<CallGraph, PointerAnalysis<InstanceKey>> x =
makeAPKCallGraph(
Expand All @@ -142,7 +126,7 @@ public void runTest() throws Exception {
}

protected void assertion(String string, boolean empty) {
assertTrue(string, empty);
assertTrue(empty, string);
}

private static final Set<String> skipTests = HashSetFactory.make();
Expand All @@ -156,7 +140,7 @@ protected void assertion(String string, boolean empty) {
skipTests.add("Button2.apk");
}

public static Collection<Object[]> generateData(
public static Stream<Named<TestParameters>> generateData(
final URI[] androidLibs, final File androidJavaJar, final String filter) {

return generateData(getDroidBenchRoot(), androidLibs, androidJavaJar, filter);
Expand All @@ -174,25 +158,61 @@ public static String getDroidBenchRoot() {
return f;
}

public static Collection<Object[]> generateData(
public static Stream<Named<TestParameters>> generateData(
String droidBenchRoot,
final URI[] androidLibs,
final File androidJavaJar,
final String filter) {
final List<Object[]> files = new ArrayList<>();
final Stream.Builder<Named<TestParameters>> testParameters = Stream.builder();
final var apkRoot = new File(droidBenchRoot + "/apk/");
FileUtil.recurseFiles(
f -> {
Set<MethodReference> uncalled = uncalledFunctions.get(f.getName());
if (uncalled == null) {
uncalled = Collections.emptySet();
}
files.add(new Object[] {androidLibs, androidJavaJar, f.getAbsolutePath(), uncalled});
testParameters.add(
Named.of(
apkRoot.toPath().relativize(f.toPath()).toString(),
new TestParameters(androidLibs, androidJavaJar, f.getAbsolutePath(), uncalled)));
},
t ->
(filter == null || t.getAbsolutePath().contains(filter))
&& t.getName().endsWith("apk")
&& !skipTests.contains(t.getName()),
new File(droidBenchRoot + "/apk/"));
return files;
apkRoot);
return testParameters.build().sorted(Comparator.comparing(Named::getName));
}

protected static class TestParameters {

private final URI[] androidLibs;
private final File androidJavaJar;
private final String apkFile;
private final Set<MethodReference> uncalled;

public TestParameters(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
this.androidLibs = androidLibs;
this.androidJavaJar = androidJavaJar;
this.apkFile = apkFile;
this.uncalled = uncalled;
}

public URI[] getAndroidLibs() {
return androidLibs;
}

public File getAndroidJavaJar() {
return androidJavaJar;
}

public String getApkFile() {
return apkFile;
}

public Set<MethodReference> getUncalled() {
return uncalled;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,22 @@
import static com.ibm.wala.dalvik.test.util.Util.androidJavaLib;

import com.ibm.wala.dalvik.test.callGraph.DroidBenchCGTest;
import com.ibm.wala.types.MethodReference;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

@RunWith(Parameterized.class)
public class AliasingTest extends DroidBenchCGTest {

public AliasingTest(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
super(androidLibs, androidJavaJar, apkFile, uncalled);
@MethodSource("generateData")
@Override
@ParameterizedTest
protected void runTest(final TestParameters testParameters) throws Exception {
super.runTest(testParameters);
}

@Parameters(name = "DroidBench: {2}")
public static Collection<Object[]> generateData() throws IOException {
static Stream<Named<TestParameters>> generateData() throws IOException {
return DroidBenchCGTest.generateData(null, androidJavaLib(), "Aliasing");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,22 @@
import static com.ibm.wala.dalvik.test.util.Util.androidJavaLib;

import com.ibm.wala.dalvik.test.callGraph.DroidBenchCGTest;
import com.ibm.wala.types.MethodReference;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

@RunWith(Parameterized.class)
public class AndroidSpecificTest extends DroidBenchCGTest {

public AndroidSpecificTest(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
super(androidLibs, androidJavaJar, apkFile, uncalled);
@MethodSource("generateData")
@Override
@ParameterizedTest
protected void runTest(final TestParameters testParameters) throws Exception {
super.runTest(testParameters);
}

@Parameters(name = "DroidBench: {2}")
public static Collection<Object[]> generateData() throws IOException {
static Stream<Named<TestParameters>> generateData() throws IOException {
return DroidBenchCGTest.generateData(null, androidJavaLib(), "AndroidSpecific");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,22 @@
import static com.ibm.wala.dalvik.test.util.Util.androidJavaLib;

import com.ibm.wala.dalvik.test.callGraph.DroidBenchCGTest;
import com.ibm.wala.types.MethodReference;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

@RunWith(Parameterized.class)
public class ArraysAndListsTest extends DroidBenchCGTest {

public ArraysAndListsTest(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
super(androidLibs, androidJavaJar, apkFile, uncalled);
@MethodSource("generateData")
@Override
@ParameterizedTest
protected void runTest(final TestParameters testParameters) throws Exception {
super.runTest(testParameters);
}

@Parameters(name = "DroidBench: {2}")
public static Collection<Object[]> generateData() throws IOException {
static Stream<Named<TestParameters>> generateData() throws IOException {
return DroidBenchCGTest.generateData(null, androidJavaLib(), "ArraysAndLists");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,22 @@
import static com.ibm.wala.dalvik.test.util.Util.androidJavaLib;

import com.ibm.wala.dalvik.test.callGraph.DroidBenchCGTest;
import com.ibm.wala.types.MethodReference;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

@RunWith(Parameterized.class)
public class CallbacksTest extends DroidBenchCGTest {

public CallbacksTest(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
super(androidLibs, androidJavaJar, apkFile, uncalled);
@MethodSource("generateData")
@Override
@ParameterizedTest
protected void runTest(final TestParameters testParameters) throws Exception {
super.runTest(testParameters);
}

@Parameters(name = "DroidBench: {2}")
public static Collection<Object[]> generateData() throws IOException {
static Stream<Named<TestParameters>> generateData() throws IOException {
return DroidBenchCGTest.generateData(null, androidJavaLib(), "Callbacks");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,22 @@
import static com.ibm.wala.dalvik.test.util.Util.androidJavaLib;

import com.ibm.wala.dalvik.test.callGraph.DroidBenchCGTest;
import com.ibm.wala.types.MethodReference;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

@RunWith(Parameterized.class)
public class EmulatorDetectionTest extends DroidBenchCGTest {
public EmulatorDetectionTest(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
super(androidLibs, androidJavaJar, apkFile, uncalled);

@MethodSource("generateData")
@Override
@ParameterizedTest
protected void runTest(final TestParameters testParameters) throws Exception {
super.runTest(testParameters);
}

@Parameters(name = "DroidBench: {2}")
public static Collection<Object[]> generateData() throws IOException {
static Stream<Named<TestParameters>> generateData() throws IOException {
return DroidBenchCGTest.generateData(null, androidJavaLib(), "EmulatorDetection");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,22 @@
import static com.ibm.wala.dalvik.test.util.Util.androidJavaLib;

import com.ibm.wala.dalvik.test.callGraph.DroidBenchCGTest;
import com.ibm.wala.types.MethodReference;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

@RunWith(Parameterized.class)
public class FieldAndObjectSensitivityTest extends DroidBenchCGTest {

public FieldAndObjectSensitivityTest(
URI[] androidLibs, File androidJavaJar, String apkFile, Set<MethodReference> uncalled) {
super(androidLibs, androidJavaJar, apkFile, uncalled);
@MethodSource("generateData")
@Override
@ParameterizedTest
protected void runTest(final TestParameters testParameters) throws Exception {
super.runTest(testParameters);
}

@Parameters(name = "DroidBench: {2}")
public static Collection<Object[]> generateData() throws IOException {
static Stream<Named<TestParameters>> generateData() throws IOException {
return DroidBenchCGTest.generateData(null, androidJavaLib(), "FieldAndObjectSensitivity");
}
}
Loading
Loading