// 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