1# Copyright 2012 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import os
6import unittest
7
8from telemetry.page import page
9from telemetry.page import page_set
10
11
12class TestPage(unittest.TestCase):
13  def assertPathEqual(self, path1, path2):
14    self.assertEqual(os.path.normpath(path1), os.path.normpath(path2))
15
16  def testFilePathRelative(self):
17    apage = page.Page('file://somedir/otherdir/file.html',
18                      None, base_dir='basedir')
19    self.assertPathEqual(apage.file_path, 'basedir/somedir/otherdir/file.html')
20
21  def testFilePathAbsolute(self):
22    apage = page.Page('file:///somedir/otherdir/file.html',
23                      None, base_dir='basedir')
24    self.assertPathEqual(apage.file_path, '/somedir/otherdir/file.html')
25
26  def testFilePathQueryString(self):
27    apage = page.Page('file://somedir/otherdir/file.html?key=val',
28                      None, base_dir='basedir')
29    self.assertPathEqual(apage.file_path, 'basedir/somedir/otherdir/file.html')
30
31  def testFilePathUrlQueryString(self):
32    apage = page.Page('file://somedir/file.html?key=val',
33                      None, base_dir='basedir')
34    self.assertPathEqual(apage.file_path_url,
35                         'basedir/somedir/file.html?key=val')
36
37  def testFilePathUrlTrailingSeparator(self):
38    apage = page.Page('file://somedir/otherdir/',
39                      None, base_dir='basedir')
40    self.assertPathEqual(apage.file_path_url, 'basedir/somedir/otherdir/')
41    self.assertTrue(apage.file_path_url.endswith(os.sep) or
42                    (os.altsep and apage.file_path_url.endswith(os.altsep)))
43
44  def testSort(self):
45    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
46    ps.AddPageWithDefaultRunNavigate('http://www.foo.com/')
47    ps.AddPageWithDefaultRunNavigate('http://www.bar.com/')
48
49    pages = [ps.pages[0], ps.pages[1]]
50    pages.sort()
51    self.assertEquals([ps.pages[1], ps.pages[0]],
52                      pages)
53
54  def testGetUrlBaseDirAndFileForUrlBaseDir(self):
55    ps = page_set.PageSet(file_path='basedir/', serving_dirs=['../somedir/'])
56    ps.AddPageWithDefaultRunNavigate('file://../otherdir/file.html')
57    self.assertPathEqual(ps[0].file_path, 'otherdir/file.html')
58
59  def testDisplayUrlForHttp(self):
60    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
61    ps.AddPageWithDefaultRunNavigate('http://www.foo.com/')
62    ps.AddPageWithDefaultRunNavigate('http://www.bar.com/')
63
64    self.assertEquals(ps[0].display_name, 'http://www.foo.com/')
65    self.assertEquals(ps[1].display_name, 'http://www.bar.com/')
66
67  def testDisplayUrlForHttps(self):
68    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
69    ps.AddPageWithDefaultRunNavigate('http://www.foo.com/')
70    ps.AddPageWithDefaultRunNavigate('https://www.bar.com/')
71
72    self.assertEquals(ps[0].display_name, 'http://www.foo.com/')
73    self.assertEquals(ps[1].display_name, 'https://www.bar.com/')
74
75  def testDisplayUrlForFile(self):
76    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
77    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/foo.html')
78    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/bar.html')
79
80    self.assertEquals(ps[0].display_name, 'foo.html')
81    self.assertEquals(ps[1].display_name, 'bar.html')
82
83  def testDisplayUrlForFilesDifferingBySuffix(self):
84    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
85    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/foo.html')
86    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/foo1.html')
87
88    self.assertEquals(ps[0].display_name, 'foo.html')
89    self.assertEquals(ps[1].display_name, 'foo1.html')
90
91  def testDisplayUrlForFileOfDifferentPaths(self):
92    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
93    ps.AddPageWithDefaultRunNavigate('file://../../somedir/foo.html')
94    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/bar.html')
95
96    self.assertEquals(ps[0].display_name, 'somedir/foo.html')
97    self.assertEquals(ps[1].display_name, 'otherdir/bar.html')
98
99  def testDisplayUrlForFileDirectories(self):
100    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
101    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/foo')
102    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/bar')
103
104    self.assertEquals(ps[0].display_name, 'foo')
105    self.assertEquals(ps[1].display_name, 'bar')
106
107  def testDisplayUrlForSingleFile(self):
108    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
109    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/foo.html')
110
111    self.assertEquals(ps[0].display_name, 'foo.html')
112
113  def testDisplayUrlForSingleDirectory(self):
114    ps = page_set.PageSet(file_path=os.path.dirname(__file__))
115    ps.AddPageWithDefaultRunNavigate('file://../../otherdir/foo')
116
117    self.assertEquals(ps[0].display_name, 'foo')
118
119  def testPagesHaveDifferentIds(self):
120    p0 = page.Page("http://example.com")
121    p1 = page.Page("http://example.com")
122    self.assertNotEqual(p0.id, p1.id)
123
124  def testNamelessPageAsDict(self):
125    nameless_dict = page.Page('http://example.com/').AsDict()
126    self.assertIn('id', nameless_dict)
127    del nameless_dict['id']
128    self.assertEquals({
129          'url': 'http://example.com/',
130        }, nameless_dict)
131
132  def testNamedPageAsDict(self):
133    named_dict = page.Page('http://example.com/', name='Example').AsDict()
134    self.assertIn('id', named_dict)
135    del named_dict['id']
136    self.assertEquals({
137          'url': 'http://example.com/',
138          'name': 'Example'
139        }, named_dict)
140
141  def testTransferToPageSet(self):
142    page_set_a = page_set.PageSet()
143    page_set_b = page_set.PageSet()
144    page_foo = page.Page('http://foo.com', page_set_a)
145    page_bar = page.Page('http://bar.com', page_set_a)
146    page_baz = page.Page('http://baz.com', page_set_a)
147
148    page_set_a.AddPage(page_foo)
149    page_set_a.AddPage(page_bar)
150    page_set_a.AddPage(page_baz)
151
152    page_bar.TransferToPageSet(page_set_b)
153    self.assertEqual([page_foo, page_baz], page_set_a.pages)
154    self.assertEqual([page_bar], page_set_b.pages)
155    self.assertIs(page_set_b, page_bar.page_set)
156