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