# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import os

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.cros import cros_logging


class logging_AsanCrash(test.test):
    """Verify Address Sanitizer does catch memory errors."""

    version = 1


    def run_once(self):
        if not 'asan' in utils.read_file('/etc/ui_use_flags.txt'):
            raise error.TestFail('Current image not built with ASAN')

        extension_path = os.path.join(os.path.dirname(__file__),
                                      'asan_crash_ext')

        with chrome.Chrome(extension_paths=[extension_path]) as cr:
            pid = utils.get_oldest_pid_by_name('chrome')
            asan_log_name = '/var/log/chrome/asan_log.%d' % pid
            logging.info('Browser PID under telemetry control is %d. '
                         'So ASAN log is expected at %s.', pid, asan_log_name)

            logging.info('Initiate simulating memory bug to be caught by ASAN.')
            extension = cr.get_extension(extension_path)
            if not extension:
                raise error.TestFail('Failed to find extension %s'
                                     % extension_path)

            # Catch the exception raised when the browser crashes.
            cr.did_browser_crash(lambda: extension.ExecuteJavaScript(
                    'chrome.autotestPrivate.simulateAsanMemoryBug();'))

            utils.poll_for_condition(
                    lambda: os.path.isfile(asan_log_name),
                    timeout=10,
                    exception=error.TestFail(
                            'Found no asan log file %s during 10s'
                            % asan_log_name))
            ui_log = cros_logging.LogReader(asan_log_name)
            ui_log.read_all_logs()

            # We must wait some time until memory bug is simulated (happens
            # immediately after the return on the call) and caught by ASAN.
            try:
                utils.poll_for_condition(
                        lambda: ui_log.can_find('ERROR: AddressSanitizer'),
                        timeout=10,
                        exception=error.TestFail(
                                'Found no asan log message about '
                                'Address Sanitizer catch'))
                # An example error string is like this
                # 'testarray:228' <== Memory access at offset 52 overflows
                # this variable
                utils.poll_for_condition(
                        lambda: ui_log.can_find("'testarray"),
                        timeout=10,
                        exception=error.TestFail(
                                'ASAN caught bug but did not mention '
                                'the cause in the log'))

            except:
                logging.debug('ASAN log content: ' + ui_log.get_logs())
                raise

            # The cbuildbot logic will look for asan logs and process them.
            # Remove the simulated log file to avoid that.
            os.remove(asan_log_name)
