| package android |
| |
| import ( |
| "testing" |
| ) |
| |
| // Common test set up for license tests. |
| var prepareForLicenseTest = GroupFixturePreparers( |
| // General preparers in alphabetical order. |
| PrepareForTestWithDefaults, |
| PrepareForTestWithLicenses, |
| PrepareForTestWithOverrides, |
| PrepareForTestWithPackageModule, |
| PrepareForTestWithPrebuilts, |
| PrepareForTestWithVisibility, |
| |
| // Additional test specific stuff |
| prepareForTestWithFakePrebuiltModules, |
| FixtureMergeEnv(map[string]string{"ANDROID_REQUIRE_LICENSES": "1"}), |
| ) |
| |
| var licenseTests = []struct { |
| name string |
| fs MockFS |
| expectedErrors []string |
| }{ |
| { |
| name: "license must not accept licenses property", |
| fs: map[string][]byte{ |
| "top/Android.bp": []byte(` |
| license { |
| name: "top_license", |
| visibility: ["//visibility:private"], |
| licenses: ["other_license"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `top/Android.bp:5:14: unrecognized property "licenses"`, |
| }, |
| }, |
| { |
| name: "private license", |
| fs: map[string][]byte{ |
| "top/Android.bp": []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/Android.bp": []byte(` |
| rule { |
| name: "arule", |
| licenses: ["top_allowed_as_notice"], |
| }`), |
| "yetmore/Android.bp": []byte(` |
| package { |
| default_applicable_licenses: ["top_allowed_as_notice"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `other/Android.bp:2:5: module "arule": depends on //top:top_allowed_as_notice ` + |
| `which is not visible to this module`, |
| `yetmore/Android.bp: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/Android.bp": []byte(` |
| rule { |
| name: "top_by_exception_only", |
| } |
| |
| license { |
| name: "top_proprietary", |
| license_kinds: ["top_by_exception_only"], |
| visibility: ["//visibility:public"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `top/Android.bp:6:5: module "top_proprietary": license_kinds property ` + |
| `"top_by_exception_only" is not a license_kind module`, |
| }, |
| }, |
| { |
| name: "must not duplicate license_kind", |
| fs: map[string][]byte{ |
| "top/Android.bp": []byte(` |
| license_kind { |
| name: "top_by_exception_only", |
| conditions: ["by_exception_only"], |
| visibility: ["//visibility:private"], |
| } |
| |
| license_kind { |
| name: "top_by_exception_only_2", |
| conditions: ["by_exception_only"], |
| visibility: ["//visibility:private"], |
| } |
| |
| license { |
| name: "top_proprietary", |
| license_kinds: [ |
| "top_by_exception_only", |
| "top_by_exception_only_2", |
| "top_by_exception_only" |
| ], |
| visibility: ["//visibility:public"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `top/Android.bp:14:5: module "top_proprietary": Duplicated license kind: "top_by_exception_only"`, |
| }, |
| }, |
| { |
| name: "license_kind module must exist", |
| fs: map[string][]byte{ |
| "top/Android.bp": []byte(` |
| license { |
| name: "top_notice_allowed", |
| license_kinds: ["top_notice"], |
| visibility: ["//visibility:public"], |
| }`), |
| }, |
| expectedErrors: []string{ |
| `top/Android.bp:2:5: "top_notice_allowed" depends on undefined module "top_notice"`, |
| }, |
| }, |
| { |
| name: "public license", |
| fs: map[string][]byte{ |
| "top/Android.bp": []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/Android.bp": []byte(` |
| rule { |
| name: "arule", |
| licenses: ["top_proprietary"], |
| }`), |
| "yetmore/Android.bp": []byte(` |
| package { |
| default_applicable_licenses: ["top_proprietary"], |
| }`), |
| }, |
| }, |
| { |
| name: "multiple licenses", |
| fs: map[string][]byte{ |
| "top/Android.bp": []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/Android.bp": []byte(` |
| rule { |
| name: "arule", |
| licenses: ["top_proprietary"], |
| }`), |
| "yetmore/Android.bp": []byte(` |
| package { |
| default_applicable_licenses: ["top_proprietary"], |
| }`), |
| }, |
| }, |
| } |
| |
| func TestLicense(t *testing.T) { |
| for _, test := range licenseTests { |
| t.Run(test.name, func(t *testing.T) { |
| // Customize the common license text fixture factory. |
| GroupFixturePreparers( |
| prepareForLicenseTest, |
| FixtureRegisterWithContext(func(ctx RegistrationContext) { |
| ctx.RegisterModuleType("rule", newMockRuleModule) |
| }), |
| test.fs.AddToFixture(), |
| ). |
| ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)). |
| RunTest(t) |
| }) |
| } |
| } |
| |
| func testLicense(t *testing.T, fs MockFS, expectedErrors []string) { |
| } |
| |
| type mockRuleModule struct { |
| ModuleBase |
| DefaultableModuleBase |
| } |
| |
| func newMockRuleModule() Module { |
| m := &mockRuleModule{} |
| InitAndroidModule(m) |
| InitDefaultableModule(m) |
| return m |
| } |
| |
| func (p *mockRuleModule) GenerateAndroidBuildActions(ModuleContext) { |
| } |