1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "reflect" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryReuse(t *testing.T) { 25*333d2b36SAndroid Build Coastguard Worker t.Parallel() 26*333d2b36SAndroid Build Coastguard Worker t.Run("simple", func(t *testing.T) { 27*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 28*333d2b36SAndroid Build Coastguard Worker cc_library { 29*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 30*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c", "baz.o"], 31*333d2b36SAndroid Build Coastguard Worker }`) 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") 34*333d2b36SAndroid Build Coastguard Worker libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker if len(libfooShared.Inputs) != 2 { 37*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) 38*333d2b36SAndroid Build Coastguard Worker } 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker if len(libfooStatic.Inputs) != 2 { 41*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings()) 42*333d2b36SAndroid Build Coastguard Worker } 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker if libfooShared.Inputs[0] != libfooStatic.Inputs[0] { 45*333d2b36SAndroid Build Coastguard Worker t.Errorf("static object not reused for shared library") 46*333d2b36SAndroid Build Coastguard Worker } 47*333d2b36SAndroid Build Coastguard Worker if libfooShared.Inputs[1] != libfooStatic.Inputs[1] { 48*333d2b36SAndroid Build Coastguard Worker t.Errorf("static object not reused for shared library") 49*333d2b36SAndroid Build Coastguard Worker } 50*333d2b36SAndroid Build Coastguard Worker }) 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker t.Run("extra static source", func(t *testing.T) { 53*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 54*333d2b36SAndroid Build Coastguard Worker cc_library { 55*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 56*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 57*333d2b36SAndroid Build Coastguard Worker static: { 58*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"] 59*333d2b36SAndroid Build Coastguard Worker }, 60*333d2b36SAndroid Build Coastguard Worker }`) 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") 63*333d2b36SAndroid Build Coastguard Worker libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker if len(libfooShared.Inputs) != 1 { 66*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) 67*333d2b36SAndroid Build Coastguard Worker } 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker if len(libfooStatic.Inputs) != 2 { 70*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings()) 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker if libfooShared.Inputs[0] != libfooStatic.Inputs[0] { 74*333d2b36SAndroid Build Coastguard Worker t.Errorf("static object not reused for shared library") 75*333d2b36SAndroid Build Coastguard Worker } 76*333d2b36SAndroid Build Coastguard Worker }) 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Worker t.Run("extra shared source", func(t *testing.T) { 79*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 80*333d2b36SAndroid Build Coastguard Worker cc_library { 81*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 82*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 83*333d2b36SAndroid Build Coastguard Worker shared: { 84*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"] 85*333d2b36SAndroid Build Coastguard Worker }, 86*333d2b36SAndroid Build Coastguard Worker }`) 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Worker libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") 89*333d2b36SAndroid Build Coastguard Worker libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker if len(libfooShared.Inputs) != 2 { 92*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) 93*333d2b36SAndroid Build Coastguard Worker } 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker if len(libfooStatic.Inputs) != 1 { 96*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings()) 97*333d2b36SAndroid Build Coastguard Worker } 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker if libfooShared.Inputs[0] != libfooStatic.Inputs[0] { 100*333d2b36SAndroid Build Coastguard Worker t.Errorf("static object not reused for shared library") 101*333d2b36SAndroid Build Coastguard Worker } 102*333d2b36SAndroid Build Coastguard Worker }) 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Worker t.Run("extra static cflags", func(t *testing.T) { 105*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 106*333d2b36SAndroid Build Coastguard Worker cc_library { 107*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 108*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 109*333d2b36SAndroid Build Coastguard Worker static: { 110*333d2b36SAndroid Build Coastguard Worker cflags: ["-DFOO"], 111*333d2b36SAndroid Build Coastguard Worker }, 112*333d2b36SAndroid Build Coastguard Worker }`) 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Worker libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") 115*333d2b36SAndroid Build Coastguard Worker libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker if len(libfooShared.Inputs) != 1 { 118*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) 119*333d2b36SAndroid Build Coastguard Worker } 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Worker if len(libfooStatic.Inputs) != 1 { 122*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings()) 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker if libfooShared.Inputs[0] == libfooStatic.Inputs[0] { 126*333d2b36SAndroid Build Coastguard Worker t.Errorf("static object reused for shared library when it shouldn't be") 127*333d2b36SAndroid Build Coastguard Worker } 128*333d2b36SAndroid Build Coastguard Worker }) 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker t.Run("extra shared cflags", func(t *testing.T) { 131*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 132*333d2b36SAndroid Build Coastguard Worker cc_library { 133*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 134*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 135*333d2b36SAndroid Build Coastguard Worker shared: { 136*333d2b36SAndroid Build Coastguard Worker cflags: ["-DFOO"], 137*333d2b36SAndroid Build Coastguard Worker }, 138*333d2b36SAndroid Build Coastguard Worker }`) 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") 141*333d2b36SAndroid Build Coastguard Worker libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker if len(libfooShared.Inputs) != 1 { 144*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) 145*333d2b36SAndroid Build Coastguard Worker } 146*333d2b36SAndroid Build Coastguard Worker 147*333d2b36SAndroid Build Coastguard Worker if len(libfooStatic.Inputs) != 1 { 148*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings()) 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker if libfooShared.Inputs[0] == libfooStatic.Inputs[0] { 152*333d2b36SAndroid Build Coastguard Worker t.Errorf("static object reused for shared library when it shouldn't be") 153*333d2b36SAndroid Build Coastguard Worker } 154*333d2b36SAndroid Build Coastguard Worker }) 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Worker t.Run("global cflags for reused generated sources", func(t *testing.T) { 157*333d2b36SAndroid Build Coastguard Worker ctx := testCc(t, ` 158*333d2b36SAndroid Build Coastguard Worker cc_library { 159*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 160*333d2b36SAndroid Build Coastguard Worker srcs: [ 161*333d2b36SAndroid Build Coastguard Worker "foo.c", 162*333d2b36SAndroid Build Coastguard Worker "a.proto", 163*333d2b36SAndroid Build Coastguard Worker ], 164*333d2b36SAndroid Build Coastguard Worker shared: { 165*333d2b36SAndroid Build Coastguard Worker srcs: [ 166*333d2b36SAndroid Build Coastguard Worker "bar.c", 167*333d2b36SAndroid Build Coastguard Worker ], 168*333d2b36SAndroid Build Coastguard Worker }, 169*333d2b36SAndroid Build Coastguard Worker }`) 170*333d2b36SAndroid Build Coastguard Worker 171*333d2b36SAndroid Build Coastguard Worker libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") 172*333d2b36SAndroid Build Coastguard Worker libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker if len(libfooShared.Inputs) != 3 { 175*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) 176*333d2b36SAndroid Build Coastguard Worker } 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Worker if len(libfooStatic.Inputs) != 2 { 179*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected inputs to libfoo static: %#v", libfooStatic.Inputs.Strings()) 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(libfooShared.Inputs[0:2].Strings(), libfooStatic.Inputs.Strings()) { 183*333d2b36SAndroid Build Coastguard Worker t.Errorf("static objects not reused for shared library") 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Worker libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module) 187*333d2b36SAndroid Build Coastguard Worker if !inList("-DGOOGLE_PROTOBUF_NO_RTTI", libfoo.flags.Local.CFlags) { 188*333d2b36SAndroid Build Coastguard Worker t.Errorf("missing protobuf cflags") 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker }) 191*333d2b36SAndroid Build Coastguard Worker} 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Workerfunc TestStubsVersions(t *testing.T) { 194*333d2b36SAndroid Build Coastguard Worker t.Parallel() 195*333d2b36SAndroid Build Coastguard Worker bp := ` 196*333d2b36SAndroid Build Coastguard Worker cc_library { 197*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 198*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 199*333d2b36SAndroid Build Coastguard Worker stubs: { 200*333d2b36SAndroid Build Coastguard Worker versions: ["29", "R", "current"], 201*333d2b36SAndroid Build Coastguard Worker }, 202*333d2b36SAndroid Build Coastguard Worker } 203*333d2b36SAndroid Build Coastguard Worker ` 204*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 205*333d2b36SAndroid Build Coastguard Worker config.TestProductVariables.Platform_version_active_codenames = []string{"R"} 206*333d2b36SAndroid Build Coastguard Worker ctx := testCcWithConfig(t, config) 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker variants := ctx.ModuleVariantsForTests("libfoo") 209*333d2b36SAndroid Build Coastguard Worker for _, expectedVer := range []string{"29", "R", "current"} { 210*333d2b36SAndroid Build Coastguard Worker expectedVariant := "android_arm_armv7-a-neon_shared_" + expectedVer 211*333d2b36SAndroid Build Coastguard Worker if !inList(expectedVariant, variants) { 212*333d2b36SAndroid Build Coastguard Worker t.Errorf("missing expected variant: %q", expectedVariant) 213*333d2b36SAndroid Build Coastguard Worker } 214*333d2b36SAndroid Build Coastguard Worker } 215*333d2b36SAndroid Build Coastguard Worker} 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Workerfunc TestStubsVersions_NotSorted(t *testing.T) { 218*333d2b36SAndroid Build Coastguard Worker t.Parallel() 219*333d2b36SAndroid Build Coastguard Worker bp := ` 220*333d2b36SAndroid Build Coastguard Worker cc_library { 221*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 222*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 223*333d2b36SAndroid Build Coastguard Worker stubs: { 224*333d2b36SAndroid Build Coastguard Worker versions: ["29", "current", "R"], 225*333d2b36SAndroid Build Coastguard Worker }, 226*333d2b36SAndroid Build Coastguard Worker } 227*333d2b36SAndroid Build Coastguard Worker ` 228*333d2b36SAndroid Build Coastguard Worker config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) 229*333d2b36SAndroid Build Coastguard Worker config.TestProductVariables.Platform_version_active_codenames = []string{"R"} 230*333d2b36SAndroid Build Coastguard Worker testCcErrorWithConfig(t, `"libfoo" .*: versions: not sorted`, config) 231*333d2b36SAndroid Build Coastguard Worker} 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Workerfunc TestStubsVersions_ParseError(t *testing.T) { 234*333d2b36SAndroid Build Coastguard Worker t.Parallel() 235*333d2b36SAndroid Build Coastguard Worker bp := ` 236*333d2b36SAndroid Build Coastguard Worker cc_library { 237*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 238*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 239*333d2b36SAndroid Build Coastguard Worker stubs: { 240*333d2b36SAndroid Build Coastguard Worker versions: ["29", "current", "X"], 241*333d2b36SAndroid Build Coastguard Worker }, 242*333d2b36SAndroid Build Coastguard Worker } 243*333d2b36SAndroid Build Coastguard Worker ` 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker testCcError(t, `"libfoo" .*: versions: "X" could not be parsed as an integer and is not a recognized codename`, bp) 246*333d2b36SAndroid Build Coastguard Worker} 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryVersionScript(t *testing.T) { 249*333d2b36SAndroid Build Coastguard Worker t.Parallel() 250*333d2b36SAndroid Build Coastguard Worker result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, ` 251*333d2b36SAndroid Build Coastguard Worker cc_library { 252*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 253*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 254*333d2b36SAndroid Build Coastguard Worker version_script: "foo.map.txt", 255*333d2b36SAndroid Build Coastguard Worker }`) 256*333d2b36SAndroid Build Coastguard Worker 257*333d2b36SAndroid Build Coastguard Worker libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld") 258*333d2b36SAndroid Build Coastguard Worker 259*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on version_script", 260*333d2b36SAndroid Build Coastguard Worker libfoo.Implicits.Strings(), "foo.map.txt") 261*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for version_script", 262*333d2b36SAndroid Build Coastguard Worker libfoo.Args["ldFlags"], "-Wl,--version-script,foo.map.txt") 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Worker} 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryDynamicList(t *testing.T) { 267*333d2b36SAndroid Build Coastguard Worker t.Parallel() 268*333d2b36SAndroid Build Coastguard Worker result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, ` 269*333d2b36SAndroid Build Coastguard Worker cc_library { 270*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 271*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.c"], 272*333d2b36SAndroid Build Coastguard Worker dynamic_list: "foo.dynamic.txt", 273*333d2b36SAndroid Build Coastguard Worker }`) 274*333d2b36SAndroid Build Coastguard Worker 275*333d2b36SAndroid Build Coastguard Worker libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld") 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on dynamic_list", 278*333d2b36SAndroid Build Coastguard Worker libfoo.Implicits.Strings(), "foo.dynamic.txt") 279*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for dynamic_list", 280*333d2b36SAndroid Build Coastguard Worker libfoo.Args["ldFlags"], "-Wl,--dynamic-list,foo.dynamic.txt") 281*333d2b36SAndroid Build Coastguard Worker 282*333d2b36SAndroid Build Coastguard Worker} 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Workerfunc TestWholeStaticLibPrebuilts(t *testing.T) { 285*333d2b36SAndroid Build Coastguard Worker t.Parallel() 286*333d2b36SAndroid Build Coastguard Worker result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, ` 287*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_library_static { 288*333d2b36SAndroid Build Coastguard Worker name: "libprebuilt", 289*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.a"], 290*333d2b36SAndroid Build Coastguard Worker } 291*333d2b36SAndroid Build Coastguard Worker 292*333d2b36SAndroid Build Coastguard Worker cc_library_static { 293*333d2b36SAndroid Build Coastguard Worker name: "libdirect", 294*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libprebuilt"], 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker cc_library_static { 298*333d2b36SAndroid Build Coastguard Worker name: "libtransitive", 299*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libdirect"], 300*333d2b36SAndroid Build Coastguard Worker } 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker cc_library_static { 303*333d2b36SAndroid Build Coastguard Worker name: "libdirect_with_srcs", 304*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.c"], 305*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libprebuilt"], 306*333d2b36SAndroid Build Coastguard Worker } 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Worker cc_library_static { 309*333d2b36SAndroid Build Coastguard Worker name: "libtransitive_with_srcs", 310*333d2b36SAndroid Build Coastguard Worker srcs: ["baz.c"], 311*333d2b36SAndroid Build Coastguard Worker whole_static_libs: ["libdirect_with_srcs"], 312*333d2b36SAndroid Build Coastguard Worker } 313*333d2b36SAndroid Build Coastguard Worker `) 314*333d2b36SAndroid Build Coastguard Worker 315*333d2b36SAndroid Build Coastguard Worker libdirect := result.ModuleForTests("libdirect", "android_arm64_armv8-a_static").Rule("arWithLibs") 316*333d2b36SAndroid Build Coastguard Worker libtransitive := result.ModuleForTests("libtransitive", "android_arm64_armv8-a_static").Rule("arWithLibs") 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker libdirectWithSrcs := result.ModuleForTests("libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs") 319*333d2b36SAndroid Build Coastguard Worker libtransitiveWithSrcs := result.ModuleForTests("libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs") 320*333d2b36SAndroid Build Coastguard Worker 321*333d2b36SAndroid Build Coastguard Worker barObj := result.ModuleForTests("libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("cc") 322*333d2b36SAndroid Build Coastguard Worker bazObj := result.ModuleForTests("libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("cc") 323*333d2b36SAndroid Build Coastguard Worker 324*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on foo.a", 325*333d2b36SAndroid Build Coastguard Worker libdirect.Inputs.Strings(), "foo.a") 326*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for foo.a", 327*333d2b36SAndroid Build Coastguard Worker libdirect.Args["arLibs"], "foo.a") 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on foo.a", 330*333d2b36SAndroid Build Coastguard Worker libtransitive.Inputs.Strings(), "foo.a") 331*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for foo.a", 332*333d2b36SAndroid Build Coastguard Worker libtransitive.Args["arLibs"], "foo.a") 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on foo.a", 335*333d2b36SAndroid Build Coastguard Worker libdirectWithSrcs.Inputs.Strings(), "foo.a") 336*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for foo.a", 337*333d2b36SAndroid Build Coastguard Worker libdirectWithSrcs.Args["arLibs"], "foo.a") 338*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on bar.o", 339*333d2b36SAndroid Build Coastguard Worker libdirectWithSrcs.Inputs.Strings(), barObj.Output.String()) 340*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for bar.o", 341*333d2b36SAndroid Build Coastguard Worker libdirectWithSrcs.Args["arObjs"], barObj.Output.String()) 342*333d2b36SAndroid Build Coastguard Worker 343*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on foo.a", 344*333d2b36SAndroid Build Coastguard Worker libtransitiveWithSrcs.Inputs.Strings(), "foo.a") 345*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for foo.a", 346*333d2b36SAndroid Build Coastguard Worker libtransitiveWithSrcs.Args["arLibs"], "foo.a") 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on bar.o", 349*333d2b36SAndroid Build Coastguard Worker libtransitiveWithSrcs.Inputs.Strings(), barObj.Output.String()) 350*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for bar.o", 351*333d2b36SAndroid Build Coastguard Worker libtransitiveWithSrcs.Args["arObjs"], barObj.Output.String()) 352*333d2b36SAndroid Build Coastguard Worker 353*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "missing dependency on baz.o", 354*333d2b36SAndroid Build Coastguard Worker libtransitiveWithSrcs.Inputs.Strings(), bazObj.Output.String()) 355*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "missing flag for baz.o", 356*333d2b36SAndroid Build Coastguard Worker libtransitiveWithSrcs.Args["arObjs"], bazObj.Output.String()) 357*333d2b36SAndroid Build Coastguard Worker} 358