1// Copyright (c) 2011 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// Functions and constants for test registration and setup. 6// 7// NOTE: These must be implemented by the tester: 8// - SetupTests() 9// - SetupPluginInterfaces() 10// 11// Sample Usage: 12// 13// void MyCallback(void* user_data, int32_t result) { ... } 14// 15// void TestPPBFoo() { 16// // sync test case 17// PP_Resource my_resource = PPBFoo()->Create(kInvalidInstance); 18// EXPECT(my_resource == kInvalidResource); 19// 20// // async test case 21// PP_CompletionCallback testable_callback = 22// MakeTestableCompletionCallback("MyCallback", MyCallback, NULL); 23// int32_t pp_error = PPBFoo()->AsyncFunction(testable_callback); 24// EXPECT(pp_error == PP_OK_COMPLETIONPENDING); 25// 26// TEST_PASSED; 27// } 28// 29// void SetupTests() { 30// RegisterTest("TestPPBFoo", TestPPBFoo); 31// } 32// 33// const PPP_Bar ppp_bar_interface = { ... }; 34// 35// void SetupPluginInterface() { 36// RegisterPluginInterface(PPP_BAR_INTERFACE, &ppp_bar_interface); 37// } 38// 39 40#ifndef NATIVE_CLIENT_TESTS_PPAPI_TEST_PPB_TEMPLATE_TEST_INTERFACE_H 41#define NATIVE_CLIENT_TESTS_PPAPI_TEST_PPB_TEMPLATE_TEST_INTERFACE_H 42 43#include <stdio.h> 44#include <limits> 45 46#include <sstream> 47 48#include "native_client/src/include/nacl_string.h" 49 50#include "ppapi/c/pp_completion_callback.h" 51#include "ppapi/c/pp_instance.h" 52#include "ppapi/c/pp_module.h" 53#include "ppapi/c/pp_point.h" 54#include "ppapi/c/pp_resource.h" 55#include "ppapi/c/pp_var.h" 56#include "ppapi/c/ppb_image_data.h" 57 58struct PP_Rect; 59struct PP_Size; 60 61//////////////////////////////////////////////////////////////////////////////// 62// These must be implemented by the tester 63//////////////////////////////////////////////////////////////////////////////// 64 65// Use RegisterTest() to register each TestFunction. 66void SetupTests(); 67// Use RegisterPluginInterface() to register custom PPP_ interfaces other than 68// PPP_Instance that is required and provided by default. 69void SetupPluginInterfaces(); 70 71//////////////////////////////////////////////////////////////////////////////// 72// Test helpers 73//////////////////////////////////////////////////////////////////////////////// 74 75// Registers test_function, so it is callable from JS using 76// plugin.postMessage(test_name); 77typedef void (*TestFunction)(); 78void RegisterTest(nacl::string test_name, TestFunction test_function); 79 80// Registers ppp_interface, so it is returned by PPP_GetInterface(). 81void RegisterPluginInterface(const char* interface_name, 82 const void* ppp_interface); 83 84// Helper for creating user callbacks whose invocation will be reported to JS. 85// Callback setting allows for synchronous completion to make it easier to 86// test error conditions. 87// WARNING: Do not reuse this callback if the operation that took it as an arg 88// returned PP_OK_COMPLETIONPENDING. The wrapper allocates data on creation 89// and then deallocates it when the callback is invoked. 90PP_CompletionCallback MakeTestableCompletionCallback( 91 const char* callback_name, // will be postmessage'ed to JS 92 PP_CompletionCallback_Func func, 93 void* user_data); 94PP_CompletionCallback MakeTestableCompletionCallback( 95 const char* callback_name, // will be postmessage'ed to JS 96 PP_CompletionCallback_Func func); 97 98// Uses PPB_Messaging interface to post "test_name:message". 99void PostTestMessage(nacl::string test_name, nacl::string message); 100 101// Make a STRING var. 102PP_Var PP_MakeString(const char* s); 103 104// Convert var into printable string (for debuggin) 105nacl::string StringifyVar(const PP_Var& var); 106 107// Use to verify the result of a test and report failures. 108#define EXPECT(expr) do { \ 109 if (!(expr)) { \ 110 char error[1024]; \ 111 snprintf(error, sizeof(error), \ 112 "ERROR at %s:%d: %s\n", __FILE__, __LINE__, #expr); \ 113 fprintf(stderr, "%s", error); \ 114 PostTestMessage(__FUNCTION__, error); \ 115 } \ 116} while (0) 117 118// Check expected value of INT32 var. 119#define EXPECT_VAR_INT(var, val) \ 120 EXPECT(var.type == PP_VARTYPE_INT32 && var.value.as_int == val) 121 122// Check expected value of STRING var (val is 'char*') 123#define EXPECT_VAR_STRING(var, val) \ 124 do { \ 125 EXPECT(var.type == PP_VARTYPE_STRING); \ 126 uint32_t dummy_size; \ 127 const char* expected = PPBVar()->VarToUtf8(var, &dummy_size); \ 128 EXPECT(0 == strcmp(expected, val)); \ 129 } while (0) 130 131// Check expected value of BOOL var. 132#define EXPECT_VAR_BOOL(var, val) \ 133 EXPECT(var.type == PP_VARTYPE_BOOL && var.value.as_bool == val) 134 135// Use to report success. 136#define TEST_PASSED PostTestMessage(__FUNCTION__, "PASSED"); 137// Or failure. 138#define TEST_FAILED EXPECT(false) 139 140// Handy for use with LOG_TO_BROWSER() convert arbitrary objects into strings. 141template<typename T> nacl::string toString(T v) { 142 std::stringstream s; 143 s << v; 144 return s.str(); 145} 146 147// Log message for debugging or progress reporting purposes. 148// If you use this with nacltest.js::expectMessageSequence 149// it will not interfere with output used for correctness checking. 150#define LOG_TO_BROWSER(message) PostTestMessage("@", message) 151 152// Cause a crash in a way that is guaranteed not to get optimized out by LLVM. 153#define CRASH *(volatile int *) 0 = 0; 154 155// Use this constant for stress testing 156// (i.e. creating and using a large number of resources). 157const int kManyResources = 1000; 158 159//////////////////////////////////////////////////////////////////////////////// 160// PPAPI Helpers 161//////////////////////////////////////////////////////////////////////////////// 162 163const PP_Instance kInvalidInstance = 0; 164const PP_Module kInvalidModule = 0; 165const PP_Resource kInvalidResource = 0; 166 167// These should not exist. 168// Chrome uses the bottom 2 bits to differentiate between different id types. 169// 00 - module, 01 - instance, 10 - resource, 11 - var. 170const PP_Instance kNotAnInstance = 0xFFFFF0; 171const PP_Resource kNotAResource = 0xAAAAA0; 172 173const PP_Point kOrigin = PP_MakePoint(0, 0); 174 175// Interface pointers and ids corresponding to this plugin; 176// set at initialization/creation. 177PP_Instance pp_instance(); 178PP_Module pp_module(); 179 180// If you are providing your own version of PPP_Instance::DidCreate 181// call this function to ensure proper test set-up. 182PP_Bool DidCreateDefault(PP_Instance instance, 183 uint32_t argc, const char* argn[], const char* argv[]); 184// Other default implementations of the required PPP_Instance functions. 185void DidDestroyDefault(PP_Instance instance); 186void DidChangeViewDefault(PP_Instance instance, PP_Resource view); 187void DidChangeFocusDefault(PP_Instance instance, PP_Bool has_focus); 188PP_Bool HandleDocumentLoadDefault(PP_Instance instance, PP_Resource url_loader); 189 190 191bool IsSizeInRange(PP_Size size, PP_Size min_size, PP_Size max_size); 192bool IsSizeEqual(PP_Size size, PP_Size expected); 193bool IsRectEqual(PP_Rect position, PP_Rect expected); 194 195// TODO(polina, nfullagar): allow specification of non-premultipled colors 196// and provide alpha premultiplcation in FormatColor(). This will be required 197// when future PPAPI pixel formats are extended to include non-premultipled 198// or ignored alpha. 199 200struct ColorPremul { uint32_t A, R, G, B; }; // Use premultipled Alpha. 201const ColorPremul kSheerRed = { 0x88, 0x88, 0x00, 0x00 }; 202const ColorPremul kSheerBlue = { 0x88, 0x00, 0x00, 0x88 }; 203const ColorPremul kSheerGray = { 0x77, 0x55, 0x55, 0x55 }; 204const ColorPremul kOpaqueGreen = { 0xFF, 0x00, 0xFF, 0x00 }; 205const ColorPremul kOpaqueBlack = { 0xFF, 0x00, 0x00, 0x00 }; 206const ColorPremul kOpaqueWhite = { 0xFF, 0xFF, 0xFF, 0xFF }; 207const ColorPremul kOpaqueYellow = { 0xFF, 0xFF, 0xFF, 0x00 }; 208const int kBytesPerPixel = sizeof(uint32_t); // 4 bytes for BGRA or RGBA. 209 210// Assumes premultipled Alpha. 211uint32_t FormatColor(PP_ImageDataFormat format, ColorPremul color); 212 213// Creates image data resource and bitmap for a rectangular region of |size| 214// and |pixel_color|. 215PP_Resource CreateImageData(PP_Size size, ColorPremul pixel_color, void** bmp); 216 217 218// Checks if the image rect of |color| and |size| is on the screen at |origin|. 219bool IsImageRectOnScreen(PP_Resource graphics2d, 220 PP_Point origin, 221 PP_Size size, 222 ColorPremul color); 223 224#endif // NATIVE_CLIENT_TESTS_PPAPI_TEST_PPB_TEMPLATE_TEST_INTERFACE_H 225