// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.testing.local;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.runner.Description;
import org.junit.runner.manipulation.Filter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/** Filters tests to only those listed in the JSON config. */
class ConfigFilter extends Filter {
private final Map<String, Set<String>> mTestsByClass;
public ConfigFilter(JSONObject configJson) throws JSONException {
Map<String, Set<String>> testsByClass = new HashMap<>();
JSONObject configsObj = configJson.getJSONObject("configs");
JSONObject classesObj = configsObj.getJSONObject(configsObj.keys().next());
Iterator<String> classNames = classesObj.keys();
while (classNames.hasNext()) {
String className = classNames.next();
JSONArray methodNamesArr = classesObj.getJSONArray(className);
Set<String> methodsSet = new HashSet<>(methodNamesArr.length());
for (int i = 0, len = methodNamesArr.length(); i < len; ++i) {
methodsSet.add(methodNamesArr.getString(i));
}
testsByClass.put(className, methodsSet);
}
mTestsByClass = testsByClass;
}
static Class[] classesFromConfig(JSONObject configJson)
throws JSONException, ClassNotFoundException {
JSONObject configsObj = configJson.getJSONObject("configs");
if (configsObj.length() != 1) {
throw new IllegalArgumentException(
"JSON Config had " + configsObj.length() + " entries");
}
JSONObject classesObj = configsObj.getJSONObject(configsObj.keys().next());
Class[] ret = new Class[classesObj.length()];
int i = 0;
Iterator<String> classNames = classesObj.keys();
ClassLoader classLoader = JunitTestMain.class.getClassLoader();
while (classNames.hasNext()) {
ret[i++] = Class.forName(classNames.next(), false, classLoader);
}
return ret;
}
@Override
public boolean shouldRun(Description description) {
if (description.getMethodName() == null) {
return true;
}
Set<String> methodsSet = mTestsByClass.get(description.getClassName());
if (methodsSet == null) {
return false;
}
return methodsSet.contains(description.getMethodName());
}
@Override
public String describe() {
return "JSON Config filter";
}
}