bitbake: toaster: Add tests for error message display on the build dashboard

Add tests to ensure that log messages with CRITICAL level and
with EXCEPTION level are shown in the main errors display
on the build dashboard.

[YOCTO #8320]

(Bitbake rev: 7b3ed62800cb7352154897c1c5ad2440a54df198)

Signed-off-by: Elliot Smith <elliot.smith@intel.com>
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Elliot Smith 2015-10-13 15:35:17 +01:00 committed by Richard Purdie
parent 2517987f8d
commit a9053ac082
1 changed files with 89 additions and 2 deletions

View File

@ -26,15 +26,15 @@ from django.test.client import RequestFactory
from django.core.urlresolvers import reverse
from django.utils import timezone
from orm.models import Project, Release, BitbakeVersion, Package
from orm.models import Project, Release, BitbakeVersion, Package, LogMessage
from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build
from orm.models import Layer_Version, Recipe, Machine, ProjectLayer, Target
from orm.models import CustomImageRecipe, ProjectVariable
from orm.models import Branch
from toastergui.tables import SoftwareRecipesTable
from bs4 import BeautifulSoup
import json
from bs4 import BeautifulSoup
import re
PROJECT_NAME = "test project"
@ -832,3 +832,90 @@ class ProjectPageTests(TestCase):
response = self.client.get(url, follow=True)
self.assertEqual(response.status_code, 200)
class BuildDashboardTests(TestCase):
""" Tests for the build dashboard /build/X """
def setUp(self):
bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/",
branch="master", dirpath="")
release = Release.objects.create(name="release1",
bitbake_version=bbv)
project = Project.objects.create_project(name=PROJECT_NAME,
release=release)
now = timezone.now()
self.build1 = Build.objects.create(project=project,
started_on=now,
completed_on=now)
# exception
msg1 = 'an exception was thrown'
self.exception_message = LogMessage.objects.create(
build=self.build1,
level=LogMessage.EXCEPTION,
message=msg1
)
# critical
msg2 = 'a critical error occurred'
self.critical_message = LogMessage.objects.create(
build=self.build1,
level=LogMessage.CRITICAL,
message=msg2
)
def _get_build_dashboard_errors(self):
"""
Get a list of HTML fragments representing the errors on the
build dashboard
"""
url = reverse('builddashboard', args=(self.build1.id,))
response = self.client.get(url)
soup = BeautifulSoup(response.content)
return soup.select('#errors div.alert-error')
def _check_for_log_message(self, log_message):
"""
Check whether the LogMessage instance <log_message> is
represented as an HTML error in the build dashboard page
"""
errors = self._get_build_dashboard_errors()
self.assertEqual(len(errors), 2)
expected_text = log_message.message
expected_id = str(log_message.id)
found = False
for error in errors:
error_text = error.find('pre').text
text_matches = (error_text == expected_text)
error_id = error['data-error']
id_matches = (error_id == expected_id)
if text_matches and id_matches:
found = True
break
template_vars = (expected_text, error_text,
expected_id, error_id)
assertion_error_msg = 'exception not found as error: ' \
'expected text "%s" and got "%s"; ' \
'expected ID %s and got %s' % template_vars
self.assertTrue(found, assertion_error_msg)
def test_exceptions_show_as_errors(self):
"""
LogMessages with level EXCEPTION should display in the errors
section of the page
"""
self._check_for_log_message(self.exception_message)
def test_criticals_show_as_errors(self):
"""
LogMessages with level CRITICAL should display in the errors
section of the page
"""
self._check_for_log_message(self.critical_message)