1package android 2 3import ( 4 "testing" 5) 6 7var packageTests = []struct { 8 name string 9 fs map[string][]byte 10 expectedErrors []string 11}{ 12 // Package default_visibility handling is tested in visibility_test.go 13 { 14 name: "package must not accept visibility and name properties", 15 fs: map[string][]byte{ 16 "top/Blueprints": []byte(` 17 package { 18 name: "package", 19 visibility: ["//visibility:private"], 20 }`), 21 }, 22 expectedErrors: []string{ 23 `top/Blueprints:3:10: unrecognized property "name"`, 24 `top/Blueprints:4:16: unrecognized property "visibility"`, 25 }, 26 }, 27 { 28 name: "multiple packages in separate directories", 29 fs: map[string][]byte{ 30 "top/Blueprints": []byte(` 31 package { 32 }`), 33 "other/Blueprints": []byte(` 34 package { 35 }`), 36 "other/nested/Blueprints": []byte(` 37 package { 38 }`), 39 }, 40 }, 41 { 42 name: "package must not be specified more than once per package", 43 fs: map[string][]byte{ 44 "top/Blueprints": []byte(` 45 package { 46 default_visibility: ["//visibility:private"], 47 default_applicable_licenses: ["license"], 48 } 49 50 package { 51 }`), 52 }, 53 expectedErrors: []string{ 54 `module "//top" already defined`, 55 }, 56 }, 57} 58 59func TestPackage(t *testing.T) { 60 for _, test := range packageTests { 61 t.Run(test.name, func(t *testing.T) { 62 _, errs := testPackage(test.fs) 63 64 expectedErrors := test.expectedErrors 65 if expectedErrors == nil { 66 FailIfErrored(t, errs) 67 } else { 68 for _, expectedError := range expectedErrors { 69 FailIfNoMatchingErrors(t, expectedError, errs) 70 } 71 if len(errs) > len(expectedErrors) { 72 t.Errorf("additional errors found, expected %d, found %d", len(expectedErrors), len(errs)) 73 for i, expectedError := range expectedErrors { 74 t.Errorf("expectedErrors[%d] = %s", i, expectedError) 75 } 76 for i, err := range errs { 77 t.Errorf("errs[%d] = %s", i, err) 78 } 79 } 80 } 81 }) 82 } 83} 84 85func testPackage(fs map[string][]byte) (*TestContext, []error) { 86 87 // Create a new config per test as visibility information is stored in the config. 88 config := TestArchConfig(buildDir, nil, "", fs) 89 90 ctx := NewTestArchContext() 91 RegisterPackageBuildComponents(ctx) 92 ctx.Register(config) 93 94 _, errs := ctx.ParseBlueprintsFiles(".") 95 if len(errs) > 0 { 96 return ctx, errs 97 } 98 99 _, errs = ctx.PrepareBuildActions(config) 100 return ctx, errs 101} 102