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