blob: e2623e8ad365fda9184a4910daf30bfbe7aacabe [file] [log] [blame]
Brad Bishop96ff1982019-08-19 13:50:42 -04001#! /usr/bin/env python3
Patrick Williamsc0f7c042017-02-23 20:41:17 -06002#
3# BitBake Toaster Implementation
4#
5# Copyright (C) 2013-2016 Intel Corporation
6#
Brad Bishopc342db32019-05-15 21:57:59 -04007# SPDX-License-Identifier: GPL-2.0-only
Patrick Williamsc0f7c042017-02-23 20:41:17 -06008#
Patrick Williamsc0f7c042017-02-23 20:41:17 -06009
10from django.core.urlresolvers import reverse
11from django.utils import timezone
12
13from tests.browser.selenium_helpers import SeleniumTestCase
14
15from orm.models import Project, Release, BitbakeVersion, Build, Target, Package
16from orm.models import Target_Image_File, TargetSDKFile, TargetKernelFile
17from orm.models import Target_Installed_Package, Variable
18
19class TestBuildDashboardPageArtifacts(SeleniumTestCase):
20 """ Tests for artifacts on the build dashboard /build/X """
21
22 def setUp(self):
23 bbv = BitbakeVersion.objects.create(name='bbv1', giturl='/tmp/',
24 branch='master', dirpath="")
25 release = Release.objects.create(name='release1',
26 bitbake_version=bbv)
27 self.project = Project.objects.create_project(name='test project',
28 release=release)
29
30 def _get_build_dashboard(self, build):
31 """
32 Navigate to the build dashboard for build
33 """
34 url = reverse('builddashboard', args=(build.id,))
35 self.get(url)
36
37 def _has_build_artifacts_heading(self):
38 """
39 Check whether the "Build artifacts" heading is visible (True if it
40 is, False otherwise).
41 """
42 return self.element_exists('[data-heading="build-artifacts"]')
43
44 def _has_images_menu_option(self):
45 """
46 Try to get the "Images" list element from the left-hand menu in the
47 build dashboard, and return True if it is present, False otherwise.
48 """
49 return self.element_exists('li.nav-header[data-menu-heading="images"]')
50
51 def test_no_artifacts(self):
52 """
53 If a build produced no artifacts, the artifacts heading and images
54 menu option shouldn't show.
55 """
56 now = timezone.now()
57 build = Build.objects.create(project=self.project,
58 started_on=now, completed_on=now, outcome=Build.SUCCEEDED)
59
60 Target.objects.create(is_image=False, build=build, task='',
61 target='mpfr-native')
62
63 self._get_build_dashboard(build)
64
65 # check build artifacts heading
66 msg = 'Build artifacts heading should not be displayed for non-image' \
67 'builds'
68 self.assertFalse(self._has_build_artifacts_heading(), msg)
69
70 # check "Images" option in left-hand menu (should not be there)
71 msg = 'Images option should not be shown in left-hand menu'
72 self.assertFalse(self._has_images_menu_option(), msg)
73
74 def test_sdk_artifacts(self):
75 """
76 If a build produced SDK artifacts, they should be shown, but the section
77 for image files and the images menu option should be hidden.
78
79 The packages count and size should also be hidden.
80 """
81 now = timezone.now()
82 build = Build.objects.create(project=self.project,
83 started_on=now, completed_on=timezone.now(),
84 outcome=Build.SUCCEEDED)
85
86 target = Target.objects.create(is_image=True, build=build,
87 task='populate_sdk', target='core-image-minimal')
88
89 sdk_file1 = TargetSDKFile.objects.create(target=target,
90 file_size=100000,
91 file_name='/home/foo/core-image-minimal.toolchain.sh')
92
93 sdk_file2 = TargetSDKFile.objects.create(target=target,
94 file_size=120000,
95 file_name='/home/foo/x86_64.toolchain.sh')
96
97 self._get_build_dashboard(build)
98
99 # check build artifacts heading
100 msg = 'Build artifacts heading should be displayed for SDK ' \
101 'builds which generate artifacts'
102 self.assertTrue(self._has_build_artifacts_heading(), msg)
103
104 # check "Images" option in left-hand menu (should not be there)
105 msg = 'Images option should not be shown in left-hand menu for ' \
106 'builds which didn\'t generate an image file'
107 self.assertFalse(self._has_images_menu_option(), msg)
108
109 # check links to SDK artifacts
110 sdk_artifact_links = self.find_all('[data-links="sdk-artifacts"] li')
111 self.assertEqual(len(sdk_artifact_links), 2,
112 'should be links to 2 SDK artifacts')
113
114 # package count and size should not be visible, no link on
115 # target name
116 selector = '[data-value="target-package-count"]'
117 self.assertFalse(self.element_exists(selector),
118 'package count should not be shown for non-image builds')
119
120 selector = '[data-value="target-package-size"]'
121 self.assertFalse(self.element_exists(selector),
122 'package size should not be shown for non-image builds')
123
124 selector = '[data-link="target-packages"]'
125 self.assertFalse(self.element_exists(selector),
126 'link to target packages should not be on target heading')
127
128 def test_image_artifacts(self):
129 """
130 If a build produced image files, kernel artifacts, and manifests,
131 they should all be shown, as well as the image link in the left-hand
132 menu.
133
134 The packages count and size should be shown, with a link to the
135 package display page.
136 """
137 now = timezone.now()
138 build = Build.objects.create(project=self.project,
139 started_on=now, completed_on=timezone.now(),
140 outcome=Build.SUCCEEDED)
141
142 # add a variable to the build so that it counts as "started"
143 Variable.objects.create(build=build,
144 variable_name='Christopher',
145 variable_value='Lee')
146
147 target = Target.objects.create(is_image=True, build=build,
148 task='', target='core-image-minimal',
149 license_manifest_path='/home/foo/license.manifest',
150 package_manifest_path='/home/foo/package.manifest')
151
152 image_file = Target_Image_File.objects.create(target=target,
153 file_name='/home/foo/core-image-minimal.ext4', file_size=9000)
154
155 kernel_file1 = TargetKernelFile.objects.create(target=target,
156 file_name='/home/foo/bzImage', file_size=2000)
157
158 kernel_file2 = TargetKernelFile.objects.create(target=target,
159 file_name='/home/foo/bzImage', file_size=2000)
160
161 package = Package.objects.create(build=build, name='foo', size=1024,
162 installed_name='foo1')
163 installed_package = Target_Installed_Package.objects.create(
164 target=target, package=package)
165
166 self._get_build_dashboard(build)
167
168 # check build artifacts heading
169 msg = 'Build artifacts heading should be displayed for image ' \
170 'builds'
171 self.assertTrue(self._has_build_artifacts_heading(), msg)
172
173 # check "Images" option in left-hand menu (should be there)
174 msg = 'Images option should be shown in left-hand menu for image builds'
175 self.assertTrue(self._has_images_menu_option(), msg)
176
177 # check link to image file
178 selector = '[data-links="image-artifacts"] li'
179 self.assertTrue(self.element_exists(selector),
180 'should be a link to the image file (selector %s)' % selector)
181
182 # check links to kernel artifacts
183 kernel_artifact_links = \
184 self.find_all('[data-links="kernel-artifacts"] li')
185 self.assertEqual(len(kernel_artifact_links), 2,
186 'should be links to 2 kernel artifacts')
187
188 # check manifest links
189 selector = 'a[data-link="license-manifest"]'
190 self.assertTrue(self.element_exists(selector),
191 'should be a link to the license manifest (selector %s)' % selector)
192
193 selector = 'a[data-link="package-manifest"]'
194 self.assertTrue(self.element_exists(selector),
195 'should be a link to the package manifest (selector %s)' % selector)
196
197 # check package count and size, link on target name
198 selector = '[data-value="target-package-count"]'
199 element = self.find(selector)
200 self.assertEquals(element.text, '1',
201 'package count should be shown for image builds')
202
203 selector = '[data-value="target-package-size"]'
204 element = self.find(selector)
205 self.assertEquals(element.text, '1.0 KB',
206 'package size should be shown for image builds')
207
208 selector = '[data-link="target-packages"]'
209 self.assertTrue(self.element_exists(selector),
210 'link to target packages should be on target heading')