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 "github.com/google/blueprint" 7*333d2b36SAndroid Build Coastguard Worker) 8*333d2b36SAndroid Build Coastguard Worker 9*333d2b36SAndroid Build Coastguard Workervar licensesTests = []struct { 10*333d2b36SAndroid Build Coastguard Worker name string 11*333d2b36SAndroid Build Coastguard Worker fs MockFS 12*333d2b36SAndroid Build Coastguard Worker expectedErrors []string 13*333d2b36SAndroid Build Coastguard Worker effectiveLicenses map[string][]string 14*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses map[string][]string 15*333d2b36SAndroid Build Coastguard Worker effectivePackage map[string]string 16*333d2b36SAndroid Build Coastguard Worker effectiveNotices map[string][]string 17*333d2b36SAndroid Build Coastguard Worker effectiveKinds map[string][]string 18*333d2b36SAndroid Build Coastguard Worker effectiveConditions map[string][]string 19*333d2b36SAndroid Build Coastguard Worker}{ 20*333d2b36SAndroid Build Coastguard Worker { 21*333d2b36SAndroid Build Coastguard Worker name: "invalid module type without licenses property", 22*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 23*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 24*333d2b36SAndroid Build Coastguard Worker mock_bad_module { 25*333d2b36SAndroid Build Coastguard Worker name: "libexample", 26*333d2b36SAndroid Build Coastguard Worker }`), 27*333d2b36SAndroid Build Coastguard Worker }, 28*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{`module type "mock_bad_module" must have an applicable licenses property`}, 29*333d2b36SAndroid Build Coastguard Worker }, 30*333d2b36SAndroid Build Coastguard Worker { 31*333d2b36SAndroid Build Coastguard Worker name: "license must exist", 32*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 33*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 34*333d2b36SAndroid Build Coastguard Worker mock_library { 35*333d2b36SAndroid Build Coastguard Worker name: "libexample", 36*333d2b36SAndroid Build Coastguard Worker licenses: ["notice"], 37*333d2b36SAndroid Build Coastguard Worker }`), 38*333d2b36SAndroid Build Coastguard Worker }, 39*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{`"libexample" depends on undefined module "notice"`}, 40*333d2b36SAndroid Build Coastguard Worker }, 41*333d2b36SAndroid Build Coastguard Worker { 42*333d2b36SAndroid Build Coastguard Worker name: "all good", 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: "notice", 47*333d2b36SAndroid Build Coastguard Worker conditions: ["shownotice"], 48*333d2b36SAndroid Build Coastguard Worker } 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker license { 51*333d2b36SAndroid Build Coastguard Worker name: "top_Apache2", 52*333d2b36SAndroid Build Coastguard Worker license_kinds: ["notice"], 53*333d2b36SAndroid Build Coastguard Worker package_name: "topDog", 54*333d2b36SAndroid Build Coastguard Worker license_text: ["LICENSE", "NOTICE"], 55*333d2b36SAndroid Build Coastguard Worker } 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker mock_library { 58*333d2b36SAndroid Build Coastguard Worker name: "libexample1", 59*333d2b36SAndroid Build Coastguard Worker licenses: ["top_Apache2"], 60*333d2b36SAndroid Build Coastguard Worker }`), 61*333d2b36SAndroid Build Coastguard Worker "top/nested/Android.bp": []byte(` 62*333d2b36SAndroid Build Coastguard Worker mock_library { 63*333d2b36SAndroid Build Coastguard Worker name: "libnested", 64*333d2b36SAndroid Build Coastguard Worker licenses: ["top_Apache2"], 65*333d2b36SAndroid Build Coastguard Worker }`), 66*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 67*333d2b36SAndroid Build Coastguard Worker mock_library { 68*333d2b36SAndroid Build Coastguard Worker name: "libother", 69*333d2b36SAndroid Build Coastguard Worker licenses: ["top_Apache2"], 70*333d2b36SAndroid Build Coastguard Worker }`), 71*333d2b36SAndroid Build Coastguard Worker }, 72*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 73*333d2b36SAndroid Build Coastguard Worker "libexample1": []string{"top_Apache2"}, 74*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"top_Apache2"}, 75*333d2b36SAndroid Build Coastguard Worker "libother": []string{"top_Apache2"}, 76*333d2b36SAndroid Build Coastguard Worker }, 77*333d2b36SAndroid Build Coastguard Worker effectiveKinds: map[string][]string{ 78*333d2b36SAndroid Build Coastguard Worker "libexample1": []string{"notice"}, 79*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"notice"}, 80*333d2b36SAndroid Build Coastguard Worker "libother": []string{"notice"}, 81*333d2b36SAndroid Build Coastguard Worker }, 82*333d2b36SAndroid Build Coastguard Worker effectivePackage: map[string]string{ 83*333d2b36SAndroid Build Coastguard Worker "libexample1": "topDog", 84*333d2b36SAndroid Build Coastguard Worker "libnested": "topDog", 85*333d2b36SAndroid Build Coastguard Worker "libother": "topDog", 86*333d2b36SAndroid Build Coastguard Worker }, 87*333d2b36SAndroid Build Coastguard Worker effectiveConditions: map[string][]string{ 88*333d2b36SAndroid Build Coastguard Worker "libexample1": []string{"shownotice"}, 89*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"shownotice"}, 90*333d2b36SAndroid Build Coastguard Worker "libother": []string{"shownotice"}, 91*333d2b36SAndroid Build Coastguard Worker }, 92*333d2b36SAndroid Build Coastguard Worker effectiveNotices: map[string][]string{ 93*333d2b36SAndroid Build Coastguard Worker "libexample1": []string{"top/LICENSE:topDog", "top/NOTICE:topDog"}, 94*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"top/LICENSE:topDog", "top/NOTICE:topDog"}, 95*333d2b36SAndroid Build Coastguard Worker "libother": []string{"top/LICENSE:topDog", "top/NOTICE:topDog"}, 96*333d2b36SAndroid Build Coastguard Worker }, 97*333d2b36SAndroid Build Coastguard Worker }, 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker // Defaults propagation tests 100*333d2b36SAndroid Build Coastguard Worker { 101*333d2b36SAndroid Build Coastguard Worker // Check that licenses is the union of the defaults modules. 102*333d2b36SAndroid Build Coastguard Worker name: "defaults union, basic", 103*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 104*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 105*333d2b36SAndroid Build Coastguard Worker license_kind { 106*333d2b36SAndroid Build Coastguard Worker name: "top_notice", 107*333d2b36SAndroid Build Coastguard Worker conditions: ["notice"], 108*333d2b36SAndroid Build Coastguard Worker } 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker license { 111*333d2b36SAndroid Build Coastguard Worker name: "top_other", 112*333d2b36SAndroid Build Coastguard Worker license_kinds: ["top_notice"], 113*333d2b36SAndroid Build Coastguard Worker } 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker mock_defaults { 116*333d2b36SAndroid Build Coastguard Worker name: "libexample_defaults", 117*333d2b36SAndroid Build Coastguard Worker licenses: ["top_other"], 118*333d2b36SAndroid Build Coastguard Worker } 119*333d2b36SAndroid Build Coastguard Worker mock_library { 120*333d2b36SAndroid Build Coastguard Worker name: "libexample", 121*333d2b36SAndroid Build Coastguard Worker licenses: ["nested_other"], 122*333d2b36SAndroid Build Coastguard Worker defaults: ["libexample_defaults"], 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker mock_library { 125*333d2b36SAndroid Build Coastguard Worker name: "libsamepackage", 126*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 127*333d2b36SAndroid Build Coastguard Worker }`), 128*333d2b36SAndroid Build Coastguard Worker "top/nested/Android.bp": []byte(` 129*333d2b36SAndroid Build Coastguard Worker license_kind { 130*333d2b36SAndroid Build Coastguard Worker name: "nested_notice", 131*333d2b36SAndroid Build Coastguard Worker conditions: ["notice"], 132*333d2b36SAndroid Build Coastguard Worker } 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker license { 135*333d2b36SAndroid Build Coastguard Worker name: "nested_other", 136*333d2b36SAndroid Build Coastguard Worker license_kinds: ["nested_notice"], 137*333d2b36SAndroid Build Coastguard Worker } 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker mock_library { 140*333d2b36SAndroid Build Coastguard Worker name: "libnested", 141*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 142*333d2b36SAndroid Build Coastguard Worker }`), 143*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 144*333d2b36SAndroid Build Coastguard Worker mock_library { 145*333d2b36SAndroid Build Coastguard Worker name: "libother", 146*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 147*333d2b36SAndroid Build Coastguard Worker }`), 148*333d2b36SAndroid Build Coastguard Worker }, 149*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 150*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"nested_other", "top_other"}, 151*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{}, 152*333d2b36SAndroid Build Coastguard Worker "libnested": []string{}, 153*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 154*333d2b36SAndroid Build Coastguard Worker }, 155*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses: map[string][]string{ 156*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"nested_other", "top_other"}, 157*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{"nested_other", "top_other"}, 158*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"nested_other", "top_other"}, 159*333d2b36SAndroid Build Coastguard Worker "libother": []string{"nested_other", "top_other"}, 160*333d2b36SAndroid Build Coastguard Worker }, 161*333d2b36SAndroid Build Coastguard Worker effectiveKinds: map[string][]string{ 162*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"nested_notice", "top_notice"}, 163*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{}, 164*333d2b36SAndroid Build Coastguard Worker "libnested": []string{}, 165*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 166*333d2b36SAndroid Build Coastguard Worker }, 167*333d2b36SAndroid Build Coastguard Worker effectiveConditions: map[string][]string{ 168*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"notice"}, 169*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{}, 170*333d2b36SAndroid Build Coastguard Worker "libnested": []string{}, 171*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 172*333d2b36SAndroid Build Coastguard Worker }, 173*333d2b36SAndroid Build Coastguard Worker }, 174*333d2b36SAndroid Build Coastguard Worker { 175*333d2b36SAndroid Build Coastguard Worker name: "defaults union, multiple defaults", 176*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 177*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 178*333d2b36SAndroid Build Coastguard Worker license { 179*333d2b36SAndroid Build Coastguard Worker name: "top", 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker mock_defaults { 182*333d2b36SAndroid Build Coastguard Worker name: "libexample_defaults_1", 183*333d2b36SAndroid Build Coastguard Worker licenses: ["other"], 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker mock_defaults { 186*333d2b36SAndroid Build Coastguard Worker name: "libexample_defaults_2", 187*333d2b36SAndroid Build Coastguard Worker licenses: ["top_nested"], 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker mock_library { 190*333d2b36SAndroid Build Coastguard Worker name: "libexample", 191*333d2b36SAndroid Build Coastguard Worker defaults: ["libexample_defaults_1", "libexample_defaults_2"], 192*333d2b36SAndroid Build Coastguard Worker } 193*333d2b36SAndroid Build Coastguard Worker mock_library { 194*333d2b36SAndroid Build Coastguard Worker name: "libsamepackage", 195*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 196*333d2b36SAndroid Build Coastguard Worker }`), 197*333d2b36SAndroid Build Coastguard Worker "top/nested/Android.bp": []byte(` 198*333d2b36SAndroid Build Coastguard Worker license { 199*333d2b36SAndroid Build Coastguard Worker name: "top_nested", 200*333d2b36SAndroid Build Coastguard Worker license_text: ["LICENSE.txt"], 201*333d2b36SAndroid Build Coastguard Worker } 202*333d2b36SAndroid Build Coastguard Worker mock_library { 203*333d2b36SAndroid Build Coastguard Worker name: "libnested", 204*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 205*333d2b36SAndroid Build Coastguard Worker }`), 206*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 207*333d2b36SAndroid Build Coastguard Worker license { 208*333d2b36SAndroid Build Coastguard Worker name: "other", 209*333d2b36SAndroid Build Coastguard Worker } 210*333d2b36SAndroid Build Coastguard Worker mock_library { 211*333d2b36SAndroid Build Coastguard Worker name: "libother", 212*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 213*333d2b36SAndroid Build Coastguard Worker }`), 214*333d2b36SAndroid Build Coastguard Worker "outsider/Android.bp": []byte(` 215*333d2b36SAndroid Build Coastguard Worker mock_library { 216*333d2b36SAndroid Build Coastguard Worker name: "liboutsider", 217*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 218*333d2b36SAndroid Build Coastguard Worker }`), 219*333d2b36SAndroid Build Coastguard Worker }, 220*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 221*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"other", "top_nested"}, 222*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{}, 223*333d2b36SAndroid Build Coastguard Worker "libnested": []string{}, 224*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 225*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{}, 226*333d2b36SAndroid Build Coastguard Worker }, 227*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses: map[string][]string{ 228*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"other", "top_nested"}, 229*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{"other", "top_nested"}, 230*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"other", "top_nested"}, 231*333d2b36SAndroid Build Coastguard Worker "libother": []string{"other", "top_nested"}, 232*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{"other", "top_nested"}, 233*333d2b36SAndroid Build Coastguard Worker }, 234*333d2b36SAndroid Build Coastguard Worker effectiveKinds: map[string][]string{ 235*333d2b36SAndroid Build Coastguard Worker "libexample": []string{}, 236*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{}, 237*333d2b36SAndroid Build Coastguard Worker "libnested": []string{}, 238*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 239*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{}, 240*333d2b36SAndroid Build Coastguard Worker }, 241*333d2b36SAndroid Build Coastguard Worker effectiveNotices: map[string][]string{ 242*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"top/nested/LICENSE.txt"}, 243*333d2b36SAndroid Build Coastguard Worker "libsamepackage": []string{}, 244*333d2b36SAndroid Build Coastguard Worker "libnested": []string{}, 245*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 246*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{}, 247*333d2b36SAndroid Build Coastguard Worker }, 248*333d2b36SAndroid Build Coastguard Worker }, 249*333d2b36SAndroid Build Coastguard Worker 250*333d2b36SAndroid Build Coastguard Worker // Defaults module's defaults_licenses tests 251*333d2b36SAndroid Build Coastguard Worker { 252*333d2b36SAndroid Build Coastguard Worker name: "defaults_licenses invalid", 253*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 254*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 255*333d2b36SAndroid Build Coastguard Worker mock_defaults { 256*333d2b36SAndroid Build Coastguard Worker name: "top_defaults", 257*333d2b36SAndroid Build Coastguard Worker licenses: ["notice"], 258*333d2b36SAndroid Build Coastguard Worker }`), 259*333d2b36SAndroid Build Coastguard Worker }, 260*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{`"top_defaults" depends on undefined module "notice"`}, 261*333d2b36SAndroid Build Coastguard Worker }, 262*333d2b36SAndroid Build Coastguard Worker { 263*333d2b36SAndroid Build Coastguard Worker name: "defaults_licenses overrides package default", 264*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 265*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 266*333d2b36SAndroid Build Coastguard Worker package { 267*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["by_exception_only"], 268*333d2b36SAndroid Build Coastguard Worker } 269*333d2b36SAndroid Build Coastguard Worker license { 270*333d2b36SAndroid Build Coastguard Worker name: "by_exception_only", 271*333d2b36SAndroid Build Coastguard Worker } 272*333d2b36SAndroid Build Coastguard Worker license { 273*333d2b36SAndroid Build Coastguard Worker name: "notice", 274*333d2b36SAndroid Build Coastguard Worker } 275*333d2b36SAndroid Build Coastguard Worker mock_defaults { 276*333d2b36SAndroid Build Coastguard Worker name: "top_defaults", 277*333d2b36SAndroid Build Coastguard Worker licenses: ["notice"], 278*333d2b36SAndroid Build Coastguard Worker } 279*333d2b36SAndroid Build Coastguard Worker mock_library { 280*333d2b36SAndroid Build Coastguard Worker name: "libexample", 281*333d2b36SAndroid Build Coastguard Worker } 282*333d2b36SAndroid Build Coastguard Worker mock_library { 283*333d2b36SAndroid Build Coastguard Worker name: "libdefaults", 284*333d2b36SAndroid Build Coastguard Worker defaults: ["top_defaults"], 285*333d2b36SAndroid Build Coastguard Worker }`), 286*333d2b36SAndroid Build Coastguard Worker }, 287*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 288*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"by_exception_only"}, 289*333d2b36SAndroid Build Coastguard Worker "libdefaults": []string{"notice"}, 290*333d2b36SAndroid Build Coastguard Worker }, 291*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses: map[string][]string{ 292*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"by_exception_only"}, 293*333d2b36SAndroid Build Coastguard Worker "libdefaults": []string{"notice"}, 294*333d2b36SAndroid Build Coastguard Worker }, 295*333d2b36SAndroid Build Coastguard Worker }, 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker // Package default_applicable_licenses tests 298*333d2b36SAndroid Build Coastguard Worker { 299*333d2b36SAndroid Build Coastguard Worker name: "package default_applicable_licenses must exist", 300*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 301*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 302*333d2b36SAndroid Build Coastguard Worker package { 303*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["notice"], 304*333d2b36SAndroid Build Coastguard Worker }`), 305*333d2b36SAndroid Build Coastguard Worker }, 306*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{`"//top" depends on undefined module "notice"`}, 307*333d2b36SAndroid Build Coastguard Worker }, 308*333d2b36SAndroid Build Coastguard Worker { 309*333d2b36SAndroid Build Coastguard Worker // This test relies on the default licenses being legacy_public. 310*333d2b36SAndroid Build Coastguard Worker name: "package default_applicable_licenses property used when no licenses specified", 311*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 312*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 313*333d2b36SAndroid Build Coastguard Worker package { 314*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["top_notice"], 315*333d2b36SAndroid Build Coastguard Worker } 316*333d2b36SAndroid Build Coastguard Worker 317*333d2b36SAndroid Build Coastguard Worker license { 318*333d2b36SAndroid Build Coastguard Worker name: "top_notice", 319*333d2b36SAndroid Build Coastguard Worker } 320*333d2b36SAndroid Build Coastguard Worker mock_library { 321*333d2b36SAndroid Build Coastguard Worker name: "libexample", 322*333d2b36SAndroid Build Coastguard Worker }`), 323*333d2b36SAndroid Build Coastguard Worker "outsider/Android.bp": []byte(` 324*333d2b36SAndroid Build Coastguard Worker mock_library { 325*333d2b36SAndroid Build Coastguard Worker name: "liboutsider", 326*333d2b36SAndroid Build Coastguard Worker deps: ["libexample"], 327*333d2b36SAndroid Build Coastguard Worker }`), 328*333d2b36SAndroid Build Coastguard Worker }, 329*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 330*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"top_notice"}, 331*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{}, 332*333d2b36SAndroid Build Coastguard Worker }, 333*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses: map[string][]string{ 334*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"top_notice"}, 335*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{"top_notice"}, 336*333d2b36SAndroid Build Coastguard Worker }, 337*333d2b36SAndroid Build Coastguard Worker }, 338*333d2b36SAndroid Build Coastguard Worker { 339*333d2b36SAndroid Build Coastguard Worker name: "package default_applicable_licenses not inherited to subpackages", 340*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 341*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 342*333d2b36SAndroid Build Coastguard Worker package { 343*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["top_notice"], 344*333d2b36SAndroid Build Coastguard Worker } 345*333d2b36SAndroid Build Coastguard Worker license { 346*333d2b36SAndroid Build Coastguard Worker name: "top_notice", 347*333d2b36SAndroid Build Coastguard Worker } 348*333d2b36SAndroid Build Coastguard Worker mock_library { 349*333d2b36SAndroid Build Coastguard Worker name: "libexample", 350*333d2b36SAndroid Build Coastguard Worker }`), 351*333d2b36SAndroid Build Coastguard Worker "top/nested/Android.bp": []byte(` 352*333d2b36SAndroid Build Coastguard Worker package { 353*333d2b36SAndroid Build Coastguard Worker default_applicable_licenses: ["outsider"], 354*333d2b36SAndroid Build Coastguard Worker } 355*333d2b36SAndroid Build Coastguard Worker 356*333d2b36SAndroid Build Coastguard Worker mock_library { 357*333d2b36SAndroid Build Coastguard Worker name: "libnested", 358*333d2b36SAndroid Build Coastguard Worker }`), 359*333d2b36SAndroid Build Coastguard Worker "top/other/Android.bp": []byte(` 360*333d2b36SAndroid Build Coastguard Worker mock_library { 361*333d2b36SAndroid Build Coastguard Worker name: "libother", 362*333d2b36SAndroid Build Coastguard Worker }`), 363*333d2b36SAndroid Build Coastguard Worker "outsider/Android.bp": []byte(` 364*333d2b36SAndroid Build Coastguard Worker license { 365*333d2b36SAndroid Build Coastguard Worker name: "outsider", 366*333d2b36SAndroid Build Coastguard Worker } 367*333d2b36SAndroid Build Coastguard Worker mock_library { 368*333d2b36SAndroid Build Coastguard Worker name: "liboutsider", 369*333d2b36SAndroid Build Coastguard Worker deps: ["libexample", "libother", "libnested"], 370*333d2b36SAndroid Build Coastguard Worker }`), 371*333d2b36SAndroid Build Coastguard Worker }, 372*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 373*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"top_notice"}, 374*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"outsider"}, 375*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 376*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{}, 377*333d2b36SAndroid Build Coastguard Worker }, 378*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses: map[string][]string{ 379*333d2b36SAndroid Build Coastguard Worker "libexample": []string{"top_notice"}, 380*333d2b36SAndroid Build Coastguard Worker "libnested": []string{"outsider"}, 381*333d2b36SAndroid Build Coastguard Worker "libother": []string{}, 382*333d2b36SAndroid Build Coastguard Worker "liboutsider": []string{"top_notice", "outsider"}, 383*333d2b36SAndroid Build Coastguard Worker }, 384*333d2b36SAndroid Build Coastguard Worker }, 385*333d2b36SAndroid Build Coastguard Worker { 386*333d2b36SAndroid Build Coastguard Worker name: "verify that prebuilt dependencies are included", 387*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 388*333d2b36SAndroid Build Coastguard Worker "prebuilts/Android.bp": []byte(` 389*333d2b36SAndroid Build Coastguard Worker license { 390*333d2b36SAndroid Build Coastguard Worker name: "prebuilt" 391*333d2b36SAndroid Build Coastguard Worker } 392*333d2b36SAndroid Build Coastguard Worker prebuilt { 393*333d2b36SAndroid Build Coastguard Worker name: "module", 394*333d2b36SAndroid Build Coastguard Worker licenses: ["prebuilt"], 395*333d2b36SAndroid Build Coastguard Worker }`), 396*333d2b36SAndroid Build Coastguard Worker "top/sources/source_file": nil, 397*333d2b36SAndroid Build Coastguard Worker "top/sources/Android.bp": []byte(` 398*333d2b36SAndroid Build Coastguard Worker license { 399*333d2b36SAndroid Build Coastguard Worker name: "top_sources" 400*333d2b36SAndroid Build Coastguard Worker } 401*333d2b36SAndroid Build Coastguard Worker source { 402*333d2b36SAndroid Build Coastguard Worker name: "module", 403*333d2b36SAndroid Build Coastguard Worker licenses: ["top_sources"], 404*333d2b36SAndroid Build Coastguard Worker }`), 405*333d2b36SAndroid Build Coastguard Worker "top/other/source_file": nil, 406*333d2b36SAndroid Build Coastguard Worker "top/other/Android.bp": []byte(` 407*333d2b36SAndroid Build Coastguard Worker source { 408*333d2b36SAndroid Build Coastguard Worker name: "other", 409*333d2b36SAndroid Build Coastguard Worker deps: [":module"], 410*333d2b36SAndroid Build Coastguard Worker }`), 411*333d2b36SAndroid Build Coastguard Worker }, 412*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 413*333d2b36SAndroid Build Coastguard Worker "other": []string{}, 414*333d2b36SAndroid Build Coastguard Worker }, 415*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses: map[string][]string{ 416*333d2b36SAndroid Build Coastguard Worker "other": []string{"prebuilt", "top_sources"}, 417*333d2b36SAndroid Build Coastguard Worker }, 418*333d2b36SAndroid Build Coastguard Worker }, 419*333d2b36SAndroid Build Coastguard Worker { 420*333d2b36SAndroid Build Coastguard Worker name: "verify that prebuilt dependencies are ignored for licenses reasons (preferred)", 421*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 422*333d2b36SAndroid Build Coastguard Worker "prebuilts/Android.bp": []byte(` 423*333d2b36SAndroid Build Coastguard Worker license { 424*333d2b36SAndroid Build Coastguard Worker name: "prebuilt" 425*333d2b36SAndroid Build Coastguard Worker } 426*333d2b36SAndroid Build Coastguard Worker prebuilt { 427*333d2b36SAndroid Build Coastguard Worker name: "module", 428*333d2b36SAndroid Build Coastguard Worker licenses: ["prebuilt"], 429*333d2b36SAndroid Build Coastguard Worker prefer: true, 430*333d2b36SAndroid Build Coastguard Worker }`), 431*333d2b36SAndroid Build Coastguard Worker "top/sources/source_file": nil, 432*333d2b36SAndroid Build Coastguard Worker "top/sources/Android.bp": []byte(` 433*333d2b36SAndroid Build Coastguard Worker license { 434*333d2b36SAndroid Build Coastguard Worker name: "top_sources" 435*333d2b36SAndroid Build Coastguard Worker } 436*333d2b36SAndroid Build Coastguard Worker source { 437*333d2b36SAndroid Build Coastguard Worker name: "module", 438*333d2b36SAndroid Build Coastguard Worker licenses: ["top_sources"], 439*333d2b36SAndroid Build Coastguard Worker }`), 440*333d2b36SAndroid Build Coastguard Worker "top/other/source_file": nil, 441*333d2b36SAndroid Build Coastguard Worker "top/other/Android.bp": []byte(` 442*333d2b36SAndroid Build Coastguard Worker source { 443*333d2b36SAndroid Build Coastguard Worker name: "other", 444*333d2b36SAndroid Build Coastguard Worker deps: [":module"], 445*333d2b36SAndroid Build Coastguard Worker }`), 446*333d2b36SAndroid Build Coastguard Worker }, 447*333d2b36SAndroid Build Coastguard Worker effectiveLicenses: map[string][]string{ 448*333d2b36SAndroid Build Coastguard Worker "other": []string{}, 449*333d2b36SAndroid Build Coastguard Worker }, 450*333d2b36SAndroid Build Coastguard Worker effectiveInheritedLicenses: map[string][]string{ 451*333d2b36SAndroid Build Coastguard Worker "module": []string{"prebuilt", "top_sources"}, 452*333d2b36SAndroid Build Coastguard Worker "other": []string{"prebuilt", "top_sources"}, 453*333d2b36SAndroid Build Coastguard Worker }, 454*333d2b36SAndroid Build Coastguard Worker }, 455*333d2b36SAndroid Build Coastguard Worker} 456*333d2b36SAndroid Build Coastguard Worker 457*333d2b36SAndroid Build Coastguard Workerfunc TestLicenses(t *testing.T) { 458*333d2b36SAndroid Build Coastguard Worker for _, test := range licensesTests { 459*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 460*333d2b36SAndroid Build Coastguard Worker // Customize the common license text fixture factory. 461*333d2b36SAndroid Build Coastguard Worker result := GroupFixturePreparers( 462*333d2b36SAndroid Build Coastguard Worker prepareForLicenseTest, 463*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 464*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("mock_bad_module", newMockLicensesBadModule) 465*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("mock_library", newMockLicensesLibraryModule) 466*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("mock_defaults", defaultsLicensesFactory) 467*333d2b36SAndroid Build Coastguard Worker }), 468*333d2b36SAndroid Build Coastguard Worker test.fs.AddToFixture(), 469*333d2b36SAndroid Build Coastguard Worker ). 470*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)). 471*333d2b36SAndroid Build Coastguard Worker RunTest(t) 472*333d2b36SAndroid Build Coastguard Worker 473*333d2b36SAndroid Build Coastguard Worker if test.effectiveLicenses != nil { 474*333d2b36SAndroid Build Coastguard Worker checkEffectiveLicenses(t, result, test.effectiveLicenses) 475*333d2b36SAndroid Build Coastguard Worker } 476*333d2b36SAndroid Build Coastguard Worker 477*333d2b36SAndroid Build Coastguard Worker if test.effectivePackage != nil { 478*333d2b36SAndroid Build Coastguard Worker checkEffectivePackage(t, result, test.effectivePackage) 479*333d2b36SAndroid Build Coastguard Worker } 480*333d2b36SAndroid Build Coastguard Worker 481*333d2b36SAndroid Build Coastguard Worker if test.effectiveNotices != nil { 482*333d2b36SAndroid Build Coastguard Worker checkEffectiveNotices(t, result, test.effectiveNotices) 483*333d2b36SAndroid Build Coastguard Worker } 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker if test.effectiveKinds != nil { 486*333d2b36SAndroid Build Coastguard Worker checkEffectiveKinds(t, result, test.effectiveKinds) 487*333d2b36SAndroid Build Coastguard Worker } 488*333d2b36SAndroid Build Coastguard Worker 489*333d2b36SAndroid Build Coastguard Worker if test.effectiveConditions != nil { 490*333d2b36SAndroid Build Coastguard Worker checkEffectiveConditions(t, result, test.effectiveConditions) 491*333d2b36SAndroid Build Coastguard Worker } 492*333d2b36SAndroid Build Coastguard Worker 493*333d2b36SAndroid Build Coastguard Worker if test.effectiveInheritedLicenses != nil { 494*333d2b36SAndroid Build Coastguard Worker checkEffectiveInheritedLicenses(t, result, test.effectiveInheritedLicenses) 495*333d2b36SAndroid Build Coastguard Worker } 496*333d2b36SAndroid Build Coastguard Worker }) 497*333d2b36SAndroid Build Coastguard Worker } 498*333d2b36SAndroid Build Coastguard Worker} 499*333d2b36SAndroid Build Coastguard Worker 500*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveLicenses(t *testing.T, result *TestResult, effectiveLicenses map[string][]string) { 501*333d2b36SAndroid Build Coastguard Worker actualLicenses := make(map[string][]string) 502*333d2b36SAndroid Build Coastguard Worker result.Context.Context.VisitAllModules(func(m blueprint.Module) { 503*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseModule); ok { 504*333d2b36SAndroid Build Coastguard Worker return 505*333d2b36SAndroid Build Coastguard Worker } 506*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseKindModule); ok { 507*333d2b36SAndroid Build Coastguard Worker return 508*333d2b36SAndroid Build Coastguard Worker } 509*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*packageModule); ok { 510*333d2b36SAndroid Build Coastguard Worker return 511*333d2b36SAndroid Build Coastguard Worker } 512*333d2b36SAndroid Build Coastguard Worker module, ok := m.(Module) 513*333d2b36SAndroid Build Coastguard Worker if !ok { 514*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q not a module", m.Name()) 515*333d2b36SAndroid Build Coastguard Worker return 516*333d2b36SAndroid Build Coastguard Worker } 517*333d2b36SAndroid Build Coastguard Worker base := module.base() 518*333d2b36SAndroid Build Coastguard Worker if base == nil { 519*333d2b36SAndroid Build Coastguard Worker return 520*333d2b36SAndroid Build Coastguard Worker } 521*333d2b36SAndroid Build Coastguard Worker actualLicenses[m.Name()] = base.commonProperties.Effective_licenses 522*333d2b36SAndroid Build Coastguard Worker }) 523*333d2b36SAndroid Build Coastguard Worker 524*333d2b36SAndroid Build Coastguard Worker for moduleName, expectedLicenses := range effectiveLicenses { 525*333d2b36SAndroid Build Coastguard Worker licenses, ok := actualLicenses[moduleName] 526*333d2b36SAndroid Build Coastguard Worker if !ok { 527*333d2b36SAndroid Build Coastguard Worker licenses = []string{} 528*333d2b36SAndroid Build Coastguard Worker } 529*333d2b36SAndroid Build Coastguard Worker if !compareUnorderedStringArrays(expectedLicenses, licenses) { 530*333d2b36SAndroid Build Coastguard Worker t.Errorf("effective licenses mismatch for module %q: expected %q, found %q", moduleName, expectedLicenses, licenses) 531*333d2b36SAndroid Build Coastguard Worker } 532*333d2b36SAndroid Build Coastguard Worker } 533*333d2b36SAndroid Build Coastguard Worker} 534*333d2b36SAndroid Build Coastguard Worker 535*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveInheritedLicenses(t *testing.T, result *TestResult, effectiveInheritedLicenses map[string][]string) { 536*333d2b36SAndroid Build Coastguard Worker actualLicenses := make(map[string][]string) 537*333d2b36SAndroid Build Coastguard Worker result.Context.Context.VisitAllModules(func(m blueprint.Module) { 538*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseModule); ok { 539*333d2b36SAndroid Build Coastguard Worker return 540*333d2b36SAndroid Build Coastguard Worker } 541*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseKindModule); ok { 542*333d2b36SAndroid Build Coastguard Worker return 543*333d2b36SAndroid Build Coastguard Worker } 544*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*packageModule); ok { 545*333d2b36SAndroid Build Coastguard Worker return 546*333d2b36SAndroid Build Coastguard Worker } 547*333d2b36SAndroid Build Coastguard Worker module, ok := m.(Module) 548*333d2b36SAndroid Build Coastguard Worker if !ok { 549*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q not a module", m.Name()) 550*333d2b36SAndroid Build Coastguard Worker return 551*333d2b36SAndroid Build Coastguard Worker } 552*333d2b36SAndroid Build Coastguard Worker base := module.base() 553*333d2b36SAndroid Build Coastguard Worker if base == nil { 554*333d2b36SAndroid Build Coastguard Worker return 555*333d2b36SAndroid Build Coastguard Worker } 556*333d2b36SAndroid Build Coastguard Worker inherited := make(map[string]bool) 557*333d2b36SAndroid Build Coastguard Worker for _, l := range base.commonProperties.Effective_licenses { 558*333d2b36SAndroid Build Coastguard Worker inherited[l] = true 559*333d2b36SAndroid Build Coastguard Worker } 560*333d2b36SAndroid Build Coastguard Worker result.Context.Context.VisitDepsDepthFirst(m, func(c blueprint.Module) { 561*333d2b36SAndroid Build Coastguard Worker if _, ok := c.(*licenseModule); ok { 562*333d2b36SAndroid Build Coastguard Worker return 563*333d2b36SAndroid Build Coastguard Worker } 564*333d2b36SAndroid Build Coastguard Worker if _, ok := c.(*licenseKindModule); ok { 565*333d2b36SAndroid Build Coastguard Worker return 566*333d2b36SAndroid Build Coastguard Worker } 567*333d2b36SAndroid Build Coastguard Worker if _, ok := c.(*packageModule); ok { 568*333d2b36SAndroid Build Coastguard Worker return 569*333d2b36SAndroid Build Coastguard Worker } 570*333d2b36SAndroid Build Coastguard Worker cmodule, ok := c.(Module) 571*333d2b36SAndroid Build Coastguard Worker if !ok { 572*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q not a module", c.Name()) 573*333d2b36SAndroid Build Coastguard Worker return 574*333d2b36SAndroid Build Coastguard Worker } 575*333d2b36SAndroid Build Coastguard Worker cbase := cmodule.base() 576*333d2b36SAndroid Build Coastguard Worker if cbase == nil { 577*333d2b36SAndroid Build Coastguard Worker return 578*333d2b36SAndroid Build Coastguard Worker } 579*333d2b36SAndroid Build Coastguard Worker for _, l := range cbase.commonProperties.Effective_licenses { 580*333d2b36SAndroid Build Coastguard Worker inherited[l] = true 581*333d2b36SAndroid Build Coastguard Worker } 582*333d2b36SAndroid Build Coastguard Worker }) 583*333d2b36SAndroid Build Coastguard Worker actualLicenses[m.Name()] = []string{} 584*333d2b36SAndroid Build Coastguard Worker for l := range inherited { 585*333d2b36SAndroid Build Coastguard Worker actualLicenses[m.Name()] = append(actualLicenses[m.Name()], l) 586*333d2b36SAndroid Build Coastguard Worker } 587*333d2b36SAndroid Build Coastguard Worker }) 588*333d2b36SAndroid Build Coastguard Worker 589*333d2b36SAndroid Build Coastguard Worker for moduleName, expectedInheritedLicenses := range effectiveInheritedLicenses { 590*333d2b36SAndroid Build Coastguard Worker licenses, ok := actualLicenses[moduleName] 591*333d2b36SAndroid Build Coastguard Worker if !ok { 592*333d2b36SAndroid Build Coastguard Worker licenses = []string{} 593*333d2b36SAndroid Build Coastguard Worker } 594*333d2b36SAndroid Build Coastguard Worker if !compareUnorderedStringArrays(expectedInheritedLicenses, licenses) { 595*333d2b36SAndroid Build Coastguard Worker t.Errorf("effective inherited licenses mismatch for module %q: expected %q, found %q", moduleName, expectedInheritedLicenses, licenses) 596*333d2b36SAndroid Build Coastguard Worker } 597*333d2b36SAndroid Build Coastguard Worker } 598*333d2b36SAndroid Build Coastguard Worker} 599*333d2b36SAndroid Build Coastguard Worker 600*333d2b36SAndroid Build Coastguard Workerfunc checkEffectivePackage(t *testing.T, result *TestResult, effectivePackage map[string]string) { 601*333d2b36SAndroid Build Coastguard Worker actualPackage := make(map[string]string) 602*333d2b36SAndroid Build Coastguard Worker result.Context.Context.VisitAllModules(func(m blueprint.Module) { 603*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseModule); ok { 604*333d2b36SAndroid Build Coastguard Worker return 605*333d2b36SAndroid Build Coastguard Worker } 606*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseKindModule); ok { 607*333d2b36SAndroid Build Coastguard Worker return 608*333d2b36SAndroid Build Coastguard Worker } 609*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*packageModule); ok { 610*333d2b36SAndroid Build Coastguard Worker return 611*333d2b36SAndroid Build Coastguard Worker } 612*333d2b36SAndroid Build Coastguard Worker module, ok := m.(Module) 613*333d2b36SAndroid Build Coastguard Worker if !ok { 614*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q not a module", m.Name()) 615*333d2b36SAndroid Build Coastguard Worker return 616*333d2b36SAndroid Build Coastguard Worker } 617*333d2b36SAndroid Build Coastguard Worker base := module.base() 618*333d2b36SAndroid Build Coastguard Worker if base == nil { 619*333d2b36SAndroid Build Coastguard Worker return 620*333d2b36SAndroid Build Coastguard Worker } 621*333d2b36SAndroid Build Coastguard Worker 622*333d2b36SAndroid Build Coastguard Worker if base.commonProperties.Effective_package_name == nil { 623*333d2b36SAndroid Build Coastguard Worker actualPackage[m.Name()] = "" 624*333d2b36SAndroid Build Coastguard Worker } else { 625*333d2b36SAndroid Build Coastguard Worker actualPackage[m.Name()] = *base.commonProperties.Effective_package_name 626*333d2b36SAndroid Build Coastguard Worker } 627*333d2b36SAndroid Build Coastguard Worker }) 628*333d2b36SAndroid Build Coastguard Worker 629*333d2b36SAndroid Build Coastguard Worker for moduleName, expectedPackage := range effectivePackage { 630*333d2b36SAndroid Build Coastguard Worker packageName, ok := actualPackage[moduleName] 631*333d2b36SAndroid Build Coastguard Worker if !ok { 632*333d2b36SAndroid Build Coastguard Worker packageName = "" 633*333d2b36SAndroid Build Coastguard Worker } 634*333d2b36SAndroid Build Coastguard Worker if expectedPackage != packageName { 635*333d2b36SAndroid Build Coastguard Worker t.Errorf("effective package mismatch for module %q: expected %q, found %q", moduleName, expectedPackage, packageName) 636*333d2b36SAndroid Build Coastguard Worker } 637*333d2b36SAndroid Build Coastguard Worker } 638*333d2b36SAndroid Build Coastguard Worker} 639*333d2b36SAndroid Build Coastguard Worker 640*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveNotices(t *testing.T, result *TestResult, effectiveNotices map[string][]string) { 641*333d2b36SAndroid Build Coastguard Worker actualNotices := make(map[string][]string) 642*333d2b36SAndroid Build Coastguard Worker result.Context.Context.VisitAllModules(func(m blueprint.Module) { 643*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseModule); ok { 644*333d2b36SAndroid Build Coastguard Worker return 645*333d2b36SAndroid Build Coastguard Worker } 646*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseKindModule); ok { 647*333d2b36SAndroid Build Coastguard Worker return 648*333d2b36SAndroid Build Coastguard Worker } 649*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*packageModule); ok { 650*333d2b36SAndroid Build Coastguard Worker return 651*333d2b36SAndroid Build Coastguard Worker } 652*333d2b36SAndroid Build Coastguard Worker module, ok := m.(Module) 653*333d2b36SAndroid Build Coastguard Worker if !ok { 654*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q not a module", m.Name()) 655*333d2b36SAndroid Build Coastguard Worker return 656*333d2b36SAndroid Build Coastguard Worker } 657*333d2b36SAndroid Build Coastguard Worker base := module.base() 658*333d2b36SAndroid Build Coastguard Worker if base == nil { 659*333d2b36SAndroid Build Coastguard Worker return 660*333d2b36SAndroid Build Coastguard Worker } 661*333d2b36SAndroid Build Coastguard Worker actualNotices[m.Name()] = base.commonProperties.Effective_license_text.Strings() 662*333d2b36SAndroid Build Coastguard Worker }) 663*333d2b36SAndroid Build Coastguard Worker 664*333d2b36SAndroid Build Coastguard Worker for moduleName, expectedNotices := range effectiveNotices { 665*333d2b36SAndroid Build Coastguard Worker notices, ok := actualNotices[moduleName] 666*333d2b36SAndroid Build Coastguard Worker if !ok { 667*333d2b36SAndroid Build Coastguard Worker notices = []string{} 668*333d2b36SAndroid Build Coastguard Worker } 669*333d2b36SAndroid Build Coastguard Worker if !compareUnorderedStringArrays(expectedNotices, notices) { 670*333d2b36SAndroid Build Coastguard Worker t.Errorf("effective notice files mismatch for module %q: expected %q, found %q", moduleName, expectedNotices, notices) 671*333d2b36SAndroid Build Coastguard Worker } 672*333d2b36SAndroid Build Coastguard Worker } 673*333d2b36SAndroid Build Coastguard Worker} 674*333d2b36SAndroid Build Coastguard Worker 675*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveKinds(t *testing.T, result *TestResult, effectiveKinds map[string][]string) { 676*333d2b36SAndroid Build Coastguard Worker actualKinds := make(map[string][]string) 677*333d2b36SAndroid Build Coastguard Worker result.Context.Context.VisitAllModules(func(m blueprint.Module) { 678*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseModule); ok { 679*333d2b36SAndroid Build Coastguard Worker return 680*333d2b36SAndroid Build Coastguard Worker } 681*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseKindModule); ok { 682*333d2b36SAndroid Build Coastguard Worker return 683*333d2b36SAndroid Build Coastguard Worker } 684*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*packageModule); ok { 685*333d2b36SAndroid Build Coastguard Worker return 686*333d2b36SAndroid Build Coastguard Worker } 687*333d2b36SAndroid Build Coastguard Worker module, ok := m.(Module) 688*333d2b36SAndroid Build Coastguard Worker if !ok { 689*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q not a module", m.Name()) 690*333d2b36SAndroid Build Coastguard Worker return 691*333d2b36SAndroid Build Coastguard Worker } 692*333d2b36SAndroid Build Coastguard Worker base := module.base() 693*333d2b36SAndroid Build Coastguard Worker if base == nil { 694*333d2b36SAndroid Build Coastguard Worker return 695*333d2b36SAndroid Build Coastguard Worker } 696*333d2b36SAndroid Build Coastguard Worker actualKinds[m.Name()] = base.commonProperties.Effective_license_kinds 697*333d2b36SAndroid Build Coastguard Worker }) 698*333d2b36SAndroid Build Coastguard Worker 699*333d2b36SAndroid Build Coastguard Worker for moduleName, expectedKinds := range effectiveKinds { 700*333d2b36SAndroid Build Coastguard Worker kinds, ok := actualKinds[moduleName] 701*333d2b36SAndroid Build Coastguard Worker if !ok { 702*333d2b36SAndroid Build Coastguard Worker kinds = []string{} 703*333d2b36SAndroid Build Coastguard Worker } 704*333d2b36SAndroid Build Coastguard Worker if !compareUnorderedStringArrays(expectedKinds, kinds) { 705*333d2b36SAndroid Build Coastguard Worker t.Errorf("effective license kinds mismatch for module %q: expected %q, found %q", moduleName, expectedKinds, kinds) 706*333d2b36SAndroid Build Coastguard Worker } 707*333d2b36SAndroid Build Coastguard Worker } 708*333d2b36SAndroid Build Coastguard Worker} 709*333d2b36SAndroid Build Coastguard Worker 710*333d2b36SAndroid Build Coastguard Workerfunc checkEffectiveConditions(t *testing.T, result *TestResult, effectiveConditions map[string][]string) { 711*333d2b36SAndroid Build Coastguard Worker actualConditions := make(map[string][]string) 712*333d2b36SAndroid Build Coastguard Worker result.Context.Context.VisitAllModules(func(m blueprint.Module) { 713*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseModule); ok { 714*333d2b36SAndroid Build Coastguard Worker return 715*333d2b36SAndroid Build Coastguard Worker } 716*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*licenseKindModule); ok { 717*333d2b36SAndroid Build Coastguard Worker return 718*333d2b36SAndroid Build Coastguard Worker } 719*333d2b36SAndroid Build Coastguard Worker if _, ok := m.(*packageModule); ok { 720*333d2b36SAndroid Build Coastguard Worker return 721*333d2b36SAndroid Build Coastguard Worker } 722*333d2b36SAndroid Build Coastguard Worker module, ok := m.(Module) 723*333d2b36SAndroid Build Coastguard Worker if !ok { 724*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q not a module", m.Name()) 725*333d2b36SAndroid Build Coastguard Worker return 726*333d2b36SAndroid Build Coastguard Worker } 727*333d2b36SAndroid Build Coastguard Worker base := module.base() 728*333d2b36SAndroid Build Coastguard Worker if base == nil { 729*333d2b36SAndroid Build Coastguard Worker return 730*333d2b36SAndroid Build Coastguard Worker } 731*333d2b36SAndroid Build Coastguard Worker actualConditions[m.Name()] = base.commonProperties.Effective_license_conditions 732*333d2b36SAndroid Build Coastguard Worker }) 733*333d2b36SAndroid Build Coastguard Worker 734*333d2b36SAndroid Build Coastguard Worker for moduleName, expectedConditions := range effectiveConditions { 735*333d2b36SAndroid Build Coastguard Worker conditions, ok := actualConditions[moduleName] 736*333d2b36SAndroid Build Coastguard Worker if !ok { 737*333d2b36SAndroid Build Coastguard Worker conditions = []string{} 738*333d2b36SAndroid Build Coastguard Worker } 739*333d2b36SAndroid Build Coastguard Worker if !compareUnorderedStringArrays(expectedConditions, conditions) { 740*333d2b36SAndroid Build Coastguard Worker t.Errorf("effective license conditions mismatch for module %q: expected %q, found %q", moduleName, expectedConditions, conditions) 741*333d2b36SAndroid Build Coastguard Worker } 742*333d2b36SAndroid Build Coastguard Worker } 743*333d2b36SAndroid Build Coastguard Worker} 744*333d2b36SAndroid Build Coastguard Worker 745*333d2b36SAndroid Build Coastguard Workerfunc compareUnorderedStringArrays(expected, actual []string) bool { 746*333d2b36SAndroid Build Coastguard Worker if len(expected) != len(actual) { 747*333d2b36SAndroid Build Coastguard Worker return false 748*333d2b36SAndroid Build Coastguard Worker } 749*333d2b36SAndroid Build Coastguard Worker s := make(map[string]int) 750*333d2b36SAndroid Build Coastguard Worker for _, v := range expected { 751*333d2b36SAndroid Build Coastguard Worker s[v] += 1 752*333d2b36SAndroid Build Coastguard Worker } 753*333d2b36SAndroid Build Coastguard Worker for _, v := range actual { 754*333d2b36SAndroid Build Coastguard Worker c, ok := s[v] 755*333d2b36SAndroid Build Coastguard Worker if !ok { 756*333d2b36SAndroid Build Coastguard Worker return false 757*333d2b36SAndroid Build Coastguard Worker } 758*333d2b36SAndroid Build Coastguard Worker if c < 1 { 759*333d2b36SAndroid Build Coastguard Worker return false 760*333d2b36SAndroid Build Coastguard Worker } 761*333d2b36SAndroid Build Coastguard Worker s[v] -= 1 762*333d2b36SAndroid Build Coastguard Worker } 763*333d2b36SAndroid Build Coastguard Worker return true 764*333d2b36SAndroid Build Coastguard Worker} 765*333d2b36SAndroid Build Coastguard Worker 766*333d2b36SAndroid Build Coastguard Workertype mockLicensesBadProperties struct { 767*333d2b36SAndroid Build Coastguard Worker Visibility []string 768*333d2b36SAndroid Build Coastguard Worker} 769*333d2b36SAndroid Build Coastguard Worker 770*333d2b36SAndroid Build Coastguard Workertype mockLicensesBadModule struct { 771*333d2b36SAndroid Build Coastguard Worker ModuleBase 772*333d2b36SAndroid Build Coastguard Worker DefaultableModuleBase 773*333d2b36SAndroid Build Coastguard Worker properties mockLicensesBadProperties 774*333d2b36SAndroid Build Coastguard Worker} 775*333d2b36SAndroid Build Coastguard Worker 776*333d2b36SAndroid Build Coastguard Workerfunc newMockLicensesBadModule() Module { 777*333d2b36SAndroid Build Coastguard Worker m := &mockLicensesBadModule{} 778*333d2b36SAndroid Build Coastguard Worker 779*333d2b36SAndroid Build Coastguard Worker base := m.base() 780*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&base.nameProperties, &m.properties) 781*333d2b36SAndroid Build Coastguard Worker 782*333d2b36SAndroid Build Coastguard Worker // The default_visibility property needs to be checked and parsed by the visibility module during 783*333d2b36SAndroid Build Coastguard Worker // its checking and parsing phases so make it the primary visibility property. 784*333d2b36SAndroid Build Coastguard Worker setPrimaryVisibilityProperty(m, "visibility", &m.properties.Visibility) 785*333d2b36SAndroid Build Coastguard Worker 786*333d2b36SAndroid Build Coastguard Worker initAndroidModuleBase(m) 787*333d2b36SAndroid Build Coastguard Worker InitDefaultableModule(m) 788*333d2b36SAndroid Build Coastguard Worker 789*333d2b36SAndroid Build Coastguard Worker return m 790*333d2b36SAndroid Build Coastguard Worker} 791*333d2b36SAndroid Build Coastguard Worker 792*333d2b36SAndroid Build Coastguard Workerfunc (m *mockLicensesBadModule) GenerateAndroidBuildActions(ModuleContext) { 793*333d2b36SAndroid Build Coastguard Worker} 794*333d2b36SAndroid Build Coastguard Worker 795*333d2b36SAndroid Build Coastguard Workertype mockLicensesLibraryProperties struct { 796*333d2b36SAndroid Build Coastguard Worker Deps []string 797*333d2b36SAndroid Build Coastguard Worker} 798*333d2b36SAndroid Build Coastguard Worker 799*333d2b36SAndroid Build Coastguard Workertype mockLicensesLibraryModule struct { 800*333d2b36SAndroid Build Coastguard Worker ModuleBase 801*333d2b36SAndroid Build Coastguard Worker DefaultableModuleBase 802*333d2b36SAndroid Build Coastguard Worker properties mockLicensesLibraryProperties 803*333d2b36SAndroid Build Coastguard Worker} 804*333d2b36SAndroid Build Coastguard Worker 805*333d2b36SAndroid Build Coastguard Workerfunc newMockLicensesLibraryModule() Module { 806*333d2b36SAndroid Build Coastguard Worker m := &mockLicensesLibraryModule{} 807*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.properties) 808*333d2b36SAndroid Build Coastguard Worker InitAndroidArchModule(m, HostAndDeviceSupported, MultilibCommon) 809*333d2b36SAndroid Build Coastguard Worker InitDefaultableModule(m) 810*333d2b36SAndroid Build Coastguard Worker return m 811*333d2b36SAndroid Build Coastguard Worker} 812*333d2b36SAndroid Build Coastguard Worker 813*333d2b36SAndroid Build Coastguard Workertype dependencyLicensesTag struct { 814*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 815*333d2b36SAndroid Build Coastguard Worker name string 816*333d2b36SAndroid Build Coastguard Worker} 817*333d2b36SAndroid Build Coastguard Worker 818*333d2b36SAndroid Build Coastguard Workerfunc (j *mockLicensesLibraryModule) DepsMutator(ctx BottomUpMutatorContext) { 819*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, dependencyLicensesTag{name: "mockdeps"}, j.properties.Deps...) 820*333d2b36SAndroid Build Coastguard Worker} 821*333d2b36SAndroid Build Coastguard Worker 822*333d2b36SAndroid Build Coastguard Workerfunc (p *mockLicensesLibraryModule) GenerateAndroidBuildActions(ModuleContext) { 823*333d2b36SAndroid Build Coastguard Worker} 824*333d2b36SAndroid Build Coastguard Worker 825*333d2b36SAndroid Build Coastguard Workertype mockLicensesDefaults struct { 826*333d2b36SAndroid Build Coastguard Worker ModuleBase 827*333d2b36SAndroid Build Coastguard Worker DefaultsModuleBase 828*333d2b36SAndroid Build Coastguard Worker} 829*333d2b36SAndroid Build Coastguard Worker 830*333d2b36SAndroid Build Coastguard Workerfunc defaultsLicensesFactory() Module { 831*333d2b36SAndroid Build Coastguard Worker m := &mockLicensesDefaults{} 832*333d2b36SAndroid Build Coastguard Worker InitDefaultsModule(m) 833*333d2b36SAndroid Build Coastguard Worker return m 834*333d2b36SAndroid Build Coastguard Worker} 835