Fix explicit waiting if instance has error status

This patches includes:
- don't wait instance launching if instance in error status
- add missed assertTrue to validate notification messages
- check that message is present and is displayed

Change-Id: If731751fa4deabdeebe373748b169ac7ac617f8c
Closes-Bug: #1569941
This commit is contained in:
Sergei Chipiga 2016-04-13 15:35:13 +03:00
parent 755d07cbdf
commit 65eb9e9b8c
10 changed files with 51 additions and 28 deletions

View File

@ -95,10 +95,10 @@ class BaseWebObject(unittest.TestCase):
""" """
if not timeout: if not timeout:
timeout = self.explicit_wait timeout = self.explicit_wait
wait.WebDriverWait(self.driver, timeout, poll_frequency).until( return wait.WebDriverWait(self.driver, timeout, poll_frequency).until(
predicate) predicate)
def _wait_till_text_present_in_element(self, element, text, timeout=None): def _wait_till_text_present_in_element(self, element, texts, timeout=None):
"""Waiting for a text to appear in a certain element very often is """Waiting for a text to appear in a certain element very often is
actually waiting for a _different_ element with a different text to actually waiting for a _different_ element with a different text to
appear in place of an old element. So a way to avoid capturing stale appear in place of an old element. So a way to avoid capturing stale
@ -108,11 +108,17 @@ class BaseWebObject(unittest.TestCase):
to avoid problems with cell being replaced with totally different to avoid problems with cell being replaced with totally different
element by Javascript element by Javascript
""" """
if not isinstance(texts, (list, tuple)):
texts = (texts,)
def predicate(_): def predicate(_):
elt = element() if hasattr(element, '__call__') else element elt = element() if hasattr(element, '__call__') else element
return self._is_text_visible(elt, text) for text in texts:
if self._is_text_visible(elt, text):
return text
return False
self._wait_until(predicate, timeout) return self._wait_until(predicate, timeout)
def _wait_till_element_visible(self, element, timeout=None): def _wait_till_element_visible(self, element, timeout=None):
self._wait_until(lambda x: self._is_element_displayed(element), self._wait_until(lambda x: self._is_element_displayed(element),

View File

@ -55,9 +55,10 @@ class BasePage(pageobject.PageObject):
def find_message_and_dismiss(self, message_level=messages.SUCCESS): def find_message_and_dismiss(self, message_level=messages.SUCCESS):
message = messages.MessageRegion(self.driver, self.conf, message_level) message = messages.MessageRegion(self.driver, self.conf, message_level)
if message.exists(): is_message_present = message.exists()
if is_message_present:
message.close() message.close()
return message.exists() return is_message_present
def change_project(self, name): def change_project(self, name):
self.topbar.user_dropdown_project.click_on_project(name) self.topbar.user_dropdown_project.click_on_project(name)

View File

@ -157,8 +157,8 @@ class ImagesPage(basepage.BaseNavigationPage):
def is_image_active(self, name): def is_image_active(self, name):
row = self._get_row_with_image_name(name) row = self._get_row_with_image_name(name)
return self.images_table.is_cell_status( return bool(self.images_table.wait_cell_status(
lambda: row.cells[IMAGES_TABLE_STATUS_COLUMN], 'Active') lambda: row.cells[IMAGES_TABLE_STATUS_COLUMN], 'Active'))
def wait_until_image_active(self, name): def wait_until_image_active(self, name):
self._wait_until(lambda x: self.is_image_active(name)) self._wait_until(lambda x: self.is_image_active(name))

View File

@ -118,7 +118,10 @@ class InstancesPage(basepage.BaseNavigationPage):
def cell_getter(): def cell_getter():
row = self._get_row_with_instance_name(name) row = self._get_row_with_instance_name(name)
return row and row.cells[self.INSTANCES_TABLE_STATUS_COLUMN] return row and row.cells[self.INSTANCES_TABLE_STATUS_COLUMN]
return self.instances_table.is_cell_status(cell_getter, 'Active')
status = self.instances_table.wait_cell_status(cell_getter,
('Active', 'Error'))
return status == 'Active'
def _get_source_name(self, instance, boot_source, def _get_source_name(self, instance, boot_source,
conf): conf):

View File

@ -100,8 +100,8 @@ class VolumesnapshotsPage(basepage.BaseNavigationPage):
def is_volume_snapshot_available(self, name): def is_volume_snapshot_available(self, name):
row = self._get_row_with_volume_snapshot_name(name) row = self._get_row_with_volume_snapshot_name(name)
return self.volumesnapshots_table.is_cell_status( return bool(self.volumesnapshots_table.wait_cell_status(
lambda: row.cells[self.SNAPSHOT_TABLE_STATUS_COLUMN], 'Available') lambda: row.cells[self.SNAPSHOT_TABLE_STATUS_COLUMN], 'Available'))
def get_volume_name(self, snapshot_name): def get_volume_name(self, snapshot_name):
row = self._get_row_with_volume_snapshot_name(snapshot_name) row = self._get_row_with_volume_snapshot_name(snapshot_name)

View File

@ -144,8 +144,8 @@ class VolumesPage(basepage.BaseNavigationPage):
def is_volume_status(self, name, status): def is_volume_status(self, name, status):
row = self._get_row_with_volume_name(name) row = self._get_row_with_volume_name(name)
return self.volumes_table.is_cell_status( return bool(self.volumes_table.wait_cell_status(
lambda: row.cells[self.VOLUMES_TABLE_STATUS_COLUMN], status) lambda: row.cells[self.VOLUMES_TABLE_STATUS_COLUMN], status))
def is_volume_deleted(self, name): def is_volume_deleted(self, name):
return self.volumes_table.is_row_deleted( return self.volumes_table.is_row_deleted(

View File

@ -107,5 +107,5 @@ class NetworksPage(basepage.BaseNavigationPage):
def is_network_active(self, name): def is_network_active(self, name):
row = self._get_row_with_network_name(name) row = self._get_row_with_network_name(name)
return self.networks_table.is_cell_status( return bool(self.networks_table.wait_cell_status(
lambda: row.cells[self.NETWORKS_TABLE_STATUS_COLUMN], 'Active') lambda: row.cells[self.NETWORKS_TABLE_STATUS_COLUMN], 'Active'))

View File

@ -39,7 +39,7 @@ class MessageRegion(baseregion.BaseRegion):
self._turn_on_implicit_wait() self._turn_on_implicit_wait()
def exists(self): def exists(self):
return bool(self.src_elem) return self._is_element_displayed(self.src_elem)
def close(self): def close(self):
self._get_element(*self._close_locator).click() self._get_element(*self._close_locator).click()

View File

@ -158,12 +158,14 @@ class TableRegion(baseregion.BaseRegion):
return True return True
return True return True
def is_cell_status(self, cell_getter, status): def wait_cell_status(self, cell_getter, statuses):
if not isinstance(statuses, (list, tuple)):
statuses = (statuses,)
try: try:
self._wait_till_text_present_in_element(cell_getter, status) return self._wait_till_text_present_in_element(cell_getter,
statuses)
except exceptions.TimeoutException: except exceptions.TimeoutException:
return False return False
return True
def is_next_link_available(self): def is_next_link_available(self):
try: try:

View File

@ -74,12 +74,14 @@ class TestInstances(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage() settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize(items_per_page) settings_page.change_pagesize(items_per_page)
settings_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
instances_page = self.home_pg.go_to_compute_instancespage() instances_page = self.home_pg.go_to_compute_instancespage()
instances_page.create_instance(self.INSTANCE_NAME, instances_page.create_instance(self.INSTANCE_NAME,
instance_count=instance_count) instance_count=instance_count)
instances_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.is_instance_active(instance_list[1])) self.assertTrue(instances_page.is_instance_active(instance_list[1]))
instances_page = self.instances_page instances_page = self.instances_page
@ -96,12 +98,14 @@ class TestInstances(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage() settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize() settings_page.change_pagesize()
settings_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
instances_page = self.instances_page instances_page = self.instances_page
for instance_name in instance_list: for instance_name in instance_list:
instances_page.delete_instance(instance_name) instances_page.delete_instance(instance_name)
instances_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.is_instance_deleted(instance_name)) self.assertTrue(instances_page.is_instance_deleted(instance_name))
def test_instances_pagination_and_filtration(self): def test_instances_pagination_and_filtration(self):
@ -139,12 +143,14 @@ class TestInstances(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage() settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize(items_per_page) settings_page.change_pagesize(items_per_page)
settings_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
instances_page = self.home_pg.go_to_compute_instancespage() instances_page = self.home_pg.go_to_compute_instancespage()
instances_page.create_instance(self.INSTANCE_NAME, instances_page.create_instance(self.INSTANCE_NAME,
instance_count=instance_count) instance_count=instance_count)
instances_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.is_instance_active(instance_list[1])) self.assertTrue(instances_page.is_instance_active(instance_list[1]))
instances_page = self.instances_page instances_page = self.instances_page
@ -164,12 +170,14 @@ class TestInstances(helpers.TestCase):
settings_page = self.home_pg.go_to_settings_usersettingspage() settings_page = self.home_pg.go_to_settings_usersettingspage()
settings_page.change_pagesize() settings_page.change_pagesize()
settings_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS))
instances_page = self.instances_page instances_page = self.instances_page
for instance_name in instance_list: for instance_name in instance_list:
instances_page.delete_instance(instance_name) instances_page.delete_instance(instance_name)
instances_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.is_instance_deleted(instance_name)) self.assertTrue(instances_page.is_instance_deleted(instance_name))
def test_filter_instances(self): def test_filter_instances(self):
@ -194,6 +202,8 @@ class TestInstances(helpers.TestCase):
instances_page = self.home_pg.go_to_compute_instancespage() instances_page = self.home_pg.go_to_compute_instancespage()
instances_page.create_instance(self.INSTANCE_NAME, instances_page.create_instance(self.INSTANCE_NAME,
instance_count=instance_count) instance_count=instance_count)
self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.is_instance_active(instance_list[0])) self.assertTrue(instances_page.is_instance_active(instance_list[0]))
instances_page = self.instances_page instances_page = self.instances_page
@ -215,7 +225,8 @@ class TestInstances(helpers.TestCase):
for instance in instance_list: for instance in instance_list:
instances_page.delete_instance(instance) instances_page.delete_instance(instance)
instances_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.is_instance_deleted(instance)) self.assertTrue(instances_page.is_instance_deleted(instance))