| package android | 
 |  | 
 | import ( | 
 | 	"testing" | 
 |  | 
 | 	"github.com/google/blueprint" | 
 | ) | 
 |  | 
 | var licenseKindTests = []struct { | 
 | 	name           string | 
 | 	fs             MockFS | 
 | 	expectedErrors []string | 
 | }{ | 
 | 	{ | 
 | 		name: "license_kind must not accept licenses property", | 
 | 		fs: map[string][]byte{ | 
 | 			"top/Android.bp": []byte(` | 
 | 				license_kind { | 
 | 					name: "top_license", | 
 | 					licenses: ["other_license"], | 
 | 				}`), | 
 | 		}, | 
 | 		expectedErrors: []string{ | 
 | 			`top/Android.bp:4:14: unrecognized property "licenses"`, | 
 | 		}, | 
 | 	}, | 
 | 	{ | 
 | 		name: "bad license_kind", | 
 | 		fs: map[string][]byte{ | 
 | 			"top/Android.bp": []byte(` | 
 | 				license_kind { | 
 | 					name: "top_notice", | 
 | 					conditions: ["notice"], | 
 | 				}`), | 
 | 			"other/Android.bp": []byte(` | 
 | 				mock_license { | 
 | 					name: "other_notice", | 
 | 					license_kinds: ["notice"], | 
 | 				}`), | 
 | 		}, | 
 | 		expectedErrors: []string{ | 
 | 			`other/Android.bp:2:5: "other_notice" depends on undefined module "notice"`, | 
 | 		}, | 
 | 	}, | 
 | 	{ | 
 | 		name: "good license kind", | 
 | 		fs: map[string][]byte{ | 
 | 			"top/Android.bp": []byte(` | 
 | 				license_kind { | 
 | 					name: "top_by_exception_only", | 
 | 					conditions: ["by_exception_only"], | 
 | 				} | 
 |  | 
 | 				mock_license { | 
 | 					name: "top_proprietary", | 
 | 					license_kinds: ["top_by_exception_only"], | 
 | 				}`), | 
 | 			"other/Android.bp": []byte(` | 
 | 				mock_license { | 
 | 					name: "other_proprietary", | 
 | 					license_kinds: ["top_proprietary"], | 
 | 				}`), | 
 | 		}, | 
 | 	}, | 
 | 	{ | 
 | 		name: "multiple license kinds", | 
 | 		fs: map[string][]byte{ | 
 | 			"top/Android.bp": []byte(` | 
 | 				license_kind { | 
 | 					name: "top_notice", | 
 | 					conditions: ["notice"], | 
 | 				} | 
 |  | 
 | 				license_kind { | 
 | 					name: "top_by_exception_only", | 
 | 					conditions: ["by_exception_only"], | 
 | 				} | 
 |  | 
 | 				mock_license { | 
 | 					name: "top_allowed_as_notice", | 
 | 					license_kinds: ["top_notice"], | 
 | 				} | 
 |  | 
 | 				mock_license { | 
 | 					name: "top_proprietary", | 
 | 					license_kinds: ["top_by_exception_only"], | 
 | 				}`), | 
 | 			"other/Android.bp": []byte(` | 
 | 				mock_license { | 
 | 					name: "other_rule", | 
 | 					license_kinds: ["top_by_exception_only"], | 
 | 				}`), | 
 | 		}, | 
 | 	}, | 
 | } | 
 |  | 
 | func TestLicenseKind(t *testing.T) { | 
 | 	for _, test := range licenseKindTests { | 
 | 		t.Run(test.name, func(t *testing.T) { | 
 | 			GroupFixturePreparers( | 
 | 				prepareForLicenseTest, | 
 | 				FixtureRegisterWithContext(func(ctx RegistrationContext) { | 
 | 					ctx.RegisterModuleType("mock_license", newMockLicenseModule) | 
 | 				}), | 
 | 				test.fs.AddToFixture(), | 
 | 			). | 
 | 				ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)). | 
 | 				RunTest(t) | 
 | 		}) | 
 | 	} | 
 | } | 
 |  | 
 | type mockLicenseProperties struct { | 
 | 	License_kinds []string | 
 | } | 
 |  | 
 | type mockLicenseModule struct { | 
 | 	ModuleBase | 
 | 	DefaultableModuleBase | 
 |  | 
 | 	properties mockLicenseProperties | 
 | } | 
 |  | 
 | func newMockLicenseModule() Module { | 
 | 	m := &mockLicenseModule{} | 
 | 	m.AddProperties(&m.properties) | 
 | 	InitAndroidArchModule(m, HostAndDeviceSupported, MultilibCommon) | 
 | 	InitDefaultableModule(m) | 
 | 	return m | 
 | } | 
 |  | 
 | type licensekindTag struct { | 
 | 	blueprint.BaseDependencyTag | 
 | } | 
 |  | 
 | func (j *mockLicenseModule) DepsMutator(ctx BottomUpMutatorContext) { | 
 | 	m, ok := ctx.Module().(Module) | 
 | 	if !ok { | 
 | 		return | 
 | 	} | 
 | 	ctx.AddDependency(m, licensekindTag{}, j.properties.License_kinds...) | 
 | } | 
 |  | 
 | func (p *mockLicenseModule) GenerateAndroidBuildActions(ModuleContext) { | 
 | } |