| package android |
| |
| import ( |
| "testing" |
| ) |
| |
| var licenseTests = []struct { |
| name string |
| fs map[string][]byte |
| expectedErrors []string |
| }{ |
| { |
| name: "license must not accept licenses property", |
| fs: map[string][]byte{ |
| "top/Blueprints": []byte(` |
| license { |
| name: "top_license", |
| visibility: ["//visibility:private"], |
| licenses: ["other_license"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `top/Blueprints:5:14: unrecognized property "licenses"`, |
| }, |
| }, |
| { |
| name: "private license", |
| fs: map[string][]byte{ |
| "top/Blueprints": []byte(` |
| license_kind { |
| name: "top_notice", |
| conditions: ["notice"], |
| visibility: ["//visibility:private"], |
| } |
| |
| license { |
| name: "top_allowed_as_notice", |
| license_kinds: ["top_notice"], |
| visibility: ["//visibility:private"], |
| }`), |
| "other/Blueprints": []byte(` |
| rule { |
| name: "arule", |
| licenses: ["top_allowed_as_notice"], |
| }`), |
| "yetmore/Blueprints": []byte(` |
| package { |
| default_applicable_licenses: ["top_allowed_as_notice"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `other/Blueprints:2:5: module "arule": depends on //top:top_allowed_as_notice `+ |
| `which is not visible to this module`, |
| `yetmore/Blueprints:2:5: module "//yetmore": depends on //top:top_allowed_as_notice `+ |
| `which is not visible to this module`, |
| }, |
| }, |
| { |
| name: "must reference license_kind module", |
| fs: map[string][]byte{ |
| "top/Blueprints": []byte(` |
| rule { |
| name: "top_by_exception_only", |
| } |
| |
| license { |
| name: "top_proprietary", |
| license_kinds: ["top_by_exception_only"], |
| visibility: ["//visibility:public"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `top/Blueprints:6:5: module "top_proprietary": license_kinds property `+ |
| `"top_by_exception_only" is not a license_kind module`, |
| }, |
| }, |
| { |
| name: "license_kind module must exist", |
| fs: map[string][]byte{ |
| "top/Blueprints": []byte(` |
| license { |
| name: "top_notice_allowed", |
| license_kinds: ["top_notice"], |
| visibility: ["//visibility:public"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `top/Blueprints:2:5: "top_notice_allowed" depends on undefined module "top_notice"`, |
| }, |
| }, |
| { |
| name: "public license", |
| fs: map[string][]byte{ |
| "top/Blueprints": []byte(` |
| license_kind { |
| name: "top_by_exception_only", |
| conditions: ["by_exception_only"], |
| visibility: ["//visibility:private"], |
| } |
| |
| license { |
| name: "top_proprietary", |
| license_kinds: ["top_by_exception_only"], |
| visibility: ["//visibility:public"], |
| }`), |
| "other/Blueprints": []byte(` |
| rule { |
| name: "arule", |
| licenses: ["top_proprietary"], |
| }`), |
| "yetmore/Blueprints": []byte(` |
| package { |
| default_applicable_licenses: ["top_proprietary"], |
| }`), |
| }, |
| }, |
| { |
| name: "multiple licenses", |
| fs: map[string][]byte{ |
| "top/Blueprints": []byte(` |
| package { |
| default_applicable_licenses: ["top_proprietary"], |
| } |
| |
| license_kind { |
| name: "top_notice", |
| conditions: ["notice"], |
| } |
| |
| license_kind { |
| name: "top_by_exception_only", |
| conditions: ["by_exception_only"], |
| visibility: ["//visibility:public"], |
| } |
| |
| license { |
| name: "top_allowed_as_notice", |
| license_kinds: ["top_notice"], |
| } |
| |
| license { |
| name: "top_proprietary", |
| license_kinds: ["top_by_exception_only"], |
| visibility: ["//visibility:public"], |
| } |
| rule { |
| name: "myrule", |
| licenses: ["top_allowed_as_notice", "top_proprietary"] |
| }`), |
| "other/Blueprints": []byte(` |
| rule { |
| name: "arule", |
| licenses: ["top_proprietary"], |
| }`), |
| "yetmore/Blueprints": []byte(` |
| package { |
| default_applicable_licenses: ["top_proprietary"], |
| }`), |
| }, |
| }, |
| } |
| |
| func TestLicense(t *testing.T) { |
| for _, test := range licenseTests { |
| t.Run(test.name, func(t *testing.T) { |
| _, errs := testLicense(test.fs) |
| |
| expectedErrors := test.expectedErrors |
| if expectedErrors == nil { |
| FailIfErrored(t, errs) |
| } else { |
| for _, expectedError := range expectedErrors { |
| FailIfNoMatchingErrors(t, expectedError, errs) |
| } |
| if len(errs) > len(expectedErrors) { |
| t.Errorf("additional errors found, expected %d, found %d", len(expectedErrors), len(errs)) |
| for i, expectedError := range expectedErrors { |
| t.Errorf("expectedErrors[%d] = %s", i, expectedError) |
| } |
| for i, err := range errs { |
| t.Errorf("errs[%d] = %s", i, err) |
| } |
| } |
| } |
| }) |
| } |
| } |
| |
| func testLicense(fs map[string][]byte) (*TestContext, []error) { |
| |
| // Create a new config per test as visibility information is stored in the config. |
| env := make(map[string]string) |
| env["ANDROID_REQUIRE_LICENSES"] = "1" |
| config := TestArchConfig(buildDir, env, "", fs) |
| |
| ctx := NewTestArchContext(config) |
| RegisterPackageBuildComponents(ctx) |
| registerTestPrebuiltBuildComponents(ctx) |
| RegisterLicenseKindBuildComponents(ctx) |
| RegisterLicenseBuildComponents(ctx) |
| ctx.RegisterModuleType("rule", newMockRuleModule) |
| ctx.PreArchMutators(RegisterVisibilityRuleChecker) |
| ctx.PreArchMutators(RegisterLicensesPackageMapper) |
| ctx.PreArchMutators(RegisterDefaultsPreArchMutators) |
| ctx.PreArchMutators(RegisterLicensesPropertyGatherer) |
| ctx.PreArchMutators(RegisterVisibilityRuleGatherer) |
| ctx.PostDepsMutators(RegisterVisibilityRuleEnforcer) |
| ctx.PostDepsMutators(RegisterLicensesDependencyChecker) |
| ctx.Register() |
| |
| _, errs := ctx.ParseBlueprintsFiles(".") |
| if len(errs) > 0 { |
| return ctx, errs |
| } |
| |
| _, errs = ctx.PrepareBuildActions(config) |
| return ctx, errs |
| } |
| |
| type mockRuleModule struct { |
| ModuleBase |
| DefaultableModuleBase |
| } |
| |
| func newMockRuleModule() Module { |
| m := &mockRuleModule{} |
| InitAndroidModule(m) |
| InitDefaultableModule(m) |
| return m |
| } |
| |
| func (p *mockRuleModule) GenerateAndroidBuildActions(ModuleContext) { |
| } |