aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin DuBois <kevindubois@google.com>2020-04-23 23:04:06 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-04-23 23:04:06 +0000
commitc231060e4dbd680c770a0682e6b37ee875c0faf5 (patch)
tree6d2713d752eaa9088c1994622f5c038ff7ea5a7a
parent698816daaed74fdba3246fc4ad5229b91f6059aa (diff)
parent939ebe500e5e8babcf4ffc4f36bd9c2e69250bdd (diff)
downloadigt-gpu-tools-c231060e4dbd680c770a0682e6b37ee875c0faf5.tar.gz
igt: add Android compatible test runner. am: 939ebe500eandroid-r-beta-3android-r-beta-2
Change-Id: I7a4e96507fb472c33812d086f60ef5e9c37c3b03
-rw-r--r--Android.bp30
-rw-r--r--scripts/test_igt_gpu_tools.py119
-rw-r--r--scripts/test_igt_gpu_tools.xml40
3 files changed, 189 insertions, 0 deletions
diff --git a/Android.bp b/Android.bp
index 477efe2ef..3eebe4ec7 100644
--- a/Android.bp
+++ b/Android.bp
@@ -12,6 +12,15 @@ cc_defaults {
],
static_libs: ["libelf", "libkmod", "libion", "liblog"],
shared_libs: ["libdrm"],
+ compile_multilib: "both",
+ multilib: {
+ lib32: {
+ suffix: "32",
+ },
+ lib64: {
+ suffix: "64"
+ },
+ },
}
cc_library_static {
@@ -58,28 +67,49 @@ cc_test {
name: "gem_blt",
defaults: ["igt-gpu-tools-test-defaults"],
srcs: ["benchmarks/gem_blt.c"],
+ gtest: false,
}
cc_test {
name: "kms_flip",
defaults: ["igt-gpu-tools-test-defaults"],
srcs: ["tests/kms_flip.c"],
+ gtest: false,
}
cc_test {
name: "kms_atomic",
defaults: ["igt-gpu-tools-test-defaults"],
srcs: ["tests/kms_atomic.c"],
+ gtest: false,
}
cc_test {
name: "ion_fb",
defaults: ["igt-gpu-tools-test-defaults"],
srcs: ["tests/ion_fb.c"],
+ gtest: false,
}
cc_test {
name: "kms_vblank",
defaults: ["igt-gpu-tools-test-defaults"],
srcs: ["tests/kms_vblank.c"],
+ gtest: false,
+}
+
+python_test_host {
+ name: "igt_gpu_tools",
+ main: "scripts/test_igt_gpu_tools.py",
+ srcs: [ "scripts/test_igt_gpu_tools.py", ],
+ data: [ "scripts/test_igt_gpu_tools.xml" ],
+ test_config: "scripts/test_igt_gpu_tools.xml",
+ version: {
+ py2: {
+ enabled: false,
+ },
+ py3: {
+ enabled: true,
+ },
+ },
}
diff --git a/scripts/test_igt_gpu_tools.py b/scripts/test_igt_gpu_tools.py
new file mode 100644
index 000000000..4597836f6
--- /dev/null
+++ b/scripts/test_igt_gpu_tools.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2020 The Android Open Source Project
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import unittest
+from xml.etree import ElementTree
+import subprocess
+import sys
+
+VERBOSE = True
+TEST_CONFIG = os.path.join(os.path.dirname(__file__), "test_igt_gpu_tools.xml")
+
+""" Extracts tests from AndroidTest.xml compatible file
+ param: xmlfile str containing path to AndroidTest.xml compatible xml file
+"""
+def extract_tests_from_xml(xmlfile):
+ tree = ElementTree.parse(xmlfile)
+ root = tree.getroot()
+ return [(o.attrib['key'], o.attrib['value'])
+ for o in root.findall("./target_preparer/option")
+ if o.attrib['name'] == "push-file"]
+
+def run_command(command):
+ serial_number = os.environ.get("ANDROID_SERIAL", "")
+ if not serial_number:
+ raise "$ANDROID_SERIAL is empty, device must be specified"
+ full_command = ["adb", "-s", serial_number, "shell"] + command
+ if VERBOSE:
+ print("+" + " ".join(full_command))
+ ret = subprocess.run(full_command, capture_output=True, universal_newlines=True)
+ if VERBOSE:
+ print(ret.stdout)
+ return ret.stdout
+
+class IGTGpuToolsBinary():
+ """Harness object for a specific IGT GPU test binary. """
+
+ """ param: ondevice_test_path The IGT binary path on device """
+ def __init__(self, ondevice_test_path):
+ self._path = ondevice_test_path
+ subtests = run_command([self._path, "--list-subtests"])
+ self._subtests = list(filter(lambda x: x != "", subtests.split("\n")))
+
+ """lists subtests detected in tests.
+ return: list of strings indicating subtests found in binary.
+ """
+ def subtests(self):
+ return self._subtests;
+
+ """Runs a subtest.
+
+ param: subtest_name One of the subtests listed by self.subtest()
+ return: a subprocess.CompletedProcess
+ """
+ def run_subtest(self, subtest_name):
+ if subtest_name not in self._subtests:
+ error
+ return run_command([self._path, "--run-subtest", subtest_name])
+
+class IGTGpuToolsTest(unittest.TestCase):
+ """Tests for DRM/KMS using Intel Graphics Tests suite"""
+
+ """ param: subtest A valid subtest for the binary
+ param: the IGT binary to run as a unit test.
+ """
+ def __init__(self, subtest, binary):
+ self._subtest_name = subtest
+ self._test_binary = binary
+ setattr(self, self._subtest_name, self.runTest)
+ super(IGTGpuToolsTest, self).__init__(methodName=self._subtest_name)
+
+ """ Runs the test set in the constructor """
+ def runTest(self):
+ output = self._test_binary.run_subtest(self._subtest_name)
+ for line in output.split("\n"):
+ if "Subtest" not in line:
+ continue;
+ if "SKIP" in line:
+ self.skipTest("{} - skipped".format(self._subtest_name))
+ break
+ if "SUCCESS" in line:
+ break
+ if "FAIL" in line:
+ self.fail(output)
+ break
+ self.fail("could not parse test output; test runner failure")
+
+ANDROID_RUNNER_REQUIRED_VERBOSITY = 2
+
+def main():
+ """main entrypoint for test runner"""
+
+ runner = unittest.TextTestRunner(stream=sys.stderr, verbosity=ANDROID_RUNNER_REQUIRED_VERBOSITY)
+ suite = unittest.TestSuite()
+ for test, test_path in extract_tests_from_xml(TEST_CONFIG):
+ print("Found IGT-GPU-tools test {}".format(test))
+ subsuite = unittest.TestSuite()
+ binary = IGTGpuToolsBinary(test_path)
+ for subtest in binary.subtests():
+ print("\tFound subtest {}".format(subtest))
+ subsuite.addTest(IGTGpuToolsTest(subtest, binary))
+ suite.addTest(subsuite)
+ runner.run(suite)
+
+if __name__=="__main__":
+ main()
diff --git a/scripts/test_igt_gpu_tools.xml b/scripts/test_igt_gpu_tools.xml
new file mode 100644
index 000000000..63a5febe1
--- /dev/null
+++ b/scripts/test_igt_gpu_tools.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Config to run IGT GPU tests">
+ <option name="logcat-on-failure" value="false" />
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+ <option name="run-command" value="stop" />
+ <option name="run-command" value="stop $(grep -rn composer /vendor/etc/init | grep service | cut -d ' ' -f 2)" />
+ <option name="teardown-command" value="stop $(grep -rn composer /vendor/etc/init | grep service | cut -d ' ' -f 2)" />
+ <option name="teardown-command" value="start" />
+ </target_preparer>
+ <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
+ <option name="cleanup" value="true"/>
+ <option name="append-bitness" value="true"/>
+ <option name="push-file"
+ key="kms_atomic" value="/data/local/tmp/kms_atomic"/>
+ <option name="push-file"
+ key="kms_flip" value="/data/local/tmp/kms_flip"/>
+ <option name="push-file"
+ key="kms_vblank" value="/data/local/tmp/kms_vblank"/>
+ </target_preparer>
+ <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
+ <option name="par-file-name" value="igt_gpu_tools" />
+ <option name="inject-android-serial" value="true" />
+ <option name="test-timeout" value="30m" />
+ </test>
+</configuration>