sdk_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. // Copyright 2019 Google Inc. All rights reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package sdk
  15. import (
  16. "android/soong/android"
  17. "log"
  18. "os"
  19. "testing"
  20. "github.com/google/blueprint/proptools"
  21. )
  22. // Needed in an _test.go file in this package to ensure tests run correctly, particularly in IDE.
  23. func TestMain(m *testing.M) {
  24. if android.BuildOs != android.Linux {
  25. // b/145598135 - Generating host snapshots for anything other than linux is not supported.
  26. log.Printf("Skipping as sdk snapshot generation is only supported on %s not %s", android.Linux, android.BuildOs)
  27. os.Exit(0)
  28. }
  29. runTestWithBuildDir(m)
  30. }
  31. func TestDepNotInRequiredSdks(t *testing.T) {
  32. testSdkError(t, `module "myjavalib".*depends on "otherlib".*that isn't part of the required SDKs:.*`, `
  33. sdk {
  34. name: "mysdk",
  35. java_header_libs: ["sdkmember"],
  36. }
  37. sdk_snapshot {
  38. name: "mysdk@1",
  39. java_header_libs: ["sdkmember_mysdk_1"],
  40. }
  41. java_import {
  42. name: "sdkmember",
  43. prefer: false,
  44. host_supported: true,
  45. }
  46. java_import {
  47. name: "sdkmember_mysdk_1",
  48. sdk_member_name: "sdkmember",
  49. host_supported: true,
  50. }
  51. java_library {
  52. name: "myjavalib",
  53. srcs: ["Test.java"],
  54. libs: [
  55. "sdkmember",
  56. "otherlib",
  57. ],
  58. system_modules: "none",
  59. sdk_version: "none",
  60. compile_dex: true,
  61. host_supported: true,
  62. apex_available: ["myapex"],
  63. }
  64. // this lib is no in mysdk
  65. java_library {
  66. name: "otherlib",
  67. srcs: ["Test.java"],
  68. system_modules: "none",
  69. sdk_version: "none",
  70. compile_dex: true,
  71. host_supported: true,
  72. }
  73. apex {
  74. name: "myapex",
  75. java_libs: ["myjavalib"],
  76. uses_sdks: ["mysdk@1"],
  77. key: "myapex.key",
  78. certificate: ":myapex.cert",
  79. }
  80. `)
  81. }
  82. // Ensure that prebuilt modules have the same effective visibility as the source
  83. // modules.
  84. func TestSnapshotVisibility(t *testing.T) {
  85. packageBp := `
  86. package {
  87. default_visibility: ["//other/foo"],
  88. }
  89. sdk {
  90. name: "mysdk",
  91. visibility: [
  92. "//other/foo",
  93. // This short form will be replaced with //package:__subpackages__ in the
  94. // generated sdk_snapshot.
  95. ":__subpackages__",
  96. ],
  97. prebuilt_visibility: [
  98. "//prebuilts/mysdk",
  99. ],
  100. java_header_libs: [
  101. "myjavalib",
  102. "mypublicjavalib",
  103. "mydefaultedjavalib",
  104. "myprivatejavalib",
  105. ],
  106. }
  107. java_library {
  108. name: "myjavalib",
  109. // Uses package default visibility
  110. srcs: ["Test.java"],
  111. system_modules: "none",
  112. sdk_version: "none",
  113. }
  114. java_defaults {
  115. name: "java-defaults",
  116. visibility: ["//other/bar"],
  117. }
  118. java_library {
  119. name: "mypublicjavalib",
  120. defaults: ["java-defaults"],
  121. visibility: ["//visibility:public"],
  122. srcs: ["Test.java"],
  123. system_modules: "none",
  124. sdk_version: "none",
  125. }
  126. java_defaults {
  127. name: "myjavadefaults",
  128. visibility: ["//other/bar"],
  129. }
  130. java_library {
  131. name: "mydefaultedjavalib",
  132. defaults: ["myjavadefaults"],
  133. srcs: ["Test.java"],
  134. system_modules: "none",
  135. sdk_version: "none",
  136. }
  137. java_library {
  138. name: "myprivatejavalib",
  139. srcs: ["Test.java"],
  140. visibility: ["//visibility:private"],
  141. system_modules: "none",
  142. sdk_version: "none",
  143. }
  144. `
  145. result := testSdkWithFs(t, ``,
  146. map[string][]byte{
  147. "package/Test.java": nil,
  148. "package/Android.bp": []byte(packageBp),
  149. })
  150. result.CheckSnapshot("mysdk", "package",
  151. checkAndroidBpContents(`
  152. // This is auto-generated. DO NOT EDIT.
  153. java_import {
  154. name: "mysdk_myjavalib@current",
  155. sdk_member_name: "myjavalib",
  156. visibility: [
  157. "//other/foo",
  158. "//package",
  159. "//prebuilts/mysdk",
  160. ],
  161. jars: ["java/myjavalib.jar"],
  162. }
  163. java_import {
  164. name: "myjavalib",
  165. prefer: false,
  166. visibility: [
  167. "//other/foo",
  168. "//package",
  169. "//prebuilts/mysdk",
  170. ],
  171. jars: ["java/myjavalib.jar"],
  172. }
  173. java_import {
  174. name: "mysdk_mypublicjavalib@current",
  175. sdk_member_name: "mypublicjavalib",
  176. visibility: ["//visibility:public"],
  177. jars: ["java/mypublicjavalib.jar"],
  178. }
  179. java_import {
  180. name: "mypublicjavalib",
  181. prefer: false,
  182. visibility: ["//visibility:public"],
  183. jars: ["java/mypublicjavalib.jar"],
  184. }
  185. java_import {
  186. name: "mysdk_mydefaultedjavalib@current",
  187. sdk_member_name: "mydefaultedjavalib",
  188. visibility: [
  189. "//other/bar",
  190. "//package",
  191. "//prebuilts/mysdk",
  192. ],
  193. jars: ["java/mydefaultedjavalib.jar"],
  194. }
  195. java_import {
  196. name: "mydefaultedjavalib",
  197. prefer: false,
  198. visibility: [
  199. "//other/bar",
  200. "//package",
  201. "//prebuilts/mysdk",
  202. ],
  203. jars: ["java/mydefaultedjavalib.jar"],
  204. }
  205. java_import {
  206. name: "mysdk_myprivatejavalib@current",
  207. sdk_member_name: "myprivatejavalib",
  208. visibility: [
  209. "//package",
  210. "//prebuilts/mysdk",
  211. ],
  212. jars: ["java/myprivatejavalib.jar"],
  213. }
  214. java_import {
  215. name: "myprivatejavalib",
  216. prefer: false,
  217. visibility: [
  218. "//package",
  219. "//prebuilts/mysdk",
  220. ],
  221. jars: ["java/myprivatejavalib.jar"],
  222. }
  223. sdk_snapshot {
  224. name: "mysdk@current",
  225. visibility: [
  226. "//other/foo",
  227. "//package:__subpackages__",
  228. ],
  229. java_header_libs: [
  230. "mysdk_myjavalib@current",
  231. "mysdk_mypublicjavalib@current",
  232. "mysdk_mydefaultedjavalib@current",
  233. "mysdk_myprivatejavalib@current",
  234. ],
  235. }
  236. `))
  237. }
  238. func TestPrebuiltVisibilityProperty_IsValidated(t *testing.T) {
  239. testSdkError(t, `prebuilt_visibility: cannot mix "//visibility:private" with any other visibility rules`, `
  240. sdk {
  241. name: "mysdk",
  242. prebuilt_visibility: [
  243. "//foo",
  244. "//visibility:private",
  245. ],
  246. }
  247. `)
  248. }
  249. func TestPrebuiltVisibilityProperty_AddPrivate(t *testing.T) {
  250. testSdkError(t, `prebuilt_visibility: "//visibility:private" does not widen the visibility`, `
  251. sdk {
  252. name: "mysdk",
  253. prebuilt_visibility: [
  254. "//visibility:private",
  255. ],
  256. java_header_libs: [
  257. "myjavalib",
  258. ],
  259. }
  260. java_library {
  261. name: "myjavalib",
  262. // Uses package default visibility
  263. srcs: ["Test.java"],
  264. system_modules: "none",
  265. sdk_version: "none",
  266. }
  267. `)
  268. }
  269. func TestSDkInstall(t *testing.T) {
  270. sdk := `
  271. sdk {
  272. name: "mysdk",
  273. }
  274. `
  275. result := testSdkWithFs(t, ``,
  276. map[string][]byte{
  277. "Android.bp": []byte(sdk),
  278. })
  279. result.CheckSnapshot("mysdk", "",
  280. checkAllOtherCopyRules(`.intermediates/mysdk/common_os/mysdk-current.zip -> mysdk-current.zip`),
  281. )
  282. }
  283. type EmbeddedPropertiesStruct struct {
  284. S_Embedded_Common string `android:"arch_variant"`
  285. S_Embedded_Different string `android:"arch_variant"`
  286. }
  287. type testPropertiesStruct struct {
  288. name string
  289. private string
  290. Public_Kept string `sdk:"keep"`
  291. S_Common string
  292. S_Different string `android:"arch_variant"`
  293. A_Common []string
  294. A_Different []string `android:"arch_variant"`
  295. F_Common *bool
  296. F_Different *bool `android:"arch_variant"`
  297. EmbeddedPropertiesStruct
  298. }
  299. func (p *testPropertiesStruct) optimizableProperties() interface{} {
  300. return p
  301. }
  302. func (p *testPropertiesStruct) String() string {
  303. return p.name
  304. }
  305. var _ propertiesContainer = (*testPropertiesStruct)(nil)
  306. func TestCommonValueOptimization(t *testing.T) {
  307. common := &testPropertiesStruct{name: "common"}
  308. structs := []propertiesContainer{
  309. &testPropertiesStruct{
  310. name: "struct-0",
  311. private: "common",
  312. Public_Kept: "common",
  313. S_Common: "common",
  314. S_Different: "upper",
  315. A_Common: []string{"first", "second"},
  316. A_Different: []string{"alpha", "beta"},
  317. F_Common: proptools.BoolPtr(false),
  318. F_Different: proptools.BoolPtr(false),
  319. EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{
  320. S_Embedded_Common: "embedded_common",
  321. S_Embedded_Different: "embedded_upper",
  322. },
  323. },
  324. &testPropertiesStruct{
  325. name: "struct-1",
  326. private: "common",
  327. Public_Kept: "common",
  328. S_Common: "common",
  329. S_Different: "lower",
  330. A_Common: []string{"first", "second"},
  331. A_Different: []string{"alpha", "delta"},
  332. F_Common: proptools.BoolPtr(false),
  333. F_Different: proptools.BoolPtr(true),
  334. EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{
  335. S_Embedded_Common: "embedded_common",
  336. S_Embedded_Different: "embedded_lower",
  337. },
  338. },
  339. }
  340. extractor := newCommonValueExtractor(common)
  341. h := TestHelper{t}
  342. err := extractor.extractCommonProperties(common, structs)
  343. h.AssertDeepEquals("unexpected error", nil, err)
  344. h.AssertDeepEquals("common properties not correct",
  345. &testPropertiesStruct{
  346. name: "common",
  347. private: "",
  348. Public_Kept: "",
  349. S_Common: "common",
  350. S_Different: "",
  351. A_Common: []string{"first", "second"},
  352. A_Different: []string(nil),
  353. F_Common: proptools.BoolPtr(false),
  354. F_Different: nil,
  355. EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{
  356. S_Embedded_Common: "embedded_common",
  357. S_Embedded_Different: "",
  358. },
  359. },
  360. common)
  361. h.AssertDeepEquals("updated properties[0] not correct",
  362. &testPropertiesStruct{
  363. name: "struct-0",
  364. private: "common",
  365. Public_Kept: "common",
  366. S_Common: "",
  367. S_Different: "upper",
  368. A_Common: nil,
  369. A_Different: []string{"alpha", "beta"},
  370. F_Common: nil,
  371. F_Different: proptools.BoolPtr(false),
  372. EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{
  373. S_Embedded_Common: "",
  374. S_Embedded_Different: "embedded_upper",
  375. },
  376. },
  377. structs[0])
  378. h.AssertDeepEquals("updated properties[1] not correct",
  379. &testPropertiesStruct{
  380. name: "struct-1",
  381. private: "common",
  382. Public_Kept: "common",
  383. S_Common: "",
  384. S_Different: "lower",
  385. A_Common: nil,
  386. A_Different: []string{"alpha", "delta"},
  387. F_Common: nil,
  388. F_Different: proptools.BoolPtr(true),
  389. EmbeddedPropertiesStruct: EmbeddedPropertiesStruct{
  390. S_Embedded_Common: "",
  391. S_Embedded_Different: "embedded_lower",
  392. },
  393. },
  394. structs[1])
  395. }
  396. func TestCommonValueOptimization_InvalidArchSpecificVariants(t *testing.T) {
  397. common := &testPropertiesStruct{name: "common"}
  398. structs := []propertiesContainer{
  399. &testPropertiesStruct{
  400. name: "struct-0",
  401. S_Common: "should-be-but-is-not-common0",
  402. },
  403. &testPropertiesStruct{
  404. name: "struct-1",
  405. S_Common: "should-be-but-is-not-common1",
  406. },
  407. }
  408. extractor := newCommonValueExtractor(common)
  409. h := TestHelper{t}
  410. err := extractor.extractCommonProperties(common, structs)
  411. h.AssertErrorMessageEquals("unexpected error", `field "S_Common" is not tagged as "arch_variant" but has arch specific properties:
  412. "struct-0" has value "should-be-but-is-not-common0"
  413. "struct-1" has value "should-be-but-is-not-common1"`, err)
  414. }