diff options
author | Elliot Smith <elliot.smith@intel.com> | 2015-10-13 15:35:17 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-10-16 15:00:00 +0100 |
commit | a9053ac0829eb01f6f002587854d01e47a78e6f0 (patch) | |
tree | e415c7d2f14a5223d89c21d835d6d635052924a2 | |
parent | 2517987f8db37d50df03e690be2501447b7eeeb8 (diff) | |
download | poky-a9053ac0829eb01f6f002587854d01e47a78e6f0.tar.gz |
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>
-rw-r--r-- | bitbake/lib/toaster/toastergui/tests.py | 91 |
1 files changed, 89 insertions, 2 deletions
diff --git a/bitbake/lib/toaster/toastergui/tests.py b/bitbake/lib/toaster/toastergui/tests.py index 7c4bd39db3..29dd7fda77 100644 --- a/bitbake/lib/toaster/toastergui/tests.py +++ b/bitbake/lib/toaster/toastergui/tests.py | |||
@@ -26,15 +26,15 @@ from django.test.client import RequestFactory | |||
26 | from django.core.urlresolvers import reverse | 26 | from django.core.urlresolvers import reverse |
27 | from django.utils import timezone | 27 | from django.utils import timezone |
28 | 28 | ||
29 | from orm.models import Project, Release, BitbakeVersion, Package | 29 | from orm.models import Project, Release, BitbakeVersion, Package, LogMessage |
30 | from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build | 30 | from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build |
31 | from orm.models import Layer_Version, Recipe, Machine, ProjectLayer, Target | 31 | from orm.models import Layer_Version, Recipe, Machine, ProjectLayer, Target |
32 | from orm.models import CustomImageRecipe, ProjectVariable | 32 | from orm.models import CustomImageRecipe, ProjectVariable |
33 | from orm.models import Branch | 33 | from orm.models import Branch |
34 | 34 | ||
35 | from toastergui.tables import SoftwareRecipesTable | 35 | from toastergui.tables import SoftwareRecipesTable |
36 | from bs4 import BeautifulSoup | ||
37 | import json | 36 | import json |
37 | from bs4 import BeautifulSoup | ||
38 | import re | 38 | import re |
39 | 39 | ||
40 | PROJECT_NAME = "test project" | 40 | PROJECT_NAME = "test project" |
@@ -832,3 +832,90 @@ class ProjectPageTests(TestCase): | |||
832 | response = self.client.get(url, follow=True) | 832 | response = self.client.get(url, follow=True) |
833 | 833 | ||
834 | self.assertEqual(response.status_code, 200) | 834 | self.assertEqual(response.status_code, 200) |
835 | |||
836 | class BuildDashboardTests(TestCase): | ||
837 | """ Tests for the build dashboard /build/X """ | ||
838 | |||
839 | def setUp(self): | ||
840 | bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/", | ||
841 | branch="master", dirpath="") | ||
842 | release = Release.objects.create(name="release1", | ||
843 | bitbake_version=bbv) | ||
844 | project = Project.objects.create_project(name=PROJECT_NAME, | ||
845 | release=release) | ||
846 | |||
847 | now = timezone.now() | ||
848 | |||
849 | self.build1 = Build.objects.create(project=project, | ||
850 | started_on=now, | ||
851 | completed_on=now) | ||
852 | |||
853 | # exception | ||
854 | msg1 = 'an exception was thrown' | ||
855 | self.exception_message = LogMessage.objects.create( | ||
856 | build=self.build1, | ||
857 | level=LogMessage.EXCEPTION, | ||
858 | message=msg1 | ||
859 | ) | ||
860 | |||
861 | # critical | ||
862 | msg2 = 'a critical error occurred' | ||
863 | self.critical_message = LogMessage.objects.create( | ||
864 | build=self.build1, | ||
865 | level=LogMessage.CRITICAL, | ||
866 | message=msg2 | ||
867 | ) | ||
868 | |||
869 | def _get_build_dashboard_errors(self): | ||
870 | """ | ||
871 | Get a list of HTML fragments representing the errors on the | ||
872 | build dashboard | ||
873 | """ | ||
874 | url = reverse('builddashboard', args=(self.build1.id,)) | ||
875 | response = self.client.get(url) | ||
876 | soup = BeautifulSoup(response.content) | ||
877 | return soup.select('#errors div.alert-error') | ||
878 | |||
879 | def _check_for_log_message(self, log_message): | ||
880 | """ | ||
881 | Check whether the LogMessage instance <log_message> is | ||
882 | represented as an HTML error in the build dashboard page | ||
883 | """ | ||
884 | errors = self._get_build_dashboard_errors() | ||
885 | self.assertEqual(len(errors), 2) | ||
886 | |||
887 | expected_text = log_message.message | ||
888 | expected_id = str(log_message.id) | ||
889 | |||
890 | found = False | ||
891 | for error in errors: | ||
892 | error_text = error.find('pre').text | ||
893 | text_matches = (error_text == expected_text) | ||
894 | |||
895 | error_id = error['data-error'] | ||
896 | id_matches = (error_id == expected_id) | ||
897 | |||
898 | if text_matches and id_matches: | ||
899 | found = True | ||
900 | break | ||
901 | |||
902 | template_vars = (expected_text, error_text, | ||
903 | expected_id, error_id) | ||
904 | assertion_error_msg = 'exception not found as error: ' \ | ||
905 | 'expected text "%s" and got "%s"; ' \ | ||
906 | 'expected ID %s and got %s' % template_vars | ||
907 | self.assertTrue(found, assertion_error_msg) | ||
908 | |||
909 | def test_exceptions_show_as_errors(self): | ||
910 | """ | ||
911 | LogMessages with level EXCEPTION should display in the errors | ||
912 | section of the page | ||
913 | """ | ||
914 | self._check_for_log_message(self.exception_message) | ||
915 | |||
916 | def test_criticals_show_as_errors(self): | ||
917 | """ | ||
918 | LogMessages with level CRITICAL should display in the errors | ||
919 | section of the page | ||
920 | """ | ||
921 | self._check_for_log_message(self.critical_message) | ||