aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py3857
1 files changed, 3518 insertions, 339 deletions
diff --git a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py
index 3499cca55bf..0f4358bd98d 100755
--- a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py
+++ b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py
@@ -31,7 +31,8 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import sqlite3 as sqlite
-
+from collections import Counter
+import subprocess
###########################################
# #
@@ -333,6 +334,86 @@ class toaster_cases_base(unittest.TestCase):
# self.log = self.logger_create()
# driver setup
self.setup_browser()
+ self.driver.implicitly_wait(10)
+ self.driver.get(self.base_url)
+ self.driver.maximize_window()
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ try:
+ machine_text = self.driver.find_element_by_id("project-machine-name")
+ if (machine_text.text != "qemux86"):
+ self.driver.find_element_by_id("change-machine-toggle").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("machine-change-input").clear()
+ self.driver.find_element_by_id("machine-change-input").send_keys("qemux86")
+ self.driver.find_element_by_id("machine-change-input").send_keys(Keys.ENTER)
+ self.driver.find_element_by_id("machine-change-btn").click()
+ time.sleep(1)
+ except:
+ logging.error("Could not reset machine back to default value; attempting to continue test")
+ pass
+ layer = True
+ while (layer):
+ try:
+ delete_button = self.driver.find_element_by_xpath("//*[@id='layers-in-project-list']/li[4]/span")
+ delete_button.click()
+ self.driver.find_element_by_link_text("Configuration").click()
+ except:
+ layer = False
+
+ default_distro = "poky"
+ default_fstypes = "ext3 jffs2 tar.bz2"
+ default_package = "package_rpm"
+ default_install = "Not set"
+
+ self.driver.find_element_by_link_text("BitBake variables").click()
+ current_distro = self.driver.find_element_by_id("distro").text
+ if (current_distro != default_distro):
+ self.driver.find_element_by_id('change-distro-icon').click()
+ time.sleep(1)
+ self.driver.find_element_by_id('new-distro').clear()
+ self.driver.find_element_by_id('new-distro').send_keys(default_distro)
+ self.driver.find_element_by_id('apply-change-distro').click()
+ time.sleep(2)
+
+ current_fstypes = self.driver.find_element_by_id("image_fstypes").text
+ if (current_fstypes != default_fstypes):
+ self.driver.find_element_by_id("change-image_fstypes-icon").click()
+ active_checkboxes = default_fstypes.split()
+ checkboxes = self.driver.find_elements_by_class_name("fs-checkbox-fstypes")
+ for element in checkboxes:
+ if (element.get_attribute("checked")):
+ element.click()
+ for element in checkboxes:
+ if (element.get_attribute("value") in active_checkboxes):
+ element.click()
+ self.driver.find_element_by_id("apply-change-image_fstypes").click()
+
+ current_install = self.driver.find_element_by_id("image_install").text
+ if (current_install != default_install):
+ try:
+ self.driver.find_element_by_id("delete-image_install-icon").click()
+ #wait for animation to finish
+ time.sleep(4)
+ except:
+ pass
+
+ current_package = self.driver.find_element_by_id("package_classes").text
+ if (current_package != default_package):
+ self.driver.find_element_by_id("change-package_classes-icon").click()
+ time.sleep(1)
+ select = Select(self.driver.find_element_by_id("package_classes-select"))
+ select.select_by_visible_text("package_rpm")
+ first_box = self.driver.find_element_by_id("package_class_1_input")
+ second_box = self.driver.find_element_by_id("package_class_2_input")
+ if (first_box.get_attribute("checked")):
+ first_box.click()
+ if (second_box.get_attribute("checked")):
+ second_box.click()
+ self.driver.find_element_by_id("apply-change-package_classes").click()
+ time.sleep(2)
@staticmethod
def logger_create():
@@ -609,9 +690,26 @@ class toaster_cases_base(unittest.TestCase):
v = self.driver.find_element_by_xpath(s).text
row_content.append(v)
column = column + 1
- print("row_content=",row_content)
+ #print("row_content=",row_content)
Lists.extend(row_content)
- print Lists[row-1][0]
+ #print Lists[row-1][0]
+ row = row + 1
+ return Lists
+
+ def get_table_data_from_class(self, table_class, row_count, column_count):
+ row = 1
+ Lists = []
+ while row <= row_count:
+ column = 1
+ row_content=[]
+ while column <= column_count:
+ s= "//table[@class='" + table_class + "']/tbody/tr[" + str(row) +"]/td[" + str(column) + "]"
+ v = self.driver.find_element_by_xpath(s).text
+ row_content.append(v)
+ column = column + 1
+ #print("row_content=",row_content)
+ Lists.extend(row_content)
+ #print Lists[row-1][0]
row = row + 1
return Lists
@@ -673,6 +771,71 @@ class toaster_cases_base(unittest.TestCase):
self.assertEqual([], self.verificationErrors)
+ def get_list_elements(self, ul_id):
+ elements = []
+ html_list = self.driver.find_element_by_id(ul_id)
+ items = html_list.find_elements_by_tag_name("li")
+ for item in items:
+ text = item.text
+ elements.append(text)
+
+ return elements
+
+
+ def get_editcolumns_list_elements_by_class(self, ul_class):
+ elements = []
+ html_list = self.driver.find_element_by_css_selector(ul_class)
+ items = html_list.find_elements_by_tag_name("li")
+ for item in items:
+ elements.append(item)
+
+ return elements
+
+ def wait_until_build_finish(self, count_increment, timeout):
+ self.driver.refresh()
+ #check progress bar is displayed to signal a build has started
+ try:
+ self.driver.find_element_by_xpath("//div[@class='progress']").is_displayed()
+ except:
+ print "Unable to start new build"
+ self.fail(msg="Unable to start new build")
+ count = 0
+ failflag = False
+ try:
+ self.driver.refresh()
+ time.sleep(1)
+ print "First check starting"
+ while (self.driver.find_element_by_xpath("//div[@class='progress']").is_displayed()):
+ #print "Looking for build in progress"
+ print 'Builds running for '+str(count)+' minutes'
+ count += count_increment
+ #timeout default is at 179 minutes(3 hours); see set_up method to change
+ if (count > timeout):
+ failflag = True
+ print 'Builds took longer than expected to complete; Failing due to possible build stuck.'
+ self.fail()
+ time.sleep(count_increment*60)
+ self.driver.refresh()
+ except:
+ try:
+ if failflag:
+ self.fail(msg="Builds took longer than expected to complete; Failing due to possible build stuck.")
+ print "Looking for successful build"
+ try:
+ self.driver.find_element_by_xpath("//div[@class='alert build-result alert-success']").is_displayed()
+ except:
+ self.driver.find_element_by_xpath("//div[@class='alert build-result alert-success project-name']").is_displayed()
+ except:
+ if failflag:
+ self.fail(msg="Builds took longer than expected to complete; Failing due to possible build stuck.")
+ print 'Builds did not complete successfully'
+ self.fail(msg="Builds did not complete successfully.")
+ print "Builds complete!"
+
+ def get_text_from_elements(self, css_selector):
+ elements = self.driver.find_elements_by_css_selector(css_selector)
+ return map(lambda x: x.text, elements)
+
###################################################################
# #
# PART III: test cases #
@@ -828,6 +991,7 @@ class toaster_cases(toaster_cases_base):
# Search text box background text is "Search tasks"
self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search tasks']"),\
msg=("background text doesn't exist"))
+
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search").send_keys("busybox")
self.driver.find_element_by_id("search-button").click()
@@ -837,7 +1001,7 @@ class toaster_cases(toaster_cases_base):
# Save screen here
self.save_screenshot(screenshot_type='selenium', append_name='step5_2')
self.driver.find_element_by_id("edit-columns-button").click()
- self.driver.find_element_by_id("cpu_used").click()
+ self.driver.find_element_by_id("cpu_time_system").click()
self.driver.find_element_by_id("disk_io").click()
self.driver.find_element_by_id("recipe_version").click()
self.driver.find_element_by_id("time_taken").click()
@@ -845,8 +1009,8 @@ class toaster_cases(toaster_cases_base):
# The operation is the same as case901
# dict: {lint text name : actual class name}
table_head_dict = {'Order':'order', 'Recipe':'recipe_name', 'Task':'task_name', 'Executed':'executed', \
- 'Outcome':'outcome', 'Cache attempt':'cache_attempt', 'Time (secs)':'time_taken', 'CPU usage':'cpu_used', \
- 'Disk I/O (ms)':'disk_io'}
+ 'Outcome':'outcome', 'Cache attempt':'cache_attempt', 'Time (secs)':'time_taken', 'System CPU time (secs)':'cpu_time_system', \
+ 'Disk I/O (bytes)':'disk_io'}
for key in table_head_dict:
# This is tricky here: we are doing so because there may be more than 1
# same-name link_text in one page. So we only find element inside the table
@@ -862,20 +1026,25 @@ class toaster_cases(toaster_cases_base):
or (not column_list) :
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_text_from_elements(selector)
- #column_list = self.get_table_column_text("class", table_head_dict[key])
self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list), \
msg=("%s column not in any order" % key))
elif is_list_inverted(column_list):
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_text_from_elements(selector)
- #column_list = self.get_table_column_text("class", table_head_dict[key])
self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
else:
- self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
- self.find_element_by_link_text_in_table(self.table_name, key).click()
- column_list = self.get_text_from_elements(selector)
- #column_list = self.get_table_column_text("class", table_head_dict[key])
- self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
+ if table_head_dict[key] == "disk_io":
+ column_list = list(elem.replace(',','') for elem in column_list)
+ self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
+ self.find_element_by_link_text_in_table(self.table_name, key).click()
+ column_list = self.get_text_from_elements(selector)
+ column_list = list(elem.replace(',','') for elem in column_list)
+ self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
+ else:
+ self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
+ self.find_element_by_link_text_in_table(self.table_name, key).click()
+ column_list = self.get_text_from_elements(selector)
+ self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
# step 8-10
# filter dict: {link text name : filter table name in xpath}
filter_dict = {'Executed':'filter_executed', 'Outcome':'filter_outcome', 'Cache attempt':'filter_cache_attempt'}
@@ -924,17 +1093,17 @@ class toaster_cases(toaster_cases_base):
'Time':{
'class':'time_taken',
'check_head_list':['Recipe', 'Task', 'Executed', 'Outcome', 'Time (secs)'],
- 'check_column_list':['cpu_used', 'cache_attempt', 'disk_io', 'order', 'recipe_version']
+ 'check_column_list':['cpu_time_system', 'cache_attempt', 'disk_io', 'order', 'recipe_version']
},
- 'CPU usage':{
- 'class':'cpu_used',
- 'check_head_list':['Recipe', 'Task', 'Executed', 'Outcome', 'CPU usage'],
+ 'CPU time':{
+ 'class':'cpu_time_system',
+ 'check_head_list':['Recipe', 'Task', 'Executed', 'Outcome', 'System CPU time (secs)'],
'check_column_list':['cache_attempt', 'disk_io', 'order', 'recipe_version', 'time_taken']
},
'Disk I/O':{
'class':'disk_io',
- 'check_head_list':['Recipe', 'Task', 'Executed', 'Outcome', 'Disk I/O (ms)'],
- 'check_column_list':['cpu_used', 'cache_attempt', 'order', 'recipe_version', 'time_taken']
+ 'check_head_list':['Recipe', 'Task', 'Executed', 'Outcome', 'Disk I/O (bytes)'],
+ 'check_column_list':['cpu_time_system', 'cache_attempt', 'order', 'recipe_version', 'time_taken']
}
}
for key in test_dict:
@@ -944,6 +1113,8 @@ class toaster_cases(toaster_cases_base):
for item in test_dict[key]['check_head_list']:
self.assertTrue(item in head_list, msg=("%s not in head row" % item))
column_list = self.get_table_column_text('class', test_dict[key]['class'])
+ if test_dict[key]['class'] == "disk_io":
+ column_list = list(elem.replace(',','') for elem in column_list)
self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
self.driver.find_element_by_id("edit-columns-button").click()
@@ -1014,6 +1185,7 @@ class toaster_cases(toaster_cases_base):
print rows_displayed
self.assertTrue(self.get_table_element(self.table_name, rows_displayed))
self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1))
+
# Check the default table is sorted by Recipe
tasks_column_count = len(self.driver.find_elements_by_xpath("/html/body/div[2]/div/div[2]/div[2]/table/tbody/tr/td[1]"))
print tasks_column_count
@@ -1021,8 +1193,10 @@ class toaster_cases(toaster_cases_base):
#print default_column_list
self.assertTrue(is_list_sequenced(default_column_list))
+
# Search text box background text is "Search recipes"
self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
+
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search").send_keys(test_package1)
self.driver.find_element_by_id("search-button").click()
@@ -1030,12 +1204,14 @@ class toaster_cases(toaster_cases_base):
self.save_screenshot(screenshot_type='selenium', append_name='step4')
self.driver.find_element_by_css_selector("i.icon-remove").click()
self.save_screenshot(screenshot_type='selenium', append_name='step4_2')
+
self.driver.find_element_by_id("edit-columns-button").click()
self.driver.find_element_by_id("depends_on").click()
self.driver.find_element_by_id("layer_version__branch").click()
self.driver.find_element_by_id("layer_version__layer__commit").click()
self.driver.find_element_by_id("depends_by").click()
self.driver.find_element_by_id("edit-columns-button").click()
+
self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click()
# Check the inverted table by Recipe
# Recipe doesn't have class name
@@ -1108,9 +1284,8 @@ class toaster_cases(toaster_cases_base):
time.sleep(5)
self.assertTrue(is_list_inverted(column_list))
-
try:
- self.driver.find_element_by_partial_link_text("acl").click()
+ self.driver.find_element_by_xpath("//*[@id='otable']/tbody/tr[1]/td[1]/a").click()
time.sleep(5)
except:
self.driver.find_element_by_partial_link_text("zlib").click()
@@ -1130,33 +1305,7 @@ class toaster_cases(toaster_cases_base):
#self.driver.find_element_by_css_selector("i.icon-remove").click()
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search-button").click()
- """
- # Bug 5919
- print "bug"
- for key in table_head_dict:
- print key
- self.find_element_by_link_text_in_table(self.table_name, key).click()
- self.driver.find_element_by_id("edit-columns-button").click()
- if key == 'Recipe':
- print "pass"
- else:
- self.driver.find_element_by_id(table_head_dict[key]).click()
- self.driver.find_element_by_id("edit-columns-button").click()
- self.browser_delay()
- # After hide the column, the default table should be sorted by Recipe
- tasks_column_count = len(self.driver.find_elements_by_partial_link_text("acl"))
- #print tasks_column_count
- default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1)
- #print default_column_list
- self.assertTrue(is_list_sequenced(default_column_list))
- self.driver.find_element_by_id("edit-columns-button").click()
- self.driver.find_element_by_id("recipe_file").click()
- self.driver.find_element_by_id("recipe_section").click()
- self.driver.find_element_by_id("recipe_license").click()
- self.driver.find_element_by_id("layer_version__layer__name").click()
- self.driver.find_element_by_id("edit-columns-button").click()
- """
##############
# CASE 911 #
@@ -1246,6 +1395,7 @@ class toaster_cases(toaster_cases_base):
self.save_screenshot(screenshot_type='selenium', append_name='step4')
self.driver.find_element_by_id("edit-columns-button").click()
+
##############
# CASE 914 #
##############
@@ -1457,6 +1607,7 @@ class toaster_cases(toaster_cases_base):
for item in ['Outcome', 'Recipe', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', 'Time', "Image files", "Project"]:
self.failUnless(item in head_list, msg=item+' is missing from table head.')
+
##############
# CASE 924 #
##############
@@ -1653,6 +1804,7 @@ class toaster_cases(toaster_cases_base):
#.//*[@id=str(rows_displayed)]/td[1]/a
self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]"))
+
# click 1st package, then go back to check if it's still those rows shown.
self.driver.find_element_by_xpath(xpath_table + "/tr[1]/td[1]/a").click()
time.sleep(3)
@@ -1846,7 +1998,7 @@ class toaster_cases(toaster_cases_base):
self.driver.get(self.base_url)
# step3&4: so far we're not sure if there's "successful build" or "failed
# build".If either of them doesn't exist, we can still go on other steps
- check_list = ['Configuration', 'Tasks', 'Recipes', 'Packages', 'Time', 'CPU usage', 'Disk I/O']
+ check_list = ['Configuration', 'Tasks', 'Recipes', 'Packages', 'Time', 'CPU time', 'Disk I/O']
has_successful_build = 1
has_failed_build = 1
try:
@@ -1953,394 +2105,3421 @@ class toaster_cases(toaster_cases_base):
self.failIf(True)
####################################################################################################
-# Starting backend tests ###########################################################################
+# Starting project tests ###########################################################################
####################################################################################################
+
+ ##############
+ # CASE 1069 #
+ ##############
+ def test_1069(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ layer_list = ['Layer', 'Summary', 'Git revision', 'Dependencies', 'Add | Remove']
+ self.driver.find_element_by_partial_link_text("Layers").click()
+ time.sleep(1)
+
+ # step 3
+ self.driver.find_element_by_id('search-input-layerstable').send_keys('meta-yocto')
+ time.sleep(1)
+ self.driver.find_element_by_id('search-submit-layerstable').click()
+ time.sleep(1)
+
+ self.assertTrue(self.driver.find_element_by_partial_link_text('meta-yocto'), msg=("meta-yocto layer not find"))
+ self.assertTrue(self.driver.find_element_by_partial_link_text('meta-yocto-bsp'), msg=("meta-yocto-bsp layer not find"))
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ time.sleep(1)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+
+ head_list = self.get_table_head_text('layerstable')
+ time.sleep(1)
+ for item in layer_list:
+ self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
+
+ #step 5
+ layer_revision = self.driver.find_elements_by_class_name('revision')
+ layer_rev = layer_revision[1].text
+ self.driver.find_element_by_partial_link_text('Configuration').click()
+ time.sleep(1)
+ revision = self.driver.find_element_by_id("project-release-title").text
+ self.assertTrue(layer_rev in revision, msg=("revision difference"))
+ self.driver.find_element_by_partial_link_text("Layers").click()
+
+ #step 6-7
+ self.driver.find_element_by_id("search-input-layerstable").send_keys('e100-bsp')
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(1)
+ self.assertTrue(self.driver.find_element_by_xpath(".//*[@id='layerstable']/tbody/tr/td[6]/a"), msg="no dependencies button")
+ self.driver.find_element_by_xpath(".//*[@id='layerstable']/tbody/tr/td[6]/a").click()
+ time.sleep(2)
+
+ #step 8
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
+ self.driver.find_element_by_id("checkbox-layer__vcs_url").click()
+ self.driver.find_element_by_id("checkbox-git_subdir").click()
+ time.sleep(2)
+ self.assertTrue(self.driver.find_element_by_xpath(".//*[@id='layerstable']/tbody/tr[1]/td[3]/a[2]/i"), msg="git repository url not found")
+ self.assertTrue(self.driver.find_element_by_xpath(".//*[@id='layerstable']/tbody/tr[1]/td[4]/a[2]/i"), msg="subdirectory url not found")
+ time.sleep(2)
+
+
+ ##############
+ # CASE 1070 #
+ ##############
+ def test_1070(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ columns = ['layer__name', 'layer__summary', 'layer__vcs_url', 'git_subdir', 'revision', 'dependencies', 'add-del-layers']
+ time.sleep(1)
+ self.driver.find_element_by_id("view-compatible-layers").click()
+ time.sleep(1)
+
+ #step 3
+ element = self.driver.find_element_by_css_selector('th.layer__name')
+ self.assertTrue("i class=\"icon-caret-down\" style=\"display: inline;\"" in element.get_attribute('innerHTML'), msg='Table not sorted by layer')
+
+ #step 4
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-layer__vcs_url").click()
+ self.driver.find_element_by_id("checkbox-git_subdir").click()
+
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ #step 5
+ for column in columns:
+ element = self.driver.find_element_by_css_selector('th.%s' % column)
+ if column == 'layer__name':
+ self.assertTrue("a class=\"sorted\"" in element.get_attribute('innerHTML'), msg='%s column is sortable' %column)
+ else:
+ self.assertFalse("a class=\"sorted\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+
+ #step 6-7
+ self.driver.find_element_by_xpath("//*[@id='layerstable']/thead/th[1]/a").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("meta-intel")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(2)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='layer__name']")
+ values = [element.text for element in elements]
+
+ if is_list_inverted(values):
+ self.driver.find_element_by_xpath("//*[@id='layerstable']/thead/th[1]/a").click()
+ time.sleep(2)
+ elements = self.driver.find_elements_by_xpath("//td[@class='layer__name']")
+ values = [element.text for element in elements]
+ self.assertTrue(is_list_sequenced(values), msg=("Layer column not in order" ))
+ else:
+ self.assertTrue(is_list_sequenced(values), msg=("Layer column not sequenced"))
+ self.driver.find_element_by_xpath("//*[@id='layerstable']/thead/th[1]/a").click()
+ time.sleep(2)
+ elements = self.driver.find_elements_by_xpath("//td[@class='layer__name']")
+ values = [element.text for element in elements]
+ self.assertTrue(is_list_inverted(values), msg=("Layer column not inverted" ))
+
+ selected_layer = values[0]
+ self.driver.find_element_by_partial_link_text(selected_layer).click()
+ time.sleep(1)
+ self.driver.back()
+ time.sleep(2)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='layer__name']")
+ values2 = [element.text for element in elements]
+ self.assertEqual(values, values2, "Layer column is not sorted properly")
+ time.sleep(3)
+
+
+ ##############
+ # CASE 1073 #
+ ##############
+ def test_1073(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ layer_list = ['Layer', 'Summary', 'Subdirectory', 'Git repository URL','Git revision', 'Dependencies', 'Add | Remove']
+ time.sleep(1)
+ self.driver.find_element_by_id("view-compatible-layers").click()
+ time.sleep(1)
+
+ # step 3
+ self.assertTrue(self.driver.find_element_by_id("search-input-layerstable"), "Search input not found")
+ self.assertTrue(self.driver.find_element_by_id("search-submit-layerstable"), " Search button not found")
+ all_layers = self.driver.find_element_by_class_name("table-count-layerstable").text
+
+ # step 4
+ self.assertEqual("Search compatible layers", self.driver.find_element_by_id("search-input-layerstable").get_attribute("placeholder") \
+ ,"Different placeholder text")
+
+ # step 5
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("c")
+ self.assertEqual("c",self.driver.find_element_by_id("search-input-layerstable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(2)
+
+ # step 6
+ # returned results
+ self.assertEqual("core",self.driver.find_element_by_id("search-input-layerstable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ layers_after_search = self.driver.find_element_by_class_name("table-count-layerstable").text
+ self.assertNotEqual(all_layers,layers_after_search, msg="Same compatibles layers")
+
+ self.driver.find_element_by_xpath("//*[@id='table-chrome-layerstable']/div/div[1]/a/i").click()
+ time.sleep(2)
+
+ layers_after_clear_search = self.driver.find_element_by_class_name("table-count-layerstable").text
+ self.assertEqual(all_layers, layers_after_clear_search, msg="Different number of compatibles layers")
+
+ #no results
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("dkasashdsakjdhasjkdashdjk")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+
+ time.sleep(2)
+
+ no_layers = self.driver.find_element_by_class_name("table-count-layerstable").text
+ if no_layers=="0":
+ self.driver.find_element_by_xpath("//*[@id='no-results-layerstable']/div/form/button[2]").click()
+ time.sleep(2)
+ layers_show_all = self.driver.find_element_by_class_name("table-count-layerstable").text
+ self.assertEqual(all_layers, layers_show_all, msg="Different number of compatibles layers")
+ else:
+ self.fail(msg='Search is not working properly')
+
+ # step 7
+ self.driver.find_element_by_id("edit-columns-button").click()
+ self.driver.find_element_by_id("checkbox-layer__vcs_url").click()
+ self.driver.find_element_by_id("checkbox-git_subdir").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(2)
+
+ head_list = self.get_table_head_text('layerstable')
+ for item in layer_list:
+ self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
+
+ # step 8
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ self.driver.find_element_by_id("in_current_project").click()
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+
+ time.sleep(2)
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ # bug 8125
+ self.driver.find_element_by_id("in_current_project").click()
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_xpath(".//*[@id='table-chrome-layerstable']/div/div[1]/a/i").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied after remove search - bug 8125")
+
+
##############
- # CASE 1066 #
+ # CASE 1078 #
##############
- def test_1066(self):
+ def test_1078(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select count(name) from orm_project a, auth_user b where a.user_id = b.id and b.username='_anonuser';"
- cursor.execute(query)
- data = cursor.fetchone()
- self.failUnless(data >= 1)
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ initial_layers = self.get_list_elements("layers-in-project-list")
+ self.driver.find_element_by_id("view-compatible-layers").click()
+ time.sleep(1)
+
+ #step 3
+ head_list = self.get_table_head_text('layerstable')
+ self.assertTrue('Add | Remove' in head_list, msg=("Add | Remove not found in Directory structure table head"))
+
+ # sep 4
+ layer = "meta-intel-iot-devkit"
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys(layer)
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+
+ time.sleep(3)
+ if layer in initial_layers:
+ remove_layer = self.driver.find_elements_by_css_selector("i.icon-trash")
+ remove_layer[0].click()
+
+ time.sleep(2)
+ add_layer = self.driver.find_elements_by_css_selector("i.icon-plus")
+ add_layer[0].click()
+
+ time.sleep(1)
+ dependecies_layers = self.get_list_elements("dependencies-list")
+ avail_options = self.driver.find_elements_by_xpath("//*[@id='dependencies-list']//*[@class='checkbox']")
+
+ unselected_layer = avail_options[0].text
+ avail_options[0].click()
+ time.sleep(2)
+ dependecies_layers.pop(0)
+ time.sleep(1)
+
+ # click Add layers
+ self.driver.find_element_by_xpath("//*[@id='dependencies-modal-form']//*[@type='submit']").click()
+ time.sleep(1)
+ message = self.driver.find_element_by_id("change-notification-msg").text
+
+ layers_added = dependecies_layers
+ layers_added.append(layer)
+
+ nr_layers=str(len(layers_added))
+ self.assertIn(nr_layers,message, "Different number layer in message %s " %nr_layers)
+
+ for elem in layers_added:
+ self.assertIn(elem, message, "Layer %s not found " %elem)
+
+ self.driver.find_element_by_partial_link_text('Configuration').click()
+ time.sleep(2)
+
+ project_layers = self.get_list_elements("layers-in-project-list")
+ self.assertNotIn(unselected_layer,project_layers, msg="Found unselected layer %s in Project Layers" %unselected_layer)
+
+ expected_layers = initial_layers + layers_added
+ self.assertEqual(Counter(expected_layers), Counter(project_layers),msg="Dependencies layers not added to the project")
+
+ self.driver.find_element_by_id("view-compatible-layers").click()
+ time.sleep(1)
+ for elem in layers_added:
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys(elem)
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(1)
+
+ remove_layer = self.driver.find_elements_by_css_selector("i.icon-trash")
+ for index in range(0, len(remove_layer)):
+ try:
+ remove_layer[index].click()
+ except:
+ print index
+
+ time.sleep(1)
+
+ message = self.driver.find_element_by_id("change-notification-msg").text
+
+ self.assertIn(elem, message, msg="Different layer removed: %s" %elem)
+ self.assertIn('removed', message, msg="Not found removed in notification message")
+
+ self.driver.find_element_by_partial_link_text('Configuration').click()
+ time.sleep(2)
+
+ project_layers = self.get_list_elements("layers-in-project-list")
+
+ for item in layers_added:
+ self.assertTrue(item not in project_layers, msg=("%s layer found in project layers after remove" % item))
+
##############
- # CASE 1071 #
+ # CASE 1079 #
##############
- def test_1071(self):
+ def test_1079(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select name from orm_release;"
- cursor.execute(query)
- data = cursor.fetchall()
- for i in range(0,4):
- data[i] = data[i][0]
- data.sort()
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_data = []
- for i in range (0,4):
- json_data.append(json_parse['releases'][i]['name'])
- json_data.sort()
- print json_data
- self.failUnless(data == json_data)
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ default_image_list = ['Image recipe', 'Version', 'Description', 'Layer', 'Build']
+ time.sleep(0.5)
+
+ #step 3
+ self.driver.find_element_by_link_text("Image recipes").click()
+ time.sleep(0.5)
+
+ #step 4
+ l = self.get_table_data('imagerecipestable', 10, 5)
+ self.assertTrue(l != [], msg="Image recipes table is not populated")
+
+ head_list = self.get_table_head_text('imagerecipestable')
+ for item in default_image_list:
+ self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
+
##############
- # CASE 1072 #
+ # CASE 1080 #
##############
- def test_1072(self):
+ def test_1080(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select value from orm_toastersetting where name like 'DEFCONF%';"
- cursor.execute(query)
- data = cursor.fetchall()
- for i in range(0,6):
- data[i] = data[i][0]
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_data=json_parse['config']
- json_data = json_data.values()
- print json_data
- self.failUnless(data == json_data)
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ image_recipes_sortable_dict = {'Image recipe':'name', 'Section':'section', 'Layer':'layer_version__layer__name', 'License':'license'}
+ image_recipes_not_sortable_dict = {'Version':'version', 'Description':'get_description_or_summary', 'Recipe file':'recipe-file', \
+ 'Git revision':'layer_version__get_vcs_reference', 'Build':'add-del-layers'}
+ time.sleep(0.5)
+
+ #step 2
+ self.driver.find_element_by_link_text("Image recipes").click()
+ time.sleep(0.5)
+
+ #step 3
+ element = self.driver.find_element_by_css_selector('th.name')
+ self.assertTrue("i class=\"icon-caret-down\" style=\"display: inline;\"" in element.get_attribute('innerHTML'),\
+ msg='Table not sorted by Image recie')
+
+ #step 4
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-recipe-file").click()
+ self.driver.find_element_by_id("checkbox-section").click()
+ self.driver.find_element_by_id("checkbox-license").click()
+ self.driver.find_element_by_id("checkbox-layer_version__get_vcs_reference").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ #step 5
+ for column in image_recipes_sortable_dict:
+ element = self.driver.find_element_by_css_selector('th.%s' % image_recipes_sortable_dict[column])
+ time.sleep(1)
+ if column == 'Image recipe':
+ self.assertTrue("a class=\"sorted\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+ else:
+ self.assertTrue("href=\"#\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+
+ for column in image_recipes_not_sortable_dict:
+ element = self.driver.find_element_by_css_selector('th.%s' %image_recipes_not_sortable_dict[column])
+ time.sleep(1)
+ self.assertTrue("<span class=\"muted\">" in element.get_attribute('innerHTML'), msg='%s column is sortable' %column)
+
+ #step 6
+ e = self.driver.find_element_by_css_selector('th.%s' % image_recipes_sortable_dict['Image recipe'])
+ e.click()
+ time.sleep(1)
+ self.assertTrue("<i class=\"icon-caret-up\"" in e.get_attribute('innerHTML'),\
+ msg='Image recipe is not sorted descendent')
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("meta-intel")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+ time.sleep(1)
+
+ #step 8
+ e = self.driver.find_element_by_css_selector('th.%s' % image_recipes_sortable_dict['Image recipe'])
+ self.assertTrue("<i class=\"icon-caret-up\"" in e.get_attribute('innerHTML'),\
+ msg='Image recipe is not sorted descendent after search')
+
+ #continue step 6
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ values = [element.text for element in elements]
+
+ selected_recipe = values[0]
+ self.driver.find_element_by_partial_link_text(selected_recipe).click()
+ time.sleep(1)
+ self.driver.back()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ values2 = [element.text for element in elements]
+ self.assertEqual(values, values2, "Image Recipe column is not sorted properly")
+
+ #step 7
+ element = self.driver.find_element_by_css_selector('th.%s' % image_recipes_sortable_dict['Section'])
+ element.click()
+ time.sleep(1)
+ self.assertTrue("a class=\"sorted\"" in element.get_attribute('innerHTML'), msg='Table is not sort by Section')
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-section").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ values3 = [element.text for element in elements]
+ invers = list(reversed(values))
+ self.assertEqual(invers, values3, msg="Default sorting was not restore")
##############
- # CASE 1074 #
+ # CASE 1081 #
##############
- def test_1074(self):
+ def test_1081(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select name from orm_layersource;"
- cursor.execute(query)
- data = cursor.fetchall()
- for i in range(0,3):
- data[i] = data[i][0]
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_data = []
- for i in range(0,3):
- json_data.append(json_parse['layersources'][i]['name'])
- print json_data
- self.failUnless(set(data) == set(json_data))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ target_list = ['Image recipe', 'Version', 'Description', 'Recipe file', 'Section', 'Layer', 'License', \
+ 'Git revision', 'Build']
+ time.sleep(1)
+
+ #step 2
+ self.driver.find_element_by_link_text("Image recipes").click()
+ time.sleep(1)
+
+ # step 3
+ self.assertTrue(self.driver.find_element_by_id("search-input-imagerecipestable"), "Search input not found")
+ self.assertTrue(self.driver.find_element_by_id("search-submit-imagerecipestable"), " Search button not found")
+ all_targets = self.driver.find_element_by_class_name("table-count-imagerecipestable").text
+
+ # step 4
+ self.assertEqual("Search compatible image recipes", \
+ self.driver.find_element_by_id("search-input-imagerecipestable").get_attribute("placeholder") \
+ ,"Different placeholder text")
+
+ # step 5
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("c")
+ time.sleep(2)
+ self.assertEqual("c",self.driver.find_element_by_id("search-input-imagerecipestable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+ time.sleep(2)
+
+ # step 6
+ # returned results
+ self.assertEqual("core", self.driver.find_element_by_id("search-input-imagerecipestable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ targets_after_search = self.driver.find_element_by_class_name("table-count-imagerecipestable").text
+ self.assertNotEqual(all_targets, targets_after_search, msg="Same compatibles targets")
+
+ self.driver.find_element_by_xpath("//*[@id='table-chrome-imagerecipestable']/div/div[1]/a/i").click()
+ time.sleep(2)
+
+ targets_after_clear_search = self.driver.find_element_by_class_name("table-count-imagerecipestable").text
+ self.assertEqual(all_targets, targets_after_clear_search, msg="Different number of compatibles targets")
+
+ #no results
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("dkasashdsakjdhasjkdashdjk")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+
+ time.sleep(3)
+ no_targets = self.driver.find_element_by_class_name("table-count-imagerecipestable").text
+ if no_targets=="0":
+ self.driver.find_element_by_xpath("//*[@id='no-results-imagerecipestable']/div/form/button[2]").click()
+ time.sleep(2)
+ targets_show_all = self.driver.find_element_by_class_name("table-count-imagerecipestable").text
+ self.assertEqual(all_targets, targets_show_all, msg="Different number of compatibles targets")
+ else:
+ self.fail(msg='Search is not working properly')
+
+ # step 7
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-recipe-file").click()
+ self.driver.find_element_by_id("checkbox-section").click()
+ self.driver.find_element_by_id("checkbox-license").click()
+ self.driver.find_element_by_id("checkbox-layer_version__get_vcs_reference").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+ time.sleep(1)
+
+ head_list = self.get_table_head_text('imagerecipestable')
+ for item in target_list:
+ self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
+
+ # step 8
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ self.driver.find_element_by_id("in_current_project").click()
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+
+ time.sleep(2)
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ # bug 8125
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_xpath(".//*[@id='table-chrome-imagerecipestable']/div/div[1]/a/i").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied after remove search - bug 8125")
+
##############
- # CASE 1075 #
+ # CASE 1094 #
##############
- def test_1075(self):
+ def test_1094(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select value from orm_toastersetting where name like 'DEFAULT_RELEASE';"
- cursor.execute(query)
- data = cursor.fetchall()
- data = data[0][0]
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_data = json_parse['defaultrelease']
- print json_data
- self.failUnless(set(data) == set(json_data))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("view-compatible-layers").click()
+ time.sleep(1)
+
+ # step 3
+ add_remove_element = self.driver.find_element_by_class_name("add-del-layers")
+ self.assertIn("<i class=\"icon-filter filtered\"></i>", add_remove_element.get_attribute('innerHTML'), \
+ msg='Add|Remove filter dose not exist')
+
+ # step 4
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:not_in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:all").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ # step 5
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+
+ time.sleep(2)
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
##############
- # CASE 1076 #
+ # CASE 1095 #
##############
- def test_1076(self):
+ def test_1095(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Image recipes").click()
+ time.sleep(1)
+
+ # step 3
+ build_element = self.driver.find_element_by_class_name("add-del-layers")
+ self.assertIn("<i class=\"icon-filter filtered\"></i>", build_element.get_attribute('innerHTML'), \
+ msg='Build filter dose not exist')
+
+ # step 4
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:not_in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:all").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ # step 5
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
- print 'Checking branches for "Local Yocto Project"'
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select name from orm_branch where layer_source_id=1;"
- cursor.execute(query)
- data = cursor.fetchall()
- lenght = len(data)
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+
+ time.sleep(2)
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+
+ ##############
+ # CASE 1100 #
+ ##############
+ def test_1100(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("BitBake variables").click()
+ time.sleep(1)
+
+ distro_text = self.driver.find_element_by_id("distro").text
+ self.assertTrue((distro_text == "poky"), msg="DISTRO variable has unexpected value")
+
+ image_fstypes_text = self.driver.find_element_by_id("image_fstypes").text
+ self.assertTrue((image_fstypes_text == "ext3 jffs2 tar.bz2"), msg="IMAGE_FSTYPES variable has unexpected value")
+
+ image_install_text = self.driver.find_element_by_id("image_install").text
+ self.assertTrue((image_install_text == "Not set"), msg="IMAGE_INSTALL_append variable has unexpected value")
+
+ package_classes_text = self.driver.find_element_by_id("package_classes").text
+ self.assertTrue((package_classes_text == "package_rpm"), msg="PACKAGE_CLASSES variable has unexpected value")
+
+ variable_text = self.driver.find_element_by_id("variable").text
+ variable_placeholder = self.driver.find_element_by_id("variable").get_attribute("placeholder")
+ self.assertTrue((variable_text == ""), msg="Variable textbox is not empty")
+ self.assertTrue((variable_placeholder == "Type variable name"), msg="Variable placeholder has unexpected value")
+
+ value_text = self.driver.find_element_by_id("value").text
+ value_placeholder = self.driver.find_element_by_id("value").get_attribute("placeholder")
+ self.assertTrue((value_text == ""), msg="Value textbox is not empty")
+ self.assertTrue((value_placeholder == "Type variable value"), msg="Value placeholder has unexpected value")
+
+ button_enabled = self.driver.find_element_by_id("add-configvar-button").is_enabled()
+ self.assertFalse((button_enabled), msg="Add variable button is enabled; it should not be")
+
+
+ ##############
+ # CASE 1102 #
+ ##############
+ def test_1102(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("BitBake variables").click()
+ time.sleep(1)
+
+ #checking distro variable elements
try:
- for i in range(0,lenght):
- data[i] = data[i][0]
+ self.driver.find_element_by_id("change-distro-icon").click()
except:
- pass
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_location = json_parse['layersources'][0]['name']
- print json_location
- json_data = json_parse['layersources'][0]['branches']
- print json_data
- self.failUnless(set(data) == set(json_data))
-
- print 'Checking branches for "OpenEmbedded"'
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select name from orm_branch where layer_source_id=3;"
- cursor.execute(query)
- data = cursor.fetchall()
- lenght = len(data)
- for i in range(0,lenght):
- data[i] = data[i][0]
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_location = json_parse['layersources'][1]['name']
- print json_location
- json_data = json_parse['layersources'][1]['branches']
- print json_data
- self.failUnless(set(data) == set(json_data))
+ self.fail("Unable to find distro edit button")
+
+ edit_distro_element = self.driver.find_element_by_id("new-distro")
+ edit_distro_value = edit_distro_element.get_attribute("value")
+ self.assertTrue((edit_distro_value == 'poky'), msg="DISTRO edit box has unexpected value")
+
+ edit_distro_element.clear()
+ #workaround code; using clear() does not make the interface recognise the text box is now empty, so we need to send a key and then delete it so get the save button to be disabled
+ #this does not happen when interacting with the interface manually
+ edit_distro_element.send_keys("a")
+ edit_distro_element.send_keys(Keys.BACKSPACE)
+ #end workaround
+ edit_distro_save_button = self.driver.find_element_by_id("apply-change-distro")
+ self.assertFalse((edit_distro_save_button.is_enabled()), msg="distro save changes button still active with empty value; should not be")
+
+ edit_distro_element.send_keys("poky tiny")
+ distro_error_text = self.driver.find_element_by_id("distro-error-message").text
+ self.assertTrue((distro_error_text == "A valid distro name cannot include spaces"), msg="Error message is missing when inputting incorrect value in DISTRO variable")
+ self.driver.find_element_by_id("cancel-change-distro").click()
+
+ #checking image_fstype variable elements
+ image_fstypes_text = self.driver.find_element_by_id("image_fstypes").text
+ image_fstypes_values = image_fstypes_text.split()
+
+ try:
+ self.driver.find_element_by_id("change-image_fstypes-icon").click()
+ except:
+ self.fail("Unable to find image_fstype edit button")
+
+ edit_image_fstype_element = self.driver.find_element_by_id("filter-image_fstypes")
+ checkboxes = self.driver.find_elements_by_class_name("fs-checkbox-fstypes")
+ active_checkboxes = []
+
+ for element in checkboxes:
+ if (element.get_attribute("checked")):
+ active_checkboxes.append(element.get_attribute("value"))
+ self.assertTrue((sorted(image_fstypes_values) == sorted(active_checkboxes)), msg = "list of checked values does not match list of values found at page load")
+
+ for element in checkboxes:
+ if (element.get_attribute("value") in active_checkboxes):
+ element.click()
+ image_fstype_error_text = self.driver.find_element_by_id("fstypes-error-message").text
+ self.assertTrue((image_fstype_error_text == "You must select at least one image type"), msg="Error message is missing when inputting incorrect value in image_fstype variable")
+ fstype_button = self.driver.find_element_by_id("apply-change-image_fstypes")
+ self.assertFalse((fstype_button.is_enabled()), msg="Save changes button for image_fstype is still active with empty values; it should not be")
+
+ for element in checkboxes:
+ if (element.get_attribute("value") in active_checkboxes):
+ element.click()
+ if (element.get_attribute("value") == "cpio"):
+ element.click()
+ self.driver.find_element_by_id("apply-change-image_fstypes").click()
+ time.sleep(1)
+
+ image_fstypes_text_new = self.driver.find_element_by_id("image_fstypes").text
+ image_fstypes_values_new = image_fstypes_text_new.split()
+ active_checkboxes_new = list(active_checkboxes)
+ active_checkboxes_new.append("cpio")
+ self.assertTrue(set(image_fstypes_values_new) == set(active_checkboxes_new), msg="Values after edit for image_fstypes do not match checkboxes selected")
+
+ #resetting to defaults
+ self.driver.find_element_by_id("change-image_fstypes-icon").click()
+ checkboxes = self.driver.find_elements_by_class_name("fs-checkbox-fstypes")
+ for element in checkboxes:
+ if (element.get_attribute("checked")):
+ element.click()
+ for element in checkboxes:
+ if (element.get_attribute("value") in active_checkboxes):
+ element.click()
+ self.driver.find_element_by_id("apply-change-image_fstypes").click()
+
+ #checking image_install_append variable elements
+ try:
+ self.driver.find_element_by_id("change-image_install-icon").click()
+ time.sleep(1)
+ except:
+ self.fail("Unable to find image_install_append edit button")
+
+ edit_image_install_element = self.driver.find_element_by_id("new-image_install")
+ edit_image_install_value = edit_image_install_element.get_attribute("value")
+ self.assertTrue((edit_image_install_value == ""), msg="IMAGE_INSTALL_append edit box has unexpected value")
+ image_install_placeholder = edit_image_install_element.get_attribute("placeholder")
+ self.assertTrue((image_install_placeholder == "Type one or more package names"), msg="IMAGE_INSTALL_append edit box placeholder missing or has unexpected value")
+
+ edit_image_install_element.clear()
+ #workaround code; using clear() does not make the interface recognise the text box is now empty, so we need to send a key and then delete it so get the save button to be disabled
+ #this does not happen when interacting with the interface manually
+ edit_image_install_element.send_keys("a")
+ edit_image_install_element.send_keys(Keys.BACKSPACE)
+ #end workaround
+ edit_image_install_save_button = self.driver.find_element_by_id("apply-change-image_install")
+ self.assertFalse((edit_image_install_save_button.is_enabled()), msg="IMAGE_INSTALL_append save changes button still active with empty value; should not be")
+
+ edit_image_install_element.send_keys("package1")
+ time.sleep(2)
+ edit_image_install_save_button.click()
+ time.sleep(1)
+
+ image_install_text_new = self.driver.find_element_by_id("image_install").text
+ self.assertTrue((image_install_text_new == "package1"), msg="Saved IMAGE_INSTALL_append value does not match input sent")
- print 'Checking branches for "Imported layers"'
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select name from orm_branch where layer_source_id=2;"
- cursor.execute(query)
- data = cursor.fetchall()
- lenght = len(data)
- for i in range(0,lenght):
- data[i] = data[i][0]
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_location = json_parse['layersources'][2]['name']
- print json_location
- json_data = json_parse['layersources'][2]['branches']
- print json_data
- self.failUnless(set(data) == set(json_data))
+ try:
+ self.driver.find_element_by_id("delete-image_install-icon").click()
+ #wait for animation to finish
+ time.sleep(4)
+ except:
+ self.fail("Unable to locate delete button for option IMAGE_INSTALL_append")
+
+ image_install_text_deleted = self.driver.find_element_by_id("image_install").text
+ self.assertTrue((image_install_text_deleted == "Not set"), msg="Saved IMAGE_INSTALL_append value was not deleted")
+ image_install_delete = self.driver.find_element_by_id("delete-image_install-icon")
+ self.assertFalse((image_install_delete.is_displayed()), msg="IMAGE_INSTALL_append delete button still visible with unset value; it should not be")
+
+ #checking package_classes variable elements
+ package_classes_text = self.driver.find_element_by_id("package_classes").text
+ try:
+ self.driver.find_element_by_id("change-package_classes-icon").click()
+ time.sleep(1)
+ except:
+ self.fail("Unable to find package_classes edit button")
+
+ select_package_classes = Select(self.driver.find_element_by_id("package_classes-select"))
+ selected_package_classes = select_package_classes.first_selected_option.text
+ self.assertTrue((package_classes_text == selected_package_classes), msg="Selected option for package_classes does not match selection detected on page load")
+
+ options_list = []
+ for option in select_package_classes.options:
+ options_list.append(option.get_attribute('value'))
+
+ packages_list = ["package_deb", "package_ipk", "package_rpm"]
+ self.assertTrue((set(options_list) == set(packages_list)), msg = "Unexpected values in dropdown box for package_classes")
+
+ self.driver.find_element_by_id("package_class_1_input").click()
+ self.driver.find_element_by_id("package_class_2_input").click()
+
+ self.driver.find_element_by_id("apply-change-package_classes").click()
+ time.sleep(1)
+
+ package_classes_text_new = self.driver.find_element_by_id("package_classes").text
+ package_classes_text_new = package_classes_text_new.split()
+
+ self.assertTrue((set(package_classes_text_new) == set(packages_list)), msg="PACKAGE_CLASSES after modification does not match selected options")
+
+ #resetting to defaults
+ self.driver.find_element_by_id("change-package_classes-icon").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("package_class_1_input").click()
+ self.driver.find_element_by_id("package_class_2_input").click()
+ self.driver.find_element_by_id("apply-change-package_classes").click()
+ time.sleep(1)
+
+ #adding variables
+ add_variable_button = self.driver.find_element_by_id("add-configvar-button")
+ self.assertFalse((add_variable_button.is_enabled()), msg="Add variable button active when it shouldn't be")
+
+ self.driver.find_element_by_id("variable").send_keys("variable_name_here")
+ self.assertFalse((add_variable_button.is_enabled()), msg="Add variable button active when it shouldn't be")
+
+ self.driver.find_element_by_id("value").send_keys("variable_value_here")
+ self.assertTrue((add_variable_button.is_enabled()), msg="Add variable button is not active when it should be")
+
+ add_variable_button.click()
+ time.sleep(1)
+
+ #because every variable added gets a unique ID, we will have to reverse engineer the current ID from the variable name
+ new_variable = self.driver.find_element_by_xpath("//*[contains(text(), 'variable_name_here')]")
+ new_id = new_variable.get_attribute('id')
+ id_breakdown = new_id.split('_')
+ id_number = id_breakdown[3]
+ delete_button_id = 'config_var_trash_' + str(id_number)
+ new_variable_text_id = 'config_var_value_' + str(id_number)
+ new_variable_edit_value_id = 'new-config_var_' + str(id_number)
+ change_config_form = 'change-config_var-form_' + str(id_number)
+ new_variable_save_value = self.driver.find_element_by_xpath("//*[@id='"+change_config_form+"']/div/button[1]")
+ new_variable_cancel = self.driver.find_element_by_xpath("//*[@id='"+change_config_form+"']/div/button[2]")
+ new_variable_edit_button = self.driver.find_element_by_xpath("//*[@id='configvar-list']/div/dd/i")
+
+ new_variable_edit_button.click()
+ new_variable_edit_value = self.driver.find_element_by_id(new_variable_edit_value_id)
+ new_variable_edit_value.clear()
+ #workaround code; using clear() does not make the interface recognise the text box is now empty, so we need to send a key and then delete it so get the save button to be disabled
+ #this does not happen when interacting with the interface manually
+ new_variable_edit_value.send_keys("a")
+ new_variable_edit_value.send_keys(Keys.BACKSPACE)
+ #end workaround
+ self.assertFalse((new_variable_save_value.is_enabled()), msg="IMAGE_INSTALL_append save changes button still active with empty value; should not be")
+ new_variable_cancel.click()
+
+ self.driver.find_element_by_id(delete_button_id).click()
+ #wait for animations to run, otherwise variable is not deleted
+ time.sleep(5)
+
+ self.driver.find_element_by_id("variable").send_keys(" /")
+ new_variable_error_text = self.driver.find_element_by_id("new-variable-error-message").text
+ time.sleep(1)
+ self.assertTrue((new_variable_error_text == "A valid variable name can only include letters, numbers, underscores, dashes, and cannot include spaces"), \
+ msg="Error message missing when inputting improper variable name")
+
+ self.driver.find_element_by_id("variable").clear()
+ self.driver.find_element_by_id("variable").send_keys("distro")
+ time.sleep(1)
+ new_variable_error_text = self.driver.find_element_by_id("new-variable-error-message").text
+ self.assertTrue((new_variable_error_text == "This variable is already set in this page, edit its value instead"), msg="Error message missing when inputting existing variable name")
##############
- # CASE 1077 #
+ # CASE 1104 #
##############
- def test_1077(self):
+ def test_1104(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select name from orm_bitbakeversion;"
- cursor.execute(query)
- data = cursor.fetchall()
- for i in range(0,4):
- data[i] = data[i][0]
- print data
- json_parse = json.loads(open('toasterconf.json').read())
- json_data = []
- for i in range(0,4):
- json_data.append(json_parse['bitbake'][i]['name'])
- print json_data
- self.failUnless(set(data) == set(json_data))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ #step 4
+ builds = self.driver.find_element_by_partial_link_text("Builds (").text
+ nr_builds = int(filter(str.isdigit, repr(builds)))
+ self.driver.find_element_by_link_text(builds).click()
+ time.sleep(2)
+
+ # Step 5
+ default_head_table = ['Outcome', 'Recipe', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', "Image files"]
+ head_list = self.get_table_head_text('projectbuildstable')
+ for item in default_head_table :
+ self.failUnless(item in head_list, msg=item+' is missing from table head.')
+
+ icon_up = self.driver.find_element_by_xpath("//*[@class='completed_on']//*[@class='icon-caret-up']").get_attribute('style')
+
+ self.assertIn("inline", icon_up ,msg = "Icon for completed on is down")
+ selector = "td[class='completed_on']"
+ column_list = self.get_text_from_elements(selector)
+
+ self.assertTrue(is_list_inverted(column_list), msg="Table is not sorted by Completed on column in descending order")
+
##############
- # CASE 1083 #
+ # CASE 1105 #
##############
- def test_1083(self):
+ def test_1105(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
self.driver.maximize_window()
self.driver.get(self.base_url)
- self.driver.find_element_by_id("new-project-button").click()
- self.driver.find_element_by_id("new-project-name").send_keys("new-test-project")
- self.driver.find_element_by_id("create-project-button").click()
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select count(name) from orm_project where name = 'new-test-project';"
- cursor.execute(query)
- data = cursor.fetchone()
- print 'data: %s' % data
- self.failUnless(data >= 1)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ project_builds_sortable_dict = {'Outcome':'outcome', 'Machine':'machine', 'Completed on':'completed_on', \
+ 'Errors':'errors_no','Warnings':'warnings_no'}
+ project_builds_not_sortable_dict = {'Recipe':'target', 'Failed tasks':'failed_tasks', 'Time':'time', \
+ 'Image files':'image_files'}
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+
+ # step 3
+ element = self.driver.find_element_by_css_selector('th.completed_on')
+ self.assertTrue("i class=\"icon-caret-up\" style=\"display: inline;\"" in element.get_attribute('innerHTML'), msg='Table not sorted by Image recie')
+ time.sleep(1)
+
+ # step 4
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-machine").click()
+ self.driver.find_element_by_id("checkbox-started_on").click()
+ self.driver.find_element_by_id("checkbox-time").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(1)
+
+ # step 5
+ for column in project_builds_sortable_dict:
+ element = self.driver.find_element_by_css_selector('th.%s' % project_builds_sortable_dict[column])
+ time.sleep(1)
+ self.assertTrue("<i class=\"icon-caret-down\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+ self.assertTrue("<i class=\"icon-caret-up\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+ self.assertTrue("href=\"#\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+
+ for column in project_builds_not_sortable_dict:
+ element = self.driver.find_element_by_css_selector('th.%s' %project_builds_not_sortable_dict[column])
+ time.sleep(1)
+ self.assertTrue("<span class=\"muted\">" in element.get_attribute('innerHTML'), msg='%s column is sortable' %column)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='completed_on']")
+ values = [element.text for element in elements]
+
+ #step 6
+ self.driver.find_element_by_xpath(".//*[@id='projectbuildstable']/thead/th[3]/a").click()
+ element = self.driver.find_element_by_css_selector('th.%s' % project_builds_sortable_dict['Machine'])
+ element.click()
+ time.sleep(1)
+ self.assertTrue("class=\"sorted\"" in element.get_attribute('innerHTML'), msg='Table is not sort by Machine')
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-machine").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ elements = self.driver.find_elements_by_xpath("//td[@class='completed_on']")
+ values2 = [element.text for element in elements]
+ self.assertEqual(values, values2, msg="Default sorting was not restore")
+
##############
- # CASE 1084 #
+ # CASE 1106 #
##############
- def test_1084(self):
+ def test_1106(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
self.driver.maximize_window()
self.driver.get(self.base_url)
- self.driver.find_element_by_id("new-project-button").click()
- self.driver.find_element_by_id("new-project-name").send_keys("new-default-project")
- self.driver.find_element_by_id("create-project-button").click()
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select a.name from orm_release a, orm_project b where a.id = b.release_id and b.name = 'new-default-project' limit 1;"
- cursor.execute(query)
- db_data = str(cursor.fetchone()[0])
- json_parse = json.loads(open('toasterconf.json').read())
- json_data = str(json_parse['defaultrelease'])
- self.failUnless(db_data == json_data)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+
+ # step 3
+ head_list = self.get_table_head_text('projectbuildstable')
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(1)
+ all_editcolumns_elements = self.get_editcolumns_list_elements_by_class('.dropdown-menu.editcol')
+
+ checked_elements = []
+ for element in all_editcolumns_elements:
+ if ("checked=\"checked\"" in element.get_attribute('innerHTML')):
+ checked_elements.append(element.text)
+
+ self.assertEqual(Counter(head_list), Counter(checked_elements), msg="Checked columns from edit button doesn't "\
+ "match the columns currently being shown")
+
+ # step 4
+ for element in all_editcolumns_elements:
+ if element.text in ['Outcome', 'Recipe', 'Completed on']:
+ self.assertIn('class="checkbox muted"', element.get_attribute('innerHTML'), msg='%s column can be '\
+ 'removed from the shown columns' %element.text)
+
+ # step 5
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-machine").click()
+ self.driver.find_element_by_id("checkbox-started_on").click()
+ self.driver.find_element_by_id("checkbox-time").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ time.sleep(0.5)
+ head_list = self.get_table_head_text('projectbuildstable')
+ for item in ['Machine', 'Started on', 'Time']:
+ self.assertIn(item, head_list, msg='%s items is not in table' %item)
+
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ self.driver.find_element_by_id("checkbox-machine").click()
+ self.driver.find_element_by_id("checkbox-started_on").click()
+ self.driver.find_element_by_id("checkbox-time").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ time.sleep(0.5)
+ head_list = self.get_table_head_text('projectbuildstable')
+ for item in ['Machine', 'Started on', 'Time']:
+ self.assertNotIn(item, head_list, msg='%s items is in table' %item)
+
##############
- # CASE 1088 #
+ # CASE 1108 #
##############
- def test_1088(self):
+ def test_1108(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
self.driver.maximize_window()
self.driver.get(self.base_url)
+
self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
- self.driver.find_element_by_link_text('new-default-project').click()
- self.driver.find_element_by_id('project-change-form-toggle').click()
- self.driver.find_element_by_id('project-name-change-input').clear()
- self.driver.find_element_by_id('project-name-change-input').send_keys('new-name')
- self.driver.find_element_by_id('project-name-change-btn').click()
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select count(name) from orm_project where name = 'new-name';"
- cursor.execute(query)
- data = cursor.fetchone()[0]
- self.failUnless(data == 1)
- #reseting project name
- self.driver.find_element_by_id('project-change-form-toggle').click()
- self.driver.find_element_by_id('project-name-change-input').clear()
- self.driver.find_element_by_id('project-name-change-input').send_keys('new-default-project')
- self.driver.find_element_by_id('project-name-change-btn').click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("edit-columns-button").click()
+ self.driver.find_element_by_id("checkbox-started_on").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(1)
+
+ # step 3
+ filters = []
+ filters.append(self.driver.find_element_by_id("outcome_filter"))
+ filters.append(self.driver.find_element_by_id("started_on_filter"))
+ filters.append(self.driver.find_element_by_id("completed_on_filter"))
+ filters.append(self.driver.find_element_by_id("failed_tasks_filter"))
+
+ for filter in filters:
+ self.assertIn("<i class=\"icon-filter filtered\"></i>", filter.get_attribute('innerHTML'), \
+ msg='Filter does not exist')
+
+ # step 4
+ outcome = self.driver.find_element_by_id("outcome_filter")
+ outcome.click()
+ time.sleep(1)
+ self.driver.find_element_by_id("outcome_filter:successful_builds").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(1)
+ self.assertIn("btn-primary", outcome.get_attribute('class'), msg='Outcome filter was not applied')
+
+ failed_task = self.driver.find_element_by_id("failed_tasks_filter")
+ failed_task.click()
+ time.sleep(1)
+ self.driver.find_element_by_id("failed_tasks_filter:without_failed_tasks").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(1)
+
+ self.assertIn("btn-primary", failed_task.get_attribute('class'), msg='Failed task filter was not applied')
+ self.assertNotIn("btn-primary", outcome.get_attribute('class'), msg='Outcome filter is still applied')
+
+ # step 5
+ self.driver.find_element_by_id("search-input-projectbuildstable").clear()
+ self.driver.find_element_by_id("search-input-projectbuildstable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-projectbuildstable").click()
+
+ time.sleep(2)
+ for filter in filters:
+ self.assertNotIn("btn-primary", filter.get_attribute('class'), msg='Filter is still applied after search')
##############
- # CASE 1089 #
+ # CASE 1109 #
##############
- def test_1089(self):
+ def test_1109(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
self.driver.maximize_window()
self.driver.get(self.base_url)
+
self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
- self.driver.find_element_by_link_text('new-default-project').click()
- self.driver.find_element_by_id('change-machine-toggle').click()
- self.driver.find_element_by_id('machine-change-input').clear()
- self.driver.find_element_by_id('machine-change-input').send_keys('qemuarm64')
-# self.driver.find_element_by_id('machine-change-input').send_keys(Keys.RETURN)
- self.driver.find_element_by_id('machine-change-btn').click()
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select count(id) from orm_projectvariable where name like 'machine' and value like 'qemuarm64';"
- cursor.execute(query)
- data = cursor.fetchone()[0]
- self.failUnless(data == 1)
- #resetting machine to default value
- self.driver.find_element_by_id('change-machine-toggle').click()
- self.driver.find_element_by_id('machine-change-input').clear()
- self.driver.find_element_by_id('machine-change-input').send_keys('qemux86')
- self.driver.find_element_by_id('machine-change-input').send_keys(Keys.RETURN)
- self.driver.find_element_by_id('machine-change-btn').click()
-
- ##############
- # CASE 1090 #
- ##############
- def test_1090(self):
- self.case_no = self.get_case_number()
- self.log.info(' CASE %s log: ' % str(self.case_no))
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select username from auth_user where is_superuser = 1;"
- cursor.execute(query)
- data = cursor.fetchall()
- try:
- data = data[0][0]
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+ search_string = "core"
+
+ self.assertTrue(self.driver.find_element_by_id("search-input-projectbuildstable"), "Search input not found")
+ self.assertTrue(self.driver.find_element_by_id("search-submit-projectbuildstable"), " Search button not found")
+
+ #step 3
+ self.assertEqual("Search all project builds", \
+ self.driver.find_element_by_id("search-input-projectbuildstable").get_attribute("placeholder") ,\
+ "Different placeholder text")
+
+ #step 4
+ self.driver.find_element_by_id("search-input-projectbuildstable").clear()
+ self.driver.find_element_by_id("search-input-projectbuildstable").send_keys("c")
+ self.assertEqual("c", self.driver.find_element_by_id("search-input-projectbuildstable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ self.driver.find_element_by_id("search-input-projectbuildstable").clear()
+ self.driver.find_element_by_id("search-input-projectbuildstable").send_keys(search_string)
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-projectbuildstable").click()
+ time.sleep(1)
+
+ self.assertEqual(search_string, self.driver.find_element_by_id("search-input-projectbuildstable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ returned_builds = self.driver.find_element_by_css_selector(".page-header.top-air").text
+ nr_builds = int(filter(str.isdigit, repr(returned_builds)))
+ self.assertIn("project builds found", returned_builds, msg='Message after search not showing properly')
+
+ self.driver.find_element_by_xpath(".//*[@id='table-chrome-projectbuildstable']/div/div[1]/a/i").click()
+ time.sleep(1)
+ self.assertIn("All project builds", self.driver.find_element_by_css_selector(".page-header.top-air").text, \
+ msg='Message after search not showing properly')
+
+ #step 5
+ self.driver.find_element_by_id("search-input-projectbuildstable").clear()
+ self.driver.find_element_by_id("search-input-projectbuildstable").send_keys('dkasashdsakjdhasjkdashdjk')
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-projectbuildstable").click()
+ time.sleep(1)
+ self.assertIn("No project builds found", self.driver.find_element_by_css_selector(".page-header.top-air").text, \
+ msg='Search is not working properly')
+ self.driver.find_element_by_xpath(".//*[@id='no-results-projectbuildstable']/div/form/button[2]").click()
+ time.sleep(1)
+
+ # step 6
+ self.driver.find_element_by_id('edit-columns-button').click()
+ self.driver.find_element_by_id('checkbox-started_on').click()
+ self.driver.find_element_by_id('edit-columns-button').click()
+ time.sleep(1)
+
+ head_list = self.get_table_head_text('projectbuildstable')
+ time.sleep(1)
+
+ started_on = self.driver.find_element_by_css_selector('th.started_on')
+ self.driver.find_element_by_partial_link_text('Started on').click()
+ time.sleep(1)
+ self.assertTrue("<a class=\"sorted\" href=\"#\">" in started_on.get_attribute('innerHTML'), \
+ msg='Table not sorted by started on column')
+
+ self.driver.find_element_by_id("search-input-projectbuildstable").clear()
+ self.driver.find_element_by_id("search-input-projectbuildstable").send_keys(search_string)
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-projectbuildstable").click()
+ time.sleep(1)
+
+ element_after_search = self.driver.find_element_by_css_selector('th.started_on')
+ self.assertTrue("<a class=\"sorted\" href=\"#\">" in element_after_search.get_attribute('innerHTML'), \
+ msg='Table not sorted by started on after search')
+
+ head_list_after_search = self.get_table_head_text('projectbuildstable')
+ self.assertEqual(head_list, head_list_after_search, msg='The table have different columns after search')
+
+
+ ##############
+ # CASE 1110 #
+ ##############
+ def test_1110(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("Layers").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("meta-acer")
+ time.sleep(1)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("meta-acer").click()
+ time.sleep(1)
+
+ crumbs_list = self.driver.find_elements_by_class_name("breadcrumb")
+ self.assertTrue((("selenium-project" in crumbs_list[0].text) and ("Compatible layers" in crumbs_list[0].text) and ("meta-acer (master)" in crumbs_list[0].text)), \
+ msg="Breadcrumbs have unexpected values")
+
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.back()
+ time.sleep(1)
+ self.assertTrue((self.is_text_present("meta-acer")), msg="Returning from breadcrumb failed")
+
+ self.driver.find_element_by_link_text("Compatible layers").click()
+ time.sleep(1)
+ self.driver.back()
+ time.sleep(1)
+ self.assertTrue((self.is_text_present("meta-acer")), msg="Returning from breadcrumb failed")
+
+ URL_link = self.driver.find_element_by_xpath("//a[@href='http://github.com/shr-distribution/meta-smartphone/']")
+ self.assertTrue((URL_link.is_displayed()), msg="Could not find repository URL external link")
+ subdir_link = self.driver.find_element_by_xpath("//a[@href='http://github.com/shr-distribution/meta-smartphone/tree/master/meta-acer']")
+ self.assertTrue((subdir_link.is_displayed()), msg="Could not find repository subdirectory external link")
+
+ add_layer_button = self.driver.find_element_by_id("add-remove-layer-btn")
+ button_text = add_layer_button.text
+ self.assertTrue((button_text == "Add the meta-acer layer to your project"), msg="Button text different than expected")
+
+ try:
+ add_layer_button.click()
+ time.sleep(1)
except:
- pass
- print data
- self.failUnless(data == 'toaster_admin')
+ self.fail(msg="Unable to click on the add layer button")
+
+ title = self.driver.find_element_by_id("title")
+ title_text = title.text
+ self.assertTrue((title_text == "meta-acer"), msg="Cannot find dependencies pop-up window")
+ self.driver.find_element_by_xpath("//*[@id='dependencies-modal-form']/div[3]/button[2]").click()
+
+ self.assertTrue((self.is_text_present("Summary")), msg="Cannot find summary entry")
+ self.assertTrue((self.is_text_present("Description")), msg="Cannot find description entry")
+ self.assertTrue((self.is_text_present("Repository URL")), msg="Cannot find repository URL entry")
+ self.assertTrue((self.is_text_present("Repository subdirectory")), msg="Cannot find repository subdirectory entry")
+ self.assertTrue((self.is_text_present("Git revision")), msg="Cannot find git revision entry")
+ self.assertTrue((self.is_text_present("Layer dependencies")), msg="Cannot find layer dependencies entry")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#recipes']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find recipes tab")
+
+ add_layer_button = self.driver.find_element_by_id("add-remove-layer-btn")
+ button_text = add_layer_button.text
+ self.assertTrue((button_text == "Add the meta-acer layer to your project to enable these recipes"), msg="Button text different than expected")
+
+ table_head = self.get_table_head_text("recipestable")
+ self.assertTrue((set(table_head) == set(["Recipe", "Version", "Description", "Build recipe"])), msg="Recipes table head has unexpected values")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#machines']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find machines tab")
+
+ add_layer_button = self.driver.find_element_by_id("add-remove-layer-btn")
+ button_text = add_layer_button.text
+ self.assertTrue((button_text == "Add the meta-acer layer to your project to enable these machines"), msg="Button text different than expected")
+
+ table_head = self.get_table_head_text("machinestable")
+ self.assertTrue((set(table_head) == set(["Machine", "Description", "Select machine"])), msg="Recipes table head has unexpected values")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#information']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find layer details tab")
+
+
+ ##############
+ # CASE 1111 #
+ ##############
+ def test_1111(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ #making sure there are no other layers in the project other than the defaults(in particular meta-selftest
+ layer = True
+ while (layer):
+ try:
+ delete_button = self.driver.find_element_by_xpath("//*[@id='layers-in-project-list']/li[4]/span")
+ delete_button.click()
+ self.driver.find_element_by_link_text("Configuration").click()
+ except:
+ layer = False
+ self.driver.find_element_by_partial_link_text("Layers").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("meta-acer")
+ time.sleep(1)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("meta-acer").click()
+ time.sleep(1)
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#recipes']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find recipes tab")
+ build_recipe_button = self.driver.find_element_by_xpath("//table[@id='recipestable']/tbody/tr/td[4]/button")
+ self.assertFalse((build_recipe_button.is_enabled()), msg="Build recipe button active before layer was added to project")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#machines']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find machines tab")
+ select_machine_button = self.driver.find_element_by_xpath("//table[@id='machinestable']/tbody/tr/td[3]/a")
+ self.assertTrue((select_machine_button.get_attribute('disabled')), msg="Select machine button active before layer was added to project")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#information']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find layers details tab")
+
+ add_layer_button = self.driver.find_element_by_id("add-remove-layer-btn")
+ try:
+ add_layer_button.click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Unable to click on the add layer button")
+
+ try:
+ self.driver.find_element_by_xpath("//*[@id='dependencies-modal-form']/div[3]/button[1]").click()
+ except:
+ self.fail(msg="Unable to click on the add layers button in the dependencies pop-up window")
+
+ time.sleep(5)
+ add_layer_button = self.driver.find_element_by_id("add-remove-layer-btn")
+ button_text = add_layer_button.text
+ self.assertTrue((button_text == "Remove the meta-acer layer from your project"), msg="Button text different than expected")
+
+ alert = self.driver.find_element_by_id("alert-area")
+ alert_message = alert.text
+ self.assertTrue(("You have added 3 layers to your project: meta-acer and its dependencies meta-android, meta-oe" in alert_message), msg="Alert message not found or text wrong")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#recipes']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find recipes tab")
+ build_recipe_button = self.driver.find_element_by_xpath("//table[@id='recipestable']/tbody/tr/td[4]/button")
+ self.assertTrue((build_recipe_button.is_enabled()), msg="Build recipe button not active after layer was added to project")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#machines']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find machines tab")
+ select_machine_button = self.driver.find_element_by_xpath("//table[@id='machinestable']/tbody/tr/td[3]/a")
+ self.assertFalse((select_machine_button.get_attribute('disabled')), msg="Select machine button not active after layer was added to project")
+ select_machine_button.click()
+ time.sleep(2)
+ machine_text = self.driver.find_element_by_id("project-machine-name").text
+ self.assertTrue((machine_text == "a500"), "Machine not changed after using 'Select machine' button")
+
+
+ ##############
+ # CASE 1112 #
+ ##############
+ def test_1112(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("Import layer").click()
+ time.sleep(1)
+
+ import_button = self.driver.find_element_by_id("import-and-add-btn")
+ self.assertFalse((import_button.is_enabled()), msg="Import layer button active before all requirement are filled out; it should not be")
+
+ try:
+ self.driver.find_element_by_id("import-layer-name").send_keys("meta-selftest")
+ except:
+ self.fail(msg="Cannot find layer name text box")
+
+ try:
+ self.driver.find_element_by_id("layer-git-repo-url").send_keys("git://git.yoctoproject.org/poky")
+ except:
+ self.fail(msg="Cannot find git repo text box")
+
+ try:
+ self.driver.find_element_by_id("layer-subdir").send_keys("meta-selftest")
+ except:
+ self.fail(msg="Cannot find repo subdirectory text box")
+
+ try:
+ self.driver.find_element_by_id("layer-git-ref").send_keys("master")
+ except:
+ self.fail(msg="Cannot find git revision text box")
+
+ add_dependency_button = self.driver.find_element_by_id("add-layer-dependency-btn")
+ self.assertTrue((add_dependency_button.get_attribute("disabled")), msg="Add dependency button active before layer text box is filled out")
+
+ try:
+ self.driver.find_element_by_id("layer-dependency").send_keys("meta-acer")
+ self.driver.find_element_by_id("layer-dependency").send_keys(Keys.ENTER)
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find layer dependency text box")
+
+ self.assertFalse((add_dependency_button.get_attribute("disabled")), msg="Add dependency button not active after layer text box filled out")
+ add_dependency_button.click()
+
+ try:
+ self.driver.find_element_by_xpath("//ul[@id='layer-deps-list']/li[2]/span").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Unable to delete added dependency layer")
+
+ default_dependency = self.driver.find_element_by_xpath("//ul[@id='layer-deps-list']/li/a")
+ self.assertTrue((default_dependency.text == "openembedded-core"), msg="Default layer dependency has unexpected value")
+
+ delete_default_dependency = self.driver.find_element_by_xpath("//ul[@id='layer-deps-list']/li/span")
+ self.assertTrue((delete_default_dependency.is_enabled()), msg="Delete button for default dependency either missing or inactive")
+
+ self.assertTrue((import_button.is_enabled()), msg="Import layer button not active after all requirement are filled out; it should be")
+ import_button.click()
+ time.sleep(1)
+
+ self.assertTrue((self.is_text_present("meta-selftest")), msg="Unable to verify layer was added to project")
+
+
+ ##############
+ # CASE 1113 #
+ ##############
+ def test_1113(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.find_element_by_partial_link_text("Layers").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("meta-selftest")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+
+ self.driver.find_element_by_link_text("meta-selftest").click()
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#recipes']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find recipes tab")
+ no_recipe_message = self.driver.find_element_by_id("no-recipes-yet")
+ print no_recipe_message.text
+ self.assertTrue(no_recipe_message, msg="Unable to find notification of missing recipes")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#machines']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find machines tab")
+ no_machine_message = self.driver.find_element_by_id("no-machines-yet")
+ print no_machine_message.text
+ self.assertTrue(no_machine_message, msg="Unable to find notification of missing machines")
+
+ try:
+ self.driver.find_element_by_xpath("//a[@href='#information']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Cannot find layers details tab")
+
+ add_layer_button = self.driver.find_element_by_id("add-remove-layer-btn")
+ try:
+ add_layer_button.click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Unable to click on the add layer button")
+
+ add_layer_button = self.driver.find_element_by_id("add-remove-layer-btn")
+ button_text = add_layer_button.text
+ self.assertTrue((button_text == "Remove the meta-selftest layer from your project"), msg="Button text different than expected")
+
+ alert = self.driver.find_element_by_id("alert-area")
+ alert_message = alert.text
+ self.assertTrue(("You have added 1 layer to your project: meta-selftest" in alert_message), msg="Alert message not found or text wrong")
+
+ add_layer_button.click()
+
+ self.assertTrue((self.is_text_present("Summary")), msg="Cannot find summary entry")
+ self.assertTrue((self.is_text_present("Description")), msg="Cannot find description entry")
+ self.assertTrue((self.is_text_present("Repository URL")), msg="Cannot find repository URL entry")
+ self.assertTrue((self.is_text_present("Repository subdirectory")), msg="Cannot find repository subdirectory entry")
+ self.assertTrue((self.is_text_present("Git revision")), msg="Cannot find git revision entry")
+ self.assertTrue((self.is_text_present("Layer dependencies")), msg="Cannot find layer dependencies entry")
+
+ edit_repo_button = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd/i")
+ self.assertTrue(edit_repo_button.is_displayed(), msg="Unable to find edit repository URL button")
+ edit_repo_button.click()
+ edit_repo_text = self.driver.find_element_by_xpath("//form[@id='change-repo-form']/div/input")
+ self.assertTrue(edit_repo_text.is_displayed(), msg="Unable to find edit repository text box")
+ edit_repo_text.clear()
+ edit_repo_text.send_keys("new_repo_here")
+ try:
+ self.driver.find_element_by_xpath("//form[@id='change-repo-form']/div/button").click()
+ time.sleep(1)
+ except:
+ self.Fail(msg="Unable to save new repo")
+ repo_text = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[1]/span")
+ self.assertTrue(repo_text.text == "new_repo_here", msg="repo value not updated after change")
+
+ edit_subdir_button = self.driver.find_element_by_id("change-subdir")
+ self.assertTrue(edit_subdir_button.is_displayed(), msg="Unable to find change subdirectory button")
+ edit_subdir_button.click()
+ edit_subdir_text = self.driver.find_element_by_xpath("//form[@id='change-subdir-form']/div/input")
+ edit_subdir_text.clear()
+ edit_subdir_text.send_keys("new-subdir")
+ try:
+ self.driver.find_element_by_xpath("//form[@id='change-subdir-form']/div/button").click()
+ time.sleep(1)
+ except:
+ self.Fail(msg="Unable to save new subdir")
+ subdir_text = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[2]/span[2]")
+ self.assertTrue(subdir_text.text == "new-subdir", msg="subdir value not updated after change")
+ delete_subdir_button = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[2]/span[3]")
+ self.assertTrue(delete_subdir_button.is_displayed(), msg="Unable to find delete subdirectory button")
+ delete_subdir_button.click()
+ time.sleep(2)
+ subdir_text = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[2]/span[1]")
+ self.assertTrue(subdir_text.text == "Not set", msg="subdir value not deleted after delete button was pressed")
+ edit_revision_button = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[3]/i")
+ self.assertTrue(edit_revision_button.is_displayed(), msg="Unable to find edit revision button")
+ edit_revision_button.click()
+ edit_revision_text = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[3]/form/div/input")
+ edit_revision_text.clear()
+ edit_revision_text.send_keys("master")
+ try:
+ self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[3]/form/div/button").click()
+ time.sleep(1)
+ except:
+ self.Fail(msg="Unable to save new revision")
+ revision_text = self.driver.find_element_by_xpath("//div[@id='information']/dl/dd[3]/span")
+ self.assertTrue(revision_text.text == "master", msg="revision value not updated after change")
+ delete_dep_button = self.driver.find_element_by_xpath("//ul[@id='layer-deps-list']/li/span")
+ self.assertTrue(delete_dep_button.is_displayed(), msg="Unable to find delete dependency button")
+ add_dep_text = self.driver.find_element_by_id("layer-dep-input")
+ self.assertTrue(add_dep_text.is_displayed(), msg="Unable to find add dependency text box")
+ add_dep_button = self.driver.find_element_by_id("add-layer-dependency-btn")
+ self.assertTrue(add_dep_button.is_displayed(), msg="Unable to find add dependency button")
+
+ #we need to find a better way to ID the next few elements; maybe ask DEV to add IDs?
+ edit_summary_button = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[1]/i")
+ self.assertTrue(edit_summary_button.is_displayed(), msg="Unable to find edit summary button")
+ edit_desc_button = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[2]/i")
+ self.assertTrue(edit_desc_button.is_displayed(), msg="Unable to find edit description button")
+
+ edit_summary_button.click()
+ time.sleep(1)
+ edit_summary_text = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[1]/form/textarea")
+ self.assertTrue(edit_summary_text.is_displayed(), msg="Unable to find edit summary text area")
+ edit_summary_text.send_keys("test summary here")
+ edit_summary_save = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[1]/form/button")
+ try:
+ edit_summary_save.click()
+ time.sleep(1)
+ except:
+ self.Fail(msg="Unable to save new summary")
+ delete_summary = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[1]/span[3]")
+ try:
+ delete_summary.click()
+ time.sleep(2)
+ except:
+ self.Fail("Unable to delete custom summary")
+
+ edit_desc_button.click()
+ time.sleep(1)
+ edit_desc_text = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[2]/form/textarea")
+ self.assertTrue(edit_desc_text.is_displayed(), msg="Unable to find edit description text area")
+ edit_desc_text.send_keys("test description here")
+ edit_desc_save = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[2]/form/button")
+ try:
+ edit_desc_save.click()
+ time.sleep(1)
+ except:
+ self.Fail(msg="Unable to save new description")
+ delete_desc = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[4]/dl/dd[2]/span[3]")
+ try:
+ delete_desc.click()
+ time.sleep(2)
+ except:
+ self.Fail("Unable to delete custom description")
+
+
+ ##############
+ # CASE 1140 #
+ ##############
+ def test_1140(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get("http://localhost:8000/admin/")
+ time.sleep(2)
+
+ self.driver.find_element_by_id("id_username").send_keys("toaster_admin")
+ time.sleep(1)
+ self.driver.find_element_by_id("id_password").send_keys("qwe123")
+ time.sleep(1)
+ self.driver.find_element_by_xpath("//input[@value='Log in']").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Build environments").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("BuildEnvironment object").click()
+ time.sleep(1)
+
+ sourcedir = self.driver.find_element_by_id("id_sourcedir").get_attribute('value')
+ builddir = self.driver.find_element_by_id("id_builddir").get_attribute('value')
+
+ builddir2 = str(builddir) + "2"
+
+ self.driver.find_element_by_link_text("Build environments").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("Add build environment").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("id_address").send_keys("2")
+ self.driver.find_element_by_id("id_sourcedir").send_keys(str(sourcedir))
+ time.sleep(2)
+ self.driver.find_element_by_id("id_builddir").send_keys(str(builddir2))
+ time.sleep(2)
+
+ options = Select(self.driver.find_element_by_id("id_betype"))
+ options.select_by_visible_text("local")
+
+ self.driver.find_element_by_xpath("//input[@value='Save']").click()
+ time.sleep(2)
+
+ self.driver.get(self.base_url)
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("build-input").send_keys("core-image-sato")
+ time.sleep(1)
+ self.driver.find_element_by_id("build-button").click()
+ time.sleep(2)
+
+ self.driver.find_element_by_id("build-input").send_keys("core-image-minimal")
+ time.sleep(1)
+ self.driver.find_element_by_id("build-button").click()
+ time.sleep(10)
+
+ progress_list = self.driver.find_elements_by_xpath("//div[@class='progress']")
+ self.assertTrue(len(progress_list) > 1,msg="Could not find 2 progress bars visible")
+
+ count = 1
+ self.timeout = 340
+ failflag = False
+ try:
+ self.driver.refresh()
+ time.sleep(1)
+ while (self.driver.find_element_by_xpath("//div[@class='progress']").is_displayed()):
+ print 'Build running for '+str(count)+' minutes'
+ count += 5
+ if (count > self.timeout):
+ failflag = True
+ print 'Build took longer than expected to complete; Failing due to possible build stuck.'
+ self.fail()
+ time.sleep(300)
+ self.driver.refresh()
+ except:
+ if failflag:
+ self.fail(msg="Build took longer than expected to complete; Failing due to possible build stuck.")
+ print "Looking for successful builds"
+ build_list = self.driver.find_elements_by_xpath("//div[@class='alert build-result alert-success']")
+ self.assertTrue((len(build_list) > 1), msg="Could not find successful builds")
+
+
+ ##############
+ # CASE 1393 #
+ ##############
+ def test_1393(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text('core-image-minimal').click()
+ time.sleep(1)
+
+ #step 6
+ self.driver.find_element_by_partial_link_text('Tasks').click()
+ time.sleep(1)
+
+ #step 7
+ self.driver.find_element_by_xpath(".//*[@id='otable']/thead/tr/th[6]/div/a").click()
+ time.sleep(1)
+ avail_options = self.driver.find_elements_by_xpath("//*[@id='filter_outcome']//*[@class='radio'][not(@disabled)]")
+
+ for number in range(0, len(avail_options)):
+ if avail_options[number].text == 'Succeeded Tasks':
+ avail_options[number].click()
+ self.browser_delay()
+ # click "Apply"
+ self.driver.find_element_by_xpath("//*[@id='filter_outcome']//*[@type='submit']").click()
+ break
+ time.sleep(1)
+ try:
+ succeeded_tasks = self.driver.find_elements_by_xpath("//td[@class='task_name']/a")
+ succeeded_tasks[0].click()
+ time.sleep(1)
+ # step 8
+ task_log = self.driver.find_element_by_css_selector('.btn.btn-large')
+ task_log.click()
+ time.sleep(1)
+ self.assertTrue(task_log.get_attribute('href') != '', msg='Download link is empty!')
+ self.assertIn('tasklogfile', task_log.get_attribute('href'), msg='Is not the task log file')
+ except:
+ print "No succeeded tasks"
+ self.find_element_by_text("Show all tasks").click()
+ time.sleep(1)
+
+ # step 9
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(2)
+ self.driver.find_element_by_link_text('core-image-minimal').click()
+ time.sleep(1)
+
+ #step 6
+ self.driver.find_element_by_partial_link_text('Tasks').click()
+ time.sleep(1)
+
+ #step 7
+ self.driver.find_element_by_xpath(".//*[@id='otable']/thead/tr/th[6]/div/a").click()
+ time.sleep(1)
+ avail_options = self.driver.find_elements_by_xpath("//*[@id='filter_outcome']//*[@class='radio'][not(@disabled)]")
+
+ for number in range(0, len(avail_options)):
+ if avail_options[number].text == 'Failed Tasks':
+ avail_options[number].click()
+ self.browser_delay()
+ # click "Apply"
+ self.driver.find_element_by_xpath("//*[@id='filter_outcome']//*[@type='submit']").click()
+
+ break
+ time.sleep(1)
+ try:
+ failed_tasks = self.driver.find_elements_by_xpath("//td[@class='task_name']/a")
+ failed_tasks[0].click()
+ time.sleep(1)
+ # step 10
+ task_log = self.driver.find_element_by_css_selector('.btn.btn-large')
+ task_log.click()
+ time.sleep(1)
+ self.assertTrue(task_log.get_attribute('href') != '', msg='Download link is empty!')
+ self.assertIn('tasklogfile', task_log.get_attribute('href'), msg='Is not the task log file')
+ except:
+ print "No failed tasks"
+ self.find_element_by_text("Show all tasks").click()
+ time.sleep(1)
+
+
+ ##############
+ # CASE 1394 #
+ ##############
+ def test_1394(self):
+
+ self.timeout = 15
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id('build-input').clear()
+ self.driver.find_element_by_id('build-input').send_keys('core-image-minimal:clean')
+ time.sleep(2)
+ self.driver.find_element_by_id('build-button').click()
+ time.sleep(3)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+
+ time.sleep(1)
+ self.wait_until_build_finish(1, 60)
+
+ rebuild_elements = self.driver.find_elements_by_css_selector(".btn.btn-success.pull-right")
+ for element in rebuild_elements:
+ if "core-image-minimal:clean" in element.get_attribute('onclick'):
+ element.click()
+ break
+
+ time.sleep(1)
+ self.wait_until_build_finish(1, 100)
+
+ self.driver.find_element_by_partial_link_text('core-image-minimal:clean').click()
+ time.sleep(1)
+ nr_of_tasks = self.driver.find_element_by_xpath("//div[@class='well span4 dashboard-section'][2]/dl/dd[1]/a").text
+
+ self.assertEqual("1", nr_of_tasks, msg="The number of tasks executed is not 1")
+
+ self.driver.get(self.base_url)
+ time.sleep(1)
+
+ rebuild_elements = self.driver.find_elements_by_css_selector(".btn.btn-success.pull-right")
+ for element in rebuild_elements:
+ if "core-image-minimal:clean" in element.get_attribute('onclick'):
+ element.click()
+ break
+
+ time.sleep(1)
+ self.wait_until_build_finish(1, 100)
+
+ self.driver.find_element_by_partial_link_text('core-image-minimal:clean').click()
+ time.sleep(1)
+ nr_of_tasks = self.driver.find_element_by_xpath("//div[@class='well span4 dashboard-section'][2]/dl/dd[1]/a").text
+
+ self.assertEqual("1", nr_of_tasks, msg="The number of tasks executed is not 1")
+
+
+ ##############
+ # CASE 1395 #
+ ##############
+ def test_1395(self):
+
+ self.timeout = 15
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text('Layers').click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").clear()
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("meta-intel")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("meta-intel").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("add-remove-layer-btn").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("machines-tab").click()
+
+ machines = self.driver.find_elements_by_css_selector(".btn.btn-block.select-machine-btn")
+ for machine in machines:
+ if "intel-core2-32" in machine.get_attribute("href"):
+ machine.click()
+ break
+
+ time.sleep(1)
+ self.assertIn("intel-core2-32", self.driver.find_element_by_id("project-machine-name").text, msg="Machine was not changed")
+
+ self.driver.find_element_by_id('build-input').clear()
+ self.driver.find_element_by_id('build-input').send_keys('core-image-minimal')
+ time.sleep(2)
+ self.driver.find_element_by_id('build-button').click()
+ time.sleep(3)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 180)
+ self.driver.find_element_by_link_text('core-image-minimal').click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Configuration").click()
+ time.sleep(1)
+
+
+ self.assertIn("meta-intel", self.get_table_data_from_class("table table-bordered table-hover", 4, 1), \
+ msg="meta-intel layer not added to build")
+
+
+ ##############
+ # CASE 1396 #
+ ##############
+ def test_1396(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text('core-image-minimal').click()
+ time.sleep(1)
+
+ build_artifact = self.driver.find_element_by_xpath("//dl[@class='dl-horizontal']/dd/div/a[2]")
+ build_artifact.click()
+ time.sleep(2)
+
+ self.assertTrue(build_artifact.get_attribute('href') != '', msg='Download link is empty!')
+ self.assertIn('buildartifact', build_artifact.get_attribute('href'), msg='Is not the build artifact')
+ self.save_screenshot(screenshot_type='selenium', append_name='other_artifacts_download')
+ os.system('wget %s --no-proxy -P ./dld' %build_artifact.get_attribute('href'))
+
+ output = subprocess.check_output("ls -l ./dld | wc -l", shell=True)
+ self.assertTrue(output >= 1, msg='File was not downloaded')
+ os.system('rm -rf ./dld')
+
+
+ ##############
+ # CASE 1397 #
+ ##############
+ def test_1397(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text('core-image-minimal').click()
+ time.sleep(1)
+
+ download = self.driver.find_element_by_xpath("html/body/div[4]/div/div/div[2]/div[4]/div/dl/dd[3]/a[2]")
+ download.click()
+ time.sleep(2)
+
+ self.assertTrue(download.get_attribute('href') != '', msg='Download link is empty!')
+ self.assertIn('licensemanifest', download.get_attribute('href'), msg='Is not the license manifest')
+ self.save_screenshot(screenshot_type='selenium', append_name='licence_manifes_download')
+ os.system('wget %s --no-proxy -P ./dld' %download.get_attribute('href'))
+
+ output = subprocess.check_output("ls -l ./dld | wc -l", shell=True)
+ self.assertTrue(output >= 1, msg='File was not downloaded')
+ os.system('rm -rf ./dld')
+
+
+ ##############
+ # CASE 1398 #
+ ##############
+ def test_1398(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("Layers").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("meta-acer")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(2)
+
+ self.driver.find_element_by_link_text("meta-acer").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("add-remove-layer-btn").click()
+ time.sleep(1)
+
+ try:
+ self.driver.find_element_by_xpath("//*[@id='dependencies-modal-form']/div[3]/button[1]").click()
+ time.sleep(2)
+ except:
+ self.fail(msg="Unable to click on the add layers button in the dependencies pop-up window")
+
+ self.driver.find_element_by_link_text("Compatible layers").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-layerstable").send_keys("meta-oe")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-layerstable").click()
+ time.sleep(2)
+
+ self.driver.find_element_by_link_text("meta-oe").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("add-remove-layer-btn").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("build-input").send_keys("core-image-minimal")
+ time.sleep(1)
+ self.driver.find_element_by_id("build-button").click()
+ time.sleep(1)
+
+ try:
+ self.driver.find_element_by_xpath("//div[@class='progress']").is_displayed()
+ except:
+ print "Unable to start new build"
+ self.fail(msg="Unable to start new build")
+ count = 1
+ self.timeout = 50
+ failflag = False
+ try:
+ self.driver.refresh()
+ time.sleep(1)
+ print "First check starting"
+ while (self.driver.find_element_by_xpath("//div[@class='progress']").is_displayed()):
+ #print "Looking for build in progress"
+ print 'Build running for '+str(count)+' minutes'
+ count += 5
+ if (count > self.timeout):
+ failflag = True
+ print 'Build took longer than expected to complete; Failing due to possible build stuck.'
+ self.fail()
+ time.sleep(300)
+ self.driver.refresh()
+ except:
+ try:
+ if failflag:
+ self.fail(msg="Build took longer than expected to complete; Failing due to possible build stuck.")
+ print "Looking for failed build"
+ self.driver.find_element_by_xpath("//div[@class='alert build-result alert-error']").is_displayed()
+ except:
+ if failflag:
+ self.fail(msg="Build took longer than expected to complete; Failing due to possible build stuck.")
+ self.fail(msg="Could not find expected failed build")
+
##############
- # CASE 1091 #
+ # CASE 1399 #
##############
- def test_1091(self):
+ def test_1399(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
self.driver.maximize_window()
+
self.driver.get(self.base_url)
+
self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
- self.driver.find_element_by_link_text('new-default-project').click()
- self.driver.find_element_by_id('release-change-toggle').click()
- dropdown = self.driver.find_element_by_css_selector('select')
- for option in dropdown.find_elements_by_tag_name('option'):
- if option.text == 'Local Yocto Project':
- option.click()
- self.driver.find_element_by_id('change-release-btn').click()
- #wait for the changes to register in the DB
time.sleep(1)
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select count(*) from orm_layer_version a, orm_projectlayer b, orm_project c where a.\"commit\"=\"HEAD\" and a.id = b.layercommit_id and b.project_id=c.id and c.name='new-default-project';"
- cursor.execute(query)
- data = cursor.fetchone()[0]
- #resetting release to default
- self.driver.find_element_by_id('release-change-toggle').click()
- dropdown = self.driver.find_element_by_css_selector('select')
- for option in dropdown.find_elements_by_tag_name('option'):
- if option.text == 'Yocto Project master':
- option.click()
- self.driver.find_element_by_id('change-release-btn').click()
- #wait for the changes to register in the DB
+ self.driver.find_element_by_link_text("selenium-project").click()
time.sleep(1)
- self.failUnless(data == 3)
+
+ img_recipe = 'core-image-minimal'
+ software_recipe = 'busybox'
+ self.driver.find_element_by_link_text("Image recipes").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys("core-image-efi")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='add-del-layers']")
+ time.sleep(1)
+ nr = 0
+ for element in elements:
+ if element.text == 'Add layer':
+ element.click()
+ break
+ nr += 1
+
+ time.sleep(1)
+
+ try:
+ self.driver.find_element_by_id("dependencies-modal")
+ time.sleep(1)
+ self.driver.find_element_by_xpath(".//*[@id='dependencies-modal-form']/div[3]/button[1]").click()
+ except:
+ print 'Only one dependency'
+
+ time.sleep(1)
+ self.driver.find_element_by_id("change-notification-msg")
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='add-del-layers']")
+ time.sleep(1)
+ self.assertEqual("Build recipe", elements[nr].text, msg='Add layer button did not become Build recipe.')
+
+ time.sleep(2)
+
+ self.driver.find_element_by_id("topbar-configuration-tab").click()
+ time.sleep(1)
+
+ layer = True
+ while (layer):
+ try:
+ delete_button = self.driver.find_element_by_xpath("//*[@id='layers-in-project-list']/li[4]/span")
+ delete_button.click()
+ self.driver.find_element_by_link_text("Configuration").click()
+ except:
+ layer = False
+
+ self.driver.find_element_by_link_text("Image recipes").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-imagerecipestable").clear()
+ self.driver.find_element_by_id("search-input-imagerecipestable").send_keys(img_recipe)
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-imagerecipestable").click()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ time.sleep(1)
+ nr = 1
+ for element in elements:
+ if element.text == img_recipe:
+ break
+ nr += 1
+
+ self.driver.find_element_by_xpath(".//*[@id='imagerecipestable']/tbody/tr[%s]/td[9]/button[1]" %nr).click()
+ time.sleep(3)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+
+ # test software recipes
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Software recipes").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("3rd-gen-i5-i7-sinit")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='add-del-layers']")
+ time.sleep(1)
+ nr = 0
+ for element in elements:
+ if element.text == 'Add layer':
+ element.click()
+ break
+ nr += 1
+
+ time.sleep(1)
+ try:
+ self.driver.find_element_by_id("dependencies-modal")
+ time.sleep(1)
+ self.driver.find_element_by_xpath(".//*[@id='dependencies-modal-form']/div[3]/button[1]").click()
+ except:
+ print 'Only one dependency'
+
+ self.driver.find_element_by_id("change-notification-msg")
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='add-del-layers']")
+ time.sleep(1)
+ self.assertEqual("Build recipe", elements[nr].text, msg='Add layer button did not become Build recipe.')
+
+ time.sleep(2)
+
+ self.driver.find_element_by_id("topbar-configuration-tab").click()
+ time.sleep(1)
+
+ layer = True
+ while (layer):
+ try:
+ delete_button = self.driver.find_element_by_xpath("//*[@id='layers-in-project-list']/li[4]/span")
+ delete_button.click()
+ self.driver.find_element_by_link_text("Configuration").click()
+ except:
+ layer = False
+
+ self.driver.find_element_by_link_text("Software recipes").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys(software_recipe)
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ time.sleep(1)
+ nr = 1
+ for element in elements:
+ if element.text == software_recipe:
+ break
+ nr += 1
+
+ self.driver.find_element_by_xpath(".//*[@id='softwarerecipestable']/tbody/tr[%s]/td[9]/button[1]" %nr).click()
+ time.sleep(3)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+
##############
- # CASE 1092 #
+ # CASE 1400 #
##############
- def test_1092(self):
+ def test_1400(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
self.driver.maximize_window()
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select a.name, a.value from orm_projectvariable a, orm_project b where a.project_id = b.id and b.name = 'new-default-project';"
- cursor.execute(query)
- data = dict(cursor.fetchall())
- print data
- default_values = {u'IMAGE_INSTALL_append': u'', u'PACKAGE_CLASSES': u'package_rpm', u'MACHINE': u'qemux86', u'SDKMACHINE': u'x86_64', u'DISTRO': u'poky', u'IMAGE_FSTYPES': u'ext3 jffs2 tar.bz2'}
- self.failUnless(data == default_values)
+
+ self.driver.get(self.base_url)
+ machine = "intel-core2-32"
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Machines").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-machinestable").clear()
+ self.driver.find_element_by_id("search-input-machinestable").send_keys(machine)
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-machinestable").click()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ time.sleep(1)
+ nr = 0
+ for element in elements:
+ if element.text == machine:
+ if nr == 0:
+ self.driver.find_element_by_xpath(".//*[@id='machinestable']/tbody/tr/td[6]/button").click()
+ else:
+ self.driver.find_element_by_xpath(".//*[@id='machinestable']/tbody/tr[%s]/td[6]/button" % nr).click()
+ break
+ nr += 1
+
+ time.sleep(1)
+ try:
+ self.driver.find_element_by_id("dependencies-modal")
+ time.sleep(1)
+ self.driver.find_element_by_xpath(".//*[@id='dependencies-modal-form']/div[3]/button[1]").click()
+ except:
+ print 'Only one dependency'
+
+ self.driver.find_element_by_id("change-notification-msg")
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='add-del-layers']")
+ time.sleep(1)
+ self.assertEqual("Select machine", elements[nr].text, msg='Add layer button did not become select machine.')
+ time.sleep(1)
+
+ if nr == 0:
+ self.driver.find_element_by_xpath(".//*[@id='machinestable']/tbody/tr/td[6]/a").click()
+ else:
+ self.driver.find_element_by_xpath(".//*[@id='machinestable']/tbody/tr[%s]/td[6]/a" % nr).click()
+
+ time.sleep(1)
+
+ self.assertEqual(self.driver.find_element_by_id("project-machine-name").text, machine, msg="Machine was not changed")
+ time.sleep(1)
+
+ self.driver.find_element_by_xpath("//*[@id='layers-in-project-list']/li[4]/a").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("targets-tab").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-recipestable").click()
+ self.driver.find_element_by_id("search-input-recipestable").send_keys("libva")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-recipestable").click()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ time.sleep(1)
+ nr = 1
+ for element in elements:
+ if element.text == "libva":
+ break
+ nr += 1
+
+ time.sleep(1)
+ self.driver.find_element_by_xpath(".//*[@id='recipestable']/tbody/tr[%s]/td[4]/button" %nr).click()
+ time.sleep(2)
+
+ self.driver.get("http://127.0.0.1:8000/toastergui/builds/")
+
+ self.wait_until_build_finish(1, 120)
+
##############
- # CASE 1093 #
+ # CASE 1401 #
##############
- def test_1093(self):
+ def test_1401(self):
+
self.case_no = self.get_case_number()
self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
- #get initial values
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select layercommit_id from orm_projectlayer a, orm_project b where a.project_id=b.id and b.name='new-default-project';"
- cursor.execute(query)
- data_initial = cursor.fetchall()
- print data_initial
+ self.driver.get(self.base_url)
+ machine1 = "qemux86-64"
+ machine2 = "qemumips"
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("change-machine-toggle").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("machine-change-input").clear()
+ self.driver.find_element_by_id("machine-change-input").send_keys(machine1)
+ time.sleep(2)
+ self.driver.find_element_by_id("machine-change-btn").click()
+ time.sleep(1)
+
+ self.assertEqual(machine1, self.driver.find_element_by_id("project-machine-name").text, msg="Machine was not changed")
+
+ self.driver.find_element_by_id("build-input").clear()
+ self.driver.find_element_by_id("build-input").send_keys("core-image-minimal")
+ time.sleep(2)
+ self.driver.find_element_by_id("build-button").click()
+ time.sleep(3)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+ self.driver.find_element_by_link_text('core-image-minimal').click()
+ time.sleep(1)
+
+ title = self.driver.find_element_by_class_name("page-header").text
+ self.assertIn(machine1, title, msg="On build summary page is a different machine")
+
+ self.driver.back()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("topbar-configuration-tab").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("change-machine-toggle").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("machine-change-input").clear()
+ self.driver.find_element_by_id("machine-change-input").send_keys(machine2)
+ time.sleep(1)
+ self.driver.find_element_by_id("machine-change-btn").click()
+ time.sleep(1)
+
+ self.assertEqual(machine2, self.driver.find_element_by_id("project-machine-name").text, msg="Machine was not changed")
+
+ self.driver.find_element_by_id("build-input").clear()
+ self.driver.find_element_by_id("build-input").send_keys("core-image-sato")
+ time.sleep(2)
+ self.driver.find_element_by_id("build-button").click()
+ time.sleep(3)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+ self.driver.find_element_by_link_text('core-image-sato').click()
+ time.sleep(1)
+
+ title = self.driver.find_element_by_class_name("page-header").text
+ self.assertIn(machine2, title, msg="On build summary page is a different machine")
+
+
+ ##############
+ # CASE 1402 #
+ ##############
+ def test_1402(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
self.driver.maximize_window()
- self.driver.get('localhost:8000')#self.base_url)
+
+ self.driver.get(self.base_url)
+
self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
- self.driver.find_element_by_link_text('new-default-project').click()
- self.driver.find_element_by_id('release-change-toggle').click()
- dropdown = self.driver.find_element_by_css_selector('select')
- for option in dropdown.find_elements_by_tag_name('option'):
- if option.text == 'Local Yocto Project':
- option.click()
- self.driver.find_element_by_id('change-release-btn').click()
- #wait for the changes to register in the DB
- time.sleep(1)
-
- #get changed values
- con=sqlite.connect('toaster.sqlite')
- cursor = con.cursor()
- query = "select layercommit_id from orm_projectlayer a, orm_project b where a.project_id=b.id and b.name='new-default-project';"
- cursor.execute(query)
- data_changed = cursor.fetchall()
- print data_changed
-
- #resetting release to default
- self.driver.find_element_by_id('release-change-toggle').click()
- dropdown = self.driver.find_element_by_css_selector('select')
- for option in dropdown.find_elements_by_tag_name('option'):
- if option.text == 'Yocto Project master':
- option.click()
- self.driver.find_element_by_id('change-release-btn').click()
- #wait for the changes to register in the DB
- time.sleep(1)
- self.failUnless(data_initial != data_changed)
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("BitBake variables").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("change-image_fstypes-icon").click()
+ time.sleep(1)
+
+ image_fstypes_list = self.driver.find_element_by_id("all-image_fstypes")
+ items = image_fstypes_list.find_elements_by_tag_name("label")
+ for item in items:
+ if (item.text == 'ext4') | (item.text == 'hddimg'):
+ if "checked=\"checked\"" not in item.get_attribute('innerHTML'):
+ item.click()
+ time.sleep(0.5)
+ else:
+ print "WARNING: Posible that ext4 and hddimg images to be allready build"
+
+ self.driver.find_element_by_id("apply-change-image_fstypes").click()
+ time.sleep(1)
+
+ image_fstypes = self.driver.find_element_by_id("image_fstypes").text
+ self.assertIn("ext4", image_fstypes, msg="ext4 is not present in the Image fstypes")
+ self.assertIn("hddimg", image_fstypes, msg="hddimg is not present in the Image fstypes")
+
+ self.driver.find_element_by_id("build-input").clear()
+ self.driver.find_element_by_id("build-input").send_keys("core-image-minimal")
+ time.sleep(2)
+ self.driver.find_element_by_id("build-button").click()
+ time.sleep(3)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+
+
+ self.driver.find_element_by_link_text("core-image-minimal").click()
+ time.sleep(1)
+
+ self.assertTrue(self.driver.find_element_by_xpath("html/body/div[4]/div/div/div[2]/div[4]/div/dl/dd[4]/ul"),\
+ msg="WARNING: This build did not create any image files - this TC will fail")
+
+ image_files_list = self.driver.find_element_by_xpath("html/body/div[4]/div/div/div[2]/div[4]/div/dl/dd[4]/ul")
+
+ elements = ""
+ items = image_files_list.find_elements_by_tag_name("li")
+ for item in items:
+ elements += item.text
+ elements += " "
+
+ self.assertIn("ext4", elements, msg="ext4 is not present in the build Image files")
+
+ other_artifacts_list = self.driver.find_element_by_xpath("html/body/div[4]/div/div/div[2]/div[5]/div/dl/dd/div")
+ items = other_artifacts_list.find_elements_by_tag_name("a")
+ for item in items:
+ elements += item.text
+ elements += " "
+ self.assertIn("hddimg", elements, msg="hddimg is not present in the build Image files (other artifacts) - Bug 8556")
+
+
+ ##############
+ # CASE 1403 #
+ ##############
+ def test_1403(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ default_image_list = ['Software recipe', 'Version', 'Description', 'Layer', 'Build']
+ time.sleep(0.5)
+
+ #step 3
+ self.driver.find_element_by_link_text("Software recipes").click()
+ time.sleep(0.5)
+
+ #step 4
+ l = self.get_table_data('softwarerecipestable', 10, 5)
+ self.assertTrue(l != [], msg="Image recipes table is not populated")
+
+ head_list = self.get_table_head_text('softwarerecipestable')
+ for item in default_image_list:
+ self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
+
+
+ ##############
+ # CASE 1404 #
+ ##############
+ def test_1404(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ image_recipes_sortable_dict = {'Software recipe':'name', 'Section':'section', 'Layer':'layer_version__layer__name', 'License':'license'}
+ image_recipes_not_sortable_dict = {'Version':'version', 'Description':'get_description_or_summary', 'Recipe file':'recipe-file', \
+ 'Git revision':'layer_version__get_vcs_reference', 'Build':'add-del-layers'}
+ time.sleep(0.5)
+
+ #step 2
+ self.driver.find_element_by_link_text("Software recipes").click()
+ time.sleep(0.5)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ initial_values = [element.text for element in elements]
+ time.sleep(1)
+
+ #step 3
+ element = self.driver.find_element_by_css_selector('th.name')
+ self.assertTrue("i class=\"icon-caret-down\" style=\"display: inline;\"" in element.get_attribute('innerHTML'),\
+ msg='Table not sorted by Image recie')
+
+ #step 4
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-recipe-file").click()
+ self.driver.find_element_by_id("checkbox-section").click()
+ self.driver.find_element_by_id("checkbox-license").click()
+ self.driver.find_element_by_id("checkbox-layer_version__get_vcs_reference").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ #step 5
+ for column in image_recipes_sortable_dict:
+ element = self.driver.find_element_by_css_selector('th.%s' % image_recipes_sortable_dict[column])
+ time.sleep(1)
+ if column == 'Software recipe':
+ self.assertTrue("a class=\"sorted\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+ else:
+ self.assertTrue("href=\"#\"" in element.get_attribute('innerHTML'), msg='%s column is not sortable' %column)
+
+ for column in image_recipes_not_sortable_dict:
+ element = self.driver.find_element_by_css_selector('th.%s' %image_recipes_not_sortable_dict[column])
+ time.sleep(1)
+ self.assertTrue("<span class=\"muted\">" in element.get_attribute('innerHTML'), msg='%s column is sortable' %column)
+
+ #step 6
+ e = self.driver.find_element_by_css_selector('th.%s' % image_recipes_sortable_dict['Software recipe'])
+ e.click()
+ time.sleep(1)
+ self.assertTrue("<i class=\"icon-caret-up\"" in e.get_attribute('innerHTML'),\
+ msg='Software recipe is not sorted descendent')
+ time.sleep(1)
+
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("meta-intel")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+ time.sleep(1)
+
+ #step 8
+ e = self.driver.find_element_by_css_selector('th.%s' % image_recipes_sortable_dict['Software recipe'])
+ self.assertTrue("<i class=\"icon-caret-up\"" in e.get_attribute('innerHTML'),\
+ msg='Software recipe is not sorted descendent after search')
+
+ #continue step 6
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ values = [element.text for element in elements]
+
+ layers_elements = self.driver.find_elements_by_xpath("//td[@class='layer_version__layer__name']/a")
+ layers_elements[0].click()
+
+ time.sleep(1)
+ self.driver.back()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ values2 = [element.text for element in elements]
+ self.assertEqual(values, values2, "Software Recipe column is not sorted properly")
+
+ #step 7
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+
+ element = self.driver.find_element_by_xpath("//th[@class='section']/a")
+ element.click()
+ time.sleep(1)
+ self.assertTrue("sorted" in element.get_attribute('class'), msg='Table is not sort by Section')
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-section").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='name']")
+ values3 = [element.text for element in elements]
+ self.assertEqual(initial_values, values3, msg="Default sorting was not restore")
+
+
+ ##############
+ # CASE 1405 #
+ ##############
+ def test_1405(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ target_list = ['Software recipe', 'Version', 'Description', 'Recipe file', 'Section', 'Layer', 'License', \
+ 'Git revision', 'Build']
+ time.sleep(1)
+
+ #step 2
+ self.driver.find_element_by_link_text("Software recipes").click()
+ time.sleep(1)
+
+ # step 3
+ self.assertTrue(self.driver.find_element_by_id("search-input-softwarerecipestable"), "Search input not found")
+ self.assertTrue(self.driver.find_element_by_id("search-submit-softwarerecipestable"), " Search button not found")
+ all_targets = self.driver.find_element_by_class_name("table-count-softwarerecipestable").text
+
+ # step 4
+ self.assertEqual("Search compatible software recipes", \
+ self.driver.find_element_by_id("search-input-softwarerecipestable").get_attribute("placeholder") \
+ ,"Different placeholder text")
+
+ # step 5
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("c")
+ self.assertEqual("c",self.driver.find_element_by_id("search-input-softwarerecipestable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+ time.sleep(2)
+
+ # step 6
+ # returned results
+ self.assertEqual("core", self.driver.find_element_by_id("search-input-softwarerecipestable").get_attribute("value"), \
+ msg="Search string is not kept in the text input field")
+
+ targets_after_search = self.driver.find_element_by_class_name("table-count-softwarerecipestable").text
+ self.assertNotEqual(all_targets, targets_after_search, msg="Same compatibles targets")
+
+ self.driver.find_element_by_xpath("//*[@id='table-chrome-softwarerecipestable']/div/div[1]/a/i").click()
+ time.sleep(2)
+
+ targets_after_clear_search = self.driver.find_element_by_class_name("table-count-softwarerecipestable").text
+ self.assertEqual(all_targets, targets_after_clear_search, msg="Different number of compatibles targets")
+
+ #no results
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("dkasashdsakjdhasjkdashdjk")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+
+ time.sleep(3)
+ no_targets = self.driver.find_element_by_class_name("table-count-softwarerecipestable").text
+ if no_targets=="0":
+ self.driver.find_element_by_xpath("//*[@id='no-results-softwarerecipestable']/div/form/button[2]").click()
+ time.sleep(2)
+ targets_show_all = self.driver.find_element_by_class_name("table-count-softwarerecipestable").text
+ self.assertEqual(all_targets, targets_show_all, msg="Different number of compatibles targets")
+ else:
+ self.fail(msg='Search is not working properly')
+
+ # step 7
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("checkbox-recipe-file").click()
+ self.driver.find_element_by_id("checkbox-section").click()
+ self.driver.find_element_by_id("checkbox-license").click()
+ self.driver.find_element_by_id("checkbox-layer_version__get_vcs_reference").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+ time.sleep(1)
+
+ head_list = self.get_table_head_text('softwarerecipestable')
+ for item in target_list:
+ self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
+
+ # step 8
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ self.driver.find_element_by_id("in_current_project").click()
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+
+ time.sleep(2)
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ # bug 8125
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_xpath(".//*[@id='table-chrome-softwarerecipestable']/div/div[1]/a/i").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied after remove search - bug 8125")
+
+
+ ##############
+ # CASE 1406 #
+ ##############
+ def test_1406(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Software recipes").click()
+ time.sleep(1)
+
+ # step 3
+ build_element = self.driver.find_element_by_class_name("add-del-layers")
+ self.assertIn("<i class=\"icon-filter filtered\"></i>", build_element.get_attribute('innerHTML'), \
+ msg='Build filter dose not exist')
+
+ # step 4
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:not_in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:all").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ # step 5
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+ self.driver.find_element_by_id("in_current_project").click()
+ time.sleep(0.5)
+ self.driver.find_element_by_id("in_current_project:in_project").click()
+ self.driver.find_element_by_xpath("//*[@class='modal-footer']//*[@type='submit']").click()
+ time.sleep(2)
+
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertIn("btn-primary", filter_class,msg = "Filter is not applied")
+
+ self.driver.find_element_by_id("search-input-softwarerecipestable").clear()
+ self.driver.find_element_by_id("search-input-softwarerecipestable").send_keys("core")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-submit-softwarerecipestable").click()
+
+ time.sleep(2)
+ filter_class = self.driver.find_element_by_id("in_current_project").get_attribute("class")
+ self.assertNotIn("btn-primary", filter_class,msg = "Filter is applied")
+
+
+ ##############
+ # CASE 1407 #
+ ##############
+ def test_1407(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id('build-input').clear()
+ self.driver.find_element_by_id('build-input').send_keys('core-image-minimal')
+ time.sleep(2)
+ self.driver.find_element_by_id('build-button').click()
+ time.sleep(3)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 150)
+
+ self.driver.find_element_by_link_text("core-image-minimal").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_xpath(".//*[@id='nav']/ul/li[3]/a").click()
+ time.sleep(1)
+
+ elements = self.driver.find_elements_by_xpath("//td[@class='package_name']")
+ elements[0].click()
+ time.sleep(1)
+ self.driver.find_element_by_xpath(".//*[@id='otable']/tbody/tr[1]/td[1]/a").click()
+ time.sleep(1)
+ self.driver.find_element_by_xpath(".//*[@id='otable']/tbody/tr[1]/td[1]/a").click()
+ time.sleep(1)
+
+ self.assertTrue(self.driver.find_element_by_id("dirtable"), msg="Can't find the directory structure table")
+
+
+ ##############
+ # CASE 1408 #
+ ##############
+ def test_1408(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+ time.sleep(2)
+
+ try:
+ self.driver.find_element_by_xpath("//i[@class='icon-ok-sign success']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Unable to find successful build")
+
+ self.driver.find_element_by_link_text("Configuration").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("BitBake variables").click()
+ time.sleep(1)
+
+ filtered = self.driver.find_element_by_xpath("//i[@class='icon-filter filtered']")
+ self.assertTrue(filtered.is_enabled() ,msg="Could not find filtered column")
+
+ filtered_column = self.get_table_column_text("class", "description")
+ if '' in filtered_column:
+ self.fail(msg="At least one element in the description column is blank; filter failed!")
+
+
+ ##############
+ # CASE 1409 #
+ ##############
+ def test_1409(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+ time.sleep(2)
+
+ try:
+ self.driver.find_element_by_xpath("//i[@class='icon-ok-sign success']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Unable to find successful build")
+
+ self.driver.find_element_by_link_text("Recipes").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("depends_on").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_xpath("//table[@id='otable']/tbody/tr[1]/td[3]/a").click()
+ time.sleep(1)
+ self.driver.find_element_by_xpath("/html/body/div[5]/div[2]/ul/li[1]/a").click()
+ time.sleep(1)
+
+ self.assertTrue(self.is_text_present("License"),msg="Could not confirm we reached a recipe page")
+
+
+ ##############
+ # CASE 1410 #
+ ##############
+ def test_1410(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("Image recipes").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_id("edit-columns-button").click()
+ self.driver.find_element_by_id("checkbox-recipe-file").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ #saving current windows element
+ main_window = self.driver.current_window_handle
+ #open external link
+ link_button = self.driver.find_element_by_xpath("//table[@id='imagerecipestable']/tbody/tr[1]/td[4]/a")
+ try:
+ #open link in new tab instead of new window
+ link_button.send_keys(Keys.CONTROL + Keys.RETURN)
+ time.sleep(1)
+ except:
+ self.fail(msg="Could not click on external link button")
+
+ #switch to new opened tab
+ self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)
+ self.assertTrue(self.is_text_present("Angstrom-distribution"), msg="Unable to confirm new tab is the expected one")
+ #close new tab
+ self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 'w')
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Software recipes").click()
+ time.sleep(1)
+ self.driver.find_element_by_id("edit-columns-button").click()
+ self.driver.find_element_by_id("checkbox-recipe-file").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
+
+ #saving current windows element
+ main_window = self.driver.current_window_handle
+ #open external link
+ link_button = self.driver.find_element_by_xpath("//table[@id='softwarerecipestable']/tbody/tr[1]/td[4]/a")
+ try:
+ #open link in new tab instead of new window
+ link_button.send_keys(Keys.CONTROL + Keys.RETURN)
+ time.sleep(1)
+ except:
+ self.fail(msg="Could not click on external link button")
+
+ #switch to new opened tab
+ self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)
+ self.assertTrue(self.is_text_present("flihp"), msg="Unable to confirm new tab is the expected one")
+ #close new tab
+ self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 'w')
+
+
+ ##############
+ # CASE 1411 #
+ ##############
+ def test_1411(self):
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+ time.sleep(2)
+
+ try:
+ self.driver.find_element_by_xpath("//i[@class='icon-ok-sign success']").click()
+ time.sleep(1)
+ except:
+ self.fail(msg="Unable to find successful build")
+
+ self.driver.find_element_by_link_text("Packages").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Size").click()
+ sizes_list = self.get_table_column_text("class", "size sizecol")
+ if '' in sizes_list:
+ self.fail(msg="At least one element in the sizes column is blank")
+
+
+ ##############
+ # CASE 1412 #
+ ##############
+ def test_1412(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ # Step 4
+ self.driver.find_element_by_id('build-input').clear()
+ self.driver.find_element_by_id('build-input').send_keys('core-image-minimal core-image-sato')
+ time.sleep(2)
+ self.driver.find_element_by_id('build-button').click()
+ time.sleep(3)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 150)
+
+ self.driver.find_element_by_partial_link_text("core-image-minimal (+1)").click()
+ time.sleep(1)
+
+ header_text = self.driver.find_element_by_class_name("page-header").text
+ self.assertIn("core-image-minimal",header_text, msg="core-image-minimal not found in header text")
+ self.assertIn("core-image-sato",header_text, msg="core-image-sato not found in header text")
+
+ navigation_list = self.get_list_elements("nav")
+ self.assertIn("core-image-minimal",navigation_list, msg="core-image-minimal not found in navigation list")
+ self.assertIn("core-image-sato",navigation_list, msg="core-image-sato not found in navigation list")
+
+
+ ##############
+ # CASE 1413 #
+ ##############
+ def test_1413(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ change_distro = "poky-lsb"
+
+ # Step 4
+ self.driver.find_element_by_link_text("BitBake variables").click()
+
+ # Step 5
+ self.driver.find_element_by_id('change-distro-icon').click()
+
+ # Step 6
+ self.driver.find_element_by_id('new-distro').clear()
+ self.driver.find_element_by_id('new-distro').send_keys(change_distro)
+ time.sleep(2)
+ self.driver.find_element_by_id('apply-change-distro').click()
+ time.sleep(2)
+ self.assertEqual(change_distro, self.driver.find_element_by_id("distro").text, msg="Distro was not changed")
+
+ # Step 7
+
+ self.driver.find_element_by_id('build-input').clear()
+ self.driver.find_element_by_id('build-input').send_keys('core-image-minimal')
+ time.sleep(2)
+ self.driver.find_element_by_id('build-button').click()
+ time.sleep(3)
+
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+
+ self.driver.find_element_by_partial_link_text("core-image-minimal").click()
+ time.sleep(2)
+
+ self.assertEqual(change_distro, self.find_element_by_text(change_distro).text, msg="Different distro in build summary")
+
+
+ ##############
+ # CASE 1414 #
+ ##############
+ def test_1414(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ # Step 4
+ self.driver.find_element_by_link_text("BitBake variables").click()
+
+ # Step 5
+ self.driver.find_element_by_id('change-package_classes-icon').click()
+ time.sleep(2)
+
+ first_package = self.driver.find_element_by_id('package_class_1')
+ package_name1 = first_package.text
+ first_package.click()
+
+ second_package = self.driver.find_element_by_id('package_class_2')
+ package_name2 = second_package.text
+ second_package.click()
+
+ # click Save
+ self.driver.find_element_by_id('apply-change-package_classes').click()
+ time.sleep(2)
+
+ package = self.driver.find_element_by_id('package_classes').text
+
+ self.assertIn(package_name1, package, msg="%s not found in PACKAGE_CLASSES" %package_name1 )
+ self.assertIn(package_name2, package, msg="%s not found in PACKAGE_CLASSES" %package_name2 )
+
+ # Step 7
+
+ self.driver.find_element_by_id('build-input').clear()
+ self.driver.find_element_by_id('build-input').send_keys('core-image-minimal')
+ time.sleep(2)
+ self.driver.find_element_by_id('build-button').click()
+
+ #bug
+ time.sleep(5)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+
+ self.driver.find_element_by_partial_link_text("core-image-minimal").click()
+ time.sleep(1)
+
+ self.driver.find_element_by_link_text("Configuration").click()
+
+ self.driver.find_element_by_link_text("BitBake variables").click()
+
+ self.driver.find_element_by_id("search").clear()
+ self.driver.find_element_by_id("search").send_keys("PACKAGE_CLASSES")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-button").click()
+
+ selector = "td[class='variable_value']"
+ column_list = self.get_text_from_elements(selector)
+
+
+ self.assertIn(str(package_name1), str(column_list), msg="%s not found in PACKAGE_CLASSES" %package_name1)
+ self.assertIn(str(package_name2), str(column_list), msg="%s not found in PACKAGE_CLASSES" %package_name2)
+ self.assertIn("package_rpm", str(column_list), msg="package_rpm not found in PACKAGE_CLASSES")
+
+
+ ##############
+ # CASE 1415 #
+ ##############
+ def test_1415(self):
+
+ self.case_no = self.get_case_number()
+ self.log.info(' CASE %s log: ' % str(self.case_no))
+ self.driver.maximize_window()
+ self.driver.get(self.base_url)
+
+ self.driver.find_element_by_css_selector("a[href='/toastergui/projects/']").click()
+ time.sleep(1)
+ self.driver.find_element_by_link_text("selenium-project").click()
+ time.sleep(1)
+
+ # Step 4
+ self.driver.find_element_by_link_text("BitBake variables").click()
+
+ # Step 5
+ self.driver.find_element_by_id('change-image_install-icon').click()
+ time.sleep(2)
+
+ self.driver.find_element_by_id('new-image_install').clear()
+ self.driver.find_element_by_id('new-image_install').send_keys('ssh')
+ time.sleep(2)
+ self.driver.find_element_by_id('apply-change-image_install').click()
+ time.sleep(2)
+ self.assertEqual("ssh",self.driver.find_element_by_id('image_install').text, msg="ssh not found in IMAGE_INSTALL_append" )
+
+ # Step 6
+
+ self.driver.find_element_by_id('build-input').clear()
+ self.driver.find_element_by_id('build-input').send_keys('core-image-minimal')
+ time.sleep(2)
+ self.driver.find_element_by_id('build-button').click()
+
+ #bug
+ time.sleep(5)
+ self.driver.find_element_by_partial_link_text("Builds (").click()
+
+ self.wait_until_build_finish(1, 120)
+
+ # Step 7
+ self.driver.find_element_by_partial_link_text("core-image-minimal").click()
+ time.sleep(1)
+
+ # Step 8
+ self.driver.find_element_by_link_text("Packages").click()
+
+ self.driver.find_element_by_id("search").clear()
+ self.driver.find_element_by_id("search").send_keys("ssh")
+ time.sleep(2)
+ self.driver.find_element_by_id("search-button").click()
+ time.sleep(3)
+
+ header_text = self.driver.find_element_by_class_name("page-header").text
+ self.assertNotIn("No packages found", header_text, msg=("No packages found text"))
+