# Copyright 2014 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.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome


class desktopui_ConnectivityDiagnostics(test.test):
    """Basic confidence check of connectivity diagnostics in Chrome."""
    version = 1


    EXT_CODE = """
var complete = false;
var success = false;
var error = false;
// Send a message to the connectivity diagnostics app asking it to run tests.
chrome.runtime.sendMessage(
    "kodldpbjkkmmnilagfdheibampofhao",
    {
      command: "test"
    }, function(result) {
      complete = true;
      if (result instanceof Object) {
        success = result.success;
        error = result.error;
      } else {
        success = result;
        if (!success) {
          error = "Tests threw an exception";
        }
      }
      console.log(result);
    });
"""


    def run_once(self):
        with chrome.Chrome(disable_default_apps=False, autotest_ext=True) as cr:
            extension = cr.autotest_ext
            extension.EvaluateJavaScript(self.EXT_CODE)

            utils.poll_for_condition(
                    lambda: extension.EvaluateJavaScript('complete;'),
                    exception = error.TestError('Tests failed to complete'))

            if not extension.EvaluateJavaScript('success;'):
                raise error.TestFail(extension.EvaluateJavaScript('error;'))
