1e347860d5
This builds cap_names.list.h, which uses an eponymous filegroup "generate_cap_names_list.awk" in Soong, but uses the file target directly in Bazel. This also improve filegroup support for mixed builds, by issuing a cquery call _without_ arch. Filegroups in Soong don't have configurable properties, so don't generate Bazel filegroups into buildroot's config_nodes (which was x86_64 by default). The mixed_build_root now looks like this: ``` config_node(...) config_node(...) config_node(...) config_node(...) ... filegroup(name = "common", srcs = ["@//bionic/linker:linker_sources_x86", "@//bionic/libc:kernel_input_headers", "@//system/timezone/apex:com.android.tzdata-androidManifest", "@//external/libcap:generate_cap_names_list.awk", "@//bionic/linker:linker_sources_arm64", "@//bionic/linker:linker_sources", "@//bionic/libc:libc_sources_shared_arm", "@//bionic/linker:linker_sources_x86_64", "@//bionic/libc:all_kernel_uapi_headers", "@//build/bazel/examples/apex/minimal:build.bazel.examples.apex.minimal-file_contexts", "@//system/core/libcutils:android_filesystem_config_header", "@//bionic/libc:libc_sources_static", "@//bionic/linker:linker_sources_arm", "@//bionic/libc/tools:bionic-gensyscalls", "@//bionic/tools:bionic-generate-version-script", "@//bionic/libc:libc_sources_shared"], ) mixed_build_root(name = "buildroot", deps = [":x86", ":arm64", ":arm", ":common", ":x86_64"], ) ``` Test: CI Fixes: 198595323 Fixes: 198235838 Change-Id: I6df9a14da556cf358d96e6a99b514f66a2638295
118 lines
3.5 KiB
Go
118 lines
3.5 KiB
Go
package android
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestRequestResultsAfterInvokeBazel(t *testing.T) {
|
|
label := "//foo:bar"
|
|
arch := Arm64
|
|
bazelContext, _ := testBazelContext(t, map[bazelCommand]string{
|
|
bazelCommand{command: "cquery", expression: "deps(@soong_injection//mixed_builds:buildroot)"}: `//foo:bar|arm64>>out/foo/bar.txt`,
|
|
})
|
|
g, ok := bazelContext.GetOutputFiles(label, arch)
|
|
if ok {
|
|
t.Errorf("Did not expect cquery results prior to running InvokeBazel(), but got %s", g)
|
|
}
|
|
err := bazelContext.InvokeBazel()
|
|
if err != nil {
|
|
t.Fatalf("Did not expect error invoking Bazel, but got %s", err)
|
|
}
|
|
g, ok = bazelContext.GetOutputFiles(label, arch)
|
|
if !ok {
|
|
t.Errorf("Expected cquery results after running InvokeBazel(), but got none")
|
|
} else if w := []string{"out/foo/bar.txt"}; !reflect.DeepEqual(w, g) {
|
|
t.Errorf("Expected output %s, got %s", w, g)
|
|
}
|
|
}
|
|
|
|
func TestInvokeBazelWritesBazelFiles(t *testing.T) {
|
|
bazelContext, baseDir := testBazelContext(t, map[bazelCommand]string{})
|
|
err := bazelContext.InvokeBazel()
|
|
if err != nil {
|
|
t.Fatalf("Did not expect error invoking Bazel, but got %s", err)
|
|
}
|
|
if _, err := os.Stat(filepath.Join(baseDir, "soong_injection", "mixed_builds", "main.bzl")); os.IsNotExist(err) {
|
|
t.Errorf("Expected main.bzl to exist, but it does not")
|
|
} else if err != nil {
|
|
t.Errorf("Unexpected error stating main.bzl %s", err)
|
|
}
|
|
|
|
if _, err := os.Stat(filepath.Join(baseDir, "soong_injection", "mixed_builds", "BUILD.bazel")); os.IsNotExist(err) {
|
|
t.Errorf("Expected BUILD.bazel to exist, but it does not")
|
|
} else if err != nil {
|
|
t.Errorf("Unexpected error stating BUILD.bazel %s", err)
|
|
}
|
|
|
|
if _, err := os.Stat(filepath.Join(baseDir, "soong_injection", "WORKSPACE.bazel")); os.IsNotExist(err) {
|
|
t.Errorf("Expected WORKSPACE.bazel to exist, but it does not")
|
|
} else if err != nil {
|
|
t.Errorf("Unexpected error stating WORKSPACE.bazel %s", err)
|
|
}
|
|
}
|
|
|
|
func TestInvokeBazelPopulatesBuildStatements(t *testing.T) {
|
|
bazelContext, _ := testBazelContext(t, map[bazelCommand]string{
|
|
bazelCommand{command: "aquery", expression: "deps(@soong_injection//mixed_builds:buildroot)"}: `
|
|
{
|
|
"artifacts": [{
|
|
"id": 1,
|
|
"pathFragmentId": 1
|
|
}, {
|
|
"id": 2,
|
|
"pathFragmentId": 2
|
|
}],
|
|
"actions": [{
|
|
"targetId": 1,
|
|
"actionKey": "x",
|
|
"mnemonic": "x",
|
|
"arguments": ["touch", "foo"],
|
|
"inputDepSetIds": [1],
|
|
"outputIds": [1],
|
|
"primaryOutputId": 1
|
|
}],
|
|
"depSetOfFiles": [{
|
|
"id": 1,
|
|
"directArtifactIds": [1, 2]
|
|
}],
|
|
"pathFragments": [{
|
|
"id": 1,
|
|
"label": "one"
|
|
}, {
|
|
"id": 2,
|
|
"label": "two"
|
|
}]
|
|
}`,
|
|
})
|
|
err := bazelContext.InvokeBazel()
|
|
if err != nil {
|
|
t.Fatalf("Did not expect error invoking Bazel, but got %s", err)
|
|
}
|
|
|
|
got := bazelContext.BuildStatementsToRegister()
|
|
if want := 1; len(got) != want {
|
|
t.Errorf("Expected %d registered build statements, got %#v", want, got)
|
|
}
|
|
}
|
|
|
|
func testBazelContext(t *testing.T, bazelCommandResults map[bazelCommand]string) (*bazelContext, string) {
|
|
t.Helper()
|
|
p := bazelPaths{
|
|
soongOutDir: t.TempDir(),
|
|
outputBase: "outputbase",
|
|
workspaceDir: "workspace_dir",
|
|
}
|
|
aqueryCommand := bazelCommand{command: "aquery", expression: "deps(@soong_injection//mixed_builds:buildroot)"}
|
|
if _, exists := bazelCommandResults[aqueryCommand]; !exists {
|
|
bazelCommandResults[aqueryCommand] = "{}\n"
|
|
}
|
|
runner := &mockBazelRunner{bazelCommandResults: bazelCommandResults}
|
|
return &bazelContext{
|
|
bazelRunner: runner,
|
|
paths: &p,
|
|
requests: map[cqueryKey]bool{},
|
|
}, p.soongOutDir
|
|
}
|