xref: /aosp_15_r20/build/soong/cc/library_headers_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 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	"fmt"
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	"github.com/google/blueprint"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryHeaders(t *testing.T) {
27*333d2b36SAndroid Build Coastguard Worker	bp := `
28*333d2b36SAndroid Build Coastguard Worker		%s {
29*333d2b36SAndroid Build Coastguard Worker			name: "headers",
30*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["my_include"],
31*333d2b36SAndroid Build Coastguard Worker		}
32*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
33*333d2b36SAndroid Build Coastguard Worker			name: "lib",
34*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.c"],
35*333d2b36SAndroid Build Coastguard Worker			header_libs: ["headers"],
36*333d2b36SAndroid Build Coastguard Worker		}
37*333d2b36SAndroid Build Coastguard Worker	`
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker	for _, headerModule := range []string{"cc_library_headers", "cc_prebuilt_library_headers"} {
40*333d2b36SAndroid Build Coastguard Worker		t.Run(headerModule, func(t *testing.T) {
41*333d2b36SAndroid Build Coastguard Worker			ctx := testCc(t, fmt.Sprintf(bp, headerModule))
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker			// test if header search paths are correctly added
44*333d2b36SAndroid Build Coastguard Worker			cc := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static").Rule("cc")
45*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "cFlags for lib module", cc.Args["cFlags"], " -Imy_include ")
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker			// Test that there's a valid AndroidMk entry.
48*333d2b36SAndroid Build Coastguard Worker			headers := ctx.ModuleForTests("headers", "android_arm64_armv8-a").Module()
49*333d2b36SAndroid Build Coastguard Worker			e := android.AndroidMkInfoForTest(t, ctx, headers).PrimaryInfo
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker			// This duplicates the tests done in AndroidMkEntries.write. It would be
52*333d2b36SAndroid Build Coastguard Worker			// better to test its output, but there are no test functions that capture that.
53*333d2b36SAndroid Build Coastguard Worker			android.AssertBoolEquals(t, "AndroidMkEntries.Disabled", false, e.Disabled)
54*333d2b36SAndroid Build Coastguard Worker			android.AssertBoolEquals(t, "AndroidMkEntries.OutputFile.Valid()", true, e.OutputFile.Valid())
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker			android.AssertStringListContains(t, "LOCAL_EXPORT_CFLAGS for headers module", e.EntryMap["LOCAL_EXPORT_CFLAGS"], "-Imy_include")
57*333d2b36SAndroid Build Coastguard Worker		})
58*333d2b36SAndroid Build Coastguard Worker	}
59*333d2b36SAndroid Build Coastguard Worker}
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltLibraryHeadersPreferred(t *testing.T) {
62*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
63*333d2b36SAndroid Build Coastguard Worker	bp := `
64*333d2b36SAndroid Build Coastguard Worker		cc_library_headers {
65*333d2b36SAndroid Build Coastguard Worker			name: "headers",
66*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["my_include"],
67*333d2b36SAndroid Build Coastguard Worker		}
68*333d2b36SAndroid Build Coastguard Worker		cc_prebuilt_library_headers {
69*333d2b36SAndroid Build Coastguard Worker			name: "headers",
70*333d2b36SAndroid Build Coastguard Worker			prefer: %t,
71*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["my_include"],
72*333d2b36SAndroid Build Coastguard Worker		}
73*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
74*333d2b36SAndroid Build Coastguard Worker			name: "lib",
75*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.c"],
76*333d2b36SAndroid Build Coastguard Worker			header_libs: ["headers"],
77*333d2b36SAndroid Build Coastguard Worker		}
78*333d2b36SAndroid Build Coastguard Worker	`
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	for _, prebuiltPreferred := range []bool{false, true} {
81*333d2b36SAndroid Build Coastguard Worker		t.Run(fmt.Sprintf("prebuilt prefer %t", prebuiltPreferred), func(t *testing.T) {
82*333d2b36SAndroid Build Coastguard Worker			ctx := testCc(t, fmt.Sprintf(bp, prebuiltPreferred))
83*333d2b36SAndroid Build Coastguard Worker			lib := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static")
84*333d2b36SAndroid Build Coastguard Worker			sourceDep := ctx.ModuleForTests("headers", "android_arm64_armv8-a")
85*333d2b36SAndroid Build Coastguard Worker			prebuiltDep := ctx.ModuleForTests("prebuilt_headers", "android_arm64_armv8-a")
86*333d2b36SAndroid Build Coastguard Worker			hasSourceDep := false
87*333d2b36SAndroid Build Coastguard Worker			hasPrebuiltDep := false
88*333d2b36SAndroid Build Coastguard Worker			ctx.VisitDirectDeps(lib.Module(), func(dep blueprint.Module) {
89*333d2b36SAndroid Build Coastguard Worker				if dep == sourceDep.Module() {
90*333d2b36SAndroid Build Coastguard Worker					hasSourceDep = true
91*333d2b36SAndroid Build Coastguard Worker				}
92*333d2b36SAndroid Build Coastguard Worker				if dep == prebuiltDep.Module() {
93*333d2b36SAndroid Build Coastguard Worker					hasPrebuiltDep = true
94*333d2b36SAndroid Build Coastguard Worker				}
95*333d2b36SAndroid Build Coastguard Worker			})
96*333d2b36SAndroid Build Coastguard Worker			android.AssertBoolEquals(t, "depends on source headers", !prebuiltPreferred, hasSourceDep)
97*333d2b36SAndroid Build Coastguard Worker			android.AssertBoolEquals(t, "depends on prebuilt headers", prebuiltPreferred, hasPrebuiltDep)
98*333d2b36SAndroid Build Coastguard Worker		})
99*333d2b36SAndroid Build Coastguard Worker	}
100*333d2b36SAndroid Build Coastguard Worker}
101