|  | // Copyright 2020 Google Inc. All rights reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package cc | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "testing" | 
|  |  | 
|  | "android/soong/android" | 
|  |  | 
|  | "github.com/google/blueprint" | 
|  | ) | 
|  |  | 
|  | func TestLibraryHeaders(t *testing.T) { | 
|  | bp := ` | 
|  | %s { | 
|  | name: "headers", | 
|  | export_include_dirs: ["my_include"], | 
|  | } | 
|  | cc_library_static { | 
|  | name: "lib", | 
|  | srcs: ["foo.c"], | 
|  | header_libs: ["headers"], | 
|  | } | 
|  | ` | 
|  |  | 
|  | for _, headerModule := range []string{"cc_library_headers", "cc_prebuilt_library_headers"} { | 
|  | t.Run(headerModule, func(t *testing.T) { | 
|  | ctx := testCc(t, fmt.Sprintf(bp, headerModule)) | 
|  |  | 
|  | // test if header search paths are correctly added | 
|  | cc := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static").Rule("cc") | 
|  | android.AssertStringDoesContain(t, "cFlags for lib module", cc.Args["cFlags"], " -Imy_include ") | 
|  |  | 
|  | // Test that there's a valid AndroidMk entry. | 
|  | headers := ctx.ModuleForTests("headers", "android_arm64_armv8-a").Module() | 
|  | e := android.AndroidMkEntriesForTest(t, ctx, headers)[0] | 
|  |  | 
|  | // This duplicates the tests done in AndroidMkEntries.write. It would be | 
|  | // better to test its output, but there are no test functions that capture that. | 
|  | android.AssertBoolEquals(t, "AndroidMkEntries.Disabled", false, e.Disabled) | 
|  | android.AssertBoolEquals(t, "AndroidMkEntries.OutputFile.Valid()", true, e.OutputFile.Valid()) | 
|  |  | 
|  | android.AssertStringListContains(t, "LOCAL_EXPORT_CFLAGS for headers module", e.EntryMap["LOCAL_EXPORT_CFLAGS"], "-Imy_include") | 
|  | }) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestPrebuiltLibraryHeadersPreferred(t *testing.T) { | 
|  | t.Parallel() | 
|  | bp := ` | 
|  | cc_library_headers { | 
|  | name: "headers", | 
|  | export_include_dirs: ["my_include"], | 
|  | } | 
|  | cc_prebuilt_library_headers { | 
|  | name: "headers", | 
|  | prefer: %t, | 
|  | export_include_dirs: ["my_include"], | 
|  | } | 
|  | cc_library_static { | 
|  | name: "lib", | 
|  | srcs: ["foo.c"], | 
|  | header_libs: ["headers"], | 
|  | } | 
|  | ` | 
|  |  | 
|  | for _, prebuiltPreferred := range []bool{false, true} { | 
|  | t.Run(fmt.Sprintf("prebuilt prefer %t", prebuiltPreferred), func(t *testing.T) { | 
|  | ctx := testCc(t, fmt.Sprintf(bp, prebuiltPreferred)) | 
|  | lib := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static") | 
|  | sourceDep := ctx.ModuleForTests("headers", "android_arm64_armv8-a") | 
|  | prebuiltDep := ctx.ModuleForTests("prebuilt_headers", "android_arm64_armv8-a") | 
|  | hasSourceDep := false | 
|  | hasPrebuiltDep := false | 
|  | ctx.VisitDirectDeps(lib.Module(), func(dep blueprint.Module) { | 
|  | if dep == sourceDep.Module() { | 
|  | hasSourceDep = true | 
|  | } | 
|  | if dep == prebuiltDep.Module() { | 
|  | hasPrebuiltDep = true | 
|  | } | 
|  | }) | 
|  | android.AssertBoolEquals(t, "depends on source headers", !prebuiltPreferred, hasSourceDep) | 
|  | android.AssertBoolEquals(t, "depends on prebuilt headers", prebuiltPreferred, hasPrebuiltDep) | 
|  | }) | 
|  | } | 
|  | } |