1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "system_wrappers/interface/thread_wrapper.h"
12
13 #include "gtest/gtest.h"
14 #include "system_wrappers/interface/trace.h"
15
16 namespace webrtc {
17
18 const int kLogTrace = 0;
19
20 class TestTraceCallback : public TraceCallback {
21 public:
Print(const TraceLevel level,const char * traceString,const int length)22 virtual void Print(const TraceLevel level,
23 const char* traceString,
24 const int length) {
25 if (traceString) {
26 char* cmd_print = new char[length+1];
27 memcpy(cmd_print, traceString, length);
28 cmd_print[length] = '\0';
29 printf("%s\n", cmd_print);
30 fflush(stdout);
31 delete[] cmd_print;
32 }
33 }
34 };
35
36 class ThreadTest : public ::testing::Test {
37 public:
ThreadTest()38 ThreadTest() {
39 StartTrace();
40 }
~ThreadTest()41 ~ThreadTest() {
42 StopTrace();
43 }
44
45 private:
StartTrace()46 void StartTrace() {
47 if (kLogTrace) {
48 Trace::CreateTrace();
49 Trace::SetLevelFilter(webrtc::kTraceAll);
50 Trace::SetTraceCallback(&trace_);
51 }
52 }
53
StopTrace()54 void StopTrace() {
55 if (kLogTrace) {
56 Trace::ReturnTrace();
57 }
58 }
59
60 TestTraceCallback trace_;
61 };
62
63 // Function that does nothing, and reports success.
NullRunFunction(void *)64 bool NullRunFunction(void* /* obj */) {
65 return true;
66 }
67
TEST_F(ThreadTest,StartStop)68 TEST_F(ThreadTest, StartStop) {
69 ThreadWrapper* thread = ThreadWrapper::CreateThread(&NullRunFunction);
70 unsigned int id = 42;
71 ASSERT_TRUE(thread->Start(id));
72 EXPECT_TRUE(thread->Stop());
73 delete thread;
74 }
75
76 // Function that sets a boolean.
SetFlagRunFunction(void * obj)77 bool SetFlagRunFunction(void* obj) {
78 bool* obj_as_bool = static_cast<bool*> (obj);
79 *obj_as_bool = true;
80 return true;
81 }
82
TEST_F(ThreadTest,RunFunctionIsCalled)83 TEST_F(ThreadTest, RunFunctionIsCalled) {
84 bool flag = false;
85 ThreadWrapper* thread = ThreadWrapper::CreateThread(&SetFlagRunFunction,
86 &flag);
87 unsigned int id = 42;
88 ASSERT_TRUE(thread->Start(id));
89 // At this point, the flag may be either true or false.
90 EXPECT_TRUE(thread->Stop());
91 // We expect the thread to have run at least once.
92 EXPECT_TRUE(flag);
93 delete thread;
94 }
95
96 } // namespace webrtc
97