Merge "Improve hwuimacro atest compatibility" into main

This commit is contained in:
John Reck
2023-07-18 18:57:12 +00:00
committed by Android (Google) Code Review

View File

@@ -14,30 +14,32 @@
* limitations under the License.
*/
#include "tests/common/LeakChecker.h"
#include "tests/common/TestScene.h"
#include "Properties.h"
#include "hwui/Typeface.h"
#include "HardwareBitmapUploader.h"
#include "renderthread/RenderProxy.h"
#include <android-base/parsebool.h>
#include <benchmark/benchmark.h>
#include <errno.h>
#include <fcntl.h>
#include <fnmatch.h>
#include <getopt.h>
#include <pthread.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <regex>
#include <string>
#include <unordered_map>
#include <vector>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "HardwareBitmapUploader.h"
#include "Properties.h"
#include "hwui/Typeface.h"
#include "renderthread/RenderProxy.h"
#include "tests/common/LeakChecker.h"
#include "tests/common/TestScene.h"
using namespace android;
using namespace android::base;
using namespace android::uirenderer;
using namespace android::uirenderer::test;
@@ -69,6 +71,9 @@ OPTIONS:
--onscreen Render tests on device screen. By default tests
are offscreen rendered
--benchmark_format Set output format. Possible values are tabular, json, csv
--benchmark_list_tests Lists the tests that would run but does not run them
--benchmark_filter=<regex> Filters the test set to the given regex. If prefixed with `-` and test
that doesn't match the given regex is run
--renderer=TYPE Sets the render pipeline to use. May be skiagl or skiavk
--skip-leak-check Skips the memory leak check
--report-gpu-memory[=verbose] Dumps the GPU memory usage after each test run
@@ -140,6 +145,9 @@ static bool setBenchmarkFormat(const char* format) {
if (!strcmp(format, "tabular")) {
gBenchmarkReporter.reset(new benchmark::ConsoleReporter());
} else if (!strcmp(format, "json")) {
// We cannot print the leak check if outputing to JSON as that will break
// JSON parsers since it's not JSON-formatted
gRunLeakCheck = false;
gBenchmarkReporter.reset(new benchmark::JSONReporter());
} else {
fprintf(stderr, "Unknown format '%s'\n", format);
@@ -160,6 +168,24 @@ static bool setRenderer(const char* renderer) {
return true;
}
static void addTestsThatMatchFilter(std::string spec) {
if (spec.empty() || spec == "all") {
spec = "."; // Regexp that matches all benchmarks
}
bool isNegativeFilter = false;
if (spec[0] == '-') {
spec.replace(0, 1, "");
isNegativeFilter = true;
}
std::regex re(spec, std::regex_constants::extended);
for (auto& iter : TestScene::testMap()) {
if ((isNegativeFilter && !std::regex_search(iter.first, re)) ||
(!isNegativeFilter && std::regex_search(iter.first, re))) {
gRunTests.push_back(iter.second);
}
}
}
// For options that only exist in long-form. Anything in the
// 0-255 range is reserved for short options (which just use their ASCII value)
namespace LongOpts {
@@ -170,6 +196,8 @@ enum {
ReportFrametime,
CpuSet,
BenchmarkFormat,
BenchmarkListTests,
BenchmarkFilter,
Onscreen,
Offscreen,
Renderer,
@@ -179,14 +207,16 @@ enum {
}
static const struct option LONG_OPTIONS[] = {
{"frames", required_argument, nullptr, 'f'},
{"repeat", required_argument, nullptr, 'r'},
{"count", required_argument, nullptr, 'c'},
{"runs", required_argument, nullptr, 'r'},
{"help", no_argument, nullptr, 'h'},
{"list", no_argument, nullptr, LongOpts::List},
{"wait-for-gpu", no_argument, nullptr, LongOpts::WaitForGpu},
{"report-frametime", optional_argument, nullptr, LongOpts::ReportFrametime},
{"cpuset", required_argument, nullptr, LongOpts::CpuSet},
{"benchmark_format", required_argument, nullptr, LongOpts::BenchmarkFormat},
{"benchmark_list_tests", optional_argument, nullptr, LongOpts::BenchmarkListTests},
{"benchmark_filter", required_argument, nullptr, LongOpts::BenchmarkFilter},
{"onscreen", no_argument, nullptr, LongOpts::Onscreen},
{"offscreen", no_argument, nullptr, LongOpts::Offscreen},
{"renderer", required_argument, nullptr, LongOpts::Renderer},
@@ -197,8 +227,12 @@ static const struct option LONG_OPTIONS[] = {
static const char* SHORT_OPTIONS = "c:r:h";
void parseOptions(int argc, char* argv[]) {
benchmark::BenchmarkReporter::Context::executable_name = (argc > 0) ? argv[0] : "unknown";
int c;
bool error = false;
bool listTestsOnly = false;
bool testsAreFiltered = false;
opterr = 0;
while (true) {
@@ -272,6 +306,21 @@ void parseOptions(int argc, char* argv[]) {
}
break;
case LongOpts::BenchmarkListTests:
if (!optarg || ParseBool(optarg) == ParseBoolResult::kTrue) {
listTestsOnly = true;
}
break;
case LongOpts::BenchmarkFilter:
if (!optarg) {
error = true;
break;
}
addTestsThatMatchFilter(optarg);
testsAreFiltered = true;
break;
case LongOpts::Renderer:
if (!optarg) {
error = true;
@@ -346,11 +395,18 @@ void parseOptions(int argc, char* argv[]) {
}
}
} while (optind < argc);
} else {
} else if (gRunTests.empty() && !testsAreFiltered) {
for (auto& iter : TestScene::testMap()) {
gRunTests.push_back(iter.second);
}
}
if (listTestsOnly) {
for (auto& iter : gRunTests) {
std::cout << iter.name << std::endl;
}
exit(EXIT_SUCCESS);
}
}
int main(int argc, char* argv[]) {