15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_TEST_BASE_V8_UNIT_TEST_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_TEST_BASE_V8_UNIT_TEST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "v8/include/v8.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A superclass for unit tests that involve running JavaScript. This class 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sets up V8 context and has methods that make it easy to execute scripts in 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this context as well as call functions in the context. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class V8UnitTest : public testing::Test { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V8UnitTest(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~V8UnitTest(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods from testing::Test. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a custom helper JS library for your test. If |library_path| is 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relative, it'll be read as relative to the test data dir. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddLibrary(const base::FilePath& library_path); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs |test_fixture|.|test_name| using the framework in test_api.js. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RunJavascriptTestF(const std::string& test_fixture, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& test_name); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Executes the given |script_source| in the context. The specified 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |script_name| is used when reporting errors. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExecuteScriptInContext(const base::StringPiece& script_source, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& script_name); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the variable |var_name| to a string |value| in the global scope. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetGlobalStringVar(const std::string& var_name, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts the v8::TryCatch |try_catch| into a human readable string. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string ExceptionToString(const v8::TryCatch& try_catch); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls the specified |function_name| that resides in the global scope of the 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // context. If the function throws an exception, FAIL() is called to indicate 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a unit test failure. This is useful for executing unit test functions 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implemented in JavaScript. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TestFunction(const std::string& function_name); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is bound to a global function "log" in the context, as well as 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to log, warn, and info of the console object. Scripts running in the 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // context can call this with |args| to print out logging information to the 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // console. 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static void Log(const v8::FunctionCallbackInfo<v8::Value>& args); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is bound to console.error in the context. Any calls to this 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will log |args| to the console and also signal an error condition causing 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |RunJavascriptF| to fail. 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static void Error(const v8::FunctionCallbackInfo<v8::Value>& args); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is bound to a method "chrome.send" in the context. When 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test_api calls testDone with |args| to report its results, this will 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // capture and hold the results for analysis by |RunJavascriptF|. 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static void ChromeSend(const v8::FunctionCallbackInfo<v8::Value>& args); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Executes all added javascript libraries. Returns true if no errors. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ExecuteJavascriptLibraries(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes paths and libraries. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitPathsAndLibraries(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle scope that is used throughout the life of this class. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::HandleScope handle_scope_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Context for the JavaScript in the test. 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Persistent<v8::Context> context_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User added libraries. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath> user_libraries_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_TEST_BASE_V8_UNIT_TEST_H_ 88