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