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) { }