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
16namespace webrtc {
17
18const int kLogTrace = 0;
19
20class TestTraceCallback : public TraceCallback {
21 public:
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
36class ThreadTest : public ::testing::Test {
37 public:
38  ThreadTest() {
39    StartTrace();
40  }
41  ~ThreadTest() {
42    StopTrace();
43  }
44
45 private:
46  void StartTrace() {
47    if (kLogTrace) {
48      Trace::CreateTrace();
49      Trace::SetLevelFilter(webrtc::kTraceAll);
50      Trace::SetTraceCallback(&trace_);
51    }
52  }
53
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.
64bool NullRunFunction(void* /* obj */) {
65  return true;
66}
67
68TEST_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.
77bool SetFlagRunFunction(void* obj) {
78  bool* obj_as_bool = static_cast<bool*> (obj);
79  *obj_as_bool = true;
80  return true;
81}
82
83TEST_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