diff options
-rw-r--r-- | tools/telemetry/telemetry/page/page.py | 22 | ||||
-rw-r--r-- | tools/telemetry/telemetry/page/page_set_unittest.py | 22 | ||||
-rw-r--r-- | tools/telemetry/telemetry/page/page_unittest.py | 16 |
3 files changed, 59 insertions, 1 deletions
diff --git a/tools/telemetry/telemetry/page/page.py b/tools/telemetry/telemetry/page/page.py index bde3dfb..3af8196 100644 --- a/tools/telemetry/telemetry/page/page.py +++ b/tools/telemetry/telemetry/page/page.py @@ -15,7 +15,7 @@ class Page(object): self._url = url self._page_set = page_set # Default value of base_dir is the directory of the file that defines the - # class of this page instace. + # class of this page instance. if base_dir is None: base_dir = os.path.dirname(inspect.getfile(self.__class__)) self._base_dir = base_dir @@ -44,6 +44,26 @@ class Page(object): if startup_url_scheme == 'file': raise ValueError('startup_url with local file scheme is not supported') + def TransferToPageSet(self, another_page_set): + """ Transfer this page to another page set. + Args: + another_page_set: an instance of telemetry.page.PageSet to transfer this + page to. + Note: + This method removes this page instance from the pages list of its current + page_set, so one should be careful not to iterate through the list of + pages of a page_set and calling this method. + For example, the below loop is erroneous: + for p in page_set_A.pages: + p.TransferToPageSet(page_set_B.pages) + """ + assert self._page_set + if another_page_set is self._page_set: + return + self._page_set.pages.remove(self) + self._page_set = another_page_set + self._page_set.AddPage(self) + def RunNavigateSteps(self, action_runner): action_runner.NavigateToPage(self) diff --git a/tools/telemetry/telemetry/page/page_set_unittest.py b/tools/telemetry/telemetry/page/page_set_unittest.py index 75afb5b..799b010 100644 --- a/tools/telemetry/telemetry/page/page_set_unittest.py +++ b/tools/telemetry/telemetry/page/page_set_unittest.py @@ -7,6 +7,7 @@ import tempfile import unittest from telemetry.core import util +from telemetry.page import page from telemetry.page import page_set from telemetry.util import cloud_storage @@ -98,3 +99,24 @@ class TestPageSet(unittest.TestCase): self.assertEqual(internal_ps.bucket, expected_bucket) self.assertRaises(ValueError, page_set.PageSet, bucket='garbage_bucket') + + def testFormingPageSetFromSubPageSet(self): + page_set_a = page_set.PageSet() + pages = [ + page.Page('http://foo.com', page_set_a), + page.Page('http://bar.com', page_set_a), + ] + for p in pages: + page_set_a.AddPage(p) + + # Form page_set_b from sub page_set_a. + page_set_b = page_set.PageSet() + for p in pages: + p.TransferToPageSet(page_set_b) + page_set_b.AddPage(page.Page('http://baz.com', page_set_b)) + self.assertEqual(0, len(page_set_a.pages)) + self.assertEqual( + set(['http://foo.com', 'http://bar.com', 'http://baz.com']), + set(p.url for p in page_set_b.pages)) + for p in page_set_b.pages: + self.assertIs(page_set_b, p.page_set) diff --git a/tools/telemetry/telemetry/page/page_unittest.py b/tools/telemetry/telemetry/page/page_unittest.py index c60c59df..b392e55 100644 --- a/tools/telemetry/telemetry/page/page_unittest.py +++ b/tools/telemetry/telemetry/page/page_unittest.py @@ -137,3 +137,19 @@ class TestPage(unittest.TestCase): 'url': 'http://example.com/', 'name': 'Example' }, named_dict) + + def testTransferToPageSet(self): + page_set_a = page_set.PageSet() + page_set_b = page_set.PageSet() + page_foo = page.Page('http://foo.com', page_set_a) + page_bar = page.Page('http://bar.com', page_set_a) + page_baz = page.Page('http://baz.com', page_set_a) + + page_set_a.AddPage(page_foo) + page_set_a.AddPage(page_bar) + page_set_a.AddPage(page_baz) + + page_bar.TransferToPageSet(page_set_b) + self.assertEqual([page_foo, page_baz], page_set_a.pages) + self.assertEqual([page_bar], page_set_b.pages) + self.assertIs(page_set_b, page_bar.page_set) |