15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#include "ppapi/tests/test_flash_message_loop.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_macros.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/core.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/flash_message_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(FlashMessageLoop);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestFlashMessageLoop::TestFlashMessageLoop(TestingInstance* instance)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestCase(instance),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message_loop_(NULL),
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      callback_factory_(this) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestFlashMessageLoop::~TestFlashMessageLoop() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_DCHECK(!message_loop_);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestFlashMessageLoop::RunTests(const std::string& filter) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(Basics, filter);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(RunWithoutQuit, filter);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashMessageLoop::TestBasics() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_ = new pp::flash::MessageLoop(instance_);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallback callback = callback_factory_.NewCallback(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestFlashMessageLoop::QuitMessageLoopTask);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Module::Get()->core()->CallOnMainThread(0, callback);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t result = message_loop_->Run();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(message_loop_);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete message_loop_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_ = NULL;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(PP_OK, result);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestFlashMessageLoop::TestRunWithoutQuit() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_ = new pp::flash::MessageLoop(instance_);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallback callback = callback_factory_.NewCallback(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &TestFlashMessageLoop::DestroyMessageLoopResourceTask);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Module::Get()->core()->CallOnMainThread(0, callback);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t result = message_loop_->Run();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_loop_) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete message_loop_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_ = NULL;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(false);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(PP_ERROR_ABORTED, result);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestFlashMessageLoop::QuitMessageLoopTask(int32_t unused) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_loop_)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_->Quit();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_NOTREACHED();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestFlashMessageLoop::DestroyMessageLoopResourceTask(int32_t unused) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_loop_) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete message_loop_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_ = NULL;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_NOTREACHED();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
80