12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/devtools_client.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/web_view_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeDevToolsClient : public DevToolsClient {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeDevToolsClient() : id_("fake-id"), status_(kOk) {}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeDevToolsClient() {}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_status(const Status& status) {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status_ = status;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_result(const base::DictionaryValue& result) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result_.Clear();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result_.MergeDictionary(&result);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from DevToolsClient:
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual const std::string& GetId() OVERRIDE {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return id_;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status ConnectIfNecessary() OVERRIDE {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Status(kOk);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status SendCommand(const std::string& method,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const base::DictionaryValue& params) OVERRIDE {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SendCommandAndGetResult(method, params, NULL);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status SendCommandAndGetResult(
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& method,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::DictionaryValue& params,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<base::DictionaryValue>* result) OVERRIDE {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (status_.IsError())
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return status_;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result->reset(result_.DeepCopy());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Status(kOk);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AddListener(DevToolsEventListener* listener) OVERRIDE {}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Status HandleEventsUntil(
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const ConditionalFunc& conditional_func,
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const base::TimeDelta& timeout) OVERRIDE {
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return Status(kOk);
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual Status HandleReceivedEvents() OVERRIDE {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Status(kOk);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string id_;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Status status_;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue result_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AssertEvalFails(const base::DictionaryValue& command_result) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> result;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_result(command_result);
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Status status = internal::EvaluateScript(
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &client, 0, std::string(), internal::ReturnByValue, &result);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kUnknownError, status.code());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(result);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScript, CommandError) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> result;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_status(Status(kUnknownError));
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Status status = internal::EvaluateScript(
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &client, 0, std::string(), internal::ReturnByValue, &result);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kUnknownError, status.code());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(result);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScript, MissingWasThrown) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AssertEvalFails(dict));
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScript, MissingResult) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", false);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AssertEvalFails(dict));
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScript, Throws) {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", true);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetString("result.type", "undefined");
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AssertEvalFails(dict));
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScript, Ok) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> result;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", false);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("result.key", 100);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_result(dict);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(internal::EvaluateScript(
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &client, 0, std::string(), internal::ReturnByValue, &result).IsOk());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result->HasKey("key"));
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScriptAndGetValue, MissingType) {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", false);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("result.value", 1);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_result(dict);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(internal::EvaluateScriptAndGetValue(
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &client, 0, std::string(), &result).IsError());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScriptAndGetValue, Undefined) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", false);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetString("result.type", "undefined");
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_result(dict);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Status status =
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      internal::EvaluateScriptAndGetValue(&client, 0, std::string(), &result);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kOk, status.code());
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result && result->IsType(base::Value::TYPE_NULL));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScriptAndGetValue, Ok) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", false);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetString("result.type", "integer");
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("result.value", 1);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_result(dict);
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Status status =
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      internal::EvaluateScriptAndGetValue(&client, 0, std::string(), &result);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kOk, status.code());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int value;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result && result->GetAsInteger(&value));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, value);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScriptAndGetObject, NoObject) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", false);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetString("result.type", "integer");
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_result(dict);
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool got_object;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string object_id;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(internal::EvaluateScriptAndGetObject(
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &client, 0, std::string(), &got_object, &object_id).IsOk());
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(got_object);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(object_id.empty());
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(EvaluateScriptAndGetObject, Ok) {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeDevToolsClient client;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetBoolean("wasThrown", false);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetString("result.objectId", "id");
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client.set_result(dict);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool got_object;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string object_id;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(internal::EvaluateScriptAndGetObject(
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &client, 0, std::string(), &got_object, &object_id).IsOk());
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(got_object);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_STREQ("id", object_id.c_str());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ParseCallFunctionResult, NotDict) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FundamentalValue value(1);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(kOk, internal::ParseCallFunctionResult(value, &result).code());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ParseCallFunctionResult, Ok) {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("status", 0);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("value", 1);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Status status = internal::ParseCallFunctionResult(dict, &result);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kOk, status.code());
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int value;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(result && result->GetAsInteger(&value));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, value);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ParseCallFunctionResult, ScriptError) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> result;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue dict;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("status", 1);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict.SetInteger("value", 1);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Status status = internal::ParseCallFunctionResult(dict, &result);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, status.code());
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(result);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
215