1
0
mirror of https://git.yoctoproject.org/poky synced 2026-06-01 13:09:50 +00:00

bitbake: toaster: UI test improvements

* Add decorator in logging mechanism
* Add more debug information

(Bitbake rev: ab94f4bbef38d23e7e8be0663781eaecf84f0172)

Signed-off-by: Ke Zou <ke.zou@windriver.com>
Signed-off-by: Stanciu Mihail <stanciux.mihail@intel.com>
Signed-off-by: Elliot Smith <elliot.smith@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ke Zou
2015-09-23 15:18:11 +01:00
committed by Richard Purdie
parent 4c5af777ea
commit 4c0320ffc0
@@ -221,6 +221,68 @@ def extract_number_from_string(s):
""" """
return re.findall(r'([0-9]+)', s) return re.findall(r'([0-9]+)', s)
# Below is decorator derived from toaster backend test code
class NoParsingFilter(logging.Filter):
def filter(self, record):
return record.levelno == 100
def LogResults(original_class):
orig_method = original_class.run
#rewrite the run method of unittest.TestCase to add testcase logging
def run(self, result, *args, **kws):
orig_method(self, result, *args, **kws)
passed = True
testMethod = getattr(self, self._testMethodName)
#if test case is decorated then use it's number, else use it's name
try:
test_case = testMethod.test_case
except AttributeError:
test_case = self._testMethodName
#create custom logging level for filtering.
custom_log_level = 100
logging.addLevelName(custom_log_level, 'RESULTS')
caller = os.path.basename(sys.argv[0])
def results(self, message, *args, **kws):
if self.isEnabledFor(custom_log_level):
self.log(custom_log_level, message, *args, **kws)
logging.Logger.results = results
logging.basicConfig(filename=os.path.join(os.getcwd(),'results-'+caller+'.log'),
filemode='w',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%H:%M:%S',
level=custom_log_level)
for handler in logging.root.handlers:
handler.addFilter(NoParsingFilter())
# local_log = logging.getLogger(caller)
local_log = logging.getLogger()
#check status of tests and record it
for (name, msg) in result.errors:
if self._testMethodName == str(name).split(' ')[0]:
local_log.results("Testcase "+str(test_case)+": ERROR")
local_log.results("Testcase "+str(test_case)+":\n"+msg+"\n\n\n")
passed = False
for (name, msg) in result.failures:
if self._testMethodName == str(name).split(' ')[0]:
local_log.results("Testcase "+str(test_case)+": FAILED")
local_log.results("Testcase "+str(test_case)+":\n"+msg+"\n\n\n")
passed = False
for (name, msg) in result.skipped:
if self._testMethodName == str(name).split(' ')[0]:
local_log.results("Testcase "+str(test_case)+": SKIPPED"+"\n\n\n")
passed = False
if passed:
local_log.results("Testcase "+str(test_case)+": PASSED"+"\n\n\n")
original_class.run = run
return original_class
########################################### ###########################################
@@ -534,6 +596,7 @@ class toaster_cases_base(unittest.TestCase):
def is_text_present (self, patterns): def is_text_present (self, patterns):
for pattern in patterns: for pattern in patterns:
if str(pattern) not in self.driver.page_source: if str(pattern) not in self.driver.page_source:
print pattern
return False return False
return True return True
@@ -595,7 +658,7 @@ class toaster_cases_base(unittest.TestCase):
# Note: to comply with the unittest framework, we call these test_xxx functions # Note: to comply with the unittest framework, we call these test_xxx functions
# from run_toastercases.py to avoid calling setUp() and tearDown() multiple times # from run_toastercases.py to avoid calling setUp() and tearDown() multiple times
@LogResults
class toaster_cases(toaster_cases_base): class toaster_cases(toaster_cases_base):
############## ##############
# CASE 901 # # CASE 901 #
@@ -630,12 +693,12 @@ class toaster_cases(toaster_cases_base):
if is_list_inverted(column_list): if is_list_inverted(column_list):
self.driver.find_element_by_link_text(key).click() self.driver.find_element_by_link_text(key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_sequenced(column_list)) self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
else: else:
self.failUnless(is_list_sequenced(column_list)) self.assertTrue(is_list_sequenced(column_list), msg=("%s column not sequenced" % key))
self.driver.find_element_by_link_text(key).click() self.driver.find_element_by_link_text(key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_inverted(column_list)) self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
self.log.info("case passed") self.log.info("case passed")
@@ -659,10 +722,10 @@ class toaster_cases(toaster_cases_base):
# if nothing found, we still count it as "pass" # if nothing found, we still count it as "pass"
if new_target_column_texts: if new_target_column_texts:
for text in new_target_column_texts: for text in new_target_column_texts:
self.failUnless(text.find(pattern)) self.assertTrue(text.find(pattern), msg=("%s item doesn't exist " % pattern))
self.driver.find_element_by_css_selector("i.icon-remove").click() self.driver.find_element_by_css_selector("i.icon-remove").click()
target_column_texts = self.get_table_column_text("class", "target") target_column_texts = self.get_table_column_text("class", "target")
self.failUnless(ori_target_column_texts == target_column_texts) self.assertTrue(ori_target_column_texts == target_column_texts, msg=("builds changed after operations"))
############## ##############
@@ -685,10 +748,9 @@ class toaster_cases(toaster_cases_base):
try: try:
temp_element = self.find_element_by_text_in_table('otable', item) temp_element = self.find_element_by_text_in_table('otable', item)
# this is how we find "filter icon" in the same level as temp_element(where "a" means clickable, "i" means icon) # this is how we find "filter icon" in the same level as temp_element(where "a" means clickable, "i" means icon)
self.failUnless(temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']")) self.assertTrue(temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']"))
except Exception,e: except Exception,e:
self.log.error(" %s cannot be found! %s" % (item, e)) self.assertFalse(True, msg=(" %s cannot be found! %s" % (item, e)))
self.failIf(True)
raise raise
# step 5-6 # step 5-6
temp_element = self.find_element_by_link_text_in_table('otable', 'Outcome') temp_element = self.find_element_by_link_text_in_table('otable', 'Outcome')
@@ -731,10 +793,12 @@ class toaster_cases(toaster_cases_base):
# This is how we find the "default" rows-number! # This is how we find the "default" rows-number!
rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text) rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text)
print rows_displayed print rows_displayed
self.failUnless(self.get_table_element(self.table_name, rows_displayed)) self.assertTrue(self.get_table_element(self.table_name, rows_displayed), msg=("not enough rows displayed"))
self.failIf(self.get_table_element(self.table_name, rows_displayed + 1)) self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1), \
msg=("more rows displayed than expected"))
# Search text box background text is "Search tasks" # Search text box background text is "Search tasks"
self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='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").clear()
self.driver.find_element_by_id("search").send_keys("busybox") self.driver.find_element_by_id("search").send_keys("busybox")
@@ -763,22 +827,23 @@ class toaster_cases(toaster_cases_base):
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
# after 1st click, the list should be either sequenced or inverted, but we don't have a "default order" here # after 1st click, the list should be either sequenced or inverted, but we don't have a "default order" here
# the point is, after another click, it should be another order # the point is, after another click, it should be another order
# the fist case is special:this means every item in column_list is the same, so # the first case is special:this means every item in column_list is the same, so
# after one click, either sequenced or inverted will be fine # after one click, either sequenced or inverted will be fine
if (is_list_inverted(column_list) and is_list_sequenced(column_list)) \ if (is_list_inverted(column_list) and is_list_sequenced(column_list)) \
or (not column_list) : or (not column_list) :
self.find_element_by_link_text_in_table(self.table_name, key).click() self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list)) 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): elif is_list_inverted(column_list):
self.find_element_by_link_text_in_table(self.table_name, key).click() self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_sequenced(column_list)) self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
else: else:
self.failUnless(is_list_sequenced(column_list)) 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() self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_inverted(column_list)) self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
# step 8-10 # step 8-10
# filter dict: {link text name : filter table name in xpath} # filter dict: {link text name : filter table name in xpath}
filter_dict = {'Executed':'filter_executed', 'Outcome':'filter_outcome', 'Cache attempt':'filter_cache_attempt'} filter_dict = {'Executed':'filter_executed', 'Outcome':'filter_outcome', 'Cache attempt':'filter_cache_attempt'}
@@ -837,9 +902,9 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', key).click() self.find_element_by_link_text_in_table('nav', key).click()
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in test_dict[key]['check_head_list']: for item in test_dict[key]['check_head_list']:
self.failUnless(item in 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']) column_list = self.get_table_column_text('class', test_dict[key]['class'])
self.failUnless(is_list_inverted(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() self.driver.find_element_by_id("edit-columns-button").click()
for item2 in test_dict[key]['check_column_list']: for item2 in test_dict[key]['check_column_list']:
@@ -865,21 +930,24 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_partial_link_text("Generated files").click() self.driver.find_element_by_partial_link_text("Generated files").click()
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in ['File', 'Size']: for item in ['File', 'Size']:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("%s not in head row" % item))
c_list = self.get_table_column_text('class', 'path') c_list = self.get_table_column_text('class', 'path')
self.failUnless(is_list_sequenced(c_list)) self.assertTrue(is_list_sequenced(c_list), msg=("column not in order"))
# step 7 # step 7
self.driver.find_element_by_partial_link_text("Runtime dependencies").click() self.driver.find_element_by_partial_link_text("Runtime dependencies").click()
# save sceen here to observe... # save sceen here to observe...
# note that here table name is not 'otable' # note that here table name is not 'otable'
head_list = self.get_table_head_text('dependencies') head_list = self.get_table_head_text('dependencies')
for item in ['Package', 'Version', 'Size']: for item in ['Package', 'Version', 'Size']:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("%s not in head row" % item))
c_list = self.get_table_column_text_by_column_number('dependencies', 1) c_list = self.get_table_column_text_by_column_number('dependencies', 1)
self.failUnless(is_list_sequenced(c_list)) self.assertTrue(is_list_sequenced(c_list), msg=("list not in order"))
texts = ['Size', 'License', 'Recipe', 'Recipe version', 'Layer', \ texts = ['Size', 'License', 'Recipe', 'Recipe version', 'Layer', \
'Layer branch', 'Layer commit', 'Layer directory'] 'Layer branch', 'Layer commit']
self.failUnless(self.is_text_present(texts)) time.sleep(1)
# for text in texts:
# self.assertTrue(self.is_text_present(text), msg=("text %s not in page" % text))
self.assertTrue(self.is_text_present(texts), msg=("text not in page"))
############## ##############
@@ -901,8 +969,8 @@ class toaster_cases(toaster_cases_base):
# This is how we find the "default" rows-number! # This is how we find the "default" rows-number!
rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text) rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text)
print rows_displayed print rows_displayed
self.failUnless(self.get_table_element(self.table_name, rows_displayed)) self.assertTrue(self.get_table_element(self.table_name, rows_displayed))
self.failIf(self.get_table_element(self.table_name, rows_displayed + 1)) self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1))
# Check the default table is sorted by Recipe # 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]")) tasks_column_count = len(self.driver.find_elements_by_xpath("/html/body/div[2]/div/div[2]/div[2]/table/tbody/tr/td[1]"))
@@ -910,10 +978,10 @@ class toaster_cases(toaster_cases_base):
default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1) default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1)
#print default_column_list #print default_column_list
self.failUnless(is_list_sequenced(default_column_list)) self.assertTrue(is_list_sequenced(default_column_list))
# Search text box background text is "Search recipes" # Search text box background text is "Search recipes"
self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='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").clear()
self.driver.find_element_by_id("search").send_keys(test_package1) self.driver.find_element_by_id("search").send_keys(test_package1)
@@ -940,7 +1008,7 @@ class toaster_cases(toaster_cases_base):
#self.driver.find_element_by_partial_link_text("zlib").click() #self.driver.find_element_by_partial_link_text("zlib").click()
#self.driver.back() #self.driver.back()
#self.failUnless(is_list_inverted(inverted_column_list)) #self.assertTrue(is_list_inverted(inverted_column_list))
#self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click() #self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click()
table_head_dict = {'Recipe':'recipe__name', 'Recipe file':'recipe_file', 'Section':'recipe_section', \ table_head_dict = {'Recipe':'recipe__name', 'Recipe file':'recipe_file', 'Section':'recipe_section', \
@@ -953,52 +1021,52 @@ class toaster_cases(toaster_cases_base):
or (not column_list) : or (not column_list) :
self.find_element_by_link_text_in_table(self.table_name, key).click() self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list)) self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list))
self.driver.find_element_by_partial_link_text("acl").click() self.driver.find_element_by_partial_link_text("acl").click()
self.driver.back() self.driver.back()
self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list)) self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list))
# Search text box background text is "Search recipes" # Search text box background text is "Search recipes"
self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='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").clear()
self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search").send_keys(test_package2)
self.driver.find_element_by_id("search-button").click() self.driver.find_element_by_id("search-button").click()
column_search_list = self.get_table_column_text("class", table_head_dict[key]) column_search_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_sequenced(column_search_list) or is_list_inverted(column_search_list)) self.assertTrue(is_list_sequenced(column_search_list) or is_list_inverted(column_search_list))
self.driver.find_element_by_css_selector("i.icon-remove").click() self.driver.find_element_by_css_selector("i.icon-remove").click()
elif is_list_inverted(column_list): elif is_list_inverted(column_list):
self.find_element_by_link_text_in_table(self.table_name, key).click() self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_sequenced(column_list)) self.assertTrue(is_list_sequenced(column_list))
self.driver.find_element_by_partial_link_text("acl").click() self.driver.find_element_by_partial_link_text("acl").click()
self.driver.back() self.driver.back()
self.failUnless(is_list_sequenced(column_list)) self.assertTrue(is_list_sequenced(column_list))
# Search text box background text is "Search recipes" # Search text box background text is "Search recipes"
self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='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").clear()
self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search").send_keys(test_package2)
self.driver.find_element_by_id("search-button").click() self.driver.find_element_by_id("search-button").click()
column_search_list = self.get_table_column_text("class", table_head_dict[key]) column_search_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_sequenced(column_search_list)) self.assertTrue(is_list_sequenced(column_search_list))
self.driver.find_element_by_css_selector("i.icon-remove").click() self.driver.find_element_by_css_selector("i.icon-remove").click()
else: else:
self.failUnless(is_list_sequenced(column_list)) self.assertTrue(is_list_sequenced(column_list))
self.find_element_by_link_text_in_table(self.table_name, key).click() self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key]) column_list = self.get_table_column_text("class", table_head_dict[key])
self.failUnless(is_list_inverted(column_list)) self.assertTrue(is_list_inverted(column_list))
try: try:
self.driver.find_element_by_partial_link_text("acl").click() self.driver.find_element_by_partial_link_text("acl").click()
except: except:
self.driver.find_element_by_partial_link_text("zlib").click() self.driver.find_element_by_partial_link_text("zlib").click()
self.driver.back() self.driver.back()
self.failUnless(is_list_inverted(column_list)) self.assertTrue(is_list_inverted(column_list))
# Search text box background text is "Search recipes" # Search text box background text is "Search recipes"
self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='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").clear()
self.driver.find_element_by_id("search").send_keys(test_package2) self.driver.find_element_by_id("search").send_keys(test_package2)
self.driver.find_element_by_id("search-button").click() self.driver.find_element_by_id("search-button").click()
column_search_list = self.get_table_column_text("class", table_head_dict[key]) column_search_list = self.get_table_column_text("class", table_head_dict[key])
#print column_search_list #print column_search_list
self.failUnless(is_list_inverted(column_search_list)) self.assertTrue(is_list_inverted(column_search_list))
self.driver.find_element_by_css_selector("i.icon-remove").click() self.driver.find_element_by_css_selector("i.icon-remove").click()
# Bug 5919 # Bug 5919
@@ -1014,7 +1082,7 @@ class toaster_cases(toaster_cases_base):
#print tasks_column_count #print tasks_column_count
default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1) default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1)
#print default_column_list #print default_column_list
self.failUnless(is_list_sequenced(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("edit-columns-button").click()
self.driver.find_element_by_id("recipe_file").click() self.driver.find_element_by_id("recipe_file").click()
@@ -1064,31 +1132,31 @@ class toaster_cases(toaster_cases_base):
# step 3 # step 3
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']: for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() 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("depends_on").click()
self.driver.find_element_by_id("layer_version__branch").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("layer_version__layer__commit").click()
self.driver.find_element_by_id("depends_by").click() self.driver.find_element_by_id("depends_by").click()
self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() self.driver.find_element_by_id("edit-columns-button").click()
# check if columns selected above is shown # check if columns selected above is shown
check_list = ['Dependencies', 'Layer branch', 'Layer commit', 'Layer directory', 'Reverse dependencies'] check_list = ['Dependencies', 'Layer branch', 'Layer commit', 'Reverse dependencies']
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
time.sleep(2) time.sleep(2)
print head_list print head_list
for item in check_list: for item in check_list:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
# un-check 'em all # un-check 'em all
self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() 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("depends_on").click()
self.driver.find_element_by_id("layer_version__branch").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("layer_version__layer__commit").click()
self.driver.find_element_by_id("depends_by").click() self.driver.find_element_by_id("depends_by").click()
self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click() self.driver.find_element_by_id("edit-columns-button").click()
# don't exist any more # don't exist any more
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in check_list: for item in check_list:
self.failIf(item in head_list) self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item))
############## ##############
@@ -1104,7 +1172,7 @@ class toaster_cases(toaster_cases_base):
# step 3 # step 3
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']: for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
# step 4 # step 4
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
# save screen # save screen
@@ -1318,7 +1386,8 @@ class toaster_cases(toaster_cases_base):
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
print head_list print head_list
print len(head_list) print len(head_list)
self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description']) self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \
msg=("head row contents wrong"))
# step 8 # step 8
# search other string. and click "Variable" to re-sort, check if table # search other string. and click "Variable" to re-sort, check if table
# head is still the same # head is still the same
@@ -1327,10 +1396,12 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search-button").click() self.driver.find_element_by_id("search-button").click()
self.find_element_by_link_text_in_table('otable', 'Variable').click() self.find_element_by_link_text_in_table('otable', 'Variable').click()
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description']) self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \
msg=("head row contents wrong"))
self.find_element_by_link_text_in_table('otable', 'Variable').click() self.find_element_by_link_text_in_table('otable', 'Variable').click()
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description']) self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \
msg=("head row contents wrong"))
############## ##############
@@ -1346,11 +1417,11 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', 'Configuration').click() self.find_element_by_link_text_in_table('nav', 'Configuration').click()
self.driver.find_element_by_link_text("BitBake variables").click() self.driver.find_element_by_link_text("BitBake variables").click()
variable_list = self.get_table_column_text('class', 'variable_name') variable_list = self.get_table_column_text('class', 'variable_name')
self.failUnless(is_list_sequenced(variable_list)) self.assertTrue(is_list_sequenced(variable_list), msg=("list not in order"))
# step 4 # step 4
self.find_element_by_link_text_in_table('otable', 'Variable').click() self.find_element_by_link_text_in_table('otable', 'Variable').click()
variable_list = self.get_table_column_text('class', 'variable_name') variable_list = self.get_table_column_text('class', 'variable_name')
self.failUnless(is_list_inverted(variable_list)) self.assertTrue(is_list_inverted(variable_list), msg=("list not inverted"))
self.find_element_by_link_text_in_table('otable', 'Variable').click() self.find_element_by_link_text_in_table('otable', 'Variable').click()
# step 5 # step 5
# searching won't change the sequentiality # searching won't change the sequentiality
@@ -1358,7 +1429,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search").send_keys("lib") self.driver.find_element_by_id("search").send_keys("lib")
self.driver.find_element_by_id("search-button").click() self.driver.find_element_by_id("search-button").click()
variable_list = self.get_table_column_text('class', 'variable_name') variable_list = self.get_table_column_text('class', 'variable_name')
self.failUnless(is_list_sequenced(variable_list)) self.assertTrue(is_list_sequenced(variable_list), msg=("list not in order"))
############## ##############
@@ -1372,7 +1443,7 @@ class toaster_cases(toaster_cases_base):
# Step 2 # Step 2
# default sequence in "Completed on" column is inverted # default sequence in "Completed on" column is inverted
c_list = self.get_table_column_text('class', 'completed_on') c_list = self.get_table_column_text('class', 'completed_on')
self.failUnless(is_list_inverted(c_list)) self.assertTrue(is_list_inverted(c_list), msg=("list not inverted"))
# step 3 # step 3
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
self.driver.find_element_by_id("started_on").click() self.driver.find_element_by_id("started_on").click()
@@ -1380,8 +1451,8 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("time").click() self.driver.find_element_by_id("time").click()
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in ['Outcome', 'Target', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', 'Warnings', 'Time']: for item in ['Outcome', 'Recipe', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', 'Warnings', 'Time']:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
############## ##############
@@ -1395,7 +1466,7 @@ class toaster_cases(toaster_cases_base):
# Please refer to case 924 requirement # Please refer to case 924 requirement
# default sequence in "Completed on" column is inverted # default sequence in "Completed on" column is inverted
c_list = self.get_table_column_text('class', 'completed_on') c_list = self.get_table_column_text('class', 'completed_on')
self.failUnless(is_list_inverted(c_list)) self.assertTrue(is_list_inverted(c_list), msg=("list not inverted"))
# Step 4 # Step 4
# click Errors , order in "Completed on" should be disturbed. Then hide # click Errors , order in "Completed on" should be disturbed. Then hide
# error column to check if order in "Completed on" can be restored # error column to check if order in "Completed on" can be restored
@@ -1406,7 +1477,7 @@ class toaster_cases(toaster_cases_base):
# Note: without time.sleep here, there'll be unpredictable error..TBD # Note: without time.sleep here, there'll be unpredictable error..TBD
time.sleep(1) time.sleep(1)
c_list = self.get_table_column_text('class', 'completed_on') c_list = self.get_table_column_text('class', 'completed_on')
self.failUnless(is_list_inverted(c_list)) self.assertTrue(is_list_inverted(c_list), msg=("list not inverted"))
############## ##############
@@ -1422,7 +1493,7 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', 'Packages').click() self.find_element_by_link_text_in_table('nav', 'Packages').click()
check_head_list = ['Package', 'Package version', 'Size', 'Recipe'] check_head_list = ['Package', 'Package version', 'Size', 'Recipe']
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
self.failUnless(head_list == check_head_list) self.assertTrue(head_list == check_head_list, msg=("head row not as expected"))
# Step 4 # Step 4
# pulldown menu # pulldown menu
option_ids = ['recipe__layer_version__layer__name', 'recipe__layer_version__branch', \ option_ids = ['recipe__layer_version__layer__name', 'recipe__layer_version__branch', \
@@ -1451,7 +1522,7 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', 'Packages').click() self.find_element_by_link_text_in_table('nav', 'Packages').click()
# column -- Package # column -- Package
column_list = self.get_table_column_text_by_column_number('otable', 1) column_list = self.get_table_column_text_by_column_number('otable', 1)
self.failUnless(is_list_sequenced(column_list)) self.assertTrue(is_list_sequenced(column_list), msg=("list not in order"))
self.find_element_by_link_text_in_table('otable', 'Size').click() self.find_element_by_link_text_in_table('otable', 'Size').click()
@@ -1473,7 +1544,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
#get modified table header #get modified table header
new_head = self.get_table_head_text('otable') new_head = self.get_table_head_text('otable')
self.failUnless(head_list > new_head) self.assertTrue(head_list > new_head)
############## ##############
# CASE 943 # # CASE 943 #
@@ -1490,7 +1561,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search").send_keys("bash") self.driver.find_element_by_id("search").send_keys("bash")
self.driver.find_element_by_id("search-button").click() self.driver.find_element_by_id("search-button").click()
#check for the search result message "XX packages found" #check for the search result message "XX packages found"
self.failUnless(self.is_text_present("packages found")) self.assertTrue(self.is_text_present("packages found"), msg=("no packages found text"))
############## ##############
@@ -1511,11 +1582,12 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
# otable is the recipes table here # otable is the recipes table here
otable_head_text = self.get_table_head_text('otable') otable_head_text = self.get_table_head_text('otable')
for item in ["Layer", "Layer branch", "Layer commit", "Layer directory"]: for item in ["Layer", "Layer branch", "Layer commit"]:
self.failIf(item not in otable_head_text) self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item))
# click the fist recipe, whatever it is # click the fist recipe, whatever it is
self.get_table_element("otable", 1, 1).click() self.get_table_element("otable", 1, 1).click()
self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"])) self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"]), \
msg=("text not in web page"))
# step 2: test Packages page stuff. almost same as above # step 2: test Packages page stuff. almost same as above
self.driver.back() self.driver.back()
@@ -1528,10 +1600,11 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
otable_head_text = self.get_table_head_text("otable") otable_head_text = self.get_table_head_text("otable")
for item in ["Layer", "Layer branch", "Layer commit"]: for item in ["Layer", "Layer branch", "Layer commit"]:
self.failIf(item not in otable_head_text) self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item))
# click the fist recipe, whatever it is # click the fist recipe, whatever it is
self.get_table_element("otable", 1, 1).click() self.get_table_element("otable", 1, 1).click()
self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit"])) self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \
msg=("text not in web page"))
# step 3: test Packages core-image-minimal(images) stuff. almost same as above. Note when future element-id changes... # step 3: test Packages core-image-minimal(images) stuff. almost same as above. Note when future element-id changes...
self.driver.back() self.driver.back()
@@ -1543,17 +1616,18 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
otable_head_text = self.get_table_head_text("otable") otable_head_text = self.get_table_head_text("otable")
for item in ["Layer", "Layer branch", "Layer commit"]: for item in ["Layer", "Layer branch", "Layer commit"]:
self.failIf(item not in otable_head_text) self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item))
# click the fist recipe, whatever it is # click the fist recipe, whatever it is
self.get_table_element("otable", 1, 1).click() self.get_table_element("otable", 1, 1).click()
self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit"])) self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \
msg=("text not in web page"))
# step 4: check Configuration page # step 4: check Configuration page
self.driver.back() self.driver.back()
self.driver.find_element_by_link_text("Configuration").click() self.driver.find_element_by_link_text("Configuration").click()
otable_head_text = self.get_table_head_text() otable_head_text = self.get_table_head_text()
for item in ["Layer", "Layer branch", "Layer commit"]: for item in ["Layer", "Layer branch", "Layer commit"]:
self.failIf(item not in otable_head_text) self.assertTrue(item not in otable_head_text, msg=("item %s should not be in head row" % item))
############## ##############
@@ -1578,14 +1652,14 @@ class toaster_cases(toaster_cases_base):
# Sure we can use driver.get(url) to refresh page, but since page will vary, we use click link text here # Sure we can use driver.get(url) to refresh page, but since page will vary, we use click link text here
self.driver.find_element_by_link_text(items).click() self.driver.find_element_by_link_text(items).click()
Select(self.driver.find_element_by_css_selector("select.pagesize")).select_by_visible_text(str(rows_displayed)) Select(self.driver.find_element_by_css_selector("select.pagesize")).select_by_visible_text(str(rows_displayed))
self.failUnless(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]")) self.assertTrue(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]"))
self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) self.assertFalse(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. # 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]").click() self.driver.find_element_by_xpath(xpath_table + "/tr[1]/td[1]").click()
self.driver.find_element_by_link_text(items).click() self.driver.find_element_by_link_text(items).click()
self.failUnless(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]")) self.assertTrue(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]"))
self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]")) self.assertFalse(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]"))
############## ##############
@@ -1676,7 +1750,7 @@ class toaster_cases(toaster_cases_base):
check_list = ['Description', 'Set in file'] check_list = ['Description', 'Set in file']
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in check_list: for item in check_list:
self.failIf(item in head_list) self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item))
# check these 2 options and verify again # check these 2 options and verify again
self.driver.find_element_by_id('edit-columns-button').click() self.driver.find_element_by_id('edit-columns-button').click()
self.driver.find_element_by_xpath(xpath_option('description')).click() self.driver.find_element_by_xpath(xpath_option('description')).click()
@@ -1684,7 +1758,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id('edit-columns-button').click() self.driver.find_element_by_id('edit-columns-button').click()
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in check_list: for item in check_list:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
############## ##############
@@ -1706,7 +1780,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search-button").click() self.driver.find_element_by_id("search-button").click()
#get number of variables visible after search #get number of variables visible after search
number_after_search = self.driver.find_element_by_class_name('page-header').text number_after_search = self.driver.find_element_by_class_name('page-header').text
self.failUnless(number_before_search > number_after_search) self.assertTrue(number_before_search > number_after_search, msg=("items should be less after search"))
############## ##############
@@ -1725,11 +1799,11 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_partial_link_text("Directory structure") self.driver.find_element_by_partial_link_text("Directory structure")
except Exception,e: except Exception,e:
self.log.error(e) self.log.error(e)
self.failIf(True) self.assertFalse(True)
# step 4 # step 4
head_list = self.get_table_head_text('otable') head_list = self.get_table_head_text('otable')
for item in ['Package', 'Package version', 'Size', 'Dependencies', 'Reverse dependencies', 'Recipe']: for item in ['Package', 'Package version', 'Size', 'Dependencies', 'Reverse dependencies', 'Recipe']:
self.failUnless(item in head_list) self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
# step 5-6 # step 5-6
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
selectable_class = 'checkbox' selectable_class = 'checkbox'
@@ -1749,22 +1823,15 @@ class toaster_cases(toaster_cases_base):
unselectable_list.append(element.text) unselectable_list.append(element.text)
# check them # check them
for item in selectable_check_list: for item in selectable_check_list:
if item not in selectable_list: self.assertTrue(item in selectable_list, msg=("%s not found in dropdown menu" % item))
self.log.error(" %s not found in dropdown menu \n" % item)
self.failIf(True)
for item in unselectable_check_list: for item in unselectable_check_list:
if item not in unselectable_list: self.assertTrue(item in unselectable_list, msg=("%s not found in dropdown menu" % item))
self.log.error(" %s not found in dropdown menu \n" % item)
self.failIf(True)
self.driver.find_element_by_id("edit-columns-button").click() self.driver.find_element_by_id("edit-columns-button").click()
# step 7 # step 7
self.driver.find_element_by_partial_link_text("Directory structure").click() self.driver.find_element_by_partial_link_text("Directory structure").click()
head_list = self.get_table_head_text('dirtable') head_list = self.get_table_head_text('dirtable')
for item in ['Directory / File', 'Symbolic link to', 'Source package', 'Size', 'Permissions', 'Owner', 'Group']: for item in ['Directory / File', 'Symbolic link to', 'Source package', 'Size', 'Permissions', 'Owner', 'Group']:
if item not in head_list: self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
self.log.error(" %s not found in Directory structure table head \n" % item)
self.failIf(True)
############## ##############
# CASE 950 # # CASE 950 #
@@ -1794,12 +1861,11 @@ class toaster_cases(toaster_cases_base):
try: try:
self.find_element_by_link_text_in_table('nav', item) self.find_element_by_link_text_in_table('nav', item)
except Exception: except Exception:
self.log.error("link %s cannot be found in the page" % item) self.assertFalse(True, msg=("link %s cannot be found in the page" % item))
self.failIf(True)
# step 6 # step 6
check_list_2 = ['Packages included', 'Total package size', \ check_list_2 = ['Packages included', 'Total package size', \
'License manifest', 'Image files'] 'License manifest', 'Image files']
self.failUnless(self.is_text_present(check_list_2)) self.assertTrue(self.is_text_present(check_list_2), msg=("text not in web page"))
self.driver.back() self.driver.back()
try: try:
fail_icon = self.driver.find_element_by_xpath("//*[@class='icon-minus-sign error']") fail_icon = self.driver.find_element_by_xpath("//*[@class='icon-minus-sign error']")
@@ -1816,12 +1882,11 @@ class toaster_cases(toaster_cases_base):
try: try:
self.find_element_by_link_text_in_table('nav', item) self.find_element_by_link_text_in_table('nav', item)
except Exception: except Exception:
self.log.error("link %s cannot be found in the page" % item) self.assertFalse(True, msg=("link %s cannot be found in the page" % item))
self.failIf(True)
# step 7 involved # step 7 involved
check_list_3 = ['Machine', 'Distro', 'Layers', 'Total number of tasks', 'Tasks executed', \ check_list_3 = ['Machine', 'Distro', 'Layers', 'Total number of tasks', 'Tasks executed', \
'Tasks not executed', 'Reuse', 'Recipes built', 'Packages built'] 'Tasks not executed', 'Reuse', 'Recipes built', 'Packages built']
self.failUnless(self.is_text_present(check_list_3)) self.assertTrue(self.is_text_present(check_list_3), msg=("text not in web page"))
self.driver.back() self.driver.back()
@@ -1881,6 +1946,5 @@ class toaster_cases(toaster_cases_base):
tasks, recipes, packages need to run manually") tasks, recipes, packages need to run manually")
self.driver.find_element_by_partial_link_text("Toaster manual").click() self.driver.find_element_by_partial_link_text("Toaster manual").click()
if not self.is_text_present("Toaster Manual"): if not self.is_text_present("Toaster Manual"):
self.log.error("please check [Toaster manual] link on page") self.assertFalse(True, msg=("please check [Toaster manual] link on page"))
self.failIf(True)