1*6c119a46SAndroid Build Coastguard Worker// Copyright 2023 The Android Open Source Project 2*6c119a46SAndroid Build Coastguard Worker// 3*6c119a46SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6c119a46SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6c119a46SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6c119a46SAndroid Build Coastguard Worker// 7*6c119a46SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6c119a46SAndroid Build Coastguard Worker// 9*6c119a46SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6c119a46SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6c119a46SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6c119a46SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6c119a46SAndroid Build Coastguard Worker// limitations under the License. 14*6c119a46SAndroid Build Coastguard Worker 15*6c119a46SAndroid Build Coastguard Workerpackage soong_wayland_protocol_codegen 16*6c119a46SAndroid Build Coastguard Worker 17*6c119a46SAndroid Build Coastguard Workerimport ( 18*6c119a46SAndroid Build Coastguard Worker "os" 19*6c119a46SAndroid Build Coastguard Worker "regexp" 20*6c119a46SAndroid Build Coastguard Worker "testing" 21*6c119a46SAndroid Build Coastguard Worker 22*6c119a46SAndroid Build Coastguard Worker "android/soong/android" 23*6c119a46SAndroid Build Coastguard Worker) 24*6c119a46SAndroid Build Coastguard Worker 25*6c119a46SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) { 26*6c119a46SAndroid Build Coastguard Worker os.Exit(m.Run()) 27*6c119a46SAndroid Build Coastguard Worker} 28*6c119a46SAndroid Build Coastguard Worker 29*6c119a46SAndroid Build Coastguard Workervar prepareForCodeGenTest = android.GroupFixturePreparers( 30*6c119a46SAndroid Build Coastguard Worker android.PrepareForTestWithArchMutator, 31*6c119a46SAndroid Build Coastguard Worker android.PrepareForTestWithDefaults, 32*6c119a46SAndroid Build Coastguard Worker android.PrepareForTestWithFilegroup, 33*6c119a46SAndroid Build Coastguard Worker android.GroupFixturePreparers( 34*6c119a46SAndroid Build Coastguard Worker android.FixtureRegisterWithContext(registerCodeGenBuildComponents), 35*6c119a46SAndroid Build Coastguard Worker ), 36*6c119a46SAndroid Build Coastguard Worker android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { 37*6c119a46SAndroid Build Coastguard Worker android.RegisterPrebuiltMutators(ctx) 38*6c119a46SAndroid Build Coastguard Worker ctx.RegisterModuleType("fake_android_host_tool", fakeAndroidHostToolFactory) 39*6c119a46SAndroid Build Coastguard Worker }), 40*6c119a46SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 41*6c119a46SAndroid Build Coastguard Worker "android_host_tool": nil, 42*6c119a46SAndroid Build Coastguard Worker "tool_src_file": nil, 43*6c119a46SAndroid Build Coastguard Worker "tool_src_file_1": nil, 44*6c119a46SAndroid Build Coastguard Worker "tool_src_file_2": nil, 45*6c119a46SAndroid Build Coastguard Worker "src_file": nil, 46*6c119a46SAndroid Build Coastguard Worker "src_file_1": nil, 47*6c119a46SAndroid Build Coastguard Worker "src_file_2": nil, 48*6c119a46SAndroid Build Coastguard Worker }), 49*6c119a46SAndroid Build Coastguard Worker) 50*6c119a46SAndroid Build Coastguard Worker 51*6c119a46SAndroid Build Coastguard Workerfunc testCodeGenBp() string { 52*6c119a46SAndroid Build Coastguard Worker return ` 53*6c119a46SAndroid Build Coastguard Worker fake_android_host_tool { 54*6c119a46SAndroid Build Coastguard Worker name: "host_tool", 55*6c119a46SAndroid Build Coastguard Worker } 56*6c119a46SAndroid Build Coastguard Worker 57*6c119a46SAndroid Build Coastguard Worker filegroup { 58*6c119a46SAndroid Build Coastguard Worker name: "tool_single_source_file_filegroup", 59*6c119a46SAndroid Build Coastguard Worker srcs: [ 60*6c119a46SAndroid Build Coastguard Worker "tool_src_file", 61*6c119a46SAndroid Build Coastguard Worker ], 62*6c119a46SAndroid Build Coastguard Worker } 63*6c119a46SAndroid Build Coastguard Worker 64*6c119a46SAndroid Build Coastguard Worker filegroup { 65*6c119a46SAndroid Build Coastguard Worker name: "tool_multi_source_files_filegroup", 66*6c119a46SAndroid Build Coastguard Worker srcs: [ 67*6c119a46SAndroid Build Coastguard Worker "tool_src_file_1", 68*6c119a46SAndroid Build Coastguard Worker "tool_src_file_2", 69*6c119a46SAndroid Build Coastguard Worker ], 70*6c119a46SAndroid Build Coastguard Worker } 71*6c119a46SAndroid Build Coastguard Worker 72*6c119a46SAndroid Build Coastguard Worker filegroup { 73*6c119a46SAndroid Build Coastguard Worker name: "single_source_filegroup", 74*6c119a46SAndroid Build Coastguard Worker srcs: [ 75*6c119a46SAndroid Build Coastguard Worker "src_file", 76*6c119a46SAndroid Build Coastguard Worker ], 77*6c119a46SAndroid Build Coastguard Worker } 78*6c119a46SAndroid Build Coastguard Worker 79*6c119a46SAndroid Build Coastguard Worker filegroup { 80*6c119a46SAndroid Build Coastguard Worker name: "multi_source_filegroup", 81*6c119a46SAndroid Build Coastguard Worker srcs: [ 82*6c119a46SAndroid Build Coastguard Worker "src_file_1", 83*6c119a46SAndroid Build Coastguard Worker "src_file_2", 84*6c119a46SAndroid Build Coastguard Worker ], 85*6c119a46SAndroid Build Coastguard Worker } 86*6c119a46SAndroid Build Coastguard Worker 87*6c119a46SAndroid Build Coastguard Worker filegroup { 88*6c119a46SAndroid Build Coastguard Worker name: "empty_filegroup", 89*6c119a46SAndroid Build Coastguard Worker } 90*6c119a46SAndroid Build Coastguard Worker ` 91*6c119a46SAndroid Build Coastguard Worker} 92*6c119a46SAndroid Build Coastguard Worker 93*6c119a46SAndroid Build Coastguard Workerfunc TestWaylandCodeGen(t *testing.T) { 94*6c119a46SAndroid Build Coastguard Worker testcases := []struct { 95*6c119a46SAndroid Build Coastguard Worker name string 96*6c119a46SAndroid Build Coastguard Worker prop string 97*6c119a46SAndroid Build Coastguard Worker 98*6c119a46SAndroid Build Coastguard Worker err string 99*6c119a46SAndroid Build Coastguard Worker cmds []string 100*6c119a46SAndroid Build Coastguard Worker files []string 101*6c119a46SAndroid Build Coastguard Worker }{ 102*6c119a46SAndroid Build Coastguard Worker { 103*6c119a46SAndroid Build Coastguard Worker name: "single_source_with_host_tool", 104*6c119a46SAndroid Build Coastguard Worker prop: ` 105*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 106*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file"], 107*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 108*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 109*6c119a46SAndroid Build Coastguard Worker `, 110*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 111*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'", 112*6c119a46SAndroid Build Coastguard Worker }, 113*6c119a46SAndroid Build Coastguard Worker files: []string{ 114*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix", 115*6c119a46SAndroid Build Coastguard Worker }, 116*6c119a46SAndroid Build Coastguard Worker }, 117*6c119a46SAndroid Build Coastguard Worker { 118*6c119a46SAndroid Build Coastguard Worker name: "multi_source_with_host_tool", 119*6c119a46SAndroid Build Coastguard Worker prop: ` 120*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 121*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file_1", "src_file_2"], 122*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 123*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 124*6c119a46SAndroid Build Coastguard Worker `, 125*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 126*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'", 127*6c119a46SAndroid Build Coastguard Worker }, 128*6c119a46SAndroid Build Coastguard Worker files: []string{ 129*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix", 130*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix", 131*6c119a46SAndroid Build Coastguard Worker }, 132*6c119a46SAndroid Build Coastguard Worker }, 133*6c119a46SAndroid Build Coastguard Worker { 134*6c119a46SAndroid Build Coastguard Worker name: "single_source_filegroup_with_host_tool", 135*6c119a46SAndroid Build Coastguard Worker prop: ` 136*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 137*6c119a46SAndroid Build Coastguard Worker srcs: [":single_source_filegroup"], 138*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 139*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 140*6c119a46SAndroid Build Coastguard Worker `, 141*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 142*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'", 143*6c119a46SAndroid Build Coastguard Worker }, 144*6c119a46SAndroid Build Coastguard Worker files: []string{ 145*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix", 146*6c119a46SAndroid Build Coastguard Worker }, 147*6c119a46SAndroid Build Coastguard Worker }, 148*6c119a46SAndroid Build Coastguard Worker { 149*6c119a46SAndroid Build Coastguard Worker name: "multi_source_filegroup_with_host_tool", 150*6c119a46SAndroid Build Coastguard Worker prop: ` 151*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 152*6c119a46SAndroid Build Coastguard Worker srcs: [":multi_source_filegroup"], 153*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 154*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 155*6c119a46SAndroid Build Coastguard Worker `, 156*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 157*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'", 158*6c119a46SAndroid Build Coastguard Worker }, 159*6c119a46SAndroid Build Coastguard Worker files: []string{ 160*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix", 161*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix", 162*6c119a46SAndroid Build Coastguard Worker }, 163*6c119a46SAndroid Build Coastguard Worker }, 164*6c119a46SAndroid Build Coastguard Worker { 165*6c119a46SAndroid Build Coastguard Worker name: "single_source_with_single_tool_file", 166*6c119a46SAndroid Build Coastguard Worker prop: ` 167*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file"], 168*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file"], 169*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 170*6c119a46SAndroid Build Coastguard Worker cmd: "$(location tool_src_file) gen < $(in) > $(out)", 171*6c119a46SAndroid Build Coastguard Worker `, 172*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 173*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'", 174*6c119a46SAndroid Build Coastguard Worker }, 175*6c119a46SAndroid Build Coastguard Worker files: []string{ 176*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix", 177*6c119a46SAndroid Build Coastguard Worker }, 178*6c119a46SAndroid Build Coastguard Worker }, 179*6c119a46SAndroid Build Coastguard Worker { 180*6c119a46SAndroid Build Coastguard Worker name: "multi_source_with_single_tool_file", 181*6c119a46SAndroid Build Coastguard Worker prop: ` 182*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file"], 183*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file_1", "src_file_2"], 184*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 185*6c119a46SAndroid Build Coastguard Worker cmd: "$(location tool_src_file) gen < $(in) > $(out)", 186*6c119a46SAndroid Build Coastguard Worker `, 187*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 188*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'", 189*6c119a46SAndroid Build Coastguard Worker }, 190*6c119a46SAndroid Build Coastguard Worker files: []string{ 191*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix", 192*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix", 193*6c119a46SAndroid Build Coastguard Worker }, 194*6c119a46SAndroid Build Coastguard Worker }, 195*6c119a46SAndroid Build Coastguard Worker { 196*6c119a46SAndroid Build Coastguard Worker name: "single_source_filegroup_with_single_tool_file", 197*6c119a46SAndroid Build Coastguard Worker prop: ` 198*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file"], 199*6c119a46SAndroid Build Coastguard Worker srcs: [":single_source_filegroup"], 200*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 201*6c119a46SAndroid Build Coastguard Worker cmd: "$(location tool_src_file) gen < $(in) > $(out)", 202*6c119a46SAndroid Build Coastguard Worker `, 203*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 204*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'", 205*6c119a46SAndroid Build Coastguard Worker }, 206*6c119a46SAndroid Build Coastguard Worker files: []string{ 207*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix", 208*6c119a46SAndroid Build Coastguard Worker }, 209*6c119a46SAndroid Build Coastguard Worker }, 210*6c119a46SAndroid Build Coastguard Worker { 211*6c119a46SAndroid Build Coastguard Worker name: "multi_source_filegroup_with_single_tool_file", 212*6c119a46SAndroid Build Coastguard Worker prop: ` 213*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file"], 214*6c119a46SAndroid Build Coastguard Worker srcs: [":multi_source_filegroup"], 215*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 216*6c119a46SAndroid Build Coastguard Worker cmd: "$(location tool_src_file) gen < $(in) > $(out)", 217*6c119a46SAndroid Build Coastguard Worker `, 218*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 219*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_1 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_1_suffix' && bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file gen < src_file_2 > __SBOX_SANDBOX_DIR__/out/prefix_src_file_2_suffix'", 220*6c119a46SAndroid Build Coastguard Worker }, 221*6c119a46SAndroid Build Coastguard Worker files: []string{ 222*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_1_suffix", 223*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_2_suffix", 224*6c119a46SAndroid Build Coastguard Worker }, 225*6c119a46SAndroid Build Coastguard Worker }, 226*6c119a46SAndroid Build Coastguard Worker { 227*6c119a46SAndroid Build Coastguard Worker name: "multiple_tool_files", 228*6c119a46SAndroid Build Coastguard Worker prop: ` 229*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file_1", "tool_src_file_2"], 230*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file"], 231*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 232*6c119a46SAndroid Build Coastguard Worker cmd: "$(location tool_src_file_1) $(location tool_src_file_2) gen < $(in) > $(out)", 233*6c119a46SAndroid Build Coastguard Worker `, 234*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 235*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/tool_src_file_1 __SBOX_SANDBOX_DIR__/tools/src/tool_src_file_2 gen < src_file > __SBOX_SANDBOX_DIR__/out/prefix_src_file_suffix'", 236*6c119a46SAndroid Build Coastguard Worker }, 237*6c119a46SAndroid Build Coastguard Worker files: []string{ 238*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/prefix_src_file_suffix", 239*6c119a46SAndroid Build Coastguard Worker }, 240*6c119a46SAndroid Build Coastguard Worker }, 241*6c119a46SAndroid Build Coastguard Worker { 242*6c119a46SAndroid Build Coastguard Worker name: "output_template_explicit_base_only", 243*6c119a46SAndroid Build Coastguard Worker prop: ` 244*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 245*6c119a46SAndroid Build Coastguard Worker srcs: ["txt/a/file.txt"], 246*6c119a46SAndroid Build Coastguard Worker output: "$(in:base)", 247*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 248*6c119a46SAndroid Build Coastguard Worker `, 249*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 250*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/file'", 251*6c119a46SAndroid Build Coastguard Worker }, 252*6c119a46SAndroid Build Coastguard Worker files: []string{ 253*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/file", 254*6c119a46SAndroid Build Coastguard Worker }, 255*6c119a46SAndroid Build Coastguard Worker }, 256*6c119a46SAndroid Build Coastguard Worker { 257*6c119a46SAndroid Build Coastguard Worker name: "output_template_explicit_base_and_ext", 258*6c119a46SAndroid Build Coastguard Worker prop: ` 259*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 260*6c119a46SAndroid Build Coastguard Worker srcs: ["txt/a/file.txt"], 261*6c119a46SAndroid Build Coastguard Worker output: "$(in:base.ext)", 262*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 263*6c119a46SAndroid Build Coastguard Worker `, 264*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 265*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/file.txt'", 266*6c119a46SAndroid Build Coastguard Worker }, 267*6c119a46SAndroid Build Coastguard Worker files: []string{ 268*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/file.txt", 269*6c119a46SAndroid Build Coastguard Worker }, 270*6c119a46SAndroid Build Coastguard Worker }, 271*6c119a46SAndroid Build Coastguard Worker { 272*6c119a46SAndroid Build Coastguard Worker name: "output_template_explicit_path_and_base", 273*6c119a46SAndroid Build Coastguard Worker prop: ` 274*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 275*6c119a46SAndroid Build Coastguard Worker srcs: ["txt/a/file.txt"], 276*6c119a46SAndroid Build Coastguard Worker output: "$(in:path/base)", 277*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 278*6c119a46SAndroid Build Coastguard Worker `, 279*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 280*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/txt/a/file'", 281*6c119a46SAndroid Build Coastguard Worker }, 282*6c119a46SAndroid Build Coastguard Worker files: []string{ 283*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/txt/a/file", 284*6c119a46SAndroid Build Coastguard Worker }, 285*6c119a46SAndroid Build Coastguard Worker }, 286*6c119a46SAndroid Build Coastguard Worker { 287*6c119a46SAndroid Build Coastguard Worker name: "output_template_explicit_path_and_base_and_ext", 288*6c119a46SAndroid Build Coastguard Worker prop: ` 289*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 290*6c119a46SAndroid Build Coastguard Worker srcs: ["txt/a/file.txt"], 291*6c119a46SAndroid Build Coastguard Worker output: "$(in:path/base.ext)", 292*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 293*6c119a46SAndroid Build Coastguard Worker `, 294*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 295*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < txt/a/file.txt > __SBOX_SANDBOX_DIR__/out/txt/a/file.txt'", 296*6c119a46SAndroid Build Coastguard Worker }, 297*6c119a46SAndroid Build Coastguard Worker files: []string{ 298*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/txt/a/file.txt", 299*6c119a46SAndroid Build Coastguard Worker }, 300*6c119a46SAndroid Build Coastguard Worker }, 301*6c119a46SAndroid Build Coastguard Worker { 302*6c119a46SAndroid Build Coastguard Worker name: "single_source_file_does_not_need_distinct_outputs", 303*6c119a46SAndroid Build Coastguard Worker prop: ` 304*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 305*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file"], 306*6c119a46SAndroid Build Coastguard Worker output: "output", 307*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 308*6c119a46SAndroid Build Coastguard Worker `, 309*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 310*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/output'", 311*6c119a46SAndroid Build Coastguard Worker }, 312*6c119a46SAndroid Build Coastguard Worker files: []string{ 313*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/output", 314*6c119a46SAndroid Build Coastguard Worker }, 315*6c119a46SAndroid Build Coastguard Worker }, 316*6c119a46SAndroid Build Coastguard Worker { 317*6c119a46SAndroid Build Coastguard Worker name: "legacy_prefix_suffix", 318*6c119a46SAndroid Build Coastguard Worker prop: ` 319*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 320*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file"], 321*6c119a46SAndroid Build Coastguard Worker prefix: "legacy_prefix_", 322*6c119a46SAndroid Build Coastguard Worker suffix: "_legacy_suffix", 323*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 324*6c119a46SAndroid Build Coastguard Worker `, 325*6c119a46SAndroid Build Coastguard Worker cmds: []string{ 326*6c119a46SAndroid Build Coastguard Worker "bash -c '__SBOX_SANDBOX_DIR__/tools/src/out/host_tool gen < src_file > __SBOX_SANDBOX_DIR__/out/legacy_prefix_src_file_legacy_suffix'", 327*6c119a46SAndroid Build Coastguard Worker }, 328*6c119a46SAndroid Build Coastguard Worker files: []string{ 329*6c119a46SAndroid Build Coastguard Worker "out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/legacy_prefix_src_file_legacy_suffix", 330*6c119a46SAndroid Build Coastguard Worker }, 331*6c119a46SAndroid Build Coastguard Worker }, 332*6c119a46SAndroid Build Coastguard Worker { 333*6c119a46SAndroid Build Coastguard Worker name: "error_if_no_sources", 334*6c119a46SAndroid Build Coastguard Worker prop: ` 335*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 336*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 337*6c119a46SAndroid Build Coastguard Worker `, 338*6c119a46SAndroid Build Coastguard Worker err: "must have at least one source file", 339*6c119a46SAndroid Build Coastguard Worker }, 340*6c119a46SAndroid Build Coastguard Worker { 341*6c119a46SAndroid Build Coastguard Worker name: "error_if_no_filegroup_sources", 342*6c119a46SAndroid Build Coastguard Worker prop: ` 343*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 344*6c119a46SAndroid Build Coastguard Worker srcs: [":empty_filegroup"], 345*6c119a46SAndroid Build Coastguard Worker cmd: "$(location host_tool) gen < $(in) > $(out)", 346*6c119a46SAndroid Build Coastguard Worker `, 347*6c119a46SAndroid Build Coastguard Worker err: "must have at least one source file", 348*6c119a46SAndroid Build Coastguard Worker }, 349*6c119a46SAndroid Build Coastguard Worker { 350*6c119a46SAndroid Build Coastguard Worker name: "error_if_in_outputs_are_not_distinct", 351*6c119a46SAndroid Build Coastguard Worker prop: ` 352*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 353*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file"], 354*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file_1", "src_file_2"], 355*6c119a46SAndroid Build Coastguard Worker output: "not_unique", 356*6c119a46SAndroid Build Coastguard Worker cmd: "$(location)" 357*6c119a46SAndroid Build Coastguard Worker `, 358*6c119a46SAndroid Build Coastguard Worker err: "Android.bp:39:2: module \"codegen\": generation conflict: both 'src_file_1' and 'src_file_2' generate 'not_unique'", 359*6c119a46SAndroid Build Coastguard Worker }, 360*6c119a46SAndroid Build Coastguard Worker { 361*6c119a46SAndroid Build Coastguard Worker name: "error_if_output_expansion_fails", 362*6c119a46SAndroid Build Coastguard Worker prop: ` 363*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 364*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file"], 365*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file"], 366*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(bad)_suffix", 367*6c119a46SAndroid Build Coastguard Worker cmd: "$(location)" 368*6c119a46SAndroid Build Coastguard Worker `, 369*6c119a46SAndroid Build Coastguard Worker err: "Android.bp:45:11: module \"codegen\": output: unknown variable '$(bad)'", 370*6c119a46SAndroid Build Coastguard Worker }, 371*6c119a46SAndroid Build Coastguard Worker { 372*6c119a46SAndroid Build Coastguard Worker name: "error_if_cmd_expansion_fails", 373*6c119a46SAndroid Build Coastguard Worker prop: ` 374*6c119a46SAndroid Build Coastguard Worker tools: ["host_tool"], 375*6c119a46SAndroid Build Coastguard Worker tool_files: ["tool_src_file"], 376*6c119a46SAndroid Build Coastguard Worker srcs: ["src_file"], 377*6c119a46SAndroid Build Coastguard Worker output: "prefix_$(in)_suffix", 378*6c119a46SAndroid Build Coastguard Worker cmd: "$(location bad_name)" 379*6c119a46SAndroid Build Coastguard Worker `, 380*6c119a46SAndroid Build Coastguard Worker err: "Android.bp:46:8: module \"codegen\": cmd: unknown location label \"bad_name\"", 381*6c119a46SAndroid Build Coastguard Worker }, 382*6c119a46SAndroid Build Coastguard Worker } 383*6c119a46SAndroid Build Coastguard Worker 384*6c119a46SAndroid Build Coastguard Worker for _, test := range testcases { 385*6c119a46SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 386*6c119a46SAndroid Build Coastguard Worker bp := "wayland_protocol_codegen {\n" 387*6c119a46SAndroid Build Coastguard Worker bp += `name: "codegen",` + "\n" 388*6c119a46SAndroid Build Coastguard Worker bp += test.prop 389*6c119a46SAndroid Build Coastguard Worker bp += "}\n" 390*6c119a46SAndroid Build Coastguard Worker 391*6c119a46SAndroid Build Coastguard Worker var expectedErrors []string 392*6c119a46SAndroid Build Coastguard Worker if test.err != "" { 393*6c119a46SAndroid Build Coastguard Worker expectedErrors = append(expectedErrors, regexp.QuoteMeta(test.err)) 394*6c119a46SAndroid Build Coastguard Worker } 395*6c119a46SAndroid Build Coastguard Worker 396*6c119a46SAndroid Build Coastguard Worker result := prepareForCodeGenTest. 397*6c119a46SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(expectedErrors)). 398*6c119a46SAndroid Build Coastguard Worker RunTestWithBp(t, testCodeGenBp()+bp) 399*6c119a46SAndroid Build Coastguard Worker 400*6c119a46SAndroid Build Coastguard Worker if expectedErrors != nil { 401*6c119a46SAndroid Build Coastguard Worker return 402*6c119a46SAndroid Build Coastguard Worker } 403*6c119a46SAndroid Build Coastguard Worker 404*6c119a46SAndroid Build Coastguard Worker gen := result.Module("codegen", "").(*Module) 405*6c119a46SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "cmd", test.cmds, gen.rawCommands) 406*6c119a46SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "files", test.files, gen.outputFiles) 407*6c119a46SAndroid Build Coastguard Worker }) 408*6c119a46SAndroid Build Coastguard Worker } 409*6c119a46SAndroid Build Coastguard Worker} 410*6c119a46SAndroid Build Coastguard Worker 411*6c119a46SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) { 412*6c119a46SAndroid Build Coastguard Worker bp := ` 413*6c119a46SAndroid Build Coastguard Worker wayland_protocol_codegen_defaults { 414*6c119a46SAndroid Build Coastguard Worker name: "gen_defaults1", 415*6c119a46SAndroid Build Coastguard Worker cmd: "cp $(in) $(out)", 416*6c119a46SAndroid Build Coastguard Worker output: "$(in).h", 417*6c119a46SAndroid Build Coastguard Worker } 418*6c119a46SAndroid Build Coastguard Worker 419*6c119a46SAndroid Build Coastguard Worker wayland_protocol_codegen_defaults { 420*6c119a46SAndroid Build Coastguard Worker name: "gen_defaults2", 421*6c119a46SAndroid Build Coastguard Worker srcs: ["in1"], 422*6c119a46SAndroid Build Coastguard Worker } 423*6c119a46SAndroid Build Coastguard Worker 424*6c119a46SAndroid Build Coastguard Worker wayland_protocol_codegen { 425*6c119a46SAndroid Build Coastguard Worker name: "codegen", 426*6c119a46SAndroid Build Coastguard Worker defaults: ["gen_defaults1", "gen_defaults2"], 427*6c119a46SAndroid Build Coastguard Worker } 428*6c119a46SAndroid Build Coastguard Worker ` 429*6c119a46SAndroid Build Coastguard Worker 430*6c119a46SAndroid Build Coastguard Worker result := prepareForCodeGenTest.RunTestWithBp(t, testCodeGenBp()+bp) 431*6c119a46SAndroid Build Coastguard Worker 432*6c119a46SAndroid Build Coastguard Worker gen := result.Module("codegen", "").(*Module) 433*6c119a46SAndroid Build Coastguard Worker 434*6c119a46SAndroid Build Coastguard Worker expectedCmd := "bash -c cp in1 __SBOX_SANDBOX_DIR__/out/in1.h" 435*6c119a46SAndroid Build Coastguard Worker android.AssertStringEquals(t, "cmd", expectedCmd, gen.rawCommands[0]) 436*6c119a46SAndroid Build Coastguard Worker 437*6c119a46SAndroid Build Coastguard Worker expectedSrcs := []string{"in1"} 438*6c119a46SAndroid Build Coastguard Worker android.AssertDeepEquals(t, "srcs", expectedSrcs, gen.properties.Srcs) 439*6c119a46SAndroid Build Coastguard Worker 440*6c119a46SAndroid Build Coastguard Worker expectedFiles := []string{"out/soong/.intermediates/codegen/gen/wayland_protocol_codegen/in1.h"} 441*6c119a46SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "files", expectedFiles, gen.outputFiles) 442*6c119a46SAndroid Build Coastguard Worker} 443*6c119a46SAndroid Build Coastguard Worker 444*6c119a46SAndroid Build Coastguard Workertype fakeAndroidHostTool struct { 445*6c119a46SAndroid Build Coastguard Worker android.ModuleBase 446*6c119a46SAndroid Build Coastguard Worker outputFile android.Path 447*6c119a46SAndroid Build Coastguard Worker} 448*6c119a46SAndroid Build Coastguard Worker 449*6c119a46SAndroid Build Coastguard Workerfunc fakeAndroidHostToolFactory() android.Module { 450*6c119a46SAndroid Build Coastguard Worker module := &fakeAndroidHostTool{} 451*6c119a46SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst) 452*6c119a46SAndroid Build Coastguard Worker return module 453*6c119a46SAndroid Build Coastguard Worker} 454*6c119a46SAndroid Build Coastguard Worker 455*6c119a46SAndroid Build Coastguard Workerfunc (t *fakeAndroidHostTool) GenerateAndroidBuildActions(ctx android.ModuleContext) { 456*6c119a46SAndroid Build Coastguard Worker t.outputFile = android.PathForTesting("out", ctx.ModuleName()) 457*6c119a46SAndroid Build Coastguard Worker} 458*6c119a46SAndroid Build Coastguard Worker 459*6c119a46SAndroid Build Coastguard Workerfunc (t *fakeAndroidHostTool) HostToolPath() android.OptionalPath { 460*6c119a46SAndroid Build Coastguard Worker return android.OptionalPathForPath(t.outputFile) 461*6c119a46SAndroid Build Coastguard Worker} 462*6c119a46SAndroid Build Coastguard Worker 463*6c119a46SAndroid Build Coastguard Workervar _ android.HostToolProvider = (*fakeAndroidHostTool)(nil) 464