1*333d2b36SAndroid Build Coastguard Workerpackage android 2*333d2b36SAndroid Build Coastguard Worker 3*333d2b36SAndroid Build Coastguard Workerimport ( 4*333d2b36SAndroid Build Coastguard Worker "testing" 5*333d2b36SAndroid Build Coastguard Worker) 6*333d2b36SAndroid Build Coastguard Worker 7*333d2b36SAndroid Build Coastguard Worker// Common test set up for license tests. 8*333d2b36SAndroid Build Coastguard Workervar prepareForLicenseTest = GroupFixturePreparers( 9*333d2b36SAndroid Build Coastguard Worker // General preparers in alphabetical order. 10*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDefaults, 11*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithLicenses, 12*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithOverrides, 13*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithPackageModule, 14*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithPrebuilts, 15*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithVisibility, 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker // Additional test specific stuff 18*333d2b36SAndroid Build Coastguard Worker prepareForTestWithFakePrebuiltModules, 19*333d2b36SAndroid Build Coastguard Worker FixtureMergeEnv(map[string]string{"ANDROID_REQUIRE_LICENSES": "1"}), 20*333d2b36SAndroid Build Coastguard Worker) 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Workervar licenseTests = []struct { 23*333d2b36SAndroid Build Coastguard Worker name string 24*333d2b36SAndroid Build Coastguard Worker fs MockFS 25*333d2b36SAndroid Build Coastguard Worker expectedErrors []string 26*333d2b36SAndroid Build Coastguard Worker}{ 27*333d2b36SAndroid Build Coastguard Worker { 28*333d2b36SAndroid Build Coastguard Worker name: "license must not accept licenses property", 29*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 30*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 31*333d2b36SAndroid Build Coastguard Worker license { 32*333d2b36SAndroid Build Coastguard Worker name: "top_license", 33*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:private"], 34*333d2b36SAndroid Build Coastguard Worker licenses: ["other_license"], 35*333d2b36SAndroid Build Coastguard Worker }`), 36*333d2b36SAndroid Build Coastguard Worker }, 37*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 38*333d2b36SAndroid Build Coastguard Worker `top/Android.bp:5:14: unrecognized property "licenses"`, 39*333d2b36SAndroid Build Coastguard Worker }, 40*333d2b36SAndroid Build Coastguard Worker }, 41*333d2b36SAndroid Build Coastguard Worker { 42*333d2b36SAndroid Build Coastguard Worker name: "private license", 43*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 44*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 45*333d2b36SAndroid Build Coastguard Worker license_kind { 46*333d2b36SAndroid Build Coastguard Worker name: "top_notice", 47*333d2b36SAndroid Build Coastguard Worker conditions: ["notice"], 48*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:private"], 49*333d2b36SAndroid Build Coastguard Worker } 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Worker license { 52*333d2b36SAndroid Build Coastguard Worker name: "top_allowed_as_notice", 53*333d2b36SAndroid Build Coastguard Worker license_kinds: ["top_notice"], 54*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:private"], 55*333d2b36SAndroid Build Coastguard Worker }`), 56*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 57*333d2b36SAndroid Build Coastguard Worker rule { 58*333d2b36SAndroid Build Coastguard Worker name: "arule", 59*333d2b36SAndroid Build Coastguard Worker licenses: ["top_allowed_as_notice"], 60*333d2b36SAndroid Build Coastguard Worker }`), 61*333d2b36SAndroid Build Coastguard Worker "yetmore/Android.bp": []byte(` 62*333d2b36SAndroid Build Coastguard Worker package { 63*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["top_allowed_as_notice"], 64*333d2b36SAndroid Build Coastguard Worker }`), 65*333d2b36SAndroid Build Coastguard Worker }, 66*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 67*333d2b36SAndroid Build Coastguard Worker `other/Android.bp:2:5: module "arule": depends on //top:top_allowed_as_notice ` + 68*333d2b36SAndroid Build Coastguard Worker `which is not visible to this module`, 69*333d2b36SAndroid Build Coastguard Worker `yetmore/Android.bp:2:5: module "//yetmore": depends on //top:top_allowed_as_notice ` + 70*333d2b36SAndroid Build Coastguard Worker `which is not visible to this module`, 71*333d2b36SAndroid Build Coastguard Worker }, 72*333d2b36SAndroid Build Coastguard Worker }, 73*333d2b36SAndroid Build Coastguard Worker { 74*333d2b36SAndroid Build Coastguard Worker name: "must reference license_kind module", 75*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 76*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 77*333d2b36SAndroid Build Coastguard Worker rule { 78*333d2b36SAndroid Build Coastguard Worker name: "top_by_exception_only", 79*333d2b36SAndroid Build Coastguard Worker } 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Worker license { 82*333d2b36SAndroid Build Coastguard Worker name: "top_proprietary", 83*333d2b36SAndroid Build Coastguard Worker license_kinds: ["top_by_exception_only"], 84*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:public"], 85*333d2b36SAndroid Build Coastguard Worker }`), 86*333d2b36SAndroid Build Coastguard Worker }, 87*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 88*333d2b36SAndroid Build Coastguard Worker `top/Android.bp:6:5: module "top_proprietary": license_kinds property ` + 89*333d2b36SAndroid Build Coastguard Worker `"top_by_exception_only" is not a license_kind module`, 90*333d2b36SAndroid Build Coastguard Worker }, 91*333d2b36SAndroid Build Coastguard Worker }, 92*333d2b36SAndroid Build Coastguard Worker { 93*333d2b36SAndroid Build Coastguard Worker name: "must not duplicate license_kind", 94*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 95*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 96*333d2b36SAndroid Build Coastguard Worker license_kind { 97*333d2b36SAndroid Build Coastguard Worker name: "top_by_exception_only", 98*333d2b36SAndroid Build Coastguard Worker conditions: ["by_exception_only"], 99*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:private"], 100*333d2b36SAndroid Build Coastguard Worker } 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker license_kind { 103*333d2b36SAndroid Build Coastguard Worker name: "top_by_exception_only_2", 104*333d2b36SAndroid Build Coastguard Worker conditions: ["by_exception_only"], 105*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:private"], 106*333d2b36SAndroid Build Coastguard Worker } 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Worker license { 109*333d2b36SAndroid Build Coastguard Worker name: "top_proprietary", 110*333d2b36SAndroid Build Coastguard Worker license_kinds: [ 111*333d2b36SAndroid Build Coastguard Worker "top_by_exception_only", 112*333d2b36SAndroid Build Coastguard Worker "top_by_exception_only_2", 113*333d2b36SAndroid Build Coastguard Worker "top_by_exception_only" 114*333d2b36SAndroid Build Coastguard Worker ], 115*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:public"], 116*333d2b36SAndroid Build Coastguard Worker }`), 117*333d2b36SAndroid Build Coastguard Worker }, 118*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 119*333d2b36SAndroid Build Coastguard Worker `top/Android.bp:14:5: module "top_proprietary": Duplicated license kind: "top_by_exception_only"`, 120*333d2b36SAndroid Build Coastguard Worker }, 121*333d2b36SAndroid Build Coastguard Worker }, 122*333d2b36SAndroid Build Coastguard Worker { 123*333d2b36SAndroid Build Coastguard Worker name: "license_kind module must exist", 124*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 125*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 126*333d2b36SAndroid Build Coastguard Worker license { 127*333d2b36SAndroid Build Coastguard Worker name: "top_notice_allowed", 128*333d2b36SAndroid Build Coastguard Worker license_kinds: ["top_notice"], 129*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:public"], 130*333d2b36SAndroid Build Coastguard Worker }`), 131*333d2b36SAndroid Build Coastguard Worker }, 132*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 133*333d2b36SAndroid Build Coastguard Worker `top/Android.bp:2:5: "top_notice_allowed" depends on undefined module "top_notice"`, 134*333d2b36SAndroid Build Coastguard Worker }, 135*333d2b36SAndroid Build Coastguard Worker }, 136*333d2b36SAndroid Build Coastguard Worker { 137*333d2b36SAndroid Build Coastguard Worker name: "public license", 138*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 139*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 140*333d2b36SAndroid Build Coastguard Worker license_kind { 141*333d2b36SAndroid Build Coastguard Worker name: "top_by_exception_only", 142*333d2b36SAndroid Build Coastguard Worker conditions: ["by_exception_only"], 143*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:private"], 144*333d2b36SAndroid Build Coastguard Worker } 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker license { 147*333d2b36SAndroid Build Coastguard Worker name: "top_proprietary", 148*333d2b36SAndroid Build Coastguard Worker license_kinds: ["top_by_exception_only"], 149*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:public"], 150*333d2b36SAndroid Build Coastguard Worker }`), 151*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 152*333d2b36SAndroid Build Coastguard Worker rule { 153*333d2b36SAndroid Build Coastguard Worker name: "arule", 154*333d2b36SAndroid Build Coastguard Worker licenses: ["top_proprietary"], 155*333d2b36SAndroid Build Coastguard Worker }`), 156*333d2b36SAndroid Build Coastguard Worker "yetmore/Android.bp": []byte(` 157*333d2b36SAndroid Build Coastguard Worker package { 158*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["top_proprietary"], 159*333d2b36SAndroid Build Coastguard Worker }`), 160*333d2b36SAndroid Build Coastguard Worker }, 161*333d2b36SAndroid Build Coastguard Worker }, 162*333d2b36SAndroid Build Coastguard Worker { 163*333d2b36SAndroid Build Coastguard Worker name: "multiple licenses", 164*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 165*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 166*333d2b36SAndroid Build Coastguard Worker package { 167*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["top_proprietary"], 168*333d2b36SAndroid Build Coastguard Worker } 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker license_kind { 171*333d2b36SAndroid Build Coastguard Worker name: "top_notice", 172*333d2b36SAndroid Build Coastguard Worker conditions: ["notice"], 173*333d2b36SAndroid Build Coastguard Worker } 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Worker license_kind { 176*333d2b36SAndroid Build Coastguard Worker name: "top_by_exception_only", 177*333d2b36SAndroid Build Coastguard Worker conditions: ["by_exception_only"], 178*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:public"], 179*333d2b36SAndroid Build Coastguard Worker } 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker license { 182*333d2b36SAndroid Build Coastguard Worker name: "top_allowed_as_notice", 183*333d2b36SAndroid Build Coastguard Worker license_kinds: ["top_notice"], 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Worker license { 187*333d2b36SAndroid Build Coastguard Worker name: "top_proprietary", 188*333d2b36SAndroid Build Coastguard Worker license_kinds: ["top_by_exception_only"], 189*333d2b36SAndroid Build Coastguard Worker visibility: ["//visibility:public"], 190*333d2b36SAndroid Build Coastguard Worker } 191*333d2b36SAndroid Build Coastguard Worker rule { 192*333d2b36SAndroid Build Coastguard Worker name: "myrule", 193*333d2b36SAndroid Build Coastguard Worker licenses: ["top_allowed_as_notice", "top_proprietary"] 194*333d2b36SAndroid Build Coastguard Worker }`), 195*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 196*333d2b36SAndroid Build Coastguard Worker rule { 197*333d2b36SAndroid Build Coastguard Worker name: "arule", 198*333d2b36SAndroid Build Coastguard Worker licenses: ["top_proprietary"], 199*333d2b36SAndroid Build Coastguard Worker }`), 200*333d2b36SAndroid Build Coastguard Worker "yetmore/Android.bp": []byte(` 201*333d2b36SAndroid Build Coastguard Worker package { 202*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["top_proprietary"], 203*333d2b36SAndroid Build Coastguard Worker }`), 204*333d2b36SAndroid Build Coastguard Worker }, 205*333d2b36SAndroid Build Coastguard Worker }, 206*333d2b36SAndroid Build Coastguard Worker} 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Workerfunc TestLicense(t *testing.T) { 209*333d2b36SAndroid Build Coastguard Worker for _, test := range licenseTests { 210*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 211*333d2b36SAndroid Build Coastguard Worker // Customize the common license text fixture factory. 212*333d2b36SAndroid Build Coastguard Worker GroupFixturePreparers( 213*333d2b36SAndroid Build Coastguard Worker prepareForLicenseTest, 214*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 215*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("rule", newMockRuleModule) 216*333d2b36SAndroid Build Coastguard Worker }), 217*333d2b36SAndroid Build Coastguard Worker test.fs.AddToFixture(), 218*333d2b36SAndroid Build Coastguard Worker ). 219*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)). 220*333d2b36SAndroid Build Coastguard Worker RunTest(t) 221*333d2b36SAndroid Build Coastguard Worker }) 222*333d2b36SAndroid Build Coastguard Worker } 223*333d2b36SAndroid Build Coastguard Worker} 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Workerfunc testLicense(t *testing.T, fs MockFS, expectedErrors []string) { 226*333d2b36SAndroid Build Coastguard Worker} 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Workertype mockRuleModule struct { 229*333d2b36SAndroid Build Coastguard Worker ModuleBase 230*333d2b36SAndroid Build Coastguard Worker DefaultableModuleBase 231*333d2b36SAndroid Build Coastguard Worker} 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Workerfunc newMockRuleModule() Module { 234*333d2b36SAndroid Build Coastguard Worker m := &mockRuleModule{} 235*333d2b36SAndroid Build Coastguard Worker InitAndroidModule(m) 236*333d2b36SAndroid Build Coastguard Worker InitDefaultableModule(m) 237*333d2b36SAndroid Build Coastguard Worker return m 238*333d2b36SAndroid Build Coastguard Worker} 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Workerfunc (p *mockRuleModule) GenerateAndroidBuildActions(ModuleContext) { 241*333d2b36SAndroid Build Coastguard Worker} 242