1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/thread_checker.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include <functional>
20*6dbdd20aSAndroid Build Coastguard Worker #include <memory>
21*6dbdd20aSAndroid Build Coastguard Worker #include <thread>
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
24*6dbdd20aSAndroid Build Coastguard Worker
25*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
26*6dbdd20aSAndroid Build Coastguard Worker namespace base {
27*6dbdd20aSAndroid Build Coastguard Worker namespace {
28*6dbdd20aSAndroid Build Coastguard Worker
RunOnThread(std::function<bool (void)> closure)29*6dbdd20aSAndroid Build Coastguard Worker bool RunOnThread(std::function<bool(void)> closure) {
30*6dbdd20aSAndroid Build Coastguard Worker bool res = false;
31*6dbdd20aSAndroid Build Coastguard Worker std::thread thread([&res, &closure] { res = closure(); });
32*6dbdd20aSAndroid Build Coastguard Worker thread.join();
33*6dbdd20aSAndroid Build Coastguard Worker return res;
34*6dbdd20aSAndroid Build Coastguard Worker }
35*6dbdd20aSAndroid Build Coastguard Worker
TEST(ThreadCheckerTest,Basic)36*6dbdd20aSAndroid Build Coastguard Worker TEST(ThreadCheckerTest, Basic) {
37*6dbdd20aSAndroid Build Coastguard Worker ThreadChecker thread_checker;
38*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(thread_checker.CalledOnValidThread());
39*6dbdd20aSAndroid Build Coastguard Worker bool res = RunOnThread(
40*6dbdd20aSAndroid Build Coastguard Worker [&thread_checker] { return thread_checker.CalledOnValidThread(); });
41*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(thread_checker.CalledOnValidThread());
42*6dbdd20aSAndroid Build Coastguard Worker ASSERT_FALSE(res);
43*6dbdd20aSAndroid Build Coastguard Worker }
44*6dbdd20aSAndroid Build Coastguard Worker
TEST(ThreadCheckerTest,Detach)45*6dbdd20aSAndroid Build Coastguard Worker TEST(ThreadCheckerTest, Detach) {
46*6dbdd20aSAndroid Build Coastguard Worker ThreadChecker thread_checker;
47*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(thread_checker.CalledOnValidThread());
48*6dbdd20aSAndroid Build Coastguard Worker thread_checker.DetachFromThread();
49*6dbdd20aSAndroid Build Coastguard Worker bool res = RunOnThread(
50*6dbdd20aSAndroid Build Coastguard Worker [&thread_checker] { return thread_checker.CalledOnValidThread(); });
51*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(res);
52*6dbdd20aSAndroid Build Coastguard Worker ASSERT_FALSE(thread_checker.CalledOnValidThread());
53*6dbdd20aSAndroid Build Coastguard Worker }
54*6dbdd20aSAndroid Build Coastguard Worker
TEST(ThreadCheckerTest,CopyConstructor)55*6dbdd20aSAndroid Build Coastguard Worker TEST(ThreadCheckerTest, CopyConstructor) {
56*6dbdd20aSAndroid Build Coastguard Worker ThreadChecker thread_checker;
57*6dbdd20aSAndroid Build Coastguard Worker ThreadChecker copied_thread_checker = thread_checker;
58*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(thread_checker.CalledOnValidThread());
59*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(copied_thread_checker.CalledOnValidThread());
60*6dbdd20aSAndroid Build Coastguard Worker bool res = RunOnThread([&copied_thread_checker] {
61*6dbdd20aSAndroid Build Coastguard Worker return copied_thread_checker.CalledOnValidThread();
62*6dbdd20aSAndroid Build Coastguard Worker });
63*6dbdd20aSAndroid Build Coastguard Worker ASSERT_FALSE(res);
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker copied_thread_checker.DetachFromThread();
66*6dbdd20aSAndroid Build Coastguard Worker res = RunOnThread([&thread_checker, &copied_thread_checker] {
67*6dbdd20aSAndroid Build Coastguard Worker return copied_thread_checker.CalledOnValidThread() &&
68*6dbdd20aSAndroid Build Coastguard Worker !thread_checker.CalledOnValidThread();
69*6dbdd20aSAndroid Build Coastguard Worker });
70*6dbdd20aSAndroid Build Coastguard Worker ASSERT_TRUE(res);
71*6dbdd20aSAndroid Build Coastguard Worker }
72*6dbdd20aSAndroid Build Coastguard Worker
73*6dbdd20aSAndroid Build Coastguard Worker } // namespace
74*6dbdd20aSAndroid Build Coastguard Worker } // namespace base
75*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
76