2015-05-13 12:21:33 +00:00
#!/usr/bin/python
# Copyright
# DESCRIPTION
# This is toaster automation base class and test cases file
# History:
# 2015.03.09 inital version
# 2015.03.23 adding toaster_test.cfg, run_toastertest.py so we can run case by case from outside
# Briefs:
# This file is comprised of 3 parts:
# I: common utils like sorting, getting attribute.. etc
# II: base class part, which complies with unittest frame work and
# contains class selenium-based functions
# III: test cases
# to add new case: just implement new test_xxx() function in class toaster_cases
# NOTES for cases:
# case 946:
# step 6 - 8 needs to be observed using screenshots
# case 956:
# step 2 - 3 needs to be run manually
import unittest , time , re , sys , getopt , os , logging , string , errno , exceptions
2015-12-07 15:53:00 +00:00
import shutil , argparse , ConfigParser , platform , json
2015-05-13 12:21:33 +00:00
from selenium import webdriver
from selenium . common . exceptions import NoSuchElementException
from selenium import selenium
from selenium . webdriver . common . by import By
from selenium . webdriver . common . keys import Keys
from selenium . webdriver . support . ui import Select
2015-12-07 15:53:00 +00:00
import sqlite3 as sqlite
2015-05-13 12:21:33 +00:00
###########################################
# #
# PART I: utils stuff #
# #
###########################################
class Listattr ( object ) :
"""
Set of list attribute . This is used to determine what the list content is .
Later on we may add more attributes here .
"""
NULL = " null "
NUMBERS = " numbers "
STRINGS = " strings "
PERCENT = " percentage "
SIZE = " size "
UNKNOWN = " unknown "
def get_log_root_dir ( ) :
max_depth = 5
parent_dir = ' ../ '
for number in range ( 0 , max_depth ) :
if os . path . isdir ( sys . path [ 0 ] + os . sep + ( os . pardir + os . sep ) * number + ' log ' ) :
log_root_dir = os . path . abspath ( sys . path [ 0 ] + os . sep + ( os . pardir + os . sep ) * number + ' log ' )
break
if number == ( max_depth - 1 ) :
2016-05-09 13:05:09 +00:00
print ( ' No log dir found. Please check ' )
2015-05-13 12:21:33 +00:00
raise Exception
return log_root_dir
def mkdir_p ( dir ) :
try :
os . makedirs ( dir )
except OSError as exc :
if exc . errno == errno . EEXIST and os . path . isdir ( dir ) :
pass
else :
raise
def get_list_attr ( testlist ) :
"""
To determine the list content
"""
if not testlist :
return Listattr . NULL
listtest = testlist [ : ]
try :
listtest . remove ( ' ' )
except ValueError :
pass
pattern_percent = re . compile ( r " ^([0-9])+( \ .)?([0-9])* % $ " )
pattern_size = re . compile ( r " ^([0-9])+( \ .)?([0-9])*( )*(K)*(M)*(G)*B$ " )
pattern_number = re . compile ( r " ^([0-9])+( \ .)?([0-9])*$ " )
def get_patterned_number ( pattern , tlist ) :
count = 0
for item in tlist :
if re . search ( pattern , item ) :
count + = 1
return count
if get_patterned_number ( pattern_percent , listtest ) == len ( listtest ) :
return Listattr . PERCENT
elif get_patterned_number ( pattern_size , listtest ) == len ( listtest ) :
return Listattr . SIZE
elif get_patterned_number ( pattern_number , listtest ) == len ( listtest ) :
return Listattr . NUMBERS
else :
return Listattr . STRINGS
def is_list_sequenced ( testlist ) :
"""
Function to tell if list is sequenced
Currently we may have list made up of : Strings ; numbers ; percentage ; time ; size
Each has respective way to determine if it ' s sequenced.
"""
test_list = testlist [ : ]
try :
test_list . remove ( ' ' )
except ValueError :
pass
if get_list_attr ( testlist ) == Listattr . NULL :
return True
elif get_list_attr ( testlist ) == Listattr . STRINGS :
return ( sorted ( test_list ) == test_list )
elif get_list_attr ( testlist ) == Listattr . NUMBERS :
list_number = [ ]
for item in test_list :
list_number . append ( eval ( item ) )
return ( sorted ( list_number ) == list_number )
elif get_list_attr ( testlist ) == Listattr . PERCENT :
list_number = [ ]
for item in test_list :
list_number . append ( eval ( item . strip ( ' % ' ) ) )
return ( sorted ( list_number ) == list_number )
elif get_list_attr ( testlist ) == Listattr . SIZE :
list_number = [ ]
# currently SIZE is splitted by space
for item in test_list :
if item . split ( ) [ 1 ] . upper ( ) == " KB " :
list_number . append ( 1024 * eval ( item . split ( ) [ 0 ] ) )
elif item . split ( ) [ 1 ] . upper ( ) == " MB " :
list_number . append ( 1024 * 1024 * eval ( item . split ( ) [ 0 ] ) )
elif item . split ( ) [ 1 ] . upper ( ) == " GB " :
list_number . append ( 1024 * 1024 * 1024 * eval ( item . split ( ) [ 0 ] ) )
else :
list_number . append ( eval ( item . split ( ) [ 0 ] ) )
return ( sorted ( list_number ) == list_number )
else :
2016-05-09 13:05:09 +00:00
print ( ' Unrecognized list type, please check ' )
2015-05-13 12:21:33 +00:00
return False
def is_list_inverted ( testlist ) :
"""
Function to tell if list is inverted
Currently we may have list made up of : Strings ; numbers ; percentage ; time ; size
Each has respective way to determine if it ' s inverted.
"""
test_list = testlist [ : ]
try :
test_list . remove ( ' ' )
except ValueError :
pass
if get_list_attr ( testlist ) == Listattr . NULL :
return True
elif get_list_attr ( testlist ) == Listattr . STRINGS :
return ( sorted ( test_list , reverse = True ) == test_list )
elif get_list_attr ( testlist ) == Listattr . NUMBERS :
list_number = [ ]
for item in test_list :
list_number . append ( eval ( item ) )
return ( sorted ( list_number , reverse = True ) == list_number )
elif get_list_attr ( testlist ) == Listattr . PERCENT :
list_number = [ ]
for item in test_list :
list_number . append ( eval ( item . strip ( ' % ' ) ) )
return ( sorted ( list_number , reverse = True ) == list_number )
elif get_list_attr ( testlist ) == Listattr . SIZE :
list_number = [ ]
# currently SIZE is splitted by space. such as 0 B; 1 KB; 2 MB
for item in test_list :
if item . split ( ) [ 1 ] . upper ( ) == " KB " :
list_number . append ( 1024 * eval ( item . split ( ) [ 0 ] ) )
elif item . split ( ) [ 1 ] . upper ( ) == " MB " :
list_number . append ( 1024 * 1024 * eval ( item . split ( ) [ 0 ] ) )
elif item . split ( ) [ 1 ] . upper ( ) == " GB " :
list_number . append ( 1024 * 1024 * 1024 * eval ( item . split ( ) [ 0 ] ) )
else :
list_number . append ( eval ( item . split ( ) [ 0 ] ) )
return ( sorted ( list_number , reverse = True ) == list_number )
else :
2016-05-09 13:05:09 +00:00
print ( ' Unrecognized list type, please check ' )
2015-05-13 12:21:33 +00:00
return False
def replace_file_content ( filename , item , option ) :
f = open ( filename )
lines = f . readlines ( )
f . close ( )
output = open ( filename , ' w ' )
for line in lines :
if line . startswith ( item ) :
output . write ( item + " = ' " + option + " ' \n " )
else :
output . write ( line )
output . close ( )
def extract_number_from_string ( s ) :
"""
extract the numbers in a string . return type is ' list '
"""
return re . findall ( r ' ([0-9]+) ' , s )
2015-09-23 14:18:11 +00:00
# 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
2016-01-25 16:03:21 +00:00
from time import strftime , gmtime
caller = ' toaster '
timestamp = strftime ( ' % Y % m %d % H % M % S ' , gmtime ( ) )
logfile = os . path . join ( os . getcwd ( ) , ' results- ' + caller + ' . ' + timestamp + ' .log ' )
linkfile = os . path . join ( os . getcwd ( ) , ' results- ' + caller + ' .log ' )
2015-09-23 14:18:11 +00:00
#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
2016-01-25 16:03:21 +00:00
class_name = str ( testMethod . im_class ) . split ( " ' " ) [ 1 ]
2015-09-23 14:18:11 +00:00
#create custom logging level for filtering.
custom_log_level = 100
logging . addLevelName ( custom_log_level , ' RESULTS ' )
def results ( self , message , * args , * * kws ) :
if self . isEnabledFor ( custom_log_level ) :
self . log ( custom_log_level , message , * args , * * kws )
logging . Logger . results = results
2016-01-25 16:03:21 +00:00
logging . basicConfig ( filename = logfile ,
2015-09-23 14:18:11 +00:00
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 ( ) )
2016-01-25 16:03:21 +00:00
local_log = logging . getLogger ( caller )
2015-09-23 14:18:11 +00:00
#check status of tests and record it
2016-01-25 16:03:21 +00:00
2015-09-23 14:18:11 +00:00
for ( name , msg ) in result . errors :
2016-01-25 16:03:21 +00:00
if ( self . _testMethodName == str ( name ) . split ( ' ' ) [ 0 ] ) and ( class_name in str ( name ) . split ( ' ' ) [ 1 ] ) :
2015-09-23 14:18:11 +00:00
local_log . results ( " Testcase " + str ( test_case ) + " : ERROR " )
2016-01-25 16:03:21 +00:00
local_log . results ( " Testcase " + str ( test_case ) + " : \n " + msg )
2015-09-23 14:18:11 +00:00
passed = False
for ( name , msg ) in result . failures :
2016-01-25 16:03:21 +00:00
if ( self . _testMethodName == str ( name ) . split ( ' ' ) [ 0 ] ) and ( class_name in str ( name ) . split ( ' ' ) [ 1 ] ) :
2015-09-23 14:18:11 +00:00
local_log . results ( " Testcase " + str ( test_case ) + " : FAILED " )
2016-01-25 16:03:21 +00:00
local_log . results ( " Testcase " + str ( test_case ) + " : \n " + msg )
2015-09-23 14:18:11 +00:00
passed = False
for ( name , msg ) in result . skipped :
2016-01-25 16:03:21 +00:00
if ( self . _testMethodName == str ( name ) . split ( ' ' ) [ 0 ] ) and ( class_name in str ( name ) . split ( ' ' ) [ 1 ] ) :
local_log . results ( " Testcase " + str ( test_case ) + " : SKIPPED " )
2015-09-23 14:18:11 +00:00
passed = False
if passed :
2016-01-25 16:03:21 +00:00
local_log . results ( " Testcase " + str ( test_case ) + " : PASSED " )
2015-09-23 14:18:11 +00:00
2016-01-25 16:03:21 +00:00
# Create symlink to the current log
if os . path . exists ( linkfile ) :
os . remove ( linkfile )
os . symlink ( logfile , linkfile )
2015-09-23 14:18:11 +00:00
2016-01-25 16:03:21 +00:00
original_class . run = run
2015-09-23 14:18:11 +00:00
2016-01-25 16:03:21 +00:00
return original_class
2015-05-13 12:21:33 +00:00
###########################################
# #
# PART II: base class #
# #
###########################################
2016-01-25 16:03:21 +00:00
@LogResults
2015-05-13 12:21:33 +00:00
class toaster_cases_base ( unittest . TestCase ) :
2016-01-25 16:03:21 +00:00
@classmethod
def setUpClass ( cls ) :
cls . log = cls . logger_create ( )
2015-05-13 12:21:33 +00:00
def setUp ( self ) :
self . screenshot_sequence = 1
self . verificationErrors = [ ]
self . accept_next_alert = True
self . host_os = platform . system ( ) . lower ( )
2016-01-25 16:03:21 +00:00
if os . getenv ( ' TOASTER_SUITE ' ) :
self . target_suite = os . getenv ( ' TOASTER_SUITE ' )
else :
self . target_suite = self . host_os
2015-05-13 12:21:33 +00:00
self . parser = ConfigParser . SafeConfigParser ( )
2016-01-25 16:03:21 +00:00
self . parser . read ( ' toaster_test.cfg ' )
self . base_url = eval ( self . parser . get ( ' toaster_test_ ' + self . target_suite , ' toaster_url ' ) )
2015-05-13 12:21:33 +00:00
# create log dir . Currently , we put log files in log/tmp. After all
# test cases are done, move them to log/$datetime dir
self . log_tmp_dir = os . path . abspath ( sys . path [ 0 ] ) + os . sep + ' log ' + os . sep + ' tmp '
try :
mkdir_p ( self . log_tmp_dir )
except OSError :
logging . error ( " %(asctime)s Cannot create tmp dir under log, please check your privilege " )
2016-01-25 16:03:21 +00:00
# self.log = self.logger_create()
2015-05-13 12:21:33 +00:00
# driver setup
self . setup_browser ( )
2016-01-25 16:03:21 +00:00
@staticmethod
def logger_create ( ) :
log_file = " toaster-auto- " + time . strftime ( " % Y % m %d % H % M % S " ) + " .log "
if os . path . exists ( " toaster-auto.log " ) : os . remove ( " toaster-auto.log " )
os . symlink ( log_file , " toaster-auto.log " )
log = logging . getLogger ( " toaster " )
log . setLevel ( logging . DEBUG )
fh = logging . FileHandler ( filename = log_file , mode = ' w ' )
fh . setLevel ( logging . DEBUG )
2015-05-13 12:21:33 +00:00
ch = logging . StreamHandler ( sys . stdout )
2016-01-25 16:03:21 +00:00
ch . setLevel ( logging . INFO )
formatter = logging . Formatter ( ' %(asctime)s - %(name)s - %(levelname)s - %(message)s ' )
2015-05-13 12:21:33 +00:00
fh . setFormatter ( formatter )
ch . setFormatter ( formatter )
2016-01-25 16:03:21 +00:00
2015-05-13 12:21:33 +00:00
log . addHandler ( fh )
log . addHandler ( ch )
2016-01-25 16:03:21 +00:00
2015-05-13 12:21:33 +00:00
return log
def setup_browser ( self , * browser_path ) :
2016-01-25 16:03:21 +00:00
self . browser = eval ( self . parser . get ( ' toaster_test_ ' + self . target_suite , ' test_browser ' ) )
2016-05-09 13:05:09 +00:00
print ( self . browser )
2015-05-13 12:21:33 +00:00
if self . browser == " firefox " :
driver = webdriver . Firefox ( )
elif self . browser == " chrome " :
driver = webdriver . Chrome ( )
elif self . browser == " ie " :
driver = webdriver . Ie ( )
else :
driver = None
2016-05-09 13:05:09 +00:00
print ( " unrecognized browser type, please check " )
2015-05-13 12:21:33 +00:00
self . driver = driver
self . driver . implicitly_wait ( 30 )
return self . driver
def save_screenshot ( self , * * log_args ) :
"""
This function is used to save screen either by os interface or selenium interface .
How to use :
self . save_screenshot ( screenshot_type = ' native ' / ' selenium ' , log_sub_dir = ' xxx ' ,
append_name = ' stepx ' )
where native means screenshot func provided by OS ,
selenium means screenshot func provided by selenium webdriver
"""
types = [ log_args . get ( ' screenshot_type ' ) ]
# when no screenshot_type is specified
if types == [ None ] :
types = [ ' native ' , ' selenium ' ]
# normally append_name is used to specify which step..
add_name = log_args . get ( ' append_name ' )
if not add_name :
add_name = ' - '
# normally there's no need to specify sub_dir
sub_dir = log_args . get ( ' log_sub_dir ' )
if not sub_dir :
# use casexxx as sub_dir name
sub_dir = ' case ' + str ( self . case_no )
for item in types :
log_dir = self . log_tmp_dir + os . sep + sub_dir
mkdir_p ( log_dir )
log_path = log_dir + os . sep + self . browser + ' - ' + \
item + ' - ' + add_name + ' - ' + str ( self . screenshot_sequence ) + ' .png '
if item == ' native ' :
2015-09-23 14:05:40 +00:00
if self . host_os == " linux " :
os . system ( " scrot " + log_path )
elif self . host_os == " darwin " :
os . system ( " screencapture -x " + log_path )
2015-05-13 12:21:33 +00:00
elif item == ' selenium ' :
self . driver . get_screenshot_as_file ( log_path )
self . screenshot_sequence + = 1
def browser_delay ( self ) :
"""
currently this is a workaround for some chrome test .
Sometimes we need a delay to accomplish some operation .
But for firefox , mostly we don ' t need this.
To be discussed
"""
if self . browser == " chrome " :
time . sleep ( 1 )
return
# these functions are not contained in WebDriver class..
def find_element_by_text ( self , string ) :
return self . driver . find_element_by_xpath ( " //*[text()= ' " + string + " ' ] " )
def find_elements_by_text ( self , string ) :
return self . driver . find_elements_by_xpath ( " //*[text()= ' " + string + " ' ] " )
def find_element_by_text_in_table ( self , table_id , text_string ) :
"""
This is used to search some certain ' text ' in certain table
"""
try :
table_element = self . get_table_element ( table_id )
element = table_element . find_element_by_xpath ( " //*[text()= ' " + text_string + " ' ] " )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' no element found ' )
2015-05-13 12:21:33 +00:00
raise
return element
def find_element_by_link_text_in_table ( self , table_id , link_text ) :
"""
Assume there ' re multiple suitable " find_element_by_link_text " .
In this circumstance we need to specify " table " .
"""
try :
table_element = self . get_table_element ( table_id )
element = table_element . find_element_by_link_text ( link_text )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' no element found ' )
2015-05-13 12:21:33 +00:00
raise
return element
def find_elements_by_link_text_in_table ( self , table_id , link_text ) :
"""
Search link - text in certain table . This helps to narrow down search area .
"""
try :
table_element = self . get_table_element ( table_id )
element_list = table_element . find_elements_by_link_text ( link_text )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' no element found ' )
2015-05-13 12:21:33 +00:00
raise
return element_list
def find_element_by_partial_link_text_in_table ( self , table_id , link_text ) :
"""
Search element by partial link text in certain table .
"""
try :
table_element = self . get_table_element ( table_id )
element = table_element . find_element_by_partial_link_text ( link_text )
return element
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' no element found ' )
2015-05-13 12:21:33 +00:00
raise
def find_elements_by_partial_link_text_in_table ( self , table_id , link_text ) :
"""
Assume there ' re multiple suitable " find_partial_element_by_link_text " .
"""
try :
table_element = self . get_table_element ( table_id )
element_list = table_element . find_elements_by_partial_link_text ( link_text )
return element_list
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' no element found ' )
2015-05-13 12:21:33 +00:00
raise
def find_element_by_xpath_in_table ( self , table_id , xpath ) :
"""
This helps to narrow down search area . Especially useful when dealing with pop - up form .
"""
try :
table_element = self . get_table_element ( table_id )
element = table_element . find_element_by_xpath ( xpath )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' no element found ' )
2015-05-13 12:21:33 +00:00
raise
return element
def find_elements_by_xpath_in_table ( self , table_id , xpath ) :
"""
This helps to narrow down search area . Especially useful when dealing with pop - up form .
"""
try :
table_element = self . get_table_element ( table_id )
element_list = table_element . find_elements_by_xpath ( xpath )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' no elements found ' )
2015-05-13 12:21:33 +00:00
raise
return element_list
def shortest_xpath ( self , pname , pvalue ) :
return " //*[@ " + pname + " = ' " + pvalue + " ' ] "
#usually elements in the same column are with same class name. for instance: class="outcome" .TBD
def get_table_column_text ( self , attr_name , attr_value ) :
c_xpath = self . shortest_xpath ( attr_name , attr_value )
elements = self . driver . find_elements_by_xpath ( c_xpath )
c_list = [ ]
for element in elements :
c_list . append ( element . text )
return c_list
def get_table_column_text_by_column_number ( self , table_id , column_number ) :
c_xpath = " //*[@id= ' " + table_id + " ' ]//td[ " + str ( column_number ) + " ] "
elements = self . driver . find_elements_by_xpath ( c_xpath )
c_list = [ ]
for element in elements :
c_list . append ( element . text )
return c_list
def get_table_head_text ( self , * table_id ) :
#now table_id is a tuple...
if table_id :
thead_xpath = " //*[@id= ' " + table_id [ 0 ] + " ' ]//thead//th[text()] "
elements = self . driver . find_elements_by_xpath ( thead_xpath )
c_list = [ ]
for element in elements :
if element . text :
c_list . append ( element . text )
return c_list
#default table on page
else :
return self . driver . find_element_by_xpath ( " //*/table/thead " ) . text
def get_table_element ( self , table_id , * coordinate ) :
if len ( coordinate ) == 0 :
#return whole-table element
element_xpath = " //*[@id= ' " + table_id + " ' ] "
try :
element = self . driver . find_element_by_xpath ( element_xpath )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
2015-05-13 12:21:33 +00:00
raise
return element
row = coordinate [ 0 ]
if len ( coordinate ) == 1 :
#return whole-row element
element_xpath = " //*[@id= ' " + table_id + " ' ]/tbody/tr[ " + str ( row ) + " ] "
try :
element = self . driver . find_element_by_xpath ( element_xpath )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
2015-05-13 12:21:33 +00:00
return False
return element
#now we are looking for an element with specified X and Y
column = coordinate [ 1 ]
element_xpath = " //*[@id= ' " + table_id + " ' ]/tbody/tr[ " + str ( row ) + " ]/td[ " + str ( column ) + " ] "
try :
element = self . driver . find_element_by_xpath ( element_xpath )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
2015-05-13 12:21:33 +00:00
return False
return element
def get_table_data ( self , table_id , row_count , column_count ) :
row = 1
Lists = [ ]
while row < = row_count :
column = 1
row_content = [ ]
while column < = column_count :
s = " //*[@id= ' " + table_id + " ' ]/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 )
2016-05-09 13:05:09 +00:00
print ( Lists [ row - 1 ] [ 0 ] )
2015-05-13 12:21:33 +00:00
row = row + 1
return Lists
# The is_xxx_present functions only returns True/False
# All the log work is done in test procedure, so we can easily trace back
# using logging
def is_text_present ( self , patterns ) :
for pattern in patterns :
if str ( pattern ) not in self . driver . page_source :
2016-05-09 13:05:09 +00:00
print ( ' Text " ' + pattern + ' " is missing ' )
2015-05-13 12:21:33 +00:00
return False
return True
def is_element_present ( self , how , what ) :
try :
self . driver . find_element ( how , what )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
print ( ' Could not find element ' + str ( what ) + ' by ' + str ( how ) )
2015-05-13 12:21:33 +00:00
return False
return True
def is_alert_present ( self ) :
try : self . driver . switch_to_alert ( )
2016-05-09 13:05:09 +00:00
except NoAlertPresentException as e : return False
2015-05-13 12:21:33 +00:00
return True
def close_alert_and_get_its_text ( self ) :
try :
alert = self . driver . switch_to_alert ( )
alert_text = alert . text
if self . accept_next_alert :
alert . accept ( )
else :
alert . dismiss ( )
return alert_text
finally : self . accept_next_alert = True
def get_case_number ( self ) :
"""
what case are we running now
"""
funcname = sys . _getframe ( 1 ) . f_code . co_name
caseno_str = funcname . strip ( ' test_ ' )
try :
caseno = int ( caseno_str )
except ValueError :
2016-05-09 13:05:09 +00:00
print ( " get case number error! please check if func name is test_xxx " )
2015-05-13 12:21:33 +00:00
return False
return caseno
def tearDown ( self ) :
self . log . info ( ' END: CASE %s log \n \n ' % str ( self . case_no ) )
self . driver . quit ( )
self . assertEqual ( [ ] , self . verificationErrors )
###################################################################
# #
# PART III: test cases #
# please refer to #
# https://bugzilla.yoctoproject.org/tr_show_case.cgi?case_id=xxx #
# #
###################################################################
# 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
2016-01-25 16:03:21 +00:00
2015-05-13 12:21:33 +00:00
class toaster_cases ( toaster_cases_base ) :
##############
# CASE 901 #
##############
def test_901 ( self ) :
# the reason why get_case_number is not in setUp function is that
# otherwise it returns "setUp" instead of "test_xxx"
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 )
# open all columns
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# adding explicitly wait for chromedriver..-_-
self . browser_delay ( )
self . driver . find_element_by_id ( " started_on " ) . click ( )
self . browser_delay ( )
self . driver . find_element_by_id ( " time " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# dict: {lint text name : actual class name}
2015-08-19 13:29:24 +00:00
table_head_dict = { ' Outcome ' : ' outcome ' , ' Recipe ' : ' target ' , ' Machine ' : ' machine ' , ' Started on ' : ' started_on ' , ' Completed on ' : ' completed_on ' , \
' Errors ' : ' errors_no ' , ' Warnings ' : ' warnings_no ' , ' Time ' : ' time ' }
2015-05-13 12:21:33 +00:00
for key in table_head_dict :
try :
self . driver . find_element_by_link_text ( key ) . click ( )
2016-05-09 13:05:09 +00:00
except Exception as e :
2015-05-13 12:21:33 +00:00
self . log . error ( " %s cannot be found on page " % key )
raise
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
# the point is, after another click, it should be another order
if is_list_inverted ( column_list ) :
self . driver . find_element_by_link_text ( key ) . click ( )
column_list = self . get_table_column_text ( " class " , table_head_dict [ key ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) , msg = ( " %s column not in order " % key ) )
2015-05-13 12:21:33 +00:00
else :
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) , msg = ( " %s column not sequenced " % key ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_link_text ( key ) . click ( )
column_list = self . get_table_column_text ( " class " , table_head_dict [ key ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( column_list ) , msg = ( " %s column not inverted " % key ) )
2015-05-13 12:21:33 +00:00
self . log . info ( " case passed " )
##############
# CASE 902 #
##############
def test_902 ( 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 )
# Could add more test patterns here in the future. Also, could search some items other than target column in future..
patterns = [ " minimal " , " sato " ]
for pattern in patterns :
ori_target_column_texts = self . get_table_column_text ( " class " , " target " )
2016-05-09 13:05:09 +00:00
print ( ori_target_column_texts )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( pattern )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
new_target_column_texts = self . get_table_column_text ( " class " , " target " )
# if nothing found, we still count it as "pass"
if new_target_column_texts :
for text in new_target_column_texts :
2015-09-23 14:18:11 +00:00
self . assertTrue ( text . find ( pattern ) , msg = ( " %s item doesn ' t exist " % pattern ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_css_selector ( " i.icon-remove " ) . click ( )
target_column_texts = self . get_table_column_text ( " class " , " target " )
2015-09-23 14:18:11 +00:00
self . assertTrue ( ori_target_column_texts == target_column_texts , msg = ( " builds changed after operations " ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 903 #
##############
def test_903 ( 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 )
# when opening a new page, "started_on" is not displayed by default
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# currently all the delay are for chrome driver -_-
self . browser_delay ( )
self . driver . find_element_by_id ( " started_on " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# step 4
2015-12-07 15:53:01 +00:00
items = [ " Outcome " , " Completed on " , " Started on " ]
2015-05-13 12:21:33 +00:00
for item in items :
try :
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)
2015-09-23 14:18:11 +00:00
self . assertTrue ( temp_element . find_element_by_xpath ( " ..//*/a/i[@class= ' icon-filter filtered ' ] " ) )
2016-05-09 13:05:09 +00:00
except Exception as e :
2015-09-23 14:18:11 +00:00
self . assertFalse ( True , msg = ( " %s cannot be found! %s " % ( item , e ) ) )
2015-05-13 12:21:33 +00:00
raise
# step 5-6
temp_element = self . find_element_by_link_text_in_table ( ' otable ' , ' Outcome ' )
temp_element . find_element_by_xpath ( " ..//*/a/i[@class= ' icon-filter filtered ' ] " ) . click ( )
self . browser_delay ( )
# the 2nd option, whatever it is
self . driver . find_element_by_xpath ( " (//input[@name= ' filter ' ])[2] " ) . click ( )
# click "Apply" button
self . driver . find_element_by_xpath ( " //*[@id= ' filter_outcome ' ]//*[text()= ' Apply ' ] " ) . click ( )
# save screen here
time . sleep ( 1 )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step5 ' )
temp_element = self . find_element_by_link_text_in_table ( ' otable ' , ' Completed on ' )
temp_element . find_element_by_xpath ( " ..//*/a/i[@class= ' icon-filter filtered ' ] " ) . click ( )
self . browser_delay ( )
self . driver . find_element_by_xpath ( " //*[@id= ' filter_completed_on ' ]//*[text()= ' Apply ' ] " ) . click ( )
# save screen here to compare to previous one
# please note that for chrome driver, need a little break before saving
# screen here -_-
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step6 ' )
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " core-image " )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
##############
# CASE 904 #
##############
def test_904 ( 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_partial_link_text ( " core-image " ) . click ( )
self . driver . find_element_by_link_text ( " Tasks " ) . click ( )
self . table_name = ' otable '
# 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 )
2016-05-09 13:05:09 +00:00
print ( rows_displayed )
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . get_table_element ( self . table_name , rows_displayed ) , msg = ( " not enough rows displayed " ) )
self . assertFalse ( self . get_table_element ( self . table_name , rows_displayed + 1 ) , \
msg = ( " more rows displayed than expected " ) )
2015-05-13 12:21:33 +00:00
# Search text box background text is "Search tasks"
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . driver . find_element_by_xpath ( " //*[@id= ' searchform ' ]/*[@placeholder= ' Search tasks ' ] " ) , \
msg = ( " background text doesn ' t exist " ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " busybox " )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step5 ' )
self . driver . find_element_by_css_selector ( " i.icon-remove " ) . click ( )
# Save screen here
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step5_2 ' )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " cpu_used " ) . 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 ( )
2015-12-07 15:53:01 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# 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 ' , \
2015-08-19 13:29:24 +00:00
' Disk I/O (ms) ' : ' disk_io ' }
2015-05-13 12:21:33 +00:00
for key in table_head_dict :
2015-11-04 14:32:22 +00:00
# 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
2015-05-13 12:21:33 +00:00
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 ] )
2015-11-04 14:32:22 +00:00
# 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 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
2015-05-13 12:21:33 +00:00
if ( is_list_inverted ( column_list ) and is_list_sequenced ( column_list ) ) \
or ( not column_list ) :
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 ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) or is_list_inverted ( column_list ) , \
msg = ( " %s column not in any order " % key ) )
2015-05-13 12:21:33 +00:00
elif is_list_inverted ( column_list ) :
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 ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) , msg = ( " %s column not in order " % key ) )
2015-05-13 12:21:33 +00:00
else :
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) , msg = ( " %s column not in order " % key ) )
2015-05-13 12:21:33 +00:00
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 ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( column_list ) , msg = ( " %s column not inverted " % key ) )
2015-11-04 14:32:22 +00:00
# step 8-10
2015-05-13 12:21:33 +00:00
# filter dict: {link text name : filter table name in xpath}
filter_dict = { ' Executed ' : ' filter_executed ' , ' Outcome ' : ' filter_outcome ' , ' Cache attempt ' : ' filter_cache_attempt ' }
for key in filter_dict :
temp_element = self . find_element_by_link_text_in_table ( self . table_name , key )
# find the filter icon besides it.
# And here we must have break (1 sec) to get the popup stuff
temp_element . find_element_by_xpath ( " ..//*[@class= ' icon-filter filtered ' ] " ) . click ( )
self . browser_delay ( )
avail_options = self . driver . find_elements_by_xpath ( " //*[@id= ' " + filter_dict [ key ] + " ' ]//*[@name= ' filter ' ][not(@disabled)] " )
for number in range ( 0 , len ( avail_options ) ) :
avail_options [ number ] . click ( )
self . browser_delay ( )
# click "Apply"
self . driver . find_element_by_xpath ( " //*[@id= ' " + filter_dict [ key ] + " ' ]//*[@type= ' submit ' ] " ) . click ( )
# insert screen capture here
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step8 ' )
# after the last option was clicked, we don't need operation below anymore
if number < len ( avail_options ) - 1 :
2015-12-07 15:53:01 +00:00
try :
temp_element = self . find_element_by_link_text_in_table ( self . table_name , key )
temp_element . find_element_by_xpath ( " ..//*[@class= ' icon-filter filtered ' ] " ) . click ( )
avail_options = self . driver . find_elements_by_xpath ( " //*[@id= ' " + filter_dict [ key ] + " ' ]//*[@name= ' filter ' ][not(@disabled)] " )
except :
2016-05-09 13:05:09 +00:00
print ( " in exception " )
2015-12-07 15:53:01 +00:00
self . find_element_by_text ( " Show all tasks " ) . click ( )
# self.driver.find_element_by_xpath("//*[@id='searchform']/button[2]").click()
temp_element = self . find_element_by_link_text_in_table ( self . table_name , key )
temp_element . find_element_by_xpath ( " ..//*[@class= ' icon-filter filtered ' ] " ) . click ( )
avail_options = self . driver . find_elements_by_xpath ( " //*[@id= ' " + filter_dict [ key ] + " ' ]//*[@name= ' filter ' ][not(@disabled)] " )
2015-05-13 12:21:33 +00:00
self . browser_delay ( )
2015-11-04 14:32:22 +00:00
# step 11
2015-05-13 12:21:33 +00:00
for item in [ ' order ' , ' task_name ' , ' executed ' , ' outcome ' , ' recipe_name ' , ' recipe_version ' ] :
try :
self . find_element_by_xpath_in_table ( self . table_name , " ./tbody/tr[1]/*[@class= ' " + item + " ' ]/a " ) . click ( )
2016-05-09 13:05:09 +00:00
except NoSuchElementException as e :
2015-05-13 12:21:33 +00:00
# let it go...
2016-05-09 13:05:09 +00:00
print ( ' no item in the colum ' + item )
2015-05-13 12:21:33 +00:00
# insert screen shot here
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step11 ' )
self . driver . back ( )
2015-11-04 14:32:22 +00:00
# step 12-14
2015-05-13 12:21:33 +00:00
# about test_dict: please refer to testcase 904 requirement step 12-14
test_dict = {
' Time ' : {
' class ' : ' time_taken ' ,
' check_head_list ' : [ ' Recipe ' , ' Task ' , ' Executed ' , ' Outcome ' , ' Time (secs) ' ] ,
2015-08-19 13:29:24 +00:00
' check_column_list ' : [ ' cpu_used ' , ' cache_attempt ' , ' disk_io ' , ' order ' , ' recipe_version ' ]
2015-05-13 12:21:33 +00:00
} ,
' CPU usage ' : {
' class ' : ' cpu_used ' ,
' check_head_list ' : [ ' Recipe ' , ' Task ' , ' Executed ' , ' Outcome ' , ' CPU usage ' ] ,
2015-08-19 13:29:24 +00:00
' check_column_list ' : [ ' cache_attempt ' , ' disk_io ' , ' order ' , ' recipe_version ' , ' time_taken ' ]
2015-05-13 12:21:33 +00:00
} ,
' Disk I/O ' : {
' class ' : ' disk_io ' ,
' check_head_list ' : [ ' Recipe ' , ' Task ' , ' Executed ' , ' Outcome ' , ' Disk I/O (ms) ' ] ,
2015-08-19 13:29:24 +00:00
' check_column_list ' : [ ' cpu_used ' , ' cache_attempt ' , ' order ' , ' recipe_version ' , ' time_taken ' ]
2015-05-13 12:21:33 +00:00
}
}
for key in test_dict :
self . find_element_by_partial_link_text_in_table ( ' nav ' , ' core-image ' ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , key ) . click ( )
head_list = self . get_table_head_text ( ' otable ' )
for item in test_dict [ key ] [ ' check_head_list ' ] :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " %s not in head row " % item ) )
2015-05-13 12:21:33 +00:00
column_list = self . get_table_column_text ( ' class ' , test_dict [ key ] [ ' class ' ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( column_list ) , msg = ( " %s column not inverted " % key ) )
2015-05-13 12:21:33 +00:00
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
for item2 in test_dict [ key ] [ ' check_column_list ' ] :
self . driver . find_element_by_id ( item2 ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# TBD: save screen here
##############
# CASE 906 #
##############
def test_906 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , ' Packages ' ) . click ( )
# find "bash" in first column (Packages)
self . driver . find_element_by_xpath ( " //*[@id= ' otable ' ]//td[1]//*[text()= ' bash ' ] " ) . click ( )
# save sceen here to observe...
2015-11-04 14:32:22 +00:00
# step 6
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_partial_link_text ( " Generated files " ) . click ( )
head_list = self . get_table_head_text ( ' otable ' )
for item in [ ' File ' , ' Size ' ] :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " %s not in head row " % item ) )
2015-05-13 12:21:33 +00:00
c_list = self . get_table_column_text ( ' class ' , ' path ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( c_list ) , msg = ( " column not in order " ) )
2015-11-04 14:32:22 +00:00
# step 7
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_partial_link_text ( " Runtime dependencies " ) . click ( )
# save sceen here to observe...
# note that here table name is not 'otable'
head_list = self . get_table_head_text ( ' dependencies ' )
for item in [ ' Package ' , ' Version ' , ' Size ' ] :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " %s not in head row " % item ) )
2015-05-13 12:21:33 +00:00
c_list = self . get_table_column_text_by_column_number ( ' dependencies ' , 1 )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( c_list ) , msg = ( " list not in order " ) )
2015-05-13 12:21:33 +00:00
texts = [ ' Size ' , ' License ' , ' Recipe ' , ' Recipe version ' , ' Layer ' , \
2015-12-07 15:53:01 +00:00
' Layer commit ' ]
self . failUnless ( self . is_text_present ( texts ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 910 #
##############
def test_910 ( self ) :
self . case_no = self . get_case_number ( )
self . log . info ( ' CASE %s log: ' % str ( self . case_no ) )
image_type = " core-image-minimal "
test_package1 = " busybox "
test_package2 = " lib "
self . driver . maximize_window ( )
self . driver . get ( self . base_url )
self . driver . find_element_by_link_text ( image_type ) . click ( )
self . driver . find_element_by_link_text ( " Recipes " ) . click ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step3 ' )
self . table_name = ' otable '
# 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 )
2016-05-09 13:05:09 +00:00
print ( rows_displayed )
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . get_table_element ( self . table_name , rows_displayed ) )
self . assertFalse ( self . get_table_element ( self . table_name , rows_displayed + 1 ) )
2015-05-13 12:21:33 +00:00
# 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] " ) )
2016-05-09 13:05:09 +00:00
print ( tasks_column_count )
2015-05-13 12:21:33 +00:00
default_column_list = self . get_table_column_text_by_column_number ( self . table_name , 1 )
#print default_column_list
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( default_column_list ) )
2015-05-13 12:21:33 +00:00
# Search text box background text is "Search recipes"
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . driver . find_element_by_xpath ( " //*[@id= ' searchform ' ]/*[@placeholder= ' Search recipes ' ] " ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( test_package1 )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# Save screen here
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 ' )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
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 ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
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
2015-08-19 13:29:24 +00:00
#inverted_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 inverted_tasks_column_count
#inverted_column_list = self.get_table_column_text_by_column_number(self.table_name, 1)
2015-05-13 12:21:33 +00:00
#print inverted_column_list
2015-08-19 13:29:24 +00:00
#self.driver.find_element_by_partial_link_text("zlib").click()
#self.driver.back()
2015-09-23 14:18:11 +00:00
#self.assertTrue(is_list_inverted(inverted_column_list))
2015-08-19 13:29:24 +00:00
#self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click()
2015-05-13 12:21:33 +00:00
2015-08-19 13:29:24 +00:00
table_head_dict = { ' Recipe ' : ' recipe__name ' , ' Recipe file ' : ' recipe_file ' , ' Section ' : ' recipe_section ' , \
2015-05-13 12:21:33 +00:00
' License ' : ' recipe_license ' , ' Layer ' : ' layer_version__layer__name ' , \
2015-08-19 13:29:24 +00:00
' Layer branch ' : ' layer_version__branch ' }
2015-05-13 12:21:33 +00:00
for key in table_head_dict :
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 ] )
if ( is_list_inverted ( column_list ) and is_list_sequenced ( column_list ) ) \
or ( not column_list ) :
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 ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) or is_list_inverted ( column_list ) )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_partial_link_text ( " acl " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . back ( )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) or is_list_inverted ( column_list ) )
2015-05-13 12:21:33 +00:00
# Search text box background text is "Search recipes"
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . driver . find_element_by_xpath ( " //*[@id= ' searchform ' ]/*[@placeholder= ' Search recipes ' ] " ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( test_package2 )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
column_search_list = self . get_table_column_text ( " class " , table_head_dict [ key ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_search_list ) or is_list_inverted ( column_search_list ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_css_selector ( " i.icon-remove " ) . click ( )
elif is_list_inverted ( column_list ) :
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 ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_partial_link_text ( " acl " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . back ( )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) )
2015-05-13 12:21:33 +00:00
# Search text box background text is "Search recipes"
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . driver . find_element_by_xpath ( " //*[@id= ' searchform ' ]/*[@placeholder= ' Search recipes ' ] " ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( test_package2 )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
column_search_list = self . get_table_column_text ( " class " , table_head_dict [ key ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_search_list ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_css_selector ( " i.icon-remove " ) . click ( )
else :
2015-11-04 14:32:22 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) , msg = ( " list %s not sequenced " % key ) )
2015-05-13 12:21:33 +00:00
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 ] )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( column_list ) )
2015-08-19 13:29:24 +00:00
try :
self . driver . find_element_by_partial_link_text ( " acl " ) . click ( )
except :
self . driver . find_element_by_partial_link_text ( " zlib " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . back ( )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( column_list ) )
2015-05-13 12:21:33 +00:00
# Search text box background text is "Search recipes"
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . driver . find_element_by_xpath ( " //*[@id= ' searchform ' ]/*[@placeholder= ' Search recipes ' ] " ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( test_package2 )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
column_search_list = self . get_table_column_text ( " class " , table_head_dict [ key ] )
#print column_search_list
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( column_search_list ) )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_css_selector ( " i.icon-remove " ) . click ( )
# Bug 5919
for key in table_head_dict :
2016-05-09 13:05:09 +00:00
print ( key )
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( self . table_name , key ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( table_head_dict [ key ] ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . browser_delay ( )
# After hide the column, the default table should be sorted by Recipe
2015-08-19 13:29:24 +00:00
tasks_column_count = len ( self . driver . find_elements_by_partial_link_text ( " acl " ) )
2015-05-13 12:21:33 +00:00
#print tasks_column_count
default_column_list = self . get_table_column_text_by_column_number ( self . table_name , 1 )
#print default_column_list
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( default_column_list ) )
2015-05-13 12:21:33 +00:00
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
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 ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
##############
# CASE 911 #
##############
def test_911 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , ' Recipes ' ) . click ( )
2015-11-04 14:32:22 +00:00
# step 3-5
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " lib " )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# save screen here for observation
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step5 ' )
2015-11-04 14:32:22 +00:00
# step 6
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_css_selector ( " i.icon-remove " ) . click ( )
self . driver . find_element_by_id ( " search " ) . clear ( )
# we deliberately want "no result" here
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search " ) . send_keys ( " no such input " )
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-12-07 15:53:01 +00:00
try :
self . find_element_by_text ( " Show all recipes " ) . click ( )
except :
self . fail ( msg = ' Could not identify blank page elements ' )
2015-05-13 12:21:33 +00:00
##############
# CASE 912 #
##############
def test_912 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , ' Recipes ' ) . click ( )
# step 3
head_list = self . get_table_head_text ( ' otable ' )
for item in [ ' Recipe ' , ' Recipe version ' , ' Recipe file ' , ' Section ' , ' License ' , ' Layer ' ] :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " item %s not in head row " % item ) )
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
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 ( )
2015-09-23 14:18:11 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# check if columns selected above is shown
2015-09-23 14:18:11 +00:00
check_list = [ ' Dependencies ' , ' Layer branch ' , ' Layer commit ' , ' Reverse dependencies ' ]
2015-05-13 12:21:33 +00:00
head_list = self . get_table_head_text ( ' otable ' )
time . sleep ( 2 )
2016-05-09 13:05:09 +00:00
print ( head_list )
2015-05-13 12:21:33 +00:00
for item in check_list :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " item %s not in head row " % item ) )
2015-05-13 12:21:33 +00:00
# un-check 'em all
2015-09-23 14:18:11 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
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 ( )
2015-09-23 14:18:11 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# don't exist any more
head_list = self . get_table_head_text ( ' otable ' )
for item in check_list :
2015-09-23 14:18:11 +00:00
self . assertFalse ( item in head_list , msg = ( " item %s should not be in head row " % item ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 913 #
##############
def test_913 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , ' Recipes ' ) . click ( )
# step 3
head_list = self . get_table_head_text ( ' otable ' )
for item in [ ' Recipe ' , ' Recipe version ' , ' Recipe file ' , ' Section ' , ' License ' , ' Layer ' ] :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " item %s not in head row " % item ) )
2015-05-13 12:21:33 +00:00
# step 4
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# save screen
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step4 ' )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
##############
# CASE 914 #
##############
def test_914 ( self ) :
self . case_no = self . get_case_number ( )
self . log . info ( ' CASE %s log: ' % str ( self . case_no ) )
2015-12-07 15:53:01 +00:00
image_type = " core-image-minimal "
test_package1 = " busybox "
test_package2 = " gdbm "
test_package3 = " gettext-native "
driver = self . driver
driver . maximize_window ( )
driver . get ( self . base_url )
driver . find_element_by_link_text ( image_type ) . click ( )
driver . find_element_by_link_text ( " Recipes " ) . click ( )
driver . find_element_by_link_text ( test_package1 ) . click ( )
self . table_name = ' information '
tasks_row_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' " + self . table_name + " ' ]/table/tbody/tr/td[1] " ) )
tasks_column_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' " + self . table_name + " ' ]/table/tbody/tr[1]/td " ) )
2016-05-09 13:05:09 +00:00
print ( ' rows: ' + str ( tasks_row_count ) )
print ( ' columns: ' + str ( tasks_column_count ) )
2015-12-07 15:53:01 +00:00
Tasks_column = self . get_table_column_text_by_column_number ( self . table_name , 2 )
print ( " Tasks_column= " , Tasks_column )
key_tasks = [ " do_fetch " , " do_unpack " , " do_patch " , " do_configure " , " do_compile " , " do_install " , " do_package " , " do_build " ]
i = 0
while i < len ( key_tasks ) :
if key_tasks [ i ] not in Tasks_column :
print ( " Error! Missing key task: %s " % key_tasks [ i ] )
else :
print ( " %s is in tasks " % key_tasks [ i ] )
i = i + 1
if Tasks_column . index ( key_tasks [ 0 ] ) != 0 :
print ( " Error! %s is not in the right position " % key_tasks [ 0 ] )
else :
print ( " %s is in right position " % key_tasks [ 0 ] )
if Tasks_column [ - 1 ] != key_tasks [ - 1 ] :
print ( " Error! %s is not in the right position " % key_tasks [ - 1 ] )
else :
print ( " %s is in right position " % key_tasks [ - 1 ] )
driver . find_element_by_partial_link_text ( " Packages ( " ) . click ( )
packages_name = driver . find_element_by_partial_link_text ( " Packages ( " ) . text
2016-05-09 13:05:09 +00:00
print ( packages_name )
2015-12-07 15:53:01 +00:00
packages_num = int ( filter ( str . isdigit , repr ( packages_name ) ) )
2016-05-09 13:05:09 +00:00
print ( packages_num )
2015-12-07 15:53:01 +00:00
#switch the table to show more than 10 rows at a time
self . driver . find_element_by_xpath ( " //*[@id= ' packages-built ' ]/div[1]/div/select " ) . click ( )
Select ( driver . find_element_by_xpath ( " //*[@id= ' packages-built ' ]/div[1]/div/select " ) ) . select_by_value ( ' 150 ' )
self . driver . find_element_by_xpath ( " //*[@id= ' packages-built ' ]/div[1]/div/select " ) . send_keys ( Keys . ENTER )
packages_row_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' otable ' ]/tbody/tr/td[1] " ) )
2016-05-09 13:05:09 +00:00
print ( packages_row_count )
2015-12-07 15:53:01 +00:00
if packages_num != packages_row_count :
print ( " Error! The packages number is not correct " )
else :
print ( " The packages number is correct " )
driver . find_element_by_partial_link_text ( " Build dependencies ( " ) . click ( )
depends_name = driver . find_element_by_partial_link_text ( " Build dependencies ( " ) . text
2016-05-09 13:05:09 +00:00
print ( depends_name )
depends_num = int ( list ( filter ( str . isdigit , repr ( depends_name ) ) ) )
print ( depends_num )
2015-12-07 15:53:01 +00:00
if depends_num == 0 :
depends_message = repr ( driver . find_element_by_css_selector ( " div.alert.alert-info " ) . text )
2016-05-09 13:05:09 +00:00
print ( depends_message )
2015-12-07 15:53:01 +00:00
if depends_message . find ( " has no build dependencies. " ) < 0 :
print ( " Error! The message isn ' t expected. " )
else :
print ( " The message is expected " )
else :
depends_row_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' dependencies ' ]/table/tbody/tr/td[1] " ) )
2016-05-09 13:05:09 +00:00
print ( depends_row_count )
2015-12-07 15:53:01 +00:00
if depends_num != depends_row_count :
print ( " Error! The dependent packages number is not correct " )
else :
print ( " The dependent packages number is correct " )
driver . find_element_by_partial_link_text ( " Reverse build dependencies ( " ) . click ( )
rdepends_name = driver . find_element_by_partial_link_text ( " Reverse build dependencies ( " ) . text
2016-05-09 13:05:09 +00:00
print ( rdepends_name )
2015-12-07 15:53:01 +00:00
rdepends_num = int ( filter ( str . isdigit , repr ( rdepends_name ) ) )
2016-05-09 13:05:09 +00:00
print ( rdepends_num )
2015-12-07 15:53:01 +00:00
if rdepends_num == 0 :
rdepends_message = repr ( driver . find_element_by_css_selector ( " #brought-in-by > div.alert.alert-info " ) . text )
2016-05-09 13:05:09 +00:00
print ( rdepends_message )
2015-12-07 15:53:01 +00:00
if rdepends_message . find ( " has no reverse build dependencies. " ) < 0 :
print ( " Error! The message isn ' t expected. " )
else :
print ( " The message is expected " )
else :
print ( " The reverse dependent packages number is correct " )
driver . find_element_by_link_text ( " Recipes " ) . click ( )
driver . find_element_by_link_text ( test_package2 ) . click ( )
driver . find_element_by_partial_link_text ( " Packages ( " ) . click ( )
driver . find_element_by_partial_link_text ( " Build dependencies ( " ) . click ( )
driver . find_element_by_partial_link_text ( " Reverse build dependencies ( " ) . click ( )
driver . find_element_by_link_text ( " Recipes " ) . click ( )
driver . find_element_by_link_text ( test_package3 ) . click ( )
native_tasks_row_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' information ' ]/table/tbody/tr/td[1] " ) )
native_tasks_column_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' information ' ]/table/tbody/tr[1]/td " ) )
2016-05-09 13:05:09 +00:00
print ( native_tasks_row_count )
print ( native_tasks_column_count )
2015-12-07 15:53:01 +00:00
Native_Tasks_column = self . get_table_column_text_by_column_number ( self . table_name , 2 )
print ( " Native_Tasks_column= " , Native_Tasks_column )
native_key_tasks = [ " do_fetch " , " do_unpack " , " do_patch " , " do_configure " , " do_compile " , " do_install " , " do_build " ]
i = 0
while i < len ( native_key_tasks ) :
if native_key_tasks [ i ] not in Native_Tasks_column :
print ( " Error! Missing key task: %s " % native_key_tasks [ i ] )
else :
print ( " %s is in tasks " % native_key_tasks [ i ] )
i = i + 1
if Native_Tasks_column . index ( native_key_tasks [ 0 ] ) != 0 :
print ( " Error! %s is not in the right position " % native_key_tasks [ 0 ] )
else :
print ( " %s is in right position " % native_key_tasks [ 0 ] )
if Native_Tasks_column [ - 1 ] != native_key_tasks [ - 1 ] :
print ( " Error! %s is not in the right position " % native_key_tasks [ - 1 ] )
else :
print ( " %s is in right position " % native_key_tasks [ - 1 ] )
driver . find_element_by_partial_link_text ( " Packages ( " ) . click ( )
native_packages_name = driver . find_element_by_partial_link_text ( " Packages ( " ) . text
2016-05-09 13:05:09 +00:00
print ( native_packages_name )
2015-12-07 15:53:01 +00:00
native_packages_num = int ( filter ( str . isdigit , repr ( native_packages_name ) ) )
2016-05-09 13:05:09 +00:00
print ( native_packages_num )
2015-12-07 15:53:01 +00:00
if native_packages_num != 0 :
print ( " Error! Native task shouldn ' t have any packages. " )
else :
native_package_message = repr ( driver . find_element_by_css_selector ( " #packages-built > div.alert.alert-info " ) . text )
2016-05-09 13:05:09 +00:00
print ( native_package_message )
2015-12-07 15:53:01 +00:00
if native_package_message . find ( " does not build any packages. " ) < 0 :
print ( " Error! The message for native task isn ' t expected. " )
else :
print ( " The message for native task is expected. " )
driver . find_element_by_partial_link_text ( " Build dependencies ( " ) . click ( )
native_depends_name = driver . find_element_by_partial_link_text ( " Build dependencies ( " ) . text
2016-05-09 13:05:09 +00:00
print ( native_depends_name )
2015-12-07 15:53:01 +00:00
native_depends_num = int ( filter ( str . isdigit , repr ( native_depends_name ) ) )
2016-05-09 13:05:09 +00:00
print ( native_depends_num )
2015-12-07 15:53:01 +00:00
native_depends_row_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' dependencies ' ]/table/tbody/tr/td[1] " ) )
2016-05-09 13:05:09 +00:00
print ( native_depends_row_count )
2015-12-07 15:53:01 +00:00
if native_depends_num != native_depends_row_count :
print ( " Error! The dependent packages number is not correct " )
else :
print ( " The dependent packages number is correct " )
driver . find_element_by_partial_link_text ( " Reverse build dependencies ( " ) . click ( )
native_rdepends_name = driver . find_element_by_partial_link_text ( " Reverse build dependencies ( " ) . text
2016-05-09 13:05:09 +00:00
print ( native_rdepends_name )
2015-12-07 15:53:01 +00:00
native_rdepends_num = int ( filter ( str . isdigit , repr ( native_rdepends_name ) ) )
2016-05-09 13:05:09 +00:00
print ( native_rdepends_num )
2015-12-07 15:53:01 +00:00
native_rdepends_row_count = len ( driver . find_elements_by_xpath ( " //*[@id= ' brought-in-by ' ]/table/tbody/tr/td[1] " ) )
2016-05-09 13:05:09 +00:00
print ( native_rdepends_row_count )
2015-12-07 15:53:01 +00:00
if native_rdepends_num != native_rdepends_row_count :
print ( " Error! The reverse dependent packages number is not correct " )
else :
print ( " The reverse dependent packages number is correct " )
driver . find_element_by_link_text ( " Recipes " ) . click ( )
2015-05-13 12:21:33 +00:00
##############
# CASE 915 #
##############
def test_915 ( 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_link_text ( " core-image-minimal " ) . click ( )
2015-11-04 14:32:22 +00:00
# step 3
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' nav ' , ' Configuration ' ) . click ( )
self . driver . find_element_by_link_text ( " BitBake variables " ) . click ( )
2015-11-04 14:32:22 +00:00
# step 4
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " lib " )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# save screen to see result
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step4 ' )
2015-11-04 14:32:22 +00:00
# step 5
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_css_selector ( " i.icon-remove " ) . click ( )
head_list = self . get_table_head_text ( ' otable ' )
2016-05-09 13:05:09 +00:00
print ( head_list )
print ( len ( head_list ) )
2015-09-23 14:18:11 +00:00
self . assertTrue ( head_list == [ ' Variable ' , ' Value ' , ' Set in file ' , ' Description ' ] , \
msg = ( " head row contents wrong " ) )
2015-11-04 14:32:22 +00:00
# step 8
2015-05-13 12:21:33 +00:00
# search other string. and click "Variable" to re-sort, check if table
# head is still the same
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " poky " )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' otable ' , ' Variable ' ) . click ( )
head_list = self . get_table_head_text ( ' otable ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( head_list == [ ' Variable ' , ' Value ' , ' Set in file ' , ' Description ' ] , \
msg = ( " head row contents wrong " ) )
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' otable ' , ' Variable ' ) . click ( )
head_list = self . get_table_head_text ( ' otable ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( head_list == [ ' Variable ' , ' Value ' , ' Set in file ' , ' Description ' ] , \
msg = ( " head row contents wrong " ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 916 #
##############
def test_916 ( 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_link_text ( " core-image-minimal " ) . click ( )
2015-11-04 14:32:22 +00:00
# step 2-3
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' nav ' , ' Configuration ' ) . click ( )
self . driver . find_element_by_link_text ( " BitBake variables " ) . click ( )
variable_list = self . get_table_column_text ( ' class ' , ' variable_name ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( variable_list ) , msg = ( " list not in order " ) )
2015-11-04 14:32:22 +00:00
# step 4
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' otable ' , ' Variable ' ) . click ( )
variable_list = self . get_table_column_text ( ' class ' , ' variable_name ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( variable_list ) , msg = ( " list not inverted " ) )
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' otable ' , ' Variable ' ) . click ( )
2015-11-04 14:32:22 +00:00
# step 5
2015-05-13 12:21:33 +00:00
# searching won't change the sequentiality
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " lib " )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
2015-05-13 12:21:33 +00:00
variable_list = self . get_table_column_text ( ' class ' , ' variable_name ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( variable_list ) , msg = ( " list not in order " ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 923 #
##############
def test_923 ( 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 )
# Step 2
# default sequence in "Completed on" column is inverted
c_list = self . get_table_column_text ( ' class ' , ' completed_on ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( c_list ) , msg = ( " list not inverted " ) )
2015-05-13 12:21:33 +00:00
# step 3
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " started_on " ) . click ( )
self . driver . find_element_by_id ( " time " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
head_list = self . get_table_head_text ( ' otable ' )
2015-12-07 15:53:01 +00:00
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. ' )
2015-05-13 12:21:33 +00:00
##############
# CASE 924 #
##############
def test_924 ( 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 )
# Please refer to case 924 requirement
# default sequence in "Completed on" column is inverted
c_list = self . get_table_column_text ( ' class ' , ' completed_on ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( c_list ) , msg = ( " list not inverted " ) )
2015-05-13 12:21:33 +00:00
# Step 4
# click Errors , order in "Completed on" should be disturbed. Then hide
# error column to check if order in "Completed on" can be restored
2015-12-07 15:53:01 +00:00
#THIS TEST IS NO LONGER VALID DUE TO DESIGN CHANGES. LEAVING IN PENDING UPDATES TO DESIGN
#self.find_element_by_link_text_in_table('otable', 'Errors').click()
#self.driver.find_element_by_id("edit-columns-button").click()
#self.driver.find_element_by_id("errors_no").click()
#self.driver.find_element_by_id("edit-columns-button").click()
2015-05-13 12:21:33 +00:00
# Note: without time.sleep here, there'll be unpredictable error..TBD
time . sleep ( 1 )
c_list = self . get_table_column_text ( ' class ' , ' completed_on ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_inverted ( c_list ) , msg = ( " list not inverted " ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 940 #
##############
def test_940 ( 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_link_text ( " core-image-minimal " ) . click ( )
2015-11-04 14:32:22 +00:00
# Step 2-3
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' nav ' , ' Packages ' ) . click ( )
check_head_list = [ ' Package ' , ' Package version ' , ' Size ' , ' Recipe ' ]
head_list = self . get_table_head_text ( ' otable ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( head_list == check_head_list , msg = ( " head row not as expected " ) )
2015-11-04 14:32:22 +00:00
# Step 4
2015-05-13 12:21:33 +00:00
# pulldown menu
option_ids = [ ' recipe__layer_version__layer__name ' , ' recipe__layer_version__branch ' , \
2015-08-19 13:29:24 +00:00
' recipe__layer_version__layer__commit ' , ' license ' , ' recipe__version ' ]
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
for item in option_ids :
if not self . driver . find_element_by_id ( item ) . is_selected ( ) :
self . driver . find_element_by_id ( item ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# save screen here to observe that 'Package' and 'Package version' is
# not selectable
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step4 ' )
##############
# CASE 941 #
##############
def test_941 ( 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_link_text ( " core-image-minimal " ) . click ( )
# Step 2-3
self . find_element_by_link_text_in_table ( ' nav ' , ' Packages ' ) . click ( )
# column -- Package
column_list = self . get_table_column_text_by_column_number ( ' otable ' , 1 )
2015-09-23 14:18:11 +00:00
self . assertTrue ( is_list_sequenced ( column_list ) , msg = ( " list not in order " ) )
2015-05-13 12:21:33 +00:00
self . find_element_by_link_text_in_table ( ' otable ' , ' Size ' ) . click ( )
2015-08-19 13:29:24 +00:00
##############
# CASE 942 #
##############
def test_942 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . driver . find_element_by_link_text ( " Packages " ) . click ( )
#get initial table header
head_list = self . get_table_head_text ( ' otable ' )
#remove the Recipe column from table header
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
self . driver . find_element_by_id ( " recipe__name " ) . click ( )
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
#get modified table header
new_head = self . get_table_head_text ( ' otable ' )
2015-09-23 14:18:11 +00:00
self . assertTrue ( head_list > new_head )
2015-08-19 13:29:24 +00:00
##############
# CASE 943 #
##############
def test_943 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . driver . find_element_by_link_text ( " Packages " ) . click ( )
#search for the "bash" package -> this should definitely be present
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " bash " )
self . driver . find_element_by_id ( " search-button " ) . click ( )
#check for the search result message "XX packages found"
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . is_text_present ( " packages found " ) , msg = ( " no packages found text " ) )
2015-08-19 13:29:24 +00:00
2015-05-13 12:21:33 +00:00
##############
# CASE 944 #
##############
def test_944 ( 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_link_text ( " core-image-minimal " ) . click ( )
# step 1: test Recipes page stuff
self . driver . find_element_by_link_text ( " Recipes " ) . click ( )
# for these 3 items, default status is not-checked
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " layer_version__branch " ) . click ( )
self . driver . find_element_by_id ( " layer_version__layer__commit " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# otable is the recipes table here
otable_head_text = self . get_table_head_text ( ' otable ' )
2015-09-23 14:18:11 +00:00
for item in [ " Layer " , " Layer branch " , " Layer commit " ] :
2015-12-07 15:53:01 +00:00
self . failIf ( item not in otable_head_text , msg = item + ' not in table head. ' )
2015-05-13 12:21:33 +00:00
# click the fist recipe, whatever it is
self . get_table_element ( " otable " , 1 , 1 ) . click ( )
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . is_text_present ( [ " Layer " , " Layer branch " , " Layer commit " , " Recipe file " ] ) , \
msg = ( " text not in web page " ) )
2015-05-13 12:21:33 +00:00
# step 2: test Packages page stuff. almost same as above
self . driver . back ( )
self . browser_delay ( )
self . driver . find_element_by_link_text ( " Packages " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " recipe__layer_version__layer__name " ) . click ( )
self . driver . find_element_by_id ( " recipe__layer_version__branch " ) . click ( )
self . driver . find_element_by_id ( " recipe__layer_version__layer__commit " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
otable_head_text = self . get_table_head_text ( " otable " )
2015-08-19 13:29:24 +00:00
for item in [ " Layer " , " Layer branch " , " Layer commit " ] :
2015-09-23 14:18:11 +00:00
self . assertFalse ( item not in otable_head_text , msg = ( " item %s should be in head row " % item ) )
2015-05-13 12:21:33 +00:00
# click the fist recipe, whatever it is
self . get_table_element ( " otable " , 1 , 1 ) . click ( )
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . is_text_present ( [ " Layer " , " Layer branch " , " Layer commit " ] ) , \
msg = ( " text not in web page " ) )
2015-05-13 12:21:33 +00:00
# step 3: test Packages core-image-minimal(images) stuff. almost same as above. Note when future element-id changes...
self . driver . back ( )
self . driver . find_element_by_link_text ( " core-image-minimal " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_id ( " layer_name " ) . click ( )
self . driver . find_element_by_id ( " layer_branch " ) . click ( )
self . driver . find_element_by_id ( " layer_commit " ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
otable_head_text = self . get_table_head_text ( " otable " )
2015-08-19 13:29:24 +00:00
for item in [ " Layer " , " Layer branch " , " Layer commit " ] :
2015-09-23 14:18:11 +00:00
self . assertFalse ( item not in otable_head_text , msg = ( " item %s should be in head row " % item ) )
2015-05-13 12:21:33 +00:00
# click the fist recipe, whatever it is
self . get_table_element ( " otable " , 1 , 1 ) . click ( )
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . is_text_present ( [ " Layer " , " Layer branch " , " Layer commit " ] ) , \
msg = ( " text not in web page " ) )
2015-05-13 12:21:33 +00:00
# step 4: check Configuration page
self . driver . back ( )
self . driver . find_element_by_link_text ( " Configuration " ) . click ( )
otable_head_text = self . get_table_head_text ( )
2015-11-04 14:32:22 +00:00
self . assertTrue ( self . is_text_present ( [ " Layer " , " Layer branch " , " Layer commit " ] ) , \
msg = ( " text not in web page " ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 945 #
##############
def test_945 ( self ) :
self . case_no = self . get_case_number ( )
self . log . info ( ' CASE %s log: ' % str ( self . case_no ) )
self . driver . maximize_window ( )
2015-11-04 14:32:22 +00:00
for item in [ " Packages " , " Recipes " , " Tasks " ] :
2015-05-13 12:21:33 +00:00
self . driver . get ( self . base_url )
2015-12-07 15:53:01 +00:00
self . driver . find_element_by_link_text ( " core-image-minimal " ) . click ( )
self . driver . find_element_by_link_text ( items ) . click ( )
# this may be page specific. If future page content changes, try to replace it with new xpath
xpath_showrows = " /html/body/div[4]/div/div/div[2]/div[2]/div[2]/div/div/div[2]/select "
xpath_table = " html/body/div[4]/div/div/div[2]/div[2]/table/tbody " #"id=('otable')/tbody"
self . driver . find_element_by_xpath ( xpath_showrows ) . click ( )
rows_displayed = int ( self . driver . find_element_by_xpath ( xpath_showrows + " /option[2] " ) . text )
# not sure if this is a Selenium Select bug: If page is not refreshed here, "select(by visible text)" operation will go back to 100-row page
# 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 ( )
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 . failIf ( self . is_element_present ( By . XPATH , xpath_table + " /tr[ " + str ( rows_displayed + 1 ) + " ] " ) )
2015-05-13 12:21:33 +00:00
# click 1st package, then go back to check if it's still those rows shown.
2015-11-04 14:32:22 +00:00
self . driver . find_element_by_xpath ( xpath_otable + " /tr[1]/td[1]/a " ) . click ( )
time . sleep ( 3 )
self . driver . find_element_by_link_text ( item ) . click ( )
self . assertTrue ( self . is_element_present ( By . XPATH , xpath_otable + " /tr[ " + str ( option_tobeselected ) + " ] " ) , \
msg = ( " Row %d should exist " % option_tobeselected ) )
self . assertFalse ( self . is_element_present ( By . XPATH , xpath_otable + " /tr[ " + str ( option_tobeselected + 1 ) + " ] " ) , \
msg = ( " Row %d should not exist " % ( option_tobeselected + 1 ) ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 946 #
##############
def test_946 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . driver . find_element_by_link_text ( " Configuration " ) . click ( )
# step 3-4
check_list = [ " Summary " , " BitBake variables " ]
for item in check_list :
if not self . is_element_present ( how = By . LINK_TEXT , what = item ) :
self . log . error ( " %s not found " % item )
2015-08-19 13:29:24 +00:00
if not self . is_text_present ( [ ' Layers ' , ' Layer ' , ' Layer branch ' , ' Layer commit ' ] ) :
2015-05-13 12:21:33 +00:00
self . log . error ( " text not found " )
# step 5
self . driver . find_element_by_link_text ( " BitBake variables " ) . click ( )
if not self . is_text_present ( [ ' Variable ' , ' Value ' , ' Set in file ' , ' Description ' ] ) :
self . log . error ( " text not found " )
# This may be unstable because it's page-specific
# step 6: this is how we find filter beside "Set in file"
temp_element = self . find_element_by_text_in_table ( ' otable ' , " Set in file " )
temp_element . find_element_by_xpath ( " ..//*/a/i[@class= ' icon-filter filtered ' ] " ) . click ( )
self . browser_delay ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_xpath ( " (//input[@name= ' filter ' ])[3] " ) . click ( )
btns = self . driver . find_elements_by_css_selector ( " button.btn.btn-primary " )
for btn in btns :
try :
btn . click ( )
break
except :
pass
2015-05-13 12:21:33 +00:00
# save screen here
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step6 ' )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# save screen here
# step 7
# we should manually check the step 6-8 result using screenshot
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step7 ' )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# step 9
# click the 1st item, no matter what it is
self . driver . find_element_by_xpath ( " //*[@id= ' otable ' ]/tbody/tr[1]/td[1]/a " ) . click ( )
# give it 1 sec so the pop-up becomes the "active_element"
time . sleep ( 1 )
element = self . driver . switch_to . active_element
check_list = [ ' Order ' , ' Configuration file ' , ' Operation ' , ' Line number ' ]
for item in check_list :
if item not in element . text :
self . log . error ( " %s not found " % item )
# any better way to close this pop-up? ... TBD
2015-08-19 13:29:24 +00:00
element . find_element_by_class_name ( " close " ) . click ( )
2015-05-13 12:21:33 +00:00
# step 10 : need to manually check "Yocto Manual" in saved screen
self . driver . find_element_by_css_selector ( " i.icon-share.get-info " ) . click ( )
# save screen here
time . sleep ( 5 )
self . save_screenshot ( screenshot_type = ' native ' , append_name = ' step10 ' )
##############
# CASE 947 #
##############
def test_947 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , ' Configuration ' ) . click ( )
# step 2
self . driver . find_element_by_link_text ( " BitBake variables " ) . click ( )
# step 3
def xpath_option ( column_name ) :
# return xpath of options under "Edit columns" button
return self . shortest_xpath ( ' id ' , ' navTab ' ) + self . shortest_xpath ( ' id ' , ' editcol ' ) \
+ self . shortest_xpath ( ' id ' , column_name )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( ' edit-columns-button ' ) . click ( )
2015-05-13 12:21:33 +00:00
# by default, option "Description" and "Set in file" were checked
self . driver . find_element_by_xpath ( xpath_option ( ' description ' ) ) . click ( )
self . driver . find_element_by_xpath ( xpath_option ( ' file ' ) ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( ' edit-columns-button ' ) . click ( )
2015-05-13 12:21:33 +00:00
check_list = [ ' Description ' , ' Set in file ' ]
head_list = self . get_table_head_text ( ' otable ' )
for item in check_list :
2015-09-23 14:18:11 +00:00
self . assertFalse ( item in head_list , msg = ( " item %s should not be in head row " % item ) )
2015-05-13 12:21:33 +00:00
# check these 2 options and verify again
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( ' edit-columns-button ' ) . click ( )
2015-05-13 12:21:33 +00:00
self . driver . find_element_by_xpath ( xpath_option ( ' description ' ) ) . click ( )
self . driver . find_element_by_xpath ( xpath_option ( ' file ' ) ) . click ( )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( ' edit-columns-button ' ) . click ( )
2015-05-13 12:21:33 +00:00
head_list = self . get_table_head_text ( ' otable ' )
for item in check_list :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " item %s not in head row " % item ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 948 #
##############
def test_948 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , ' Configuration ' ) . click ( )
self . driver . find_element_by_link_text ( " BitBake variables " ) . click ( )
2015-08-19 13:29:24 +00:00
#get number of variables visible by default
number_before_search = self . driver . find_element_by_class_name ( ' page-header ' ) . text
2015-05-13 12:21:33 +00:00
# search for a while...
self . driver . find_element_by_id ( " search " ) . clear ( )
self . driver . find_element_by_id ( " search " ) . send_keys ( " BB " )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " search-button " ) . click ( )
#get number of variables visible after search
number_after_search = self . driver . find_element_by_class_name ( ' page-header ' ) . text
2015-09-23 14:18:11 +00:00
self . assertTrue ( number_before_search > number_after_search , msg = ( " items should be less after search " ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 949 #
##############
def test_949 ( 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_link_text ( " core-image-minimal " ) . click ( )
self . find_element_by_link_text_in_table ( ' nav ' , ' core-image-minimal ' ) . click ( )
# step 3
try :
self . driver . find_element_by_partial_link_text ( " Packages included " )
self . driver . find_element_by_partial_link_text ( " Directory structure " )
2016-05-09 13:05:09 +00:00
except Exception as e :
2015-05-13 12:21:33 +00:00
self . log . error ( e )
2015-09-23 14:18:11 +00:00
self . assertFalse ( True )
2015-05-13 12:21:33 +00:00
# step 4
head_list = self . get_table_head_text ( ' otable ' )
for item in [ ' Package ' , ' Package version ' , ' Size ' , ' Dependencies ' , ' Reverse dependencies ' , ' Recipe ' ] :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " item %s not in head row " % item ) )
2015-05-13 12:21:33 +00:00
# step 5-6
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
selectable_class = ' checkbox '
# minimum-table : means unselectable items
unselectable_class = ' checkbox muted '
2015-08-19 13:29:24 +00:00
selectable_check_list = [ ' Dependencies ' , ' Layer ' , ' Layer branch ' , ' Layer commit ' , \
2015-05-13 12:21:33 +00:00
' License ' , ' Recipe ' , ' Recipe version ' , ' Reverse dependencies ' , \
' Size ' , ' Size over total ( % ) ' ]
unselectable_check_list = [ ' Package ' , ' Package version ' ]
selectable_list = list ( )
unselectable_list = list ( )
selectable_elements = self . driver . find_elements_by_xpath ( " //*[@id= ' editcol ' ]//*[@class= ' " + selectable_class + " ' ] " )
unselectable_elements = self . driver . find_elements_by_xpath ( " //*[@id= ' editcol ' ]//*[@class= ' " + unselectable_class + " ' ] " )
for element in selectable_elements :
selectable_list . append ( element . text )
for element in unselectable_elements :
unselectable_list . append ( element . text )
# check them
for item in selectable_check_list :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in selectable_list , msg = ( " %s not found in dropdown menu " % item ) )
2015-05-13 12:21:33 +00:00
for item in unselectable_check_list :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in unselectable_list , msg = ( " %s not found in dropdown menu " % item ) )
2015-08-19 13:29:24 +00:00
self . driver . find_element_by_id ( " edit-columns-button " ) . click ( )
2015-05-13 12:21:33 +00:00
# step 7
self . driver . find_element_by_partial_link_text ( " Directory structure " ) . click ( )
head_list = self . get_table_head_text ( ' dirtable ' )
for item in [ ' Directory / File ' , ' Symbolic link to ' , ' Source package ' , ' Size ' , ' Permissions ' , ' Owner ' , ' Group ' ] :
2015-09-23 14:18:11 +00:00
self . assertTrue ( item in head_list , msg = ( " %s not found in Directory structure table head " % item ) )
2015-05-13 12:21:33 +00:00
##############
# CASE 950 #
##############
def test_950 ( 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 )
# 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 ' ]
has_successful_build = 1
has_failed_build = 1
try :
pass_icon = self . driver . find_element_by_xpath ( " //*[@class= ' icon-ok-sign success ' ] " )
except Exception :
self . log . info ( " no successful build exists " )
has_successful_build = 0
pass
if has_successful_build :
pass_icon . click ( )
# save screen here to check if it matches requirement.
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step3_1 ' )
for item in check_list :
try :
self . find_element_by_link_text_in_table ( ' nav ' , item )
except Exception :
2015-09-23 14:18:11 +00:00
self . assertFalse ( True , msg = ( " link %s cannot be found in the page " % item ) )
2015-05-13 12:21:33 +00:00
# step 6
check_list_2 = [ ' Packages included ' , ' Total package size ' , \
' License manifest ' , ' Image files ' ]
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . is_text_present ( check_list_2 ) , msg = ( " text not in web page " ) )
2015-05-13 12:21:33 +00:00
self . driver . back ( )
try :
fail_icon = self . driver . find_element_by_xpath ( " //*[@class= ' icon-minus-sign error ' ] " )
except Exception :
has_failed_build = 0
self . log . info ( " no failed build exists " )
pass
if has_failed_build :
fail_icon . click ( )
# save screen here to check if it matches requirement.
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step3_2 ' )
for item in check_list :
try :
self . find_element_by_link_text_in_table ( ' nav ' , item )
except Exception :
2015-09-23 14:18:11 +00:00
self . assertFalse ( True , msg = ( " link %s cannot be found in the page " % item ) )
2015-05-13 12:21:33 +00:00
# step 7 involved
check_list_3 = [ ' Machine ' , ' Distro ' , ' Layers ' , ' Total number of tasks ' , ' Tasks executed ' , \
' Tasks not executed ' , ' Reuse ' , ' Recipes built ' , ' Packages built ' ]
2015-09-23 14:18:11 +00:00
self . assertTrue ( self . is_text_present ( check_list_3 ) , msg = ( " text not in web page " ) )
2015-05-13 12:21:33 +00:00
self . driver . back ( )
##############
# CASE 951 #
##############
def test_951 ( 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 )
# currently test case itself isn't responsible for creating "1 successful and
# 1 failed build"
has_successful_build = 1
has_failed_build = 1
try :
fail_icon = self . driver . find_element_by_xpath ( " //*[@class= ' icon-minus-sign error ' ] " )
except Exception :
has_failed_build = 0
self . log . info ( " no failed build exists " )
pass
# if there's failed build, we can proceed
if has_failed_build :
self . driver . find_element_by_partial_link_text ( " error " ) . click ( )
self . driver . back ( )
# not sure if there "must be" some warnings, so here save a screen
self . browser_delay ( )
self . save_screenshot ( screenshot_type = ' selenium ' , append_name = ' step4 ' )
##############
# CASE 955 #
##############
def test_955 ( 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 . log . info ( " You should manually create all images before test starts! " )
# So far the case itself is not responsable for creating all sorts of images.
# So assuming they are already there
# step 2
self . driver . find_element_by_link_text ( " core-image-minimal " ) . click ( )
# save screen here to see the page component
##############
# CASE 956 #
##############
def test_956 ( 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 )
# step 2-3 need to run manually
self . log . info ( " step 2-3: checking the help message when you hover on help icon of target, \
tasks , recipes , packages need to run manually " )
2015-12-07 15:53:01 +00:00
self . driver . find_element_by_partial_link_text ( " Manual " ) . click ( )
if not self . is_text_present ( " Manual " ) :
self . log . error ( " please check [Toaster manual] link on page " )
self . failIf ( True )
2015-05-13 12:21:33 +00:00
2015-12-07 15:53:00 +00:00
####################################################################################################
# Starting backend tests ###########################################################################
####################################################################################################
##############
# CASE 1066 #
##############
def test_1066 ( 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 )
##############
# CASE 1071 #
##############
def test_1071 ( 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 ( )
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
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 ( )
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( data == json_data )
##############
# CASE 1072 #
##############
def test_1072 ( 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 ]
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
json_parse = json . loads ( open ( ' toasterconf.json ' ) . read ( ) )
json_data = json_parse [ ' config ' ]
json_data = json_data . values ( )
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( data == json_data )
##############
# CASE 1074 #
##############
def test_1074 ( 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 ]
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
json_parse = json . loads ( open ( ' toasterconf.json ' ) . read ( ) )
json_data = [ ]
for i in range ( 0 , 3 ) :
json_data . append ( json_parse [ ' layersources ' ] [ i ] [ ' name ' ] )
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( set ( data ) == set ( json_data ) )
##############
# CASE 1075 #
##############
def test_1075 ( 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 ]
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
json_parse = json . loads ( open ( ' toasterconf.json ' ) . read ( ) )
json_data = json_parse [ ' defaultrelease ' ]
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( set ( data ) == set ( json_data ) )
##############
# CASE 1076 #
##############
def test_1076 ( self ) :
self . case_no = self . get_case_number ( )
self . log . info ( ' CASE %s log: ' % str ( self . case_no ) )
2016-05-09 13:05:09 +00:00
print ( ' Checking branches for " Local Yocto Project " ' )
2015-12-07 15:53:00 +00:00
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 ( )
2015-12-07 15:53:01 +00:00
lenght = len ( data )
try :
for i in range ( 0 , lenght ) :
data [ i ] = data [ i ] [ 0 ]
except :
pass
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
json_parse = json . loads ( open ( ' toasterconf.json ' ) . read ( ) )
2015-12-07 15:53:01 +00:00
json_location = json_parse [ ' layersources ' ] [ 0 ] [ ' name ' ]
2016-05-09 13:05:09 +00:00
print ( json_location )
2015-12-07 15:53:00 +00:00
json_data = json_parse [ ' layersources ' ] [ 0 ] [ ' branches ' ]
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( set ( data ) == set ( json_data ) )
2016-05-09 13:05:09 +00:00
print ( ' Checking branches for " OpenEmbedded " ' )
2015-12-07 15:53:00 +00:00
con = sqlite . connect ( ' toaster.sqlite ' )
cursor = con . cursor ( )
2015-12-07 15:53:01 +00:00
query = " select name from orm_branch where layer_source_id=3; "
2015-12-07 15:53:00 +00:00
cursor . execute ( query )
data = cursor . fetchall ( )
2015-12-07 15:53:01 +00:00
lenght = len ( data )
for i in range ( 0 , lenght ) :
2015-12-07 15:53:00 +00:00
data [ i ] = data [ i ] [ 0 ]
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
json_parse = json . loads ( open ( ' toasterconf.json ' ) . read ( ) )
2015-12-07 15:53:01 +00:00
json_location = json_parse [ ' layersources ' ] [ 1 ] [ ' name ' ]
2016-05-09 13:05:09 +00:00
print ( json_location )
2015-12-07 15:53:00 +00:00
json_data = json_parse [ ' layersources ' ] [ 1 ] [ ' branches ' ]
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( set ( data ) == set ( json_data ) )
2016-05-09 13:05:09 +00:00
print ( ' Checking branches for " Imported layers " ' )
2015-12-07 15:53:00 +00:00
con = sqlite . connect ( ' toaster.sqlite ' )
cursor = con . cursor ( )
2015-12-07 15:53:01 +00:00
query = " select name from orm_branch where layer_source_id=2; "
2015-12-07 15:53:00 +00:00
cursor . execute ( query )
data = cursor . fetchall ( )
2015-12-07 15:53:01 +00:00
lenght = len ( data )
for i in range ( 0 , lenght ) :
2015-12-07 15:53:00 +00:00
data [ i ] = data [ i ] [ 0 ]
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
json_parse = json . loads ( open ( ' toasterconf.json ' ) . read ( ) )
2015-12-07 15:53:01 +00:00
json_location = json_parse [ ' layersources ' ] [ 2 ] [ ' name ' ]
2016-05-09 13:05:09 +00:00
print ( json_location )
2015-12-07 15:53:00 +00:00
json_data = json_parse [ ' layersources ' ] [ 2 ] [ ' branches ' ]
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( set ( data ) == set ( json_data ) )
##############
# CASE 1077 #
##############
def test_1077 ( 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 ]
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
json_parse = json . loads ( open ( ' toasterconf.json ' ) . read ( ) )
json_data = [ ]
for i in range ( 0 , 4 ) :
json_data . append ( json_parse [ ' bitbake ' ] [ i ] [ ' name ' ] )
2016-05-09 13:05:09 +00:00
print ( json_data )
2015-12-07 15:53:00 +00:00
self . failUnless ( set ( data ) == set ( json_data ) )
##############
# CASE 1083 #
##############
def test_1083 ( 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 ( )
2016-05-09 13:05:09 +00:00
print ( ' data: %s ' % data )
2015-12-07 15:53:00 +00:00
self . failUnless ( data > = 1 )
##############
# CASE 1084 #
##############
def test_1084 ( 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 )
##############
# CASE 1088 #
##############
def test_1088 ( 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 ( )
##############
# CASE 1089 #
##############
def test_1089 ( 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 ' )
2015-12-07 15:53:01 +00:00
# self.driver.find_element_by_id('machine-change-input').send_keys(Keys.RETURN)
2015-12-07 15:53:00 +00:00
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 :
2015-12-07 15:53:01 +00:00
data = data [ 0 ] [ 0 ]
2015-12-07 15:53:00 +00:00
except :
pass
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
self . failUnless ( data == ' toaster_admin ' )
##############
# CASE 1091 #
##############
def test_1091 ( 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
time . sleep ( 1 )
self . failUnless ( data == 3 )
##############
# CASE 1092 #
##############
def test_1092 ( 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 ( ) )
2016-05-09 13:05:09 +00:00
print ( data )
2015-12-07 15:53:00 +00:00
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 )
##############
# CASE 1093 #
##############
def test_1093 ( self ) :
self . case_no = self . get_case_number ( )
self . log . info ( ' CASE %s log: ' % str ( self . case_no ) )
#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 ( )
2016-05-09 13:05:09 +00:00
print ( data_initial )
2015-12-07 15:53:00 +00:00
self . driver . maximize_window ( )
self . driver . get ( ' localhost:8000 ' ) #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 ( )
2016-05-09 13:05:09 +00:00
print ( data_changed )
2015-12-07 15:53:00 +00:00
#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 )