xref: /aosp_15_r20/system/libfmq/tests/fmq_test.py (revision be431cd81a9a2349eaea34eb56fcf6d1608da596)
1*be431cd8SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*be431cd8SAndroid Build Coastguard Worker#
3*be431cd8SAndroid Build Coastguard Worker# Copyright (C) 2020 The Android Open Source Project
4*be431cd8SAndroid Build Coastguard Worker#
5*be431cd8SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*be431cd8SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*be431cd8SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*be431cd8SAndroid Build Coastguard Worker#
9*be431cd8SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*be431cd8SAndroid Build Coastguard Worker#
11*be431cd8SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*be431cd8SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*be431cd8SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*be431cd8SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*be431cd8SAndroid Build Coastguard Worker# limitations under the License.
16*be431cd8SAndroid Build Coastguard Worker#
17*be431cd8SAndroid Build Coastguard Worker
18*be431cd8SAndroid Build Coastguard Workerimport subprocess
19*be431cd8SAndroid Build Coastguard Workerimport unittest
20*be431cd8SAndroid Build Coastguard Worker
21*be431cd8SAndroid Build Coastguard Workerdef run_cmd(cmd, ignore_error=False):
22*be431cd8SAndroid Build Coastguard Worker    print("Running command:", cmd)
23*be431cd8SAndroid Build Coastguard Worker    p = subprocess.Popen(cmd, shell=True)
24*be431cd8SAndroid Build Coastguard Worker    p.communicate()
25*be431cd8SAndroid Build Coastguard Worker    if not ignore_error and p.returncode:
26*be431cd8SAndroid Build Coastguard Worker        raise subprocess.CalledProcessError(p.returncode, cmd)
27*be431cd8SAndroid Build Coastguard Worker    return p.returncode
28*be431cd8SAndroid Build Coastguard Worker
29*be431cd8SAndroid Build Coastguard Workerclass TestFmq(unittest.TestCase):
30*be431cd8SAndroid Build Coastguard Worker    pass
31*be431cd8SAndroid Build Coastguard Worker
32*be431cd8SAndroid Build Coastguard Workerdef make_test(client, server, client_filter=None):
33*be431cd8SAndroid Build Coastguard Worker    def test(self):
34*be431cd8SAndroid Build Coastguard Worker        try:
35*be431cd8SAndroid Build Coastguard Worker            run_cmd("adb shell killall %s >/dev/null 2>&1" % client, ignore_error=True)
36*be431cd8SAndroid Build Coastguard Worker            run_cmd("adb shell killall %s >/dev/null 2>&1" % server, ignore_error=True)
37*be431cd8SAndroid Build Coastguard Worker            run_cmd("adb shell \"( %s ) </dev/null >/dev/null 2>&1 &\"" % server)
38*be431cd8SAndroid Build Coastguard Worker            client_cmd = client
39*be431cd8SAndroid Build Coastguard Worker            if client_filter:
40*be431cd8SAndroid Build Coastguard Worker                client_cmd += " --gtest_filter=" + client_filter
41*be431cd8SAndroid Build Coastguard Worker            run_cmd("adb shell %s" % client_cmd)
42*be431cd8SAndroid Build Coastguard Worker        finally:
43*be431cd8SAndroid Build Coastguard Worker            run_cmd("adb shell killall %s >/dev/null 2>&1" % client, ignore_error=True)
44*be431cd8SAndroid Build Coastguard Worker            run_cmd("adb shell killall %s >/dev/null 2>&1" % server, ignore_error=True)
45*be431cd8SAndroid Build Coastguard Worker    return test
46*be431cd8SAndroid Build Coastguard Worker
47*be431cd8SAndroid Build Coastguard Workerdef has_bitness(bitness):
48*be431cd8SAndroid Build Coastguard Worker    return 0 == run_cmd("echo '[[ \"$(getprop ro.product.cpu.abilist%s)\" != \"\" ]]' | adb shell sh" % bitness, ignore_error=True)
49*be431cd8SAndroid Build Coastguard Worker
50*be431cd8SAndroid Build Coastguard Workerif __name__ == '__main__':
51*be431cd8SAndroid Build Coastguard Worker    clients = []
52*be431cd8SAndroid Build Coastguard Worker    servers = []
53*be431cd8SAndroid Build Coastguard Worker
54*be431cd8SAndroid Build Coastguard Worker    def add_clients_and_servers(clients: list[str], servers: list[str], base: str):
55*be431cd8SAndroid Build Coastguard Worker        clients += [
56*be431cd8SAndroid Build Coastguard Worker            base + "/fmq_test_client/fmq_test_client",
57*be431cd8SAndroid Build Coastguard Worker            base + "/fmq_rust_test_client/fmq_rust_test_client",
58*be431cd8SAndroid Build Coastguard Worker        ]
59*be431cd8SAndroid Build Coastguard Worker        servers += [base + "/[email protected]/[email protected]"]
60*be431cd8SAndroid Build Coastguard Worker        servers += [base + "/[email protected]/[email protected]"]
61*be431cd8SAndroid Build Coastguard Worker
62*be431cd8SAndroid Build Coastguard Worker    if has_bitness(32):
63*be431cd8SAndroid Build Coastguard Worker        add_clients_and_servers(clients, servers, "/data/nativetest")
64*be431cd8SAndroid Build Coastguard Worker
65*be431cd8SAndroid Build Coastguard Worker    if has_bitness(64):
66*be431cd8SAndroid Build Coastguard Worker        add_clients_and_servers(clients, servers, "/data/nativetest64")
67*be431cd8SAndroid Build Coastguard Worker
68*be431cd8SAndroid Build Coastguard Worker    assert len(clients) > 0
69*be431cd8SAndroid Build Coastguard Worker    assert len(servers) > 0
70*be431cd8SAndroid Build Coastguard Worker
71*be431cd8SAndroid Build Coastguard Worker    def bitness(binary_path: str) -> str:
72*be431cd8SAndroid Build Coastguard Worker        if "64" in binary_path:
73*be431cd8SAndroid Build Coastguard Worker            return "64"
74*be431cd8SAndroid Build Coastguard Worker        return "32"
75*be431cd8SAndroid Build Coastguard Worker
76*be431cd8SAndroid Build Coastguard Worker    def short_name(binary_path: str) -> str:
77*be431cd8SAndroid Build Coastguard Worker        base = "rust" if "rust" in binary_path else ""
78*be431cd8SAndroid Build Coastguard Worker        return base + bitness(binary_path)
79*be431cd8SAndroid Build Coastguard Worker
80*be431cd8SAndroid Build Coastguard Worker    for client in clients:
81*be431cd8SAndroid Build Coastguard Worker        for server in servers:
82*be431cd8SAndroid Build Coastguard Worker            test_name = 'test_%s_to_%s' % (short_name(client), short_name(server))
83*be431cd8SAndroid Build Coastguard Worker            # Tests in the C++ test client that are fully supported by the Rust test server
84*be431cd8SAndroid Build Coastguard Worker            rust_tests = ":".join([
85*be431cd8SAndroid Build Coastguard Worker                # Only run AIDL tests 0,1, 3 ,4, not HIDL tests 2 and 5
86*be431cd8SAndroid Build Coastguard Worker                "SynchronizedReadWriteClient/0.*",
87*be431cd8SAndroid Build Coastguard Worker                "SynchronizedReadWriteClient/1.*",
88*be431cd8SAndroid Build Coastguard Worker                "SynchronizedReadWriteClient/3.*",
89*be431cd8SAndroid Build Coastguard Worker                "SynchronizedReadWriteClient/4.*",
90*be431cd8SAndroid Build Coastguard Worker                # Skip blocking tests until the Rust FMQ interface supports them: TODO(b/339999649)
91*be431cd8SAndroid Build Coastguard Worker                "-*Blocking*",
92*be431cd8SAndroid Build Coastguard Worker            ])
93*be431cd8SAndroid Build Coastguard Worker            # Enable subset of tests if testing C++ client against the rust server
94*be431cd8SAndroid Build Coastguard Worker            gtest_filter = rust_tests if "rust" in server and not "rust" in client else None
95*be431cd8SAndroid Build Coastguard Worker            test = make_test(client, server, gtest_filter)
96*be431cd8SAndroid Build Coastguard Worker            setattr(TestFmq, test_name, test)
97*be431cd8SAndroid Build Coastguard Worker
98*be431cd8SAndroid Build Coastguard Worker    suite = unittest.TestLoader().loadTestsFromTestCase(TestFmq)
99*be431cd8SAndroid Build Coastguard Worker    unittest.TextTestRunner(verbosity=2).run(suite)
100