Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: chrome/test/functional/ntp.py

Issue 222873002: Remove pyauto tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: sync Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/test/functional/netflix.py ('k') | chrome/test/functional/omnibox.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 import copy
7 import os
8
9 import pyauto_functional # Must be imported before pyauto
10 import pyauto
11 import test_utils
12
13
14 class NTPTest(pyauto.PyUITest):
15 """Test of the NTP."""
16
17 # Default apps are registered in ProfileImpl::RegisterComponentExtensions().
18 _EXPECTED_DEFAULT_APPS = [
19 {u'title': u'Chrome Web Store'},
20 ]
21 if pyauto.PyUITest.IsChromeOS():
22 _EXPECTED_DEFAULT_APPS.append({u'title': u'Files'})
23 _EXPECTED_DEFAULT_APPS.append({u'title': u'Chrome'})
24 else:
25 _EXPECTED_DEFAULT_APPS.append({u'title': u'Cloud Print'})
26
27 # Default menu and thumbnail mode preferences are set in
28 # ShownSectionsHandler::RegisterUserPrefs.
29 if pyauto.PyUITest.IsChromeOS():
30 _EXPECTED_DEFAULT_THUMB_INFO = {
31 u'apps': True,
32 u'most_visited': False
33 }
34 _EXPECTED_DEFAULT_MENU_INFO = {
35 u'apps': False,
36 u'most_visited': True,
37 u'recently_closed': True
38 }
39 else:
40 _EXPECTED_DEFAULT_THUMB_INFO = {
41 u'apps': False,
42 u'most_visited': True
43 }
44 _EXPECTED_DEFAULT_MENU_INFO = {
45 u'apps': False,
46 u'most_visited': False,
47 u'recently_closed': False
48 }
49
50 def Debug(self):
51 """Test method for experimentation.
52
53 This method is not run automatically.
54 """
55 while True:
56 raw_input('Interact with the browser and hit <enter> to dump NTP info...')
57 print '*' * 20
58 self.pprint(self._GetNTPInfo())
59
60 def __init__(self, methodName='runTest'):
61 super(NTPTest, self).__init__(methodName)
62
63 # Create some dummy file urls we can use in the tests.
64 filenames = ['title1.html', 'title2.html']
65 titles = [u'', u'Title Of Awesomeness']
66 urls = map(lambda name: self.GetFileURLForDataPath(name), filenames)
67 self.PAGES = map(lambda url, title: {'url': url, 'title': title},
68 urls, titles)
69
70 def _NTPContainsThumbnail(self, check_thumbnail):
71 """Returns whether the NTP's Most Visited section contains the given
72 thumbnail."""
73 for thumbnail in self.GetNTPThumbnails():
74 if check_thumbnail['url'] == thumbnail['url']:
75 return True
76 return False
77
78 def testFreshProfile(self):
79 """Tests that the NTP with a fresh profile is correct"""
80 thumbnails = self.GetNTPThumbnails()
81 default_sites = self.GetNTPDefaultSites()
82 self.assertEqual(len(default_sites), len(thumbnails))
83 for thumbnail, default_site in zip(thumbnails, default_sites):
84 self.assertEqual(thumbnail['url'], default_site)
85 self.assertEqual(0, len(self.GetNTPRecentlyClosed()))
86
87 def testRemoveDefaultThumbnails(self):
88 """Tests that the default thumbnails can be removed"""
89 self.RemoveNTPDefaultThumbnails()
90 self.assertFalse(self.GetNTPThumbnails())
91 self.RestoreAllNTPThumbnails()
92 self.assertEqual(len(self.GetNTPDefaultSites()),
93 len(self.GetNTPThumbnails()))
94 self.RemoveNTPDefaultThumbnails()
95 self.assertFalse(self.GetNTPThumbnails())
96
97 def testOneMostVisitedSite(self):
98 """Tests that a site is added to the most visited sites"""
99 self.RemoveNTPDefaultThumbnails()
100 self.NavigateToURL(self.PAGES[1]['url'])
101 thumbnail = self.GetNTPThumbnails()[0]
102 self.assertEqual(self.PAGES[1]['url'], thumbnail['url'])
103 self.assertEqual(self.PAGES[1]['title'], thumbnail['title'])
104
105 def testRemoveThumbnail(self):
106 """Tests removing a thumbnail works"""
107 self.RemoveNTPDefaultThumbnails()
108 for page in self.PAGES:
109 self.AppendTab(pyauto.GURL(page['url']))
110
111 thumbnails = self.GetNTPThumbnails()
112 for thumbnail in thumbnails:
113 self.assertEquals(thumbnail, self.GetNTPThumbnails()[0])
114 self.RemoveNTPThumbnail(thumbnail)
115 self.assertFalse(self._NTPContainsThumbnail(thumbnail))
116 self.assertFalse(self.GetNTPThumbnails())
117
118 def testIncognitoNotAppearInMostVisited(self):
119 """Tests that visiting a page in incognito mode does cause it to appear in
120 the Most Visited section"""
121 self.RemoveNTPDefaultThumbnails()
122 self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
123 self.NavigateToURL(self.PAGES[0]['url'], 1, 0)
124 self.assertFalse(self.GetNTPThumbnails())
125
126 def testDifferentProfileNotAppearInMostVisited(self):
127 """Tests that visiting a page in one profile does not cause it to appear in
128 the Most Visited section of another."""
129 self.RemoveNTPDefaultThumbnails()
130 self.OpenNewBrowserWindowWithNewProfile()
131 self.NavigateToURL(self.PAGES[0]['url'], 1, 0)
132 self.assertFalse(self.GetNTPThumbnails())
133
134 def testThumbnailPersistence(self):
135 """Tests that thumbnails persist across Chrome restarts"""
136 self.RemoveNTPDefaultThumbnails()
137 for page in self.PAGES:
138 self.AppendTab(pyauto.GURL(page['url']))
139 thumbnails = self.GetNTPThumbnails()
140 self.RestartBrowser(clear_profile=False)
141 self.assertEqual(thumbnails, self.GetNTPThumbnails())
142
143 def testRestoreAllRemovedThumbnails(self):
144 """Tests restoring all removed thumbnails"""
145 for page in self.PAGES:
146 self.AppendTab(pyauto.GURL(page['url']))
147
148 thumbnails = self.GetNTPThumbnails()
149 for thumbnail in thumbnails:
150 self.RemoveNTPThumbnail(thumbnail)
151
152 self.RestoreAllNTPThumbnails()
153 self.assertEquals(thumbnails, self.GetNTPThumbnails())
154
155 def testThumbnailRanking(self):
156 """Tests that the thumbnails are ordered according to visit count"""
157 self.RemoveNTPDefaultThumbnails()
158 for page in self.PAGES:
159 self.AppendTab(pyauto.GURL(page['url']))
160 thumbnails = self.GetNTPThumbnails()
161 self.assertEqual(self.PAGES[0]['url'], self.GetNTPThumbnails()[0]['url'])
162 self.AppendTab(pyauto.GURL(self.PAGES[1]['url']))
163 self.assertEqual(self.PAGES[1]['url'], self.GetNTPThumbnails()[0]['url'])
164 self.AppendTab(pyauto.GURL(self.PAGES[0]['url']))
165 self.AppendTab(pyauto.GURL(self.PAGES[0]['url']))
166 self.assertEqual(self.PAGES[0]['url'], self.GetNTPThumbnails()[0]['url'])
167
168 def testThumbnailTitleChangeAfterPageTitleChange(self):
169 """Tests that once a page title changes, the thumbnail title changes too"""
170 self.RemoveNTPDefaultThumbnails()
171 self.NavigateToURL(self.PAGES[0]['url'])
172 self.assertEqual(self.PAGES[0]['title'],
173 self.GetNTPThumbnails()[0]['title'])
174 self.ExecuteJavascript('window.domAutomationController.send(' +
175 'document.title = "new title")')
176 self.assertEqual('new title', self.GetNTPThumbnails()[0]['title'])
177
178 def testCloseOneTab(self):
179 """Tests that closing a tab populates the recently closed list"""
180 self.RemoveNTPDefaultThumbnails()
181 self.AppendTab(pyauto.GURL(self.PAGES[1]['url']))
182 self.CloseTab(tab_index=1)
183 self.assertEqual(self.PAGES[1]['url'],
184 self.GetNTPRecentlyClosed()[0]['url'])
185 self.assertEqual(self.PAGES[1]['title'],
186 self.GetNTPRecentlyClosed()[0]['title'])
187
188 def testCloseOneWindow(self):
189 """Tests that closing a window populates the recently closed list"""
190 self.RemoveNTPDefaultThumbnails()
191 self.OpenNewBrowserWindow(True)
192 self.NavigateToURL(self.PAGES[0]['url'], 1, 0)
193 self.AppendTab(pyauto.GURL(self.PAGES[1]['url']), 1)
194 self.CloseBrowserWindow(1)
195 expected = [{ u'type': u'window',
196 u'tabs': [
197 { u'type': u'tab',
198 u'url': self.PAGES[0]['url'],
199 u'direction': u'ltr' },
200 { u'type': u'tab',
201 u'url': self.PAGES[1]['url']}]
202 }]
203 self.assertEquals(expected, test_utils.StripUnmatchedKeys(
204 self.GetNTPRecentlyClosed(), expected))
205
206 def testCloseMultipleTabs(self):
207 """Tests closing multiple tabs populates the Recently Closed section in
208 order"""
209 self.RemoveNTPDefaultThumbnails()
210 self.AppendTab(pyauto.GURL(self.PAGES[0]['url']))
211 self.AppendTab(pyauto.GURL(self.PAGES[1]['url']))
212 self.CloseTab(tab_index=2)
213 self.CloseTab(tab_index=1)
214 expected = [{ u'type': u'tab',
215 u'url': self.PAGES[0]['url']
216 },
217 { u'type': u'tab',
218 u'url': self.PAGES[1]['url']
219 }]
220 self.assertEquals(expected, test_utils.StripUnmatchedKeys(
221 self.GetNTPRecentlyClosed(), expected))
222
223 def testCloseWindowWithOneTab(self):
224 """Tests that closing a window with only one tab only shows up as a tab in
225 the Recently Closed section"""
226 self.RemoveNTPDefaultThumbnails()
227 self.OpenNewBrowserWindow(True)
228 self.NavigateToURL(self.PAGES[0]['url'], 1, 0)
229 self.CloseBrowserWindow(1)
230 expected = [{ u'type': u'tab',
231 u'url': self.PAGES[0]['url']
232 }]
233 self.assertEquals(expected, test_utils.StripUnmatchedKeys(
234 self.GetNTPRecentlyClosed(), expected))
235
236 def testCloseMultipleWindows(self):
237 """Tests closing multiple windows populates the Recently Closed list"""
238 self.RemoveNTPDefaultThumbnails()
239 self.OpenNewBrowserWindow(True)
240 self.NavigateToURL(self.PAGES[0]['url'], 1, 0)
241 self.AppendTab(pyauto.GURL(self.PAGES[1]['url']), 1)
242 self.OpenNewBrowserWindow(True)
243 self.NavigateToURL(self.PAGES[1]['url'], 2, 0)
244 self.AppendTab(pyauto.GURL(self.PAGES[0]['url']), 2)
245 self.CloseBrowserWindow(2)
246 self.CloseBrowserWindow(1)
247 expected = [{ u'type': u'window',
248 u'tabs': [
249 { u'type': u'tab',
250 u'url': self.PAGES[0]['url'],
251 u'direction': u'ltr' },
252 { u'type': u'tab',
253 u'url': self.PAGES[1]['url']}]
254 },
255 { u'type': u'window',
256 u'tabs': [
257 { u'type': u'tab',
258 u'url': self.PAGES[1]['url'],
259 u'direction': u'ltr' },
260 { u'type': u'tab',
261 u'url': self.PAGES[0]['url']}]
262 }]
263 self.assertEquals(expected, test_utils.StripUnmatchedKeys(
264 self.GetNTPRecentlyClosed(), expected))
265
266 def testRecentlyClosedIncognito(self):
267 """Tests that we don't record closure of Incognito tabs or windows"""
268 #self.RemoveNTPDefaultThumbnails()
269 self.RunCommand(pyauto.IDC_NEW_INCOGNITO_WINDOW)
270 self.NavigateToURL(self.PAGES[0]['url'], 1, 0)
271 self.AppendTab(pyauto.GURL(self.PAGES[0]['url']), 1)
272 self.AppendTab(pyauto.GURL(self.PAGES[1]['url']), 1)
273 self.CloseTab(windex=1)
274 self.assertFalse(self.GetNTPRecentlyClosed())
275 self.CloseBrowserWindow(1)
276 self.assertFalse(self.GetNTPRecentlyClosed())
277
278 def _VerifyAppInfo(self, actual_info, expected_info):
279 """Ensures that the actual app info contains the expected app info.
280
281 This method assumes that both the actual and expected information for each
282 app contains at least the 'title' attribute. Both sets of info are
283 considered to match if the actual info contains at least the specified
284 expected info (if the actual info contains additional values that are not
285 specified in the expected info, that's ok). This function will fail the
286 current test if both sets of info don't match.
287
288 Args:
289 actual_info: A list of dictionaries representing the information from
290 all apps that would currently be displayed on the NTP.
291 expected_info: A corrresponding list of dictionaries representing the
292 information that is expected.
293 """
294 # Ensure all app info dictionaries contain at least the 'title' attribute.
295 self.assertTrue(all(map(lambda app: 'title' in app, actual_info)) and
296 all(map(lambda app: 'title' in app, expected_info)),
297 msg='At least one app is missing the "title" attribute.')
298
299 # Sort both app lists by title to ensure they're in a known order.
300 actual_info = sorted(actual_info, key=lambda app: app['title'])
301 expected_info = sorted(expected_info, key=lambda app: app['title'])
302
303 # Ensure the expected info matches the actual info.
304 self.assertTrue(len(actual_info) == len(expected_info),
305 msg='Expected %d app(s) on NTP, but got %d instead.' % (
306 len(expected_info), len(actual_info)))
307 for i, expected_app in enumerate(expected_info):
308 for attribute in expected_app:
309 self.assertTrue(attribute in actual_info[i],
310 msg='Expected attribute "%s" not found in app info.' % (
311 attribute))
312 self.assertTrue(expected_app[attribute] == actual_info[i][attribute],
313 msg='For attribute "%s", expected value "%s", but got '
314 '"%s".' % (attribute, expected_app[attribute],
315 actual_info[i][attribute]))
316
317 def _InstallAndVerifySamplePackagedApp(self):
318 """Installs a sample packaged app and verifies the install is successful.
319
320 Returns:
321 The string ID of the installed app.
322 """
323 app_crx_file = os.path.abspath(os.path.join(
324 self.DataDir(), 'pyauto_private', 'apps', 'countdown.crx'))
325 return self.InstallExtension(app_crx_file)
326
327 def testGetAppsInNewProfile(self):
328 """Ensures that the only app in a new profile is the Web Store app."""
329 app_info = self.GetNTPApps()
330 self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS)
331
332 def testGetAppsWhenInstallApp(self):
333 """Ensures that an installed app is reflected in the app info in the NTP."""
334 self._InstallAndVerifySamplePackagedApp()
335 app_info = self.GetNTPApps()
336 expected_app_info = [
337 {
338 u'title': u'Countdown'
339 }
340 ]
341 expected_app_info.extend(self._EXPECTED_DEFAULT_APPS)
342 self._VerifyAppInfo(app_info, expected_app_info)
343
344 def testGetAppsWhenInstallNonApps(self):
345 """Ensures installed non-apps are not reflected in the NTP app info."""
346 # Install a regular extension and a theme.
347 ext_crx_file = os.path.abspath(os.path.join(self.DataDir(), 'extensions',
348 'page_action.crx'))
349 self.InstallExtension(ext_crx_file)
350 theme_crx_file = os.path.abspath(os.path.join(self.DataDir(), 'extensions',
351 'theme.crx'))
352 self.SetTheme(theme_crx_file)
353 # Verify that no apps are listed on the NTP except for the Web Store.
354 app_info = self.GetNTPApps()
355 self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS)
356
357 def testUninstallApp(self):
358 """Ensures that an uninstalled app is reflected in the NTP app info."""
359 # First, install an app and verify that it exists in the NTP app info.
360 installed_app_id = self._InstallAndVerifySamplePackagedApp()
361 app_info = self.GetNTPApps()
362 expected_app_info = [
363 {
364 u'title': u'Countdown'
365 }
366 ]
367 expected_app_info.extend(self._EXPECTED_DEFAULT_APPS)
368 self._VerifyAppInfo(app_info, expected_app_info)
369
370 # Next, uninstall the app and verify that it is removed from the NTP.
371 self.assertTrue(self.UninstallExtensionById(installed_app_id),
372 msg='Call to UninstallExtensionById() returned False.')
373 app_info = self.GetNTPApps()
374 self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS)
375
376 def testCannotUninstallWebStore(self):
377 """Ensures that the WebStore app cannot be uninstalled."""
378 # Verify that the WebStore app is already installed in a fresh profile.
379 app_info = self.GetNTPApps()
380 self._VerifyAppInfo(app_info, self._EXPECTED_DEFAULT_APPS)
381 self.assertTrue(app_info and 'id' in app_info[0],
382 msg='Cannot identify ID of WebStore app.')
383 webstore_id = app_info[0]['id']
384
385 # Attempt to uninstall the WebStore app and verify that it still exists
386 # in the App info of the NTP even after we try to uninstall it.
387 self.assertFalse(self.UninstallExtensionById(webstore_id),
388 msg='Call to UninstallExtensionById() returned True.')
389 self._VerifyAppInfo(self.GetNTPApps(), self._EXPECTED_DEFAULT_APPS)
390
391 def testLaunchAppWithDefaultSettings(self):
392 """Verifies that an app can be launched with the default settings."""
393 # Install an app.
394 installed_app_id = self._InstallAndVerifySamplePackagedApp()
395
396 # Launch the app from the NTP.
397 self.LaunchApp(installed_app_id)
398
399 # Verify that the second tab in the first window is the app launch URL.
400 # It should be the second tab, not the first, since the call to LaunchApp
401 # should have first opened the NTP in a new tab, and then launched the app
402 # from there.
403 info = self.GetBrowserInfo()
404 actual_tab_url = info['windows'][0]['tabs'][1]['url']
405 expected_app_url_start = 'chrome-extension://' + installed_app_id
406 self.assertTrue(actual_tab_url.startswith(expected_app_url_start),
407 msg='The app was not launched.')
408
409 def testLaunchAppRegularTab(self):
410 """Verifies that an app can be launched in a regular tab."""
411 installed_app_id = self._InstallAndVerifySamplePackagedApp()
412
413 self.SetAppLaunchType(installed_app_id, 'regular', windex=0)
414 self.LaunchApp(installed_app_id)
415
416 # Verify that the second tab in the first window is the app launch URL.
417 info = self.GetBrowserInfo()
418 actual_tab_url = info['windows'][0]['tabs'][1]['url']
419 expected_app_url_start = 'chrome-extension://' + installed_app_id
420 self.assertTrue(actual_tab_url.startswith(expected_app_url_start),
421 msg='The app was not launched in a regular tab.')
422
423 def testLaunchAppPinnedTab(self):
424 """Verifies that an app can be launched in a pinned tab."""
425 installed_app_id = self._InstallAndVerifySamplePackagedApp()
426
427 self.SetAppLaunchType(installed_app_id, 'pinned', windex=0)
428 self.LaunchApp(installed_app_id)
429
430 # Verify that the first tab in the first window is the app launch URL, and
431 # that it is a pinned tab.
432 info = self.GetBrowserInfo()
433 actual_tab_url = info['windows'][0]['tabs'][0]['url']
434 expected_app_url_start = 'chrome-extension://' + installed_app_id
435 self.assertTrue(actual_tab_url.startswith(expected_app_url_start) and
436 info['windows'][0]['tabs'][0]['pinned'],
437 msg='The app was not launched in a pinned tab.')
438
439 def testLaunchAppFullScreen(self):
440 """Verifies that an app can be launched in fullscreen mode."""
441 installed_app_id = self._InstallAndVerifySamplePackagedApp()
442
443 self.SetAppLaunchType(installed_app_id, 'fullscreen', windex=0)
444 self.LaunchApp(installed_app_id)
445
446 # Verify that the second tab in the first window is the app launch URL, and
447 # that the window is fullscreen.
448 info = self.GetBrowserInfo()
449 actual_tab_url = info['windows'][0]['tabs'][1]['url']
450 expected_app_url_start = 'chrome-extension://' + installed_app_id
451 self.assertTrue(actual_tab_url.startswith(expected_app_url_start) and
452 info['windows'][0]['fullscreen'],
453 msg='The app was not launched in fullscreen mode.')
454
455 def testLaunchAppNewWindow(self):
456 """Verifies that an app can be launched in a new window."""
457 installed_app_id = self._InstallAndVerifySamplePackagedApp()
458
459 self.SetAppLaunchType(installed_app_id, 'window', windex=0)
460 self.LaunchApp(installed_app_id)
461
462 # Verify that a second window exists (at index 1), and that its first tab
463 # is the app launch URL.
464 info = self.GetBrowserInfo()
465 self.assertTrue(len(info['windows']) == 2,
466 msg='A second window does not exist.')
467 actual_tab_url = info['windows'][1]['tabs'][0]['url']
468 expected_app_url_start = 'chrome-extension://' + installed_app_id
469 self.assertTrue(actual_tab_url.startswith(expected_app_url_start),
470 msg='The app was not launched in the new window.')
471
472 if __name__ == '__main__':
473 pyauto_functional.Main()
OLDNEW
« no previous file with comments | « chrome/test/functional/netflix.py ('k') | chrome/test/functional/omnibox.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698