diff options
| -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) | ||
