Home | History | Annotate | Download | only in login_ChromeProfileSanitary
      1 # Copyright (c) 2013 The Chromium OS 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 
      5 import errno, os, stat
      6 
      7 from autotest_lib.client.bin import test, utils
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.common_lib.cros import chrome
     10 from autotest_lib.client.cros import constants, httpd
     11 
     12 
     13 def _respond_with_cookies(handler, url_args):
     14     """set_cookie response.
     15 
     16     Responds with a Set-Cookie header to any GET request, and redirects to a
     17     chosen URL.
     18 
     19     @param handler: handler for set_cookie.
     20     @param url_args: arguments passed through the url.
     21 
     22     """
     23     handler.send_response(303)
     24     handler.send_header('Set-Cookie', 'name=value')
     25     handler.send_header('Location', url_args['continue'][0])
     26     handler.end_headers()
     27     handler.wfile.write('Got form data:\n')
     28     handler.wfile.write('%s:\n' % url_args)
     29 
     30 
     31 class login_ChromeProfileSanitary(test.test):
     32     """Tests that the browser uses the correct profile after a crash."""
     33     version = 1
     34 
     35 
     36     def __get_cookies_mtime(self):
     37         try:
     38             cookies_info = os.stat(constants.LOGIN_PROFILE + '/Cookies')
     39             return cookies_info[stat.ST_MTIME]
     40         except OSError as e:
     41             if e.errno == errno.ENOENT:
     42                 return None
     43             raise
     44 
     45 
     46     def initialize(self):
     47         spec = 'http://localhost:8000'
     48         path = '/set_cookie'
     49         self._wait_path = '/test_over'
     50         self._test_url = spec + path + '?continue=' + spec + self._wait_path
     51         self._testServer = httpd.HTTPListener(8000, docroot=self.srcdir)
     52         self._testServer.add_url_handler(path, _respond_with_cookies)
     53         self._testServer.run()
     54 
     55 
     56     def cleanup(self):
     57         self._testServer.stop()
     58 
     59 
     60     def run_once(self, timeout=10):
     61         with chrome.Chrome() as cr:
     62             # Get Default/Cookies mtime. None means no Cookies DB.
     63             cookies_mtime = self.__get_cookies_mtime()
     64 
     65             # Wait for chrome to show, then "crash" it.
     66             utils.nuke_process_by_name(constants.BROWSER, with_prejudice=True)
     67 
     68             cr.wait_for_browser_to_come_up()
     69 
     70             latch = self._testServer.add_wait_url(self._wait_path)
     71 
     72             # Navigate to site that leaves cookies.
     73             cr.browser.tabs[0].Navigate(self._test_url)
     74             latch.wait(timeout)
     75             if not latch.is_set():
     76                 raise error.TestError('Never received callback from browser.')
     77 
     78         # Ensure chrome writes state to disk.
     79         with chrome.Chrome():
     80             # Check mtime of Default/Cookies.  If changed, KABLOOEY.
     81             new_cookies_mtime = self.__get_cookies_mtime()
     82 
     83             if cookies_mtime != new_cookies_mtime:
     84                 if not cookies_mtime and new_cookies_mtime:
     85                     raise error.TestFail('Cookies created in Default profile!')
     86                 raise error.TestFail('Cookies in Default profile changed!')
     87