blob: 8f6b7b1d201825a76e021ca70eb971e8214ca52e [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PPAPI_TESTS_TESTING_INSTANCE_H_
#define PPAPI_TESTS_TESTING_INSTANCE_H_
#include <string>
#include "ppapi/cpp/completion_callback.h"
#if defined(__native_client__)
#include "ppapi/cpp/instance.h"
#else
#include "ppapi/cpp/private/instance_private.h"
#endif
class TestCase;
// How signaling works:
//
// We want to signal to the Chrome UI test harness
// (chrome/test/ui/ppapi_uitest.cc) that we're making progress and when we're
// done. The easiest thing in the UI test infrastructure is to wait for a
// cookie to become nonempty. We don't want to have a big wait for all tests in
// a TestCase since they can take a while and it might timeout. So we set a
// series of cookies with an incrementing number in the name.
//
// If the value of the cookie is "..." then that tells the test runner that
// the test is progressing. It then waits for the next numbered cookie until
// it either times out or the value is something other than "...". In this
// case, the value will be either "PASS" or "FAIL [optional message]"
// corresponding to the outcome of the entire test case. Timeout will be
// treated just like a failure of the entire test case and the test will be
// terminated.
//
// In trusted builds, we use InstancePrivate and allow tests that use
// synchronous scripting. NaCl does not support synchronous scripting.
class TestingInstance : public
#if defined(__native_client__)
pp::Instance {
#else
pp::InstancePrivate {
#endif
public:
explicit TestingInstance(PP_Instance instance);
virtual ~TestingInstance();
// pp::Instance override.
virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]);
virtual void DidChangeView(const pp::Rect& position, const pp::Rect& clip);
virtual bool HandleInputEvent(const pp::InputEvent& event);
#if !(defined __native_client__)
virtual pp::Var GetInstanceObject();
#endif
// Outputs the information from one test run, using the format
// <test_name> [PASS|FAIL <error_message>]
// If error_message is empty, we say the test passed and emit PASS. If
// error_message is nonempty, the test failed with that message as the error
// string.
//
// Intended usage:
// LogTest("Foo", FooTest());
//
// Where FooTest is defined as:
// std::string FooTest() {
// if (something_horrible_happened)
// return "Something horrible happened";
// return "";
// }
void LogTest(const std::string& test_name, const std::string& error_message);
// Appends an error message to the log.
void AppendError(const std::string& message);
// Passes the message_data through to the HandleMessage method on the
// TestClass object that's associated with this instance.
virtual void HandleMessage(const pp::Var& message_data);
const std::string& protocol() {
return protocol_;
}
private:
void ExecuteTests(int32_t unused);
// Creates a new TestCase for the give test name, or NULL if there is no such
// test. Ownership is passed to the caller. The given string is split by '_'.
// The test case name is the first part.
TestCase* CaseForTestName(const std::string& name);
// Returns the filter (second part) of the given string. If there is no '_',
// returns the empty string, which means 'run all tests for this test case'.
// E.g.:
// http://testserver/test_case.html?testcase=PostMessage
// Otherwise, the part of the testcase after '_' is returned, and the test
// whose name matches that string (if any) will be run:
// http://testserver/test_case.html?testcase=PostMessage_SendingData
// Runs 'PostMessage_SendingData.
std::string FilterForTestName(const std::string& name);
// Appends a list of available tests to the console in the document.
void LogAvailableTests();
// Appends the given error test to the console in the document.
void LogError(const std::string& text);
// Appends the given HTML string to the console in the document.
void LogHTML(const std::string& html);
void ReportProgress(const std::string& progress_value);
// Sets the given cookie in the current document.
void SetCookie(const std::string& name, const std::string& value);
pp::CompletionCallbackFactory<TestingInstance> callback_factory_;
// Owning pointer to the current test case. Valid after Init has been called.
TestCase* current_case_;
// A filter to use when running tests. This is passed to 'RunTests', which
// runs only tests whose name contains test_filter_ as a substring.
std::string test_filter_;
// The current step we're on starting at 0. This is incremented every time we
// report progress via a cookie. See comment above the class.
int progress_cookie_number_;
// Set once the tests are run so we know not to re-run when the view is sized.
bool executed_tests_;
// Collects all errors to send the the browser. Empty indicates no error yet.
std::string errors_;
// True if running in Native Client.
bool nacl_mode_;
// String representing the protocol. Used for detecting whether we're running
// with http.
std::string protocol_;
};
#endif // PPAPI_TESTS_TESTING_INSTANCE_H_