1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25 #include "config.h"
26
27 #include "cc/CCThread.h"
28
29 #include "cc/CCCompletionEvent.h"
30 #include "cc/CCMainThreadTask.h"
31 #include "cc/CCThreadTask.h"
32 #include <gtest/gtest.h>
33 #include <webkit/support/webkit_support.h>
34
35 using namespace WebCore;
36
37 namespace {
38
39 class PingPongUsingCondition {
40 public:
ping(CCCompletionEvent * completion)41 void ping(CCCompletionEvent* completion)
42 {
43 hitThreadID = currentThread();
44 completion->signal();
45 }
46
47 ThreadIdentifier hitThreadID;
48 };
49
50
TEST(CCThreadTest,pingPongUsingCondition)51 TEST(CCThreadTest, pingPongUsingCondition)
52 {
53 OwnPtr<CCThread> thread = CCThread::create();
54 PingPongUsingCondition target;
55 CCCompletionEvent completion;
56 thread->postTask(createCCThreadTask(&target, &PingPongUsingCondition::ping, &completion));
57 completion.wait();
58
59 EXPECT_EQ(thread->threadID(), target.hitThreadID);
60 }
61
62 class PingPongTestUsingTasks {
63 public:
ping()64 void ping()
65 {
66 CCMainThread::postTask(createMainThreadTask(this, &PingPongTestUsingTasks::pong));
67 hit = true;
68 }
69
pong()70 void pong()
71 {
72 EXPECT_TRUE(isMainThread());
73 webkit_support::QuitMessageLoop();
74 }
75
76 bool hit;
77 };
78
TEST(CCThreadTest,startPostAndWaitOnCondition)79 TEST(CCThreadTest, startPostAndWaitOnCondition)
80 {
81 OwnPtr<CCThread> thread = CCThread::create();
82
83 PingPongTestUsingTasks target;
84 thread->postTask(createCCThreadTask(&target, &PingPongTestUsingTasks::ping));
85 webkit_support::RunMessageLoop();
86
87 EXPECT_TRUE(target.hit);
88 }
89
90 } // namespace
91