summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/tests/functional/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/tests/functional/utils.py')
-rw-r--r--bitbake/lib/toaster/tests/functional/utils.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/bitbake/lib/toaster/tests/functional/utils.py b/bitbake/lib/toaster/tests/functional/utils.py
new file mode 100644
index 0000000000..7269fa1805
--- /dev/null
+++ b/bitbake/lib/toaster/tests/functional/utils.py
@@ -0,0 +1,89 @@
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3# BitBake Toaster UI tests implementation
4#
5# Copyright (C) 2023 Savoir-faire Linux
6#
7# SPDX-License-Identifier: GPL-2.0-only
8
9
10from time import sleep
11from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException, TimeoutException
12from selenium.webdriver.common.by import By
13
14from orm.models import Build
15
16
17def wait_until_build(test_instance, state):
18 timeout = 60
19 start_time = 0
20 build_state = ''
21 while True:
22 try:
23 if start_time > timeout:
24 raise TimeoutException(
25 f'Build did not reach {state} state within {timeout} seconds'
26 )
27 last_build_state = test_instance.driver.find_element(
28 By.XPATH,
29 '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]',
30 )
31 build_state = last_build_state.get_attribute(
32 'data-build-state')
33 state_text = state.lower().split()
34 if any(x in str(build_state).lower() for x in state_text):
35 return str(build_state).lower()
36 if 'failed' in str(build_state).lower():
37 break
38 except NoSuchElementException:
39 continue
40 except TimeoutException:
41 break
42 start_time += 1
43 sleep(1) # take a breath and try again
44
45def wait_until_build_cancelled(test_instance):
46 """ Cancel build take a while sometime, the method is to wait driver action
47 until build being cancelled
48 """
49 timeout = 30
50 start_time = 0
51 build = None
52 while True:
53 try:
54 if start_time > timeout:
55 raise TimeoutException(
56 f'Build did not reach cancelled state within {timeout} seconds'
57 )
58 last_build_state = test_instance.driver.find_element(
59 By.XPATH,
60 '//*[@id="latest-builds"]/div[1]//div[@class="build-state"]',
61 )
62 build_state = last_build_state.get_attribute(
63 'data-build-state')
64 if 'failed' in str(build_state).lower():
65 break
66 if 'cancelling' in str(build_state).lower():
67 # Change build state to cancelled
68 if not build: # get build object only once
69 build = Build.objects.last()
70 build.outcome = Build.CANCELLED
71 build.save()
72 if 'cancelled' in str(build_state).lower():
73 break
74 except NoSuchElementException:
75 continue
76 except StaleElementReferenceException:
77 continue
78 except TimeoutException:
79 break
80 start_time += 1
81 sleep(1) # take a breath and try again
82
83def get_projectId_from_url(url):
84 # url = 'http://domainename.com/toastergui/project/1656/whatever
85 # or url = 'http://domainename.com/toastergui/project/1/
86 # or url = 'http://domainename.com/toastergui/project/186
87 assert '/toastergui/project/' in url, "URL is not valid"
88 url_to_list = url.split('/toastergui/project/')
89 return int(url_to_list[1].split('/')[0]) # project_id