xref: /OK3568_Linux_fs/yocto/bitbake/lib/toaster/tests/browser/test_builddashboard_page_artifacts.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#! /usr/bin/env python3
2#
3# BitBake Toaster Implementation
4#
5# Copyright (C) 2013-2016 Intel Corporation
6#
7# SPDX-License-Identifier: GPL-2.0-only
8#
9
10from django.urls 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')
211