1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_TEST_UTILS_H_ 6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_TEST_UTILS_H_ 7 8#include <string> 9 10#include "base/memory/ref_counted.h" 11#include "extensions/common/manifest.h" 12 13class Browser; 14class UIThreadExtensionFunction; 15 16namespace base { 17class Value; 18class DictionaryValue; 19class ListValue; 20} 21 22namespace extensions { 23class Extension; 24} 25 26// TODO(ckehoe): Accept args as scoped_ptr<base::Value>, 27// and migrate existing users to the new API. 28// This file is DEPRECATED. New tests should use the versions in 29// extensions/browser/api_test_utils.h. 30namespace extension_function_test_utils { 31 32// Parse JSON and return as the specified type, or NULL if the JSON is invalid 33// or not the specified type. 34base::Value* ParseJSON(const std::string& data); 35base::ListValue* ParseList(const std::string& data); 36base::DictionaryValue* ParseDictionary(const std::string& data); 37 38// Get |key| from |val| as the specified type. If |key| does not exist, or is 39// not of the specified type, adds a failure to the current test and returns 40// false, 0, empty string, etc. 41bool GetBoolean(base::DictionaryValue* val, const std::string& key); 42int GetInteger(base::DictionaryValue* val, const std::string& key); 43std::string GetString(base::DictionaryValue* val, const std::string& key); 44 45// If |val| is a dictionary, return it as one, otherwise NULL. 46base::DictionaryValue* ToDictionary(base::Value* val); 47 48// If |val| is a list, return it as one, otherwise NULL. 49base::ListValue* ToList(base::Value* val); 50 51// Creates an extension instance with a specified location that can be attached 52// to an ExtensionFunction before running. 53scoped_refptr<extensions::Extension> CreateEmptyExtensionWithLocation( 54 extensions::Manifest::Location location); 55 56scoped_refptr<extensions::Extension> CreateExtension( 57 extensions::Manifest::Location location, 58 base::DictionaryValue* test_extension_value, 59 const std::string& id_input); 60 61// Creates an extension instance with a specified extension value that can be 62// attached to an ExtensionFunction before running. 63scoped_refptr<extensions::Extension> CreateExtension( 64 base::DictionaryValue* test_extension_value); 65 66// Returns true if |val| contains privacy information, e.g. url, 67// title, and faviconUrl. 68bool HasPrivacySensitiveFields(base::DictionaryValue* val); 69 70enum RunFunctionFlags { 71 NONE = 0, 72 INCLUDE_INCOGNITO = 1 << 0 73}; 74 75// Run |function| with |args| and return the resulting error. Adds an error to 76// the current test if |function| returns a result. Takes ownership of 77// |function|. 78std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, 79 const std::string& args, 80 Browser* browser, 81 RunFunctionFlags flags); 82std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, 83 const std::string& args, 84 Browser* browser); 85 86// Run |function| with |args| and return the result. Adds an error to the 87// current test if |function| returns an error. Takes ownership of 88// |function|. The caller takes ownership of the result. 89base::Value* RunFunctionAndReturnSingleResult( 90 UIThreadExtensionFunction* function, 91 const std::string& args, 92 Browser* browser, 93 RunFunctionFlags flags); 94base::Value* RunFunctionAndReturnSingleResult( 95 UIThreadExtensionFunction* function, 96 const std::string& args, 97 Browser* browser); 98 99// Create and run |function| with |args|. Works with both synchronous and async 100// functions. Ownership of |function| remains with the caller. 101// 102// TODO(aa): It would be nice if |args| could be validated against the schema 103// that |function| expects. That way, we know that we are testing something 104// close to what the bindings would actually send. 105// 106// TODO(aa): I'm concerned that this style won't scale to all the bits and bobs 107// we're going to need to frob for all the different extension functions. But 108// we can refactor when we see what is needed. 109bool RunFunction(UIThreadExtensionFunction* function, 110 const std::string& args, 111 Browser* browser, 112 RunFunctionFlags flags); 113bool RunFunction(UIThreadExtensionFunction* function, 114 scoped_ptr<base::ListValue> args, 115 Browser* browser, 116 RunFunctionFlags flags); 117 118} // namespace extension_function_test_utils 119 120#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_FUNCTION_TEST_UTILS_H_ 121