15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_completion_callback.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_stdint.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: if you use you TestableCallback you will need to enable
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testing interfaces in PPAPIBrowserTester(), e.g.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "--enable-pepper-testing", c.f.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests/ppapi_browser/ppb_graphics2d/nacl.scons
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example Usage:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void TestProgressSimple() {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   TestableCallback callback(pp_instance(), true);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   ...
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   rv = PPBURLLoader()->Open(loader, request, callback.GetCallback());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   EXPECT(rv == PP_OK_COMPLETIONPENDING);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   rv = callback.WaitForResult();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   EXPECT(rv == PP_OK);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   ...
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestableCallback {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestableCallback(PP_Instance instance, bool force_async);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the callback to be passed to an asynchronous PPAPI call
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_CompletionCallback GetCallback();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for the callback to be called and returns the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result. Returns immediately if the callback was previously called
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the result wasn't returned (i.e. each result value received
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by the callback is returned by WaitForResult() once and only
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once).
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t WaitForResult();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasRun() const { return run_count_ != 0; }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make instance runnable again.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_count_ = 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    have_result_ = false;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t Result() const { return result_; }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Handler(void* user_data, int32_t result);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_result_;       // is a result available?
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t result_;         // value of the result
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool force_async_;       // force callback to be always called
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool post_quit_task_;    // has cleanup beem performed
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned run_count_;     // number of times the callback has been called
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Instance instance_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H
66