summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliot Smith <elliot.smith@intel.com>2015-10-13 15:35:17 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-10-16 14:59:41 +0100
commit7b3ed62800cb7352154897c1c5ad2440a54df198 (patch)
treee1b637c39b023ec31b663d47e5b1fb4556195e92
parent07e7bc29a7d976941eeae997f78a25ed6edddfc8 (diff)
downloadbitbake-7b3ed62800cb7352154897c1c5ad2440a54df198.tar.gz
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] Signed-off-by: Elliot Smith <elliot.smith@intel.com> Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
-rw-r--r--lib/toaster/toastergui/tests.py91
1 files changed, 89 insertions, 2 deletions
diff --git a/lib/toaster/toastergui/tests.py b/lib/toaster/toastergui/tests.py
index 7c4bd39db..29dd7fda7 100644
--- a/lib/toaster/toastergui/tests.py
+++ b/lib/toaster/toastergui/tests.py
@@ -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)