1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage android 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "regexp" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workervar neverallowTests = []struct { 25*333d2b36SAndroid Build Coastguard Worker // The name of the test. 26*333d2b36SAndroid Build Coastguard Worker name string 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker // Optional test specific rules. If specified then they are used instead of the default rules. 29*333d2b36SAndroid Build Coastguard Worker rules []Rule 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker // Additional contents to add to the virtual filesystem used by the tests. 32*333d2b36SAndroid Build Coastguard Worker fs MockFS 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker // The expected error patterns. If empty then no errors are expected, otherwise each error 35*333d2b36SAndroid Build Coastguard Worker // reported must be matched by at least one of these patterns. A pattern matches if the error 36*333d2b36SAndroid Build Coastguard Worker // message contains the pattern. A pattern does not have to match the whole error message. 37*333d2b36SAndroid Build Coastguard Worker expectedErrors []string 38*333d2b36SAndroid Build Coastguard Worker}{ 39*333d2b36SAndroid Build Coastguard Worker // Test General Functionality 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Worker // in direct deps tests 42*333d2b36SAndroid Build Coastguard Worker { 43*333d2b36SAndroid Build Coastguard Worker name: "not_allowed_in_direct_deps", 44*333d2b36SAndroid Build Coastguard Worker rules: []Rule{ 45*333d2b36SAndroid Build Coastguard Worker NeverAllow().InDirectDeps("not_allowed_in_direct_deps"), 46*333d2b36SAndroid Build Coastguard Worker }, 47*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 48*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 49*333d2b36SAndroid Build Coastguard Worker cc_library { 50*333d2b36SAndroid Build Coastguard Worker name: "not_allowed_in_direct_deps", 51*333d2b36SAndroid Build Coastguard Worker }`), 52*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 53*333d2b36SAndroid Build Coastguard Worker cc_library { 54*333d2b36SAndroid Build Coastguard Worker name: "libother", 55*333d2b36SAndroid Build Coastguard Worker static_libs: ["not_allowed_in_direct_deps"], 56*333d2b36SAndroid Build Coastguard Worker }`), 57*333d2b36SAndroid Build Coastguard Worker }, 58*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 59*333d2b36SAndroid Build Coastguard Worker regexp.QuoteMeta("module \"libother\": violates neverallow requirements. Not allowed:\n\tdep(s): [\"not_allowed_in_direct_deps\"]"), 60*333d2b36SAndroid Build Coastguard Worker }, 61*333d2b36SAndroid Build Coastguard Worker }, 62*333d2b36SAndroid Build Coastguard Worker { 63*333d2b36SAndroid Build Coastguard Worker name: "multiple constraints", 64*333d2b36SAndroid Build Coastguard Worker rules: []Rule{ 65*333d2b36SAndroid Build Coastguard Worker NeverAllow(). 66*333d2b36SAndroid Build Coastguard Worker InDirectDeps("not_allowed_in_direct_deps"). 67*333d2b36SAndroid Build Coastguard Worker In("other"). 68*333d2b36SAndroid Build Coastguard Worker ModuleType("cc_library"). 69*333d2b36SAndroid Build Coastguard Worker NotIn("top"). 70*333d2b36SAndroid Build Coastguard Worker NotModuleType("cc_binary"), 71*333d2b36SAndroid Build Coastguard Worker }, 72*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 73*333d2b36SAndroid Build Coastguard Worker "top/Android.bp": []byte(` 74*333d2b36SAndroid Build Coastguard Worker cc_library { 75*333d2b36SAndroid Build Coastguard Worker name: "not_allowed_in_direct_deps", 76*333d2b36SAndroid Build Coastguard Worker }`), 77*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 78*333d2b36SAndroid Build Coastguard Worker cc_library { 79*333d2b36SAndroid Build Coastguard Worker name: "libother", 80*333d2b36SAndroid Build Coastguard Worker static_libs: ["not_allowed_in_direct_deps"], 81*333d2b36SAndroid Build Coastguard Worker }`), 82*333d2b36SAndroid Build Coastguard Worker }, 83*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 84*333d2b36SAndroid Build Coastguard Worker regexp.QuoteMeta(`module "libother": violates neverallow requirements. Not allowed: 85*333d2b36SAndroid Build Coastguard Worker in dirs: ["other/"] 86*333d2b36SAndroid Build Coastguard Worker module types: ["cc_library"] 87*333d2b36SAndroid Build Coastguard Worker dep(s): ["not_allowed_in_direct_deps"] 88*333d2b36SAndroid Build Coastguard Worker EXCEPT in dirs: ["top/"] 89*333d2b36SAndroid Build Coastguard Worker EXCEPT module types: ["cc_binary"]`), 90*333d2b36SAndroid Build Coastguard Worker }, 91*333d2b36SAndroid Build Coastguard Worker }, 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker // Test android specific rules 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker // include_dir rule tests 96*333d2b36SAndroid Build Coastguard Worker { 97*333d2b36SAndroid Build Coastguard Worker name: "include_dir not allowed to reference art", 98*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 99*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 100*333d2b36SAndroid Build Coastguard Worker cc_library { 101*333d2b36SAndroid Build Coastguard Worker name: "libother", 102*333d2b36SAndroid Build Coastguard Worker include_dirs: ["art/libdexfile/include"], 103*333d2b36SAndroid Build Coastguard Worker }`), 104*333d2b36SAndroid Build Coastguard Worker }, 105*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 106*333d2b36SAndroid Build Coastguard Worker "all usages of 'art' have been migrated", 107*333d2b36SAndroid Build Coastguard Worker }, 108*333d2b36SAndroid Build Coastguard Worker }, 109*333d2b36SAndroid Build Coastguard Worker { 110*333d2b36SAndroid Build Coastguard Worker name: "include_dir not allowed to reference art", 111*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 112*333d2b36SAndroid Build Coastguard Worker "system/libfmq/Android.bp": []byte(` 113*333d2b36SAndroid Build Coastguard Worker cc_library { 114*333d2b36SAndroid Build Coastguard Worker name: "libother", 115*333d2b36SAndroid Build Coastguard Worker include_dirs: ["any/random/file"], 116*333d2b36SAndroid Build Coastguard Worker }`), 117*333d2b36SAndroid Build Coastguard Worker }, 118*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 119*333d2b36SAndroid Build Coastguard Worker "all usages of them in 'system/libfmq' have been migrated", 120*333d2b36SAndroid Build Coastguard Worker }, 121*333d2b36SAndroid Build Coastguard Worker }, 122*333d2b36SAndroid Build Coastguard Worker { 123*333d2b36SAndroid Build Coastguard Worker name: "include_dir can work", 124*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 125*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 126*333d2b36SAndroid Build Coastguard Worker cc_library { 127*333d2b36SAndroid Build Coastguard Worker name: "libother", 128*333d2b36SAndroid Build Coastguard Worker include_dirs: ["another/include"], 129*333d2b36SAndroid Build Coastguard Worker }`), 130*333d2b36SAndroid Build Coastguard Worker }, 131*333d2b36SAndroid Build Coastguard Worker }, 132*333d2b36SAndroid Build Coastguard Worker // Treble rule tests 133*333d2b36SAndroid Build Coastguard Worker { 134*333d2b36SAndroid Build Coastguard Worker name: "no vndk.enabled under vendor directory", 135*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 136*333d2b36SAndroid Build Coastguard Worker "vendor/Android.bp": []byte(` 137*333d2b36SAndroid Build Coastguard Worker cc_library { 138*333d2b36SAndroid Build Coastguard Worker name: "libvndk", 139*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 140*333d2b36SAndroid Build Coastguard Worker vndk: { 141*333d2b36SAndroid Build Coastguard Worker enabled: true, 142*333d2b36SAndroid Build Coastguard Worker }, 143*333d2b36SAndroid Build Coastguard Worker }`), 144*333d2b36SAndroid Build Coastguard Worker }, 145*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 146*333d2b36SAndroid Build Coastguard Worker "VNDK can never contain a library that is device dependent", 147*333d2b36SAndroid Build Coastguard Worker }, 148*333d2b36SAndroid Build Coastguard Worker }, 149*333d2b36SAndroid Build Coastguard Worker { 150*333d2b36SAndroid Build Coastguard Worker name: "no vndk.enabled under device directory", 151*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 152*333d2b36SAndroid Build Coastguard Worker "device/Android.bp": []byte(` 153*333d2b36SAndroid Build Coastguard Worker cc_library { 154*333d2b36SAndroid Build Coastguard Worker name: "libvndk", 155*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 156*333d2b36SAndroid Build Coastguard Worker vndk: { 157*333d2b36SAndroid Build Coastguard Worker enabled: true, 158*333d2b36SAndroid Build Coastguard Worker }, 159*333d2b36SAndroid Build Coastguard Worker }`), 160*333d2b36SAndroid Build Coastguard Worker }, 161*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 162*333d2b36SAndroid Build Coastguard Worker "VNDK can never contain a library that is device dependent", 163*333d2b36SAndroid Build Coastguard Worker }, 164*333d2b36SAndroid Build Coastguard Worker }, 165*333d2b36SAndroid Build Coastguard Worker { 166*333d2b36SAndroid Build Coastguard Worker name: "vndk-ext under vendor or device directory", 167*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 168*333d2b36SAndroid Build Coastguard Worker "device/Android.bp": []byte(` 169*333d2b36SAndroid Build Coastguard Worker cc_library { 170*333d2b36SAndroid Build Coastguard Worker name: "libvndk1_ext", 171*333d2b36SAndroid Build Coastguard Worker vendor: true, 172*333d2b36SAndroid Build Coastguard Worker vndk: { 173*333d2b36SAndroid Build Coastguard Worker enabled: true, 174*333d2b36SAndroid Build Coastguard Worker }, 175*333d2b36SAndroid Build Coastguard Worker }`), 176*333d2b36SAndroid Build Coastguard Worker "vendor/Android.bp": []byte(` 177*333d2b36SAndroid Build Coastguard Worker cc_library { 178*333d2b36SAndroid Build Coastguard Worker name: "libvndk2_ext", 179*333d2b36SAndroid Build Coastguard Worker vendor: true, 180*333d2b36SAndroid Build Coastguard Worker vndk: { 181*333d2b36SAndroid Build Coastguard Worker enabled: true, 182*333d2b36SAndroid Build Coastguard Worker }, 183*333d2b36SAndroid Build Coastguard Worker }`), 184*333d2b36SAndroid Build Coastguard Worker }, 185*333d2b36SAndroid Build Coastguard Worker }, 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Worker { 188*333d2b36SAndroid Build Coastguard Worker name: "no enforce_vintf_manifest.cflags", 189*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 190*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 191*333d2b36SAndroid Build Coastguard Worker cc_library { 192*333d2b36SAndroid Build Coastguard Worker name: "libexample", 193*333d2b36SAndroid Build Coastguard Worker product_variables: { 194*333d2b36SAndroid Build Coastguard Worker enforce_vintf_manifest: { 195*333d2b36SAndroid Build Coastguard Worker cflags: ["-DSHOULD_NOT_EXIST"], 196*333d2b36SAndroid Build Coastguard Worker }, 197*333d2b36SAndroid Build Coastguard Worker }, 198*333d2b36SAndroid Build Coastguard Worker }`), 199*333d2b36SAndroid Build Coastguard Worker }, 200*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 201*333d2b36SAndroid Build Coastguard Worker "manifest enforcement should be independent", 202*333d2b36SAndroid Build Coastguard Worker }, 203*333d2b36SAndroid Build Coastguard Worker }, 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker { 206*333d2b36SAndroid Build Coastguard Worker name: "no treble_linker_namespaces.cflags", 207*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 208*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 209*333d2b36SAndroid Build Coastguard Worker cc_library { 210*333d2b36SAndroid Build Coastguard Worker name: "libexample", 211*333d2b36SAndroid Build Coastguard Worker product_variables: { 212*333d2b36SAndroid Build Coastguard Worker treble_linker_namespaces: { 213*333d2b36SAndroid Build Coastguard Worker cflags: ["-DSHOULD_NOT_EXIST"], 214*333d2b36SAndroid Build Coastguard Worker }, 215*333d2b36SAndroid Build Coastguard Worker }, 216*333d2b36SAndroid Build Coastguard Worker }`), 217*333d2b36SAndroid Build Coastguard Worker }, 218*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 219*333d2b36SAndroid Build Coastguard Worker "nothing should care if linker namespaces are enabled or not", 220*333d2b36SAndroid Build Coastguard Worker }, 221*333d2b36SAndroid Build Coastguard Worker }, 222*333d2b36SAndroid Build Coastguard Worker { 223*333d2b36SAndroid Build Coastguard Worker name: "libc_bionic_ndk treble_linker_namespaces.cflags", 224*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 225*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 226*333d2b36SAndroid Build Coastguard Worker cc_library { 227*333d2b36SAndroid Build Coastguard Worker name: "libc_bionic_ndk", 228*333d2b36SAndroid Build Coastguard Worker product_variables: { 229*333d2b36SAndroid Build Coastguard Worker treble_linker_namespaces: { 230*333d2b36SAndroid Build Coastguard Worker cflags: ["-DSHOULD_NOT_EXIST"], 231*333d2b36SAndroid Build Coastguard Worker }, 232*333d2b36SAndroid Build Coastguard Worker }, 233*333d2b36SAndroid Build Coastguard Worker }`), 234*333d2b36SAndroid Build Coastguard Worker }, 235*333d2b36SAndroid Build Coastguard Worker }, 236*333d2b36SAndroid Build Coastguard Worker { 237*333d2b36SAndroid Build Coastguard Worker name: "java_device_for_host", 238*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 239*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 240*333d2b36SAndroid Build Coastguard Worker java_device_for_host { 241*333d2b36SAndroid Build Coastguard Worker name: "device_for_host", 242*333d2b36SAndroid Build Coastguard Worker libs: ["core-libart"], 243*333d2b36SAndroid Build Coastguard Worker }`), 244*333d2b36SAndroid Build Coastguard Worker }, 245*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 246*333d2b36SAndroid Build Coastguard Worker "java_device_for_host can only be used in allowed projects", 247*333d2b36SAndroid Build Coastguard Worker }, 248*333d2b36SAndroid Build Coastguard Worker }, 249*333d2b36SAndroid Build Coastguard Worker // CC sdk rule tests 250*333d2b36SAndroid Build Coastguard Worker { 251*333d2b36SAndroid Build Coastguard Worker name: `"sdk_variant_only" outside allowed list`, 252*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 253*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 254*333d2b36SAndroid Build Coastguard Worker cc_library { 255*333d2b36SAndroid Build Coastguard Worker name: "outside_allowed_list", 256*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 257*333d2b36SAndroid Build Coastguard Worker sdk_variant_only: true, 258*333d2b36SAndroid Build Coastguard Worker }`), 259*333d2b36SAndroid Build Coastguard Worker }, 260*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 261*333d2b36SAndroid Build Coastguard Worker `module "outside_allowed_list": violates neverallow`, 262*333d2b36SAndroid Build Coastguard Worker }, 263*333d2b36SAndroid Build Coastguard Worker }, 264*333d2b36SAndroid Build Coastguard Worker { 265*333d2b36SAndroid Build Coastguard Worker name: `"sdk_variant_only: false" outside allowed list`, 266*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 267*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 268*333d2b36SAndroid Build Coastguard Worker cc_library { 269*333d2b36SAndroid Build Coastguard Worker name: "outside_allowed_list", 270*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 271*333d2b36SAndroid Build Coastguard Worker sdk_variant_only: false, 272*333d2b36SAndroid Build Coastguard Worker }`), 273*333d2b36SAndroid Build Coastguard Worker }, 274*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 275*333d2b36SAndroid Build Coastguard Worker `module "outside_allowed_list": violates neverallow`, 276*333d2b36SAndroid Build Coastguard Worker }, 277*333d2b36SAndroid Build Coastguard Worker }, 278*333d2b36SAndroid Build Coastguard Worker { 279*333d2b36SAndroid Build Coastguard Worker name: `"platform" outside allowed list`, 280*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 281*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 282*333d2b36SAndroid Build Coastguard Worker cc_library { 283*333d2b36SAndroid Build Coastguard Worker name: "outside_allowed_list", 284*333d2b36SAndroid Build Coastguard Worker platform: { 285*333d2b36SAndroid Build Coastguard Worker shared_libs: ["libfoo"], 286*333d2b36SAndroid Build Coastguard Worker }, 287*333d2b36SAndroid Build Coastguard Worker }`), 288*333d2b36SAndroid Build Coastguard Worker }, 289*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 290*333d2b36SAndroid Build Coastguard Worker `module "outside_allowed_list": violates neverallow`, 291*333d2b36SAndroid Build Coastguard Worker }, 292*333d2b36SAndroid Build Coastguard Worker }, 293*333d2b36SAndroid Build Coastguard Worker { 294*333d2b36SAndroid Build Coastguard Worker name: "uncompress_dex inside art", 295*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 296*333d2b36SAndroid Build Coastguard Worker "art/Android.bp": []byte(` 297*333d2b36SAndroid Build Coastguard Worker java_library { 298*333d2b36SAndroid Build Coastguard Worker name: "inside_art_libraries", 299*333d2b36SAndroid Build Coastguard Worker uncompress_dex: true, 300*333d2b36SAndroid Build Coastguard Worker }`), 301*333d2b36SAndroid Build Coastguard Worker }, 302*333d2b36SAndroid Build Coastguard Worker }, 303*333d2b36SAndroid Build Coastguard Worker { 304*333d2b36SAndroid Build Coastguard Worker name: "uncompress_dex outside art", 305*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 306*333d2b36SAndroid Build Coastguard Worker "other/Android.bp": []byte(` 307*333d2b36SAndroid Build Coastguard Worker java_library { 308*333d2b36SAndroid Build Coastguard Worker name: "outside_art_libraries", 309*333d2b36SAndroid Build Coastguard Worker uncompress_dex: true, 310*333d2b36SAndroid Build Coastguard Worker }`), 311*333d2b36SAndroid Build Coastguard Worker }, 312*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 313*333d2b36SAndroid Build Coastguard Worker "module \"outside_art_libraries\": violates neverallow", 314*333d2b36SAndroid Build Coastguard Worker }, 315*333d2b36SAndroid Build Coastguard Worker }, 316*333d2b36SAndroid Build Coastguard Worker // Tests for the rule prohibiting the use of framework 317*333d2b36SAndroid Build Coastguard Worker { 318*333d2b36SAndroid Build Coastguard Worker name: "prohibit framework", 319*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 320*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 321*333d2b36SAndroid Build Coastguard Worker java_library { 322*333d2b36SAndroid Build Coastguard Worker name: "foo", 323*333d2b36SAndroid Build Coastguard Worker libs: ["framework"], 324*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 325*333d2b36SAndroid Build Coastguard Worker }`), 326*333d2b36SAndroid Build Coastguard Worker }, 327*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 328*333d2b36SAndroid Build Coastguard Worker "framework can't be used when building against SDK", 329*333d2b36SAndroid Build Coastguard Worker }, 330*333d2b36SAndroid Build Coastguard Worker }, 331*333d2b36SAndroid Build Coastguard Worker // Test for the rule restricting use of implementation_installable 332*333d2b36SAndroid Build Coastguard Worker { 333*333d2b36SAndroid Build Coastguard Worker name: `"implementation_installable" outside allowed list`, 334*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 335*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 336*333d2b36SAndroid Build Coastguard Worker cc_library { 337*333d2b36SAndroid Build Coastguard Worker name: "outside_allowed_list", 338*333d2b36SAndroid Build Coastguard Worker stubs: { 339*333d2b36SAndroid Build Coastguard Worker implementation_installable: true, 340*333d2b36SAndroid Build Coastguard Worker }, 341*333d2b36SAndroid Build Coastguard Worker }`), 342*333d2b36SAndroid Build Coastguard Worker }, 343*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 344*333d2b36SAndroid Build Coastguard Worker `module "outside_allowed_list": violates neverallow`, 345*333d2b36SAndroid Build Coastguard Worker }, 346*333d2b36SAndroid Build Coastguard Worker }, 347*333d2b36SAndroid Build Coastguard Worker // Test for only allowing headers_only for framework-minus-apex-headers 348*333d2b36SAndroid Build Coastguard Worker { 349*333d2b36SAndroid Build Coastguard Worker name: `"headers_only" outside framework-minus-apex-headers modules`, 350*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 351*333d2b36SAndroid Build Coastguard Worker "a/b/Android.bp": []byte(` 352*333d2b36SAndroid Build Coastguard Worker java_library { 353*333d2b36SAndroid Build Coastguard Worker name: "baz", 354*333d2b36SAndroid Build Coastguard Worker headers_only: true, 355*333d2b36SAndroid Build Coastguard Worker } 356*333d2b36SAndroid Build Coastguard Worker `), 357*333d2b36SAndroid Build Coastguard Worker }, 358*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 359*333d2b36SAndroid Build Coastguard Worker `headers_only can only be used for generating framework-minus-apex headers for non-updatable modules`, 360*333d2b36SAndroid Build Coastguard Worker }, 361*333d2b36SAndroid Build Coastguard Worker }, 362*333d2b36SAndroid Build Coastguard Worker // Test for the rule restricting use of is_auto_generated 363*333d2b36SAndroid Build Coastguard Worker { 364*333d2b36SAndroid Build Coastguard Worker name: `"is_auto_generated" outside allowed directory`, 365*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 366*333d2b36SAndroid Build Coastguard Worker "a/b/Android.bp": []byte(` 367*333d2b36SAndroid Build Coastguard Worker filesystem { 368*333d2b36SAndroid Build Coastguard Worker name: "baaz", 369*333d2b36SAndroid Build Coastguard Worker is_auto_generated: true, 370*333d2b36SAndroid Build Coastguard Worker } 371*333d2b36SAndroid Build Coastguard Worker `), 372*333d2b36SAndroid Build Coastguard Worker }, 373*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 374*333d2b36SAndroid Build Coastguard Worker `is_auto_generated property is only allowed for filesystem modules in build/soong/fsgen directory`, 375*333d2b36SAndroid Build Coastguard Worker }, 376*333d2b36SAndroid Build Coastguard Worker }, 377*333d2b36SAndroid Build Coastguard Worker // Test for the rule restricting use of prebuilt_* module 378*333d2b36SAndroid Build Coastguard Worker { 379*333d2b36SAndroid Build Coastguard Worker name: `"prebuilt_usr_srec" defined in Android.bp file`, 380*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 381*333d2b36SAndroid Build Coastguard Worker "a/b/Android.bp": []byte(` 382*333d2b36SAndroid Build Coastguard Worker prebuilt_usr_srec { 383*333d2b36SAndroid Build Coastguard Worker name: "foo", 384*333d2b36SAndroid Build Coastguard Worker } 385*333d2b36SAndroid Build Coastguard Worker `), 386*333d2b36SAndroid Build Coastguard Worker }, 387*333d2b36SAndroid Build Coastguard Worker expectedErrors: []string{ 388*333d2b36SAndroid Build Coastguard Worker `module type not allowed to be defined in bp file`, 389*333d2b36SAndroid Build Coastguard Worker }, 390*333d2b36SAndroid Build Coastguard Worker }, 391*333d2b36SAndroid Build Coastguard Worker} 392*333d2b36SAndroid Build Coastguard Worker 393*333d2b36SAndroid Build Coastguard Workervar prepareForNeverAllowTest = GroupFixturePreparers( 394*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 395*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_library", newMockCcLibraryModule) 396*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_library", newMockJavaLibraryModule) 397*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_library_host", newMockJavaLibraryModule) 398*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_device_for_host", newMockJavaLibraryModule) 399*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("filesystem", newMockFilesystemModule) 400*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("prebuilt_usr_srec", newMockPrebuiltUsrSrecModule) 401*333d2b36SAndroid Build Coastguard Worker }), 402*333d2b36SAndroid Build Coastguard Worker) 403*333d2b36SAndroid Build Coastguard Worker 404*333d2b36SAndroid Build Coastguard Workerfunc TestNeverallow(t *testing.T) { 405*333d2b36SAndroid Build Coastguard Worker for _, test := range neverallowTests { 406*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 407*333d2b36SAndroid Build Coastguard Worker GroupFixturePreparers( 408*333d2b36SAndroid Build Coastguard Worker prepareForNeverAllowTest, 409*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithNeverallowRules(test.rules), 410*333d2b36SAndroid Build Coastguard Worker test.fs.AddToFixture(), 411*333d2b36SAndroid Build Coastguard Worker ). 412*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)). 413*333d2b36SAndroid Build Coastguard Worker RunTest(t) 414*333d2b36SAndroid Build Coastguard Worker }) 415*333d2b36SAndroid Build Coastguard Worker } 416*333d2b36SAndroid Build Coastguard Worker} 417*333d2b36SAndroid Build Coastguard Worker 418*333d2b36SAndroid Build Coastguard Workertype mockCcLibraryProperties struct { 419*333d2b36SAndroid Build Coastguard Worker Include_dirs []string 420*333d2b36SAndroid Build Coastguard Worker Vendor_available *bool 421*333d2b36SAndroid Build Coastguard Worker Static_libs []string 422*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 423*333d2b36SAndroid Build Coastguard Worker Sdk_variant_only *bool 424*333d2b36SAndroid Build Coastguard Worker 425*333d2b36SAndroid Build Coastguard Worker Vndk struct { 426*333d2b36SAndroid Build Coastguard Worker Enabled *bool 427*333d2b36SAndroid Build Coastguard Worker Support_system_process *bool 428*333d2b36SAndroid Build Coastguard Worker Extends *string 429*333d2b36SAndroid Build Coastguard Worker } 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Worker Product_variables struct { 432*333d2b36SAndroid Build Coastguard Worker Enforce_vintf_manifest struct { 433*333d2b36SAndroid Build Coastguard Worker Cflags []string 434*333d2b36SAndroid Build Coastguard Worker } 435*333d2b36SAndroid Build Coastguard Worker 436*333d2b36SAndroid Build Coastguard Worker Treble_linker_namespaces struct { 437*333d2b36SAndroid Build Coastguard Worker Cflags []string 438*333d2b36SAndroid Build Coastguard Worker } 439*333d2b36SAndroid Build Coastguard Worker } 440*333d2b36SAndroid Build Coastguard Worker 441*333d2b36SAndroid Build Coastguard Worker Platform struct { 442*333d2b36SAndroid Build Coastguard Worker Shared_libs []string 443*333d2b36SAndroid Build Coastguard Worker } 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Worker Stubs struct { 446*333d2b36SAndroid Build Coastguard Worker Implementation_installable *bool 447*333d2b36SAndroid Build Coastguard Worker } 448*333d2b36SAndroid Build Coastguard Worker} 449*333d2b36SAndroid Build Coastguard Worker 450*333d2b36SAndroid Build Coastguard Workertype mockCcLibraryModule struct { 451*333d2b36SAndroid Build Coastguard Worker ModuleBase 452*333d2b36SAndroid Build Coastguard Worker properties mockCcLibraryProperties 453*333d2b36SAndroid Build Coastguard Worker} 454*333d2b36SAndroid Build Coastguard Worker 455*333d2b36SAndroid Build Coastguard Workerfunc newMockCcLibraryModule() Module { 456*333d2b36SAndroid Build Coastguard Worker m := &mockCcLibraryModule{} 457*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.properties) 458*333d2b36SAndroid Build Coastguard Worker InitAndroidModule(m) 459*333d2b36SAndroid Build Coastguard Worker return m 460*333d2b36SAndroid Build Coastguard Worker} 461*333d2b36SAndroid Build Coastguard Worker 462*333d2b36SAndroid Build Coastguard Workertype neverallowTestDependencyTag struct { 463*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 464*333d2b36SAndroid Build Coastguard Worker name string 465*333d2b36SAndroid Build Coastguard Worker} 466*333d2b36SAndroid Build Coastguard Worker 467*333d2b36SAndroid Build Coastguard Workervar staticDepTag = neverallowTestDependencyTag{name: "static"} 468*333d2b36SAndroid Build Coastguard Worker 469*333d2b36SAndroid Build Coastguard Workerfunc (c *mockCcLibraryModule) DepsMutator(ctx BottomUpMutatorContext) { 470*333d2b36SAndroid Build Coastguard Worker for _, lib := range c.properties.Static_libs { 471*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), staticDepTag, lib) 472*333d2b36SAndroid Build Coastguard Worker } 473*333d2b36SAndroid Build Coastguard Worker} 474*333d2b36SAndroid Build Coastguard Worker 475*333d2b36SAndroid Build Coastguard Workerfunc (p *mockCcLibraryModule) GenerateAndroidBuildActions(ModuleContext) { 476*333d2b36SAndroid Build Coastguard Worker} 477*333d2b36SAndroid Build Coastguard Worker 478*333d2b36SAndroid Build Coastguard Workertype mockJavaLibraryProperties struct { 479*333d2b36SAndroid Build Coastguard Worker Libs []string 480*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 481*333d2b36SAndroid Build Coastguard Worker Uncompress_dex *bool 482*333d2b36SAndroid Build Coastguard Worker Exclude_static_libs []string 483*333d2b36SAndroid Build Coastguard Worker Headers_only *bool 484*333d2b36SAndroid Build Coastguard Worker} 485*333d2b36SAndroid Build Coastguard Worker 486*333d2b36SAndroid Build Coastguard Workertype mockJavaLibraryModule struct { 487*333d2b36SAndroid Build Coastguard Worker ModuleBase 488*333d2b36SAndroid Build Coastguard Worker properties mockJavaLibraryProperties 489*333d2b36SAndroid Build Coastguard Worker} 490*333d2b36SAndroid Build Coastguard Worker 491*333d2b36SAndroid Build Coastguard Workerfunc newMockJavaLibraryModule() Module { 492*333d2b36SAndroid Build Coastguard Worker m := &mockJavaLibraryModule{} 493*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.properties) 494*333d2b36SAndroid Build Coastguard Worker InitAndroidModule(m) 495*333d2b36SAndroid Build Coastguard Worker return m 496*333d2b36SAndroid Build Coastguard Worker} 497*333d2b36SAndroid Build Coastguard Worker 498*333d2b36SAndroid Build Coastguard Workerfunc (p *mockJavaLibraryModule) GenerateAndroidBuildActions(ModuleContext) { 499*333d2b36SAndroid Build Coastguard Worker} 500*333d2b36SAndroid Build Coastguard Worker 501*333d2b36SAndroid Build Coastguard Workertype mockPrebuiltUsrSrecModule struct { 502*333d2b36SAndroid Build Coastguard Worker ModuleBase 503*333d2b36SAndroid Build Coastguard Worker} 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Workerfunc (p *mockPrebuiltUsrSrecModule) GenerateAndroidBuildActions(ModuleContext) { 506*333d2b36SAndroid Build Coastguard Worker} 507*333d2b36SAndroid Build Coastguard Worker 508*333d2b36SAndroid Build Coastguard Workerfunc newMockPrebuiltUsrSrecModule() Module { 509*333d2b36SAndroid Build Coastguard Worker m := &mockPrebuiltUsrSrecModule{} 510*333d2b36SAndroid Build Coastguard Worker InitAndroidModule(m) 511*333d2b36SAndroid Build Coastguard Worker return m 512*333d2b36SAndroid Build Coastguard Worker} 513