• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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