diff --git a/rust/project_json.go b/rust/project_json.go index 75375408c..41dd194ee 100644 --- a/rust/project_json.go +++ b/rust/project_json.go @@ -75,6 +75,7 @@ func mergeDependencies(ctx android.SingletonContext, project *rustProjectJson, knownCrates map[string]crateInfo, module android.Module, crate *rustProjectCrate, deps map[string]int) { + //TODO(tweek): The stdlib dependencies do not appear here. We need to manually add them. ctx.VisitDirectDeps(module, func(child android.Module) { childId, childName, ok := appendLibraryAndDeps(ctx, project, knownCrates, child) if !ok { @@ -114,11 +115,8 @@ func appendLibraryAndDeps(ctx android.SingletonContext, project *rustProjectJson return cInfo.ID, crateName, true } crate := rustProjectCrate{Deps: make([]rustProjectDep, 0), Cfgs: make([]string, 0)} - srcs := rustLib.baseCompiler.Properties.Srcs - if len(srcs) == 0 { - return 0, "", false - } - crate.RootModule = path.Join(ctx.ModuleDir(rModule), srcs[0]) + src := rustLib.baseCompiler.Properties.Srcs[0] + crate.RootModule = path.Join(ctx.ModuleDir(rModule), src) crate.Edition = rustLib.baseCompiler.edition() deps := make(map[string]int) diff --git a/rust/project_json_test.go b/rust/project_json_test.go index 89ba8d352..6786e72c7 100644 --- a/rust/project_json_test.go +++ b/rust/project_json_test.go @@ -15,7 +15,6 @@ package rust import ( - "encoding/json" "io/ioutil" "path/filepath" "testing" @@ -24,12 +23,20 @@ import ( "android/soong/cc" ) -// testProjectJson run the generation of rust-project.json. It returns the raw -// content of the generated file. -func testProjectJson(t *testing.T, bp string, fs map[string][]byte) []byte { +func TestProjectJson(t *testing.T) { + bp := `rust_library { + name: "liba", + srcs: ["src/lib.rs"], + crate_name: "a" + }` + GatherRequiredDepsForTest() + env := map[string]string{"SOONG_GEN_RUST_PROJECT": "1"} + fs := map[string][]byte{ + "foo.rs": nil, + "src/lib.rs": nil, + } + cc.GatherRequiredFilesForTest(fs) - env := map[string]string{"SOONG_GEN_RUST_PROJECT": "1"} config := android.TestArchConfig(buildDir, env, bp, fs) ctx := CreateTestContext() ctx.Register(config) @@ -41,79 +48,8 @@ func testProjectJson(t *testing.T, bp string, fs map[string][]byte) []byte { // The JSON file is generated via WriteFileToOutputDir. Therefore, it // won't appear in the Output of the TestingSingleton. Manually verify // it exists. - content, err := ioutil.ReadFile(filepath.Join(buildDir, rustProjectJsonFileName)) + _, err := ioutil.ReadFile(filepath.Join(buildDir, "rust-project.json")) if err != nil { t.Errorf("rust-project.json has not been generated") } - return content -} - -// validateJsonCrates validates that content follows the basic structure of -// rust-project.json. It returns the crates attribute if the validation -// succeeded. -// It uses an empty interface instead of relying on a defined structure to -// avoid a strong dependency on our implementation. -func validateJsonCrates(t *testing.T, rawContent []byte) []interface{} { - var content interface{} - err := json.Unmarshal(rawContent, &content) - if err != nil { - t.Errorf("Unable to parse the rust-project.json as JSON: %v", err) - } - root, ok := content.(map[string]interface{}) - if !ok { - t.Errorf("Unexpected JSON format: %v", content) - } - if _, ok = root["crates"]; !ok { - t.Errorf("No crates attribute in rust-project.json: %v", root) - } - crates, ok := root["crates"].([]interface{}) - if !ok { - t.Errorf("Unexpected crates format: %v", root["crates"]) - } - return crates -} - -func TestProjectJsonDep(t *testing.T) { - bp := ` - rust_library { - name: "liba", - srcs: ["a/src/lib.rs"], - crate_name: "a" - } - rust_library { - name: "libb", - srcs: ["b/src/lib.rs"], - crate_name: "b", - rlibs: ["liba"], - } - ` + GatherRequiredDepsForTest() - fs := map[string][]byte{ - "a/src/lib.rs": nil, - "b/src/lib.rs": nil, - } - jsonContent := testProjectJson(t, bp, fs) - validateJsonCrates(t, jsonContent) -} - -func TestProjectJsonBindGen(t *testing.T) { - bp := ` - rust_library { - name: "liba", - srcs: ["src/lib.rs"], - rlibs: ["libbindings"], - crate_name: "a" - } - rust_bindgen { - name: "libbindings", - crate_name: "bindings", - source_stem: "bindings", - host_supported: true, - wrapper_src: "src/any.h", - } - ` + GatherRequiredDepsForTest() - fs := map[string][]byte{ - "src/lib.rs": nil, - } - jsonContent := testProjectJson(t, bp, fs) - validateJsonCrates(t, jsonContent) }