# 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.

from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import constants, cros_logging
from autotest_lib.client.cros import cros_ui_test, httpd


class desktopui_FlashSanityCheck(cros_ui_test.UITest):
    version = 3

    def initialize(self):
        self._test_url = 'http://localhost:8000/index.html'
        self._testServer = httpd.HTTPListener(8000, docroot=self.srcdir)
        self._testServer.run()
        super(desktopui_FlashSanityCheck, self).initialize()


    def run_once(self, time_to_wait=25):
        self._log_reader = cros_logging.LogReader()
        self._log_reader.set_start_by_current()

        # Ensure that the swf got pulled
        latch = self._testServer.add_wait_url('/Trivial.swf')
        self.pyauto.NavigateToURL(self._test_url)
        latch.wait(time_to_wait)

        child_processes = self.pyauto.GetBrowserInfo()['child_processes']
        flash_processes = [x for x in child_processes if
                           x['name'] == 'Shockwave Flash']
        if not flash_processes:
            raise error.TestFail('No flash process found.')

        # Any better pattern matching?
        msg = ' Received crash notification for ' + constants.BROWSER
        if self._log_reader.can_find(msg):
            raise error.TestFail('Browser crashed during test.')


    def cleanup(self):
        self._testServer.stop()
        super(desktopui_FlashSanityCheck, self).cleanup()
