security_SandboxStatus.py revision 669393837af4367f7f655d0b5bbf70915a6e1152
17f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
27f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar# Use of this source code is governed by a BSD-style license that can be
37f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar# found in the LICENSE file.
47f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
5f6fcbb7405686dd0dc46884435a9ee3fa835f2abJorge Lucangeli Obesimport re
6132d1f71fbc53f15a50bb2e5b739614e05abf230Jorge Lucangeli Obes
7437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkarfrom autotest_lib.client.bin import test, utils
87f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkarfrom autotest_lib.client.common_lib import error
97f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkarfrom autotest_lib.client.common_lib.cros import chrome
107f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkarfrom telemetry.core import exceptions
117f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
1240f2187948887ad8e782fa4f28fba98b83f7818cAchuith Bhandarkarclass security_SandboxStatus(test.test):
137f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar    """Verify sandbox status."""
147f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar    version = 1
157f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
167f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
17437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar    def _EvaluateJavaScript(self, js):
18437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar        '''Evaluates js, returns None if an exception was thrown.'''
19437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar
20437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar        try:
21437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar            return self._tab.EvaluateJavaScript(js)
22437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar        except exceptions.EvaluateException:
23437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar            return None
24437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar
25669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou    def _CheckAdequatelySandboxed(self):
26669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou        '''Check that chrome:///sandbox shows "You are adequately sandboxed."'''
27669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou        sandbox_good_js = "document.getElementsByTagName('p')[0].textContent"
28669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou        sandbox_good = utils.poll_for_condition(
29669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou                lambda: self._EvaluateJavaScript(sandbox_good_js),
3039d873f13ddfefa607e3557b520514253a451d9dJorge Lucangeli Obes                exception=error.TestError(
31437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar                       'Failed to evaluate in chrome://sandbox "%s"'
32669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou                        % sandbox_good_js),
33437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar                timeout=30)
34669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou        if not re.match('You are adequately sandboxed.', sandbox_good):
35669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou            raise error.TestFail('Could not find "You\'re adequately '
36669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou                                 'sandboxed." in chrome://sandbox')
377f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
387f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar    def _CheckGPUCell(self, cell, content, error_msg):
397f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar        '''Checks the content of the cells in the GPU sandbox row.'''
407f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
417f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar        gpu_js = ("document.getElementsByTagName('table')"
427f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar                  "[1].rows[1].cells[%d].textContent" % cell)
437f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar        try:
44437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar            res = utils.poll_for_condition(
45437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar                    lambda: self._EvaluateJavaScript(gpu_js),
46437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar                    timeout=30)
47437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar        except utils.TimeoutError:
4839d873f13ddfefa607e3557b520514253a451d9dJorge Lucangeli Obes            raise error.TestError('Failed to evaluate in chrome://gpu "%s"'
4939d873f13ddfefa607e3557b520514253a451d9dJorge Lucangeli Obes                                  % gpu_js)
50132d1f71fbc53f15a50bb2e5b739614e05abf230Jorge Lucangeli Obes
517f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar        if res.find(content) == -1:
5239d873f13ddfefa607e3557b520514253a451d9dJorge Lucangeli Obes            raise error.TestFail(error_msg)
537f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
547f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar    def run_once(self):
55669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou        '''Open various sandbox-related pages and test that we are sandboxed.'''
5657c75076df269ecd843ad246c7deb4f360db8532Achuith Bhandarkar        with chrome.Chrome() as cr:
577f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar            self._tab = cr.browser.tabs[0]
587f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar            self._tab.Navigate('chrome://sandbox')
59669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou            self._CheckAdequatelySandboxed()
607f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
617f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar            self._tab.Navigate('chrome://gpu')
6239d873f13ddfefa607e3557b520514253a451d9dJorge Lucangeli Obes            self._CheckGPUCell(0, 'Sandboxed',
6339d873f13ddfefa607e3557b520514253a451d9dJorge Lucangeli Obes                               'Could not locate "Sandboxed" row in table')
6439d873f13ddfefa607e3557b520514253a451d9dJorge Lucangeli Obes            self._CheckGPUCell(1, 'true', 'GPU not sandboxed')
65