diff options
author | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-30 16:39:55 +0000 |
---|---|---|
committer | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-30 16:39:55 +0000 |
commit | fab5194cdc3d57b1aa253e8f18ea64ba141e9616 (patch) | |
tree | bc08f2b88a1b966408f031767d22c6ca503d3144 /ppapi/tests/test_post_message.cc | |
parent | 42f5c7ef330e266261387a0c49560b500f2f7e40 (diff) | |
download | chromium_src-fab5194cdc3d57b1aa253e8f18ea64ba141e9616.zip chromium_src-fab5194cdc3d57b1aa253e8f18ea64ba141e9616.tar.gz chromium_src-fab5194cdc3d57b1aa253e8f18ea64ba141e9616.tar.bz2 |
Add means for running some tests only o-o-p. Add messaging non-main thread test.
BUG=92909
TEST=included
Review URL: http://codereview.chromium.org/7648033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98826 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/tests/test_post_message.cc')
-rw-r--r-- | ppapi/tests/test_post_message.cc | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/ppapi/tests/test_post_message.cc b/ppapi/tests/test_post_message.cc index 10bc7a0..f19a3b1 100644 --- a/ppapi/tests/test_post_message.cc +++ b/ppapi/tests/test_post_message.cc @@ -11,6 +11,7 @@ #include "ppapi/cpp/dev/scriptable_object_deprecated.h" #include "ppapi/cpp/instance.h" #include "ppapi/cpp/var.h" +#include "ppapi/tests/pp_thread.h" #include "ppapi/tests/test_utils.h" #include "ppapi/tests/testing_instance.h" @@ -28,6 +29,25 @@ const bool kTestBool = true; const int32_t kTestInt = 42; const double kTestDouble = 42.0; const int32_t kThreadsToRun = 10; +const int32_t kMessagesToSendPerThread = 50; + +// The struct that invoke_post_message_thread_func expects for its argument. +// It includes the instance on which to invoke PostMessage, and the value to +// pass to PostMessage. +struct InvokePostMessageThreadArg { + InvokePostMessageThreadArg(pp::Instance* i, const pp::Var& v) + : instance(i), value_to_send(v) {} + pp::Instance* instance; + pp::Var value_to_send; +}; + +void InvokePostMessageThreadFunc(void* user_data) { + InvokePostMessageThreadArg* arg = + static_cast<InvokePostMessageThreadArg*>(user_data); + for (int32_t i = 0; i < kMessagesToSendPerThread; ++i) + arg->instance->PostMessage(arg->value_to_send); + delete arg; +} } // namespace @@ -40,6 +60,8 @@ void TestPostMessage::RunTest() { RUN_TEST(MessageEvent); RUN_TEST(NoHandler); RUN_TEST(ExtraParam); + if (testing_interface_->IsOutOfProcess()) + RUN_TEST(NonMainThread); } void TestPostMessage::HandleMessage(const pp::Var& message_data) { @@ -254,3 +276,63 @@ std::string TestPostMessage::TestExtraParam() { PASS(); } +std::string TestPostMessage::TestNonMainThread() { + ASSERT_TRUE(ClearListeners()); + ASSERT_TRUE(AddEchoingListener("message_event.data")); + message_data_.clear(); + + // Set up a thread for each integer from 0 to (kThreadsToRun - 1). Make each + // thread send the number that matches its index kMessagesToSendPerThread + // times. For good measure, call postMessage from the main thread + // kMessagesToSendPerThread times. At the end, we make sure we got all the + // values we expected. + PP_ThreadType threads[kThreadsToRun]; + for (int32_t i = 0; i < kThreadsToRun; ++i) { + // Set up a thread to send a value of i. + void* arg = new InvokePostMessageThreadArg(instance_, pp::Var(i)); + PP_CreateThread(&threads[i], &InvokePostMessageThreadFunc, arg); + } + // Invoke PostMessage right now to send a value of (kThreadsToRun). + for (int32_t i = 0; i < kMessagesToSendPerThread; ++i) + instance_->PostMessage(pp::Var(kThreadsToRun)); + + // Now join all threads. + for (int32_t i = 0; i < kThreadsToRun; ++i) + PP_JoinThread(threads[i]); + + // PostMessage is asynchronous, so we should not receive a response yet. + ASSERT_EQ(message_data_.size(), 0); + + // Make sure we got all values that we expected. Note that because it's legal + // for the JavaScript engine to treat our integers as floating points, we + // can't just use std::find or equality comparison. So we instead, we convert + // each incoming value to an integer, and count them in received_counts. + int32_t expected_num = (kThreadsToRun + 1) * kMessagesToSendPerThread; + // Count how many we receive per-index. + std::vector<int32_t> expected_counts(kThreadsToRun + 1, + kMessagesToSendPerThread); + std::vector<int32_t> received_counts(kThreadsToRun + 1, 0); + for (int32_t i = 0; i < expected_num; ++i) { + // Run the message loop to get the next expected message. + testing_interface_->RunMessageLoop(instance_->pp_instance()); + // Make sure we got another message in. + ASSERT_EQ(message_data_.size(), 1); + pp::Var latest_var(message_data_.back()); + message_data_.clear(); + + ASSERT_TRUE(latest_var.is_int() || latest_var.is_double()); + int32_t received_value = -1; + if (latest_var.is_int()) { + received_value = latest_var.AsInt(); + } else if (latest_var.is_double()) { + received_value = static_cast<int32_t>(latest_var.AsDouble() + 0.5); + } + ASSERT_TRUE(received_value >= 0); + ASSERT_TRUE(received_value <= kThreadsToRun); + ++received_counts[received_value]; + } + ASSERT_EQ(received_counts, expected_counts); + + PASS(); +} + |