test_core_image_min.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. #! /usr/bin/env python
  2. #
  3. # BitBake Toaster Implementation
  4. #
  5. # Copyright (C) 2016 Intel Corporation
  6. #
  7. # SPDX-License-Identifier: GPL-2.0-only
  8. #
  9. # Tests were part of openembedded-core oe selftest Authored by: Lucian Musat
  10. # Ionut Chisanovici, Paul Eggleton and Cristian Iorga
  11. import os
  12. from django.db.models import Q
  13. from orm.models import Target_Image_File, Target_Installed_Package, Task
  14. from orm.models import Package_Dependency, Recipe_Dependency, Build
  15. from orm.models import Task_Dependency, Package, Target, Recipe
  16. from orm.models import CustomImagePackage
  17. from tests.builds.buildtest import BuildTest
  18. class BuildCoreImageMinimal(BuildTest):
  19. """Build core-image-minimal and test the results"""
  20. def setUp(self):
  21. self.completed_build = self.build("core-image-minimal")
  22. # Check if build name is unique - tc_id=795
  23. def test_Build_Unique_Name(self):
  24. all_builds = Build.objects.all().count()
  25. distinct_builds = Build.objects.values('id').distinct().count()
  26. self.assertEqual(distinct_builds,
  27. all_builds,
  28. msg='Build name is not unique')
  29. # Check if build cooker log path is unique - tc_id=819
  30. def test_Build_Unique_Cooker_Log_Path(self):
  31. distinct_path = Build.objects.values(
  32. 'cooker_log_path').distinct().count()
  33. total_builds = Build.objects.values('id').count()
  34. self.assertEqual(distinct_path,
  35. total_builds,
  36. msg='Build cooker log path is not unique')
  37. # Check if task order is unique for one build - tc=824
  38. def test_Task_Unique_Order(self):
  39. total_task_order = Task.objects.filter(
  40. build=self.built).values('order').count()
  41. distinct_task_order = Task.objects.filter(
  42. build=self.completed_build).values('order').distinct().count()
  43. self.assertEqual(total_task_order,
  44. distinct_task_order,
  45. msg='Errors task order is not unique')
  46. # Check task order sequence for one build - tc=825
  47. def test_Task_Order_Sequence(self):
  48. cnt_err = []
  49. tasks = Task.objects.filter(
  50. Q(build=self.completed_build),
  51. ~Q(order=None),
  52. ~Q(task_name__contains='_setscene')
  53. ).values('id', 'order').order_by("order")
  54. cnt_tasks = 0
  55. for task in tasks:
  56. cnt_tasks += 1
  57. if (task['order'] != cnt_tasks):
  58. cnt_err.append(task['id'])
  59. self.assertEqual(
  60. len(cnt_err), 0, msg='Errors for task id: %s' % cnt_err)
  61. # Check if disk_io matches the difference between EndTimeIO and
  62. # StartTimeIO in build stats - tc=828
  63. # def test_Task_Disk_IO_TC828(self):
  64. # Check if outcome = 2 (SSTATE) then sstate_result must be 3 (RESTORED) -
  65. # tc=832
  66. def test_Task_If_Outcome_2_Sstate_Result_Must_Be_3(self):
  67. tasks = Task.objects.filter(outcome=2).values('id', 'sstate_result')
  68. cnt_err = []
  69. for task in tasks:
  70. if (task['sstate_result'] != 3):
  71. cnt_err.append(task['id'])
  72. self.assertEqual(len(cnt_err),
  73. 0,
  74. msg='Errors for task id: %s' % cnt_err)
  75. # Check if outcome = 1 (COVERED) or 3 (EXISTING) then sstate_result must
  76. # be 0 (SSTATE_NA) - tc=833
  77. def test_Task_If_Outcome_1_3_Sstate_Result_Must_Be_0(self):
  78. tasks = Task.objects.filter(
  79. outcome__in=(Task.OUTCOME_COVERED,
  80. Task.OUTCOME_PREBUILT)).values('id',
  81. 'task_name',
  82. 'sstate_result')
  83. cnt_err = []
  84. for task in tasks:
  85. if (task['sstate_result'] != Task.SSTATE_NA and
  86. task['sstate_result'] != Task.SSTATE_MISS):
  87. cnt_err.append({'id': task['id'],
  88. 'name': task['task_name'],
  89. 'sstate_result': task['sstate_result']})
  90. self.assertEqual(len(cnt_err),
  91. 0,
  92. msg='Errors for task id: %s' % cnt_err)
  93. # Check if outcome is 0 (SUCCESS) or 4 (FAILED) then sstate_result must be
  94. # 0 (NA), 1 (MISS) or 2 (FAILED) - tc=834
  95. def test_Task_If_Outcome_0_4_Sstate_Result_Must_Be_0_1_2(self):
  96. tasks = Task.objects.filter(
  97. outcome__in=(0, 4)).values('id', 'sstate_result')
  98. cnt_err = []
  99. for task in tasks:
  100. if (task['sstate_result'] not in [0, 1, 2]):
  101. cnt_err.append(task['id'])
  102. self.assertEqual(len(cnt_err),
  103. 0,
  104. msg='Errors for task id: %s' % cnt_err)
  105. # Check if task_executed = TRUE (1), script_type must be 0 (CODING_NA), 2
  106. # (CODING_PYTHON), 3 (CODING_SHELL) - tc=891
  107. def test_Task_If_Task_Executed_True_Script_Type_0_2_3(self):
  108. tasks = Task.objects.filter(
  109. task_executed=1).values('id', 'script_type')
  110. cnt_err = []
  111. for task in tasks:
  112. if (task['script_type'] not in [0, 2, 3]):
  113. cnt_err.append(task['id'])
  114. self.assertEqual(len(cnt_err),
  115. 0,
  116. msg='Errors for task id: %s' % cnt_err)
  117. # Check if task_executed = TRUE (1), outcome must be 0 (SUCCESS) or 4
  118. # (FAILED) - tc=836
  119. def test_Task_If_Task_Executed_True_Outcome_0_4(self):
  120. tasks = Task.objects.filter(task_executed=1).values('id', 'outcome')
  121. cnt_err = []
  122. for task in tasks:
  123. if (task['outcome'] not in [0, 4]):
  124. cnt_err.append(task['id'])
  125. self.assertEqual(len(cnt_err),
  126. 0,
  127. msg='Errors for task id: %s' % cnt_err)
  128. # Check if task_executed = FALSE (0), script_type must be 0 - tc=890
  129. def test_Task_If_Task_Executed_False_Script_Type_0(self):
  130. tasks = Task.objects.filter(
  131. task_executed=0).values('id', 'script_type')
  132. cnt_err = []
  133. for task in tasks:
  134. if (task['script_type'] != 0):
  135. cnt_err.append(task['id'])
  136. self.assertEqual(len(cnt_err),
  137. 0,
  138. msg='Errors for task id: %s' % cnt_err)
  139. # Check if task_executed = FALSE (0) and build outcome = SUCCEEDED (0),
  140. # task outcome must be 1 (COVERED), 2 (CACHED), 3 (PREBUILT), 5 (EMPTY) -
  141. # tc=837
  142. def test_Task_If_Task_Executed_False_Outcome_1_2_3_5(self):
  143. builds = Build.objects.filter(outcome=0).values('id')
  144. cnt_err = []
  145. for build in builds:
  146. tasks = Task.objects.filter(
  147. build=build['id'], task_executed=0).values('id', 'outcome')
  148. for task in tasks:
  149. if (task['outcome'] not in [1, 2, 3, 5]):
  150. cnt_err.append(task['id'])
  151. self.assertEqual(len(cnt_err),
  152. 0,
  153. msg='Errors for task id: %s' % cnt_err)
  154. # Key verification - tc=888
  155. def test_Target_Installed_Package(self):
  156. rows = Target_Installed_Package.objects.values('id',
  157. 'target_id',
  158. 'package_id')
  159. cnt_err = []
  160. for row in rows:
  161. target = Target.objects.filter(id=row['target_id']).values('id')
  162. package = Package.objects.filter(id=row['package_id']).values('id')
  163. if (not target or not package):
  164. cnt_err.append(row['id'])
  165. self.assertEqual(len(cnt_err),
  166. 0,
  167. msg='Errors for target installed package id: %s' %
  168. cnt_err)
  169. # Key verification - tc=889
  170. def test_Task_Dependency(self):
  171. rows = Task_Dependency.objects.values('id',
  172. 'task_id',
  173. 'depends_on_id')
  174. cnt_err = []
  175. for row in rows:
  176. task_id = Task.objects.filter(id=row['task_id']).values('id')
  177. depends_on_id = Task.objects.filter(
  178. id=row['depends_on_id']).values('id')
  179. if (not task_id or not depends_on_id):
  180. cnt_err.append(row['id'])
  181. self.assertEqual(len(cnt_err),
  182. 0,
  183. msg='Errors for task dependency id: %s' % cnt_err)
  184. # Check if build target file_name is populated only if is_image=true AND
  185. # orm_build.outcome=0 then if the file exists and its size matches
  186. # the file_size value. Need to add the tc in the test run
  187. def test_Target_File_Name_Populated(self):
  188. builds = Build.objects.filter(outcome=0).values('id')
  189. for build in builds:
  190. targets = Target.objects.filter(
  191. build_id=build['id'], is_image=1).values('id')
  192. for target in targets:
  193. target_files = Target_Image_File.objects.filter(
  194. target_id=target['id']).values('id',
  195. 'file_name',
  196. 'file_size')
  197. cnt_err = []
  198. for file_info in target_files:
  199. target_id = file_info['id']
  200. target_file_name = file_info['file_name']
  201. target_file_size = file_info['file_size']
  202. if (not target_file_name or not target_file_size):
  203. cnt_err.append(target_id)
  204. else:
  205. if (not os.path.exists(target_file_name)):
  206. cnt_err.append(target_id)
  207. else:
  208. if (os.path.getsize(target_file_name) !=
  209. target_file_size):
  210. cnt_err.append(target_id)
  211. self.assertEqual(len(cnt_err), 0,
  212. msg='Errors for target image file id: %s' %
  213. cnt_err)
  214. # Key verification - tc=884
  215. def test_Package_Dependency(self):
  216. cnt_err = []
  217. deps = Package_Dependency.objects.values(
  218. 'id', 'package_id', 'depends_on_id')
  219. for dep in deps:
  220. if (dep['package_id'] == dep['depends_on_id']):
  221. cnt_err.append(dep['id'])
  222. self.assertEqual(len(cnt_err), 0,
  223. msg='Errors for package dependency id: %s' % cnt_err)
  224. # Recipe key verification, recipe name does not depends on a recipe having
  225. # the same name - tc=883
  226. def test_Recipe_Dependency(self):
  227. deps = Recipe_Dependency.objects.values(
  228. 'id', 'recipe_id', 'depends_on_id')
  229. cnt_err = []
  230. for dep in deps:
  231. if (not dep['recipe_id'] or not dep['depends_on_id']):
  232. cnt_err.append(dep['id'])
  233. else:
  234. name = Recipe.objects.filter(
  235. id=dep['recipe_id']).values('name')
  236. dep_name = Recipe.objects.filter(
  237. id=dep['depends_on_id']).values('name')
  238. if (name == dep_name):
  239. cnt_err.append(dep['id'])
  240. self.assertEqual(len(cnt_err), 0,
  241. msg='Errors for recipe dependency id: %s' % cnt_err)
  242. # Check if package name does not start with a number (0-9) - tc=846
  243. def test_Package_Name_For_Number(self):
  244. packages = Package.objects.filter(~Q(size=-1)).values('id', 'name')
  245. cnt_err = []
  246. for package in packages:
  247. if (package['name'][0].isdigit() is True):
  248. cnt_err.append(package['id'])
  249. self.assertEqual(
  250. len(cnt_err), 0, msg='Errors for package id: %s' % cnt_err)
  251. # Check if package version starts with a number (0-9) - tc=847
  252. def test_Package_Version_Starts_With_Number(self):
  253. packages = Package.objects.filter(
  254. ~Q(size=-1)).values('id', 'version')
  255. cnt_err = []
  256. for package in packages:
  257. if (package['version'][0].isdigit() is False):
  258. cnt_err.append(package['id'])
  259. self.assertEqual(
  260. len(cnt_err), 0, msg='Errors for package id: %s' % cnt_err)
  261. # Check if package revision starts with 'r' - tc=848
  262. def test_Package_Revision_Starts_With_r(self):
  263. packages = Package.objects.filter(
  264. ~Q(size=-1)).values('id', 'revision')
  265. cnt_err = []
  266. for package in packages:
  267. if (package['revision'][0].startswith("r") is False):
  268. cnt_err.append(package['id'])
  269. self.assertEqual(
  270. len(cnt_err), 0, msg='Errors for package id: %s' % cnt_err)
  271. # Check the validity of the package build_id
  272. # TC must be added in test run
  273. def test_Package_Build_Id(self):
  274. packages = Package.objects.filter(
  275. ~Q(size=-1)).values('id', 'build_id')
  276. cnt_err = []
  277. for package in packages:
  278. build_id = Build.objects.filter(
  279. id=package['build_id']).values('id')
  280. if (not build_id):
  281. # They have no build_id but if they are
  282. # CustomImagePackage that's expected
  283. try:
  284. CustomImagePackage.objects.get(pk=package['id'])
  285. except CustomImagePackage.DoesNotExist:
  286. cnt_err.append(package['id'])
  287. self.assertEqual(len(cnt_err),
  288. 0,
  289. msg="Errors for package id: %s they have no build"
  290. "associated with them" % cnt_err)
  291. # Check the validity of package recipe_id
  292. # TC must be added in test run
  293. def test_Package_Recipe_Id(self):
  294. packages = Package.objects.filter(
  295. ~Q(size=-1)).values('id', 'recipe_id')
  296. cnt_err = []
  297. for package in packages:
  298. recipe_id = Recipe.objects.filter(
  299. id=package['recipe_id']).values('id')
  300. if (not recipe_id):
  301. cnt_err.append(package['id'])
  302. self.assertEqual(
  303. len(cnt_err), 0, msg='Errors for package id: %s' % cnt_err)
  304. # Check if package installed_size field is not null
  305. # TC must be aded in test run
  306. def test_Package_Installed_Size_Not_NULL(self):
  307. packages = Package.objects.filter(
  308. installed_size__isnull=True).values('id')
  309. cnt_err = []
  310. for package in packages:
  311. cnt_err.append(package['id'])
  312. self.assertEqual(
  313. len(cnt_err), 0, msg='Errors for package id: %s' % cnt_err)
  314. def test_custom_packages_generated(self):
  315. """Test if there is a corresponding generated CustomImagePackage"""
  316. """ for each of the packages generated"""
  317. missing_packages = []
  318. for package in Package.objects.all():
  319. try:
  320. CustomImagePackage.objects.get(name=package.name)
  321. except CustomImagePackage.DoesNotExist:
  322. missing_packages.append(package.name)
  323. self.assertEqual(len(missing_packages), 0,
  324. "Some package were created from the build but their"
  325. " corresponding CustomImagePackage was not found")