1*7594170eSAndroid Build Coastguard Worker"""Copyright (C) 2023 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker 3*7594170eSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard WorkerYou may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker 7*7594170eSAndroid Build Coastguard Worker http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker 9*7594170eSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Workerlimitations under the License. 14*7594170eSAndroid Build Coastguard Worker""" 15*7594170eSAndroid Build Coastguard Worker 16*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths") 17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:sets.bzl", "sets") 18*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") 19*7594170eSAndroid Build Coastguard Workerload(":ndk_headers.bzl", "ndk_headers") 20*7594170eSAndroid Build Coastguard Worker 21*7594170eSAndroid Build Coastguard Workerdef _ndk_headers_test_impl(ctx): 22*7594170eSAndroid Build Coastguard Worker env = analysistest.begin(ctx) 23*7594170eSAndroid Build Coastguard Worker target_under_test = analysistest.target_under_test(env) 24*7594170eSAndroid Build Coastguard Worker target_bin_dir_path = analysistest.target_bin_dir_path(env) 25*7594170eSAndroid Build Coastguard Worker 26*7594170eSAndroid Build Coastguard Worker # check that versioner was run for versioned NDK headers 27*7594170eSAndroid Build Coastguard Worker if ctx.attr.expected_run_versioner: 28*7594170eSAndroid Build Coastguard Worker version_action = [a for a in analysistest.target_actions(env) if a.mnemonic == "VersionBionicHeaders"] 29*7594170eSAndroid Build Coastguard Worker asserts.equals( 30*7594170eSAndroid Build Coastguard Worker env, 31*7594170eSAndroid Build Coastguard Worker len(version_action), 32*7594170eSAndroid Build Coastguard Worker 1, 33*7594170eSAndroid Build Coastguard Worker "Expected versioner to run once", 34*7594170eSAndroid Build Coastguard Worker ) 35*7594170eSAndroid Build Coastguard Worker 36*7594170eSAndroid Build Coastguard Worker asserts.set_equals( 37*7594170eSAndroid Build Coastguard Worker env, 38*7594170eSAndroid Build Coastguard Worker expected = sets.make([ 39*7594170eSAndroid Build Coastguard Worker paths.join(ctx.attr.expected_isystem, file) 40*7594170eSAndroid Build Coastguard Worker for file in ctx.attr.expected_hdrs 41*7594170eSAndroid Build Coastguard Worker ]), 42*7594170eSAndroid Build Coastguard Worker actual = sets.make([ 43*7594170eSAndroid Build Coastguard Worker file.short_path 44*7594170eSAndroid Build Coastguard Worker for file in target_under_test[DefaultInfo].files.to_list() 45*7594170eSAndroid Build Coastguard Worker ]), 46*7594170eSAndroid Build Coastguard Worker ) 47*7594170eSAndroid Build Coastguard Worker 48*7594170eSAndroid Build Coastguard Worker compilation_context = target_under_test[CcInfo].compilation_context 49*7594170eSAndroid Build Coastguard Worker 50*7594170eSAndroid Build Coastguard Worker # check -I 51*7594170eSAndroid Build Coastguard Worker asserts.equals( 52*7594170eSAndroid Build Coastguard Worker env, 53*7594170eSAndroid Build Coastguard Worker [], 54*7594170eSAndroid Build Coastguard Worker compilation_context.includes.to_list(), 55*7594170eSAndroid Build Coastguard Worker "ndk headers should be added as -isystem and not -I", 56*7594170eSAndroid Build Coastguard Worker ) 57*7594170eSAndroid Build Coastguard Worker 58*7594170eSAndroid Build Coastguard Worker # check -isystem 59*7594170eSAndroid Build Coastguard Worker asserts.equals( 60*7594170eSAndroid Build Coastguard Worker env, 61*7594170eSAndroid Build Coastguard Worker [ 62*7594170eSAndroid Build Coastguard Worker paths.join( 63*7594170eSAndroid Build Coastguard Worker target_bin_dir_path, 64*7594170eSAndroid Build Coastguard Worker ctx.attr.expected_isystem, 65*7594170eSAndroid Build Coastguard Worker ), 66*7594170eSAndroid Build Coastguard Worker # check for the NDK triple 67*7594170eSAndroid Build Coastguard Worker paths.join( 68*7594170eSAndroid Build Coastguard Worker target_bin_dir_path, 69*7594170eSAndroid Build Coastguard Worker ctx.attr.expected_isystem, 70*7594170eSAndroid Build Coastguard Worker "arm-linux-androideabi", 71*7594170eSAndroid Build Coastguard Worker ), 72*7594170eSAndroid Build Coastguard Worker ], 73*7594170eSAndroid Build Coastguard Worker compilation_context.system_includes.to_list(), 74*7594170eSAndroid Build Coastguard Worker "CcInfo returned by ndk headers does not have the correct -isystem", 75*7594170eSAndroid Build Coastguard Worker ) 76*7594170eSAndroid Build Coastguard Worker 77*7594170eSAndroid Build Coastguard Worker return analysistest.end(env) 78*7594170eSAndroid Build Coastguard Worker 79*7594170eSAndroid Build Coastguard Workerndk_headers_test = analysistest.make( 80*7594170eSAndroid Build Coastguard Worker _ndk_headers_test_impl, 81*7594170eSAndroid Build Coastguard Worker attrs = { 82*7594170eSAndroid Build Coastguard Worker "expected_hdrs": attr.string_list(), 83*7594170eSAndroid Build Coastguard Worker "expected_isystem": attr.string(doc = "expected dir relative to bin dir that will be provided as -isystem to rdeps"), 84*7594170eSAndroid Build Coastguard Worker "expected_run_versioner": attr.bool(default = False), 85*7594170eSAndroid Build Coastguard Worker }, 86*7594170eSAndroid Build Coastguard Worker # Pin the test to a consistent arch 87*7594170eSAndroid Build Coastguard Worker config_settings = { 88*7594170eSAndroid Build Coastguard Worker "//command_line_option:platforms": "@//build/bazel/tests/products:aosp_arm_for_testing", 89*7594170eSAndroid Build Coastguard Worker }, 90*7594170eSAndroid Build Coastguard Worker) 91*7594170eSAndroid Build Coastguard Worker 92*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_simple(): 93*7594170eSAndroid Build Coastguard Worker test_name = "ndk_headers_simple" 94*7594170eSAndroid Build Coastguard Worker target_under_test_name = test_name + "_target" 95*7594170eSAndroid Build Coastguard Worker 96*7594170eSAndroid Build Coastguard Worker ndk_headers( 97*7594170eSAndroid Build Coastguard Worker name = target_under_test_name, 98*7594170eSAndroid Build Coastguard Worker hdrs = ["a/aa.h", "a/ab.h"], 99*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 100*7594170eSAndroid Build Coastguard Worker ) 101*7594170eSAndroid Build Coastguard Worker 102*7594170eSAndroid Build Coastguard Worker ndk_headers_test( 103*7594170eSAndroid Build Coastguard Worker name = test_name, 104*7594170eSAndroid Build Coastguard Worker target_under_test = target_under_test_name, 105*7594170eSAndroid Build Coastguard Worker expected_hdrs = ["a/aa.h", "a/ab.h"], 106*7594170eSAndroid Build Coastguard Worker expected_isystem = "build/bazel/rules/cc/" + target_under_test_name, 107*7594170eSAndroid Build Coastguard Worker ) 108*7594170eSAndroid Build Coastguard Worker 109*7594170eSAndroid Build Coastguard Worker return test_name 110*7594170eSAndroid Build Coastguard Worker 111*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_non_empty_strip_import(): 112*7594170eSAndroid Build Coastguard Worker test_name = "ndk_headers_non_empty_strip_import" 113*7594170eSAndroid Build Coastguard Worker target_under_test_name = test_name + "_target" 114*7594170eSAndroid Build Coastguard Worker 115*7594170eSAndroid Build Coastguard Worker ndk_headers( 116*7594170eSAndroid Build Coastguard Worker name = target_under_test_name, 117*7594170eSAndroid Build Coastguard Worker strip_import_prefix = "a", 118*7594170eSAndroid Build Coastguard Worker hdrs = ["a/aa.h", "a/ab.h"], 119*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 120*7594170eSAndroid Build Coastguard Worker ) 121*7594170eSAndroid Build Coastguard Worker 122*7594170eSAndroid Build Coastguard Worker ndk_headers_test( 123*7594170eSAndroid Build Coastguard Worker name = test_name, 124*7594170eSAndroid Build Coastguard Worker target_under_test = target_under_test_name, 125*7594170eSAndroid Build Coastguard Worker expected_hdrs = ["aa.h", "ab.h"], 126*7594170eSAndroid Build Coastguard Worker expected_isystem = "build/bazel/rules/cc/" + target_under_test_name, 127*7594170eSAndroid Build Coastguard Worker ) 128*7594170eSAndroid Build Coastguard Worker 129*7594170eSAndroid Build Coastguard Worker return test_name 130*7594170eSAndroid Build Coastguard Worker 131*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_non_empty_import(): 132*7594170eSAndroid Build Coastguard Worker test_name = "ndk_headers_non_empty_import" 133*7594170eSAndroid Build Coastguard Worker target_under_test_name = test_name + "_target" 134*7594170eSAndroid Build Coastguard Worker 135*7594170eSAndroid Build Coastguard Worker ndk_headers( 136*7594170eSAndroid Build Coastguard Worker name = target_under_test_name, 137*7594170eSAndroid Build Coastguard Worker import_prefix = "b", 138*7594170eSAndroid Build Coastguard Worker hdrs = ["a/aa.h", "a/ab.h"], 139*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 140*7594170eSAndroid Build Coastguard Worker ) 141*7594170eSAndroid Build Coastguard Worker 142*7594170eSAndroid Build Coastguard Worker ndk_headers_test( 143*7594170eSAndroid Build Coastguard Worker name = test_name, 144*7594170eSAndroid Build Coastguard Worker target_under_test = target_under_test_name, 145*7594170eSAndroid Build Coastguard Worker expected_hdrs = ["b/a/aa.h", "b/a/ab.h"], 146*7594170eSAndroid Build Coastguard Worker expected_isystem = "build/bazel/rules/cc/" + target_under_test_name, 147*7594170eSAndroid Build Coastguard Worker ) 148*7594170eSAndroid Build Coastguard Worker 149*7594170eSAndroid Build Coastguard Worker return test_name 150*7594170eSAndroid Build Coastguard Worker 151*7594170eSAndroid Build Coastguard Workerdef _test_ndk_headers_non_empty_strip_import_and_import(): 152*7594170eSAndroid Build Coastguard Worker test_name = "ndk_headers_non_empty_strip_import_and_import" 153*7594170eSAndroid Build Coastguard Worker target_under_test_name = test_name + "_target" 154*7594170eSAndroid Build Coastguard Worker 155*7594170eSAndroid Build Coastguard Worker ndk_headers( 156*7594170eSAndroid Build Coastguard Worker name = target_under_test_name, 157*7594170eSAndroid Build Coastguard Worker strip_import_prefix = "a", 158*7594170eSAndroid Build Coastguard Worker import_prefix = "b", 159*7594170eSAndroid Build Coastguard Worker hdrs = ["a/aa.h", "a/ab.h"], 160*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 161*7594170eSAndroid Build Coastguard Worker ) 162*7594170eSAndroid Build Coastguard Worker 163*7594170eSAndroid Build Coastguard Worker ndk_headers_test( 164*7594170eSAndroid Build Coastguard Worker name = test_name, 165*7594170eSAndroid Build Coastguard Worker target_under_test = target_under_test_name, 166*7594170eSAndroid Build Coastguard Worker expected_hdrs = ["b/aa.h", "b/ab.h"], 167*7594170eSAndroid Build Coastguard Worker expected_isystem = "build/bazel/rules/cc/" + target_under_test_name, 168*7594170eSAndroid Build Coastguard Worker ) 169*7594170eSAndroid Build Coastguard Worker 170*7594170eSAndroid Build Coastguard Worker return test_name 171*7594170eSAndroid Build Coastguard Worker 172*7594170eSAndroid Build Coastguard Workerdef _test_versioned_ndk_headers_non_empty_strip_import_and_import(): 173*7594170eSAndroid Build Coastguard Worker test_name = "versioned_ndk_headers_non_empty_strip_import_and_import" 174*7594170eSAndroid Build Coastguard Worker target_under_test_name = test_name + "_target" 175*7594170eSAndroid Build Coastguard Worker 176*7594170eSAndroid Build Coastguard Worker ndk_headers( 177*7594170eSAndroid Build Coastguard Worker name = target_under_test_name, 178*7594170eSAndroid Build Coastguard Worker strip_import_prefix = "a", 179*7594170eSAndroid Build Coastguard Worker import_prefix = "b", 180*7594170eSAndroid Build Coastguard Worker hdrs = ["a/aa.h", "a/ab.h"], 181*7594170eSAndroid Build Coastguard Worker run_versioner = True, 182*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 183*7594170eSAndroid Build Coastguard Worker ) 184*7594170eSAndroid Build Coastguard Worker 185*7594170eSAndroid Build Coastguard Worker ndk_headers_test( 186*7594170eSAndroid Build Coastguard Worker name = test_name, 187*7594170eSAndroid Build Coastguard Worker target_under_test = target_under_test_name, 188*7594170eSAndroid Build Coastguard Worker expected_hdrs = ["b/aa.h", "b/ab.h"], 189*7594170eSAndroid Build Coastguard Worker expected_isystem = "build/bazel/rules/cc/" + target_under_test_name + ".versioned", 190*7594170eSAndroid Build Coastguard Worker expected_run_versioner = True, 191*7594170eSAndroid Build Coastguard Worker ) 192*7594170eSAndroid Build Coastguard Worker 193*7594170eSAndroid Build Coastguard Worker return test_name 194*7594170eSAndroid Build Coastguard Worker 195*7594170eSAndroid Build Coastguard Workerdef ndk_headers_test_suite(name): 196*7594170eSAndroid Build Coastguard Worker native.test_suite( 197*7594170eSAndroid Build Coastguard Worker name = name, 198*7594170eSAndroid Build Coastguard Worker tests = [ 199*7594170eSAndroid Build Coastguard Worker _test_ndk_headers_simple(), 200*7594170eSAndroid Build Coastguard Worker _test_ndk_headers_non_empty_strip_import(), 201*7594170eSAndroid Build Coastguard Worker _test_ndk_headers_non_empty_import(), 202*7594170eSAndroid Build Coastguard Worker _test_ndk_headers_non_empty_strip_import_and_import(), 203*7594170eSAndroid Build Coastguard Worker _test_versioned_ndk_headers_non_empty_strip_import_and_import(), 204*7594170eSAndroid Build Coastguard Worker ], 205*7594170eSAndroid Build Coastguard Worker ) 206