blob: b474710fb1edc16a13bd771aade13cb949aeb862 [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 NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H
#define NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_stdint.h"
// NOTE: if you use you TestableCallback you will need to enable
// testing interfaces in PPAPIBrowserTester(), e.g.
// "--enable-pepper-testing", c.f.
// tests/ppapi_browser/ppb_graphics2d/nacl.scons
//
// Example Usage:
//
// void TestProgressSimple() {
// TestableCallback callback(pp_instance(), true);
// ...
// rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
// EXPECT(rv == PP_OK_COMPLETIONPENDING);
// rv = callback.WaitForResult();
// EXPECT(rv == PP_OK);
// ...
// }
class TestableCallback {
public:
TestableCallback(PP_Instance instance, bool force_async);
// Get the callback to be passed to an asynchronous PPAPI call
PP_CompletionCallback GetCallback();
// Waits for the callback to be called and returns the
// result. Returns immediately if the callback was previously called
// and the result wasn't returned (i.e. each result value received
// by the callback is returned by WaitForResult() once and only
// once).
int32_t WaitForResult();
bool HasRun() const { return run_count_ != 0; }
// Make instance runnable again.
void Reset() {
run_count_ = 0;
have_result_ = false;
}
int32_t Result() const { return result_; }
private:
static void Handler(void* user_data, int32_t result);
bool have_result_; // is a result available?
int32_t result_; // value of the result
bool force_async_; // force callback to be always called
bool post_quit_task_; // has cleanup beem performed
unsigned run_count_; // number of times the callback has been called
PP_Instance instance_;
};
#endif // NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H