1*6777b538SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/sequence_token.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker namespace base::internal {
10*6777b538SAndroid Build Coastguard Worker
TEST(SequenceTokenTest,IsValid)11*6777b538SAndroid Build Coastguard Worker TEST(SequenceTokenTest, IsValid) {
12*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SequenceToken().IsValid());
13*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SequenceToken::Create().IsValid());
14*6777b538SAndroid Build Coastguard Worker }
15*6777b538SAndroid Build Coastguard Worker
TEST(SequenceTokenTest,OperatorEquals)16*6777b538SAndroid Build Coastguard Worker TEST(SequenceTokenTest, OperatorEquals) {
17*6777b538SAndroid Build Coastguard Worker const SequenceToken invalid_a;
18*6777b538SAndroid Build Coastguard Worker const SequenceToken invalid_b;
19*6777b538SAndroid Build Coastguard Worker const SequenceToken valid_a = SequenceToken::Create();
20*6777b538SAndroid Build Coastguard Worker const SequenceToken valid_b = SequenceToken::Create();
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_a == invalid_a);
23*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_a == invalid_b);
24*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_a == valid_a);
25*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_a == valid_b);
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(valid_a == invalid_a);
28*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(valid_a == invalid_b);
29*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(valid_a, valid_a);
30*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(valid_a == valid_b);
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker
TEST(SequenceTokenTest,OperatorNotEquals)33*6777b538SAndroid Build Coastguard Worker TEST(SequenceTokenTest, OperatorNotEquals) {
34*6777b538SAndroid Build Coastguard Worker const SequenceToken invalid_a;
35*6777b538SAndroid Build Coastguard Worker const SequenceToken invalid_b;
36*6777b538SAndroid Build Coastguard Worker const SequenceToken valid_a = SequenceToken::Create();
37*6777b538SAndroid Build Coastguard Worker const SequenceToken valid_b = SequenceToken::Create();
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker EXPECT_NE(invalid_a, invalid_a);
40*6777b538SAndroid Build Coastguard Worker EXPECT_NE(invalid_a, invalid_b);
41*6777b538SAndroid Build Coastguard Worker EXPECT_NE(invalid_a, valid_a);
42*6777b538SAndroid Build Coastguard Worker EXPECT_NE(invalid_a, valid_b);
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker EXPECT_NE(valid_a, invalid_a);
45*6777b538SAndroid Build Coastguard Worker EXPECT_NE(valid_a, invalid_b);
46*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(valid_a != valid_a);
47*6777b538SAndroid Build Coastguard Worker EXPECT_NE(valid_a, valid_b);
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker
TEST(SequenceTokenTest,GetForCurrentThread)50*6777b538SAndroid Build Coastguard Worker TEST(SequenceTokenTest, GetForCurrentThread) {
51*6777b538SAndroid Build Coastguard Worker const SequenceToken token = SequenceToken::Create();
52*6777b538SAndroid Build Coastguard Worker
53*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SequenceToken::GetForCurrentThread().IsValid());
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker {
56*6777b538SAndroid Build Coastguard Worker TaskScope task_scope(token, /* is_thread_bound=*/false);
57*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SequenceToken::GetForCurrentThread().IsValid());
58*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(token, SequenceToken::GetForCurrentThread());
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SequenceToken::GetForCurrentThread().IsValid());
62*6777b538SAndroid Build Coastguard Worker }
63*6777b538SAndroid Build Coastguard Worker
TEST(SequenceTokenTest,ToInternalValue)64*6777b538SAndroid Build Coastguard Worker TEST(SequenceTokenTest, ToInternalValue) {
65*6777b538SAndroid Build Coastguard Worker const SequenceToken token1 = SequenceToken::Create();
66*6777b538SAndroid Build Coastguard Worker const SequenceToken token2 = SequenceToken::Create();
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker // Confirm that internal values are unique.
69*6777b538SAndroid Build Coastguard Worker EXPECT_NE(token1.ToInternalValue(), token2.ToInternalValue());
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker // Expect a default-constructed TaskToken to be invalid and not equal to
73*6777b538SAndroid Build Coastguard Worker // another invalid TaskToken.
TEST(TaskTokenTest,InvalidDefaultConstructed)74*6777b538SAndroid Build Coastguard Worker TEST(TaskTokenTest, InvalidDefaultConstructed) {
75*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TaskToken().IsValid());
76*6777b538SAndroid Build Coastguard Worker EXPECT_NE(TaskToken(), TaskToken());
77*6777b538SAndroid Build Coastguard Worker }
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker // Expect a TaskToken returned by TaskToken::GetForCurrentThread() outside the
80*6777b538SAndroid Build Coastguard Worker // scope of a TaskScope to be invalid.
TEST(TaskTokenTest,InvalidOutsideScope)81*6777b538SAndroid Build Coastguard Worker TEST(TaskTokenTest, InvalidOutsideScope) {
82*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TaskToken::GetForCurrentThread().IsValid());
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker // Expect an invalid TaskToken not to be equal with a valid TaskToken.
TEST(TaskTokenTest,ValidNotEqualsInvalid)86*6777b538SAndroid Build Coastguard Worker TEST(TaskTokenTest, ValidNotEqualsInvalid) {
87*6777b538SAndroid Build Coastguard Worker TaskScope task_scope(SequenceToken::Create(),
88*6777b538SAndroid Build Coastguard Worker /* is_thread_bound=*/false);
89*6777b538SAndroid Build Coastguard Worker TaskToken valid = TaskToken::GetForCurrentThread();
90*6777b538SAndroid Build Coastguard Worker TaskToken invalid;
91*6777b538SAndroid Build Coastguard Worker EXPECT_NE(valid, invalid);
92*6777b538SAndroid Build Coastguard Worker }
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker // Expect TaskTokens returned by TaskToken::GetForCurrentThread() in the scope
95*6777b538SAndroid Build Coastguard Worker // of the same TaskScope instance to be
96*6777b538SAndroid Build Coastguard Worker // valid and equal with each other.
TEST(TaskTokenTest,EqualInSameScope)97*6777b538SAndroid Build Coastguard Worker TEST(TaskTokenTest, EqualInSameScope) {
98*6777b538SAndroid Build Coastguard Worker TaskScope task_scope(SequenceToken::Create(),
99*6777b538SAndroid Build Coastguard Worker /* is_thread_bound=*/false);
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker const TaskToken token_a = TaskToken::GetForCurrentThread();
102*6777b538SAndroid Build Coastguard Worker const TaskToken token_b = TaskToken::GetForCurrentThread();
103*6777b538SAndroid Build Coastguard Worker
104*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(token_a.IsValid());
105*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(token_b.IsValid());
106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(token_a, token_b);
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker // Expect TaskTokens returned by TaskToken::GetForCurrentThread() in the scope
110*6777b538SAndroid Build Coastguard Worker // of different TaskScope instances to be
111*6777b538SAndroid Build Coastguard Worker // valid but not equal to each other.
TEST(TaskTokenTest,NotEqualInDifferentScopes)112*6777b538SAndroid Build Coastguard Worker TEST(TaskTokenTest, NotEqualInDifferentScopes) {
113*6777b538SAndroid Build Coastguard Worker TaskToken token_a;
114*6777b538SAndroid Build Coastguard Worker TaskToken token_b;
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker {
117*6777b538SAndroid Build Coastguard Worker TaskScope task_scope(SequenceToken::Create(),
118*6777b538SAndroid Build Coastguard Worker /* is_thread_bound=*/false);
119*6777b538SAndroid Build Coastguard Worker token_a = TaskToken::GetForCurrentThread();
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker {
122*6777b538SAndroid Build Coastguard Worker TaskScope task_scope(SequenceToken::Create(),
123*6777b538SAndroid Build Coastguard Worker /* is_thread_bound=*/false);
124*6777b538SAndroid Build Coastguard Worker token_b = TaskToken::GetForCurrentThread();
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(token_a.IsValid());
128*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(token_b.IsValid());
129*6777b538SAndroid Build Coastguard Worker EXPECT_NE(token_a, token_b);
130*6777b538SAndroid Build Coastguard Worker }
131*6777b538SAndroid Build Coastguard Worker
TEST(TaskScopeTest,ThreadBound)132*6777b538SAndroid Build Coastguard Worker TEST(TaskScopeTest, ThreadBound) {
133*6777b538SAndroid Build Coastguard Worker // Code running outside of a `TaskScope` is thread-bound.
134*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CurrentTaskIsThreadBound());
135*6777b538SAndroid Build Coastguard Worker
136*6777b538SAndroid Build Coastguard Worker {
137*6777b538SAndroid Build Coastguard Worker TaskScope scope(SequenceToken::Create(), /* is_thread_bound=*/false);
138*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CurrentTaskIsThreadBound());
139*6777b538SAndroid Build Coastguard Worker {
140*6777b538SAndroid Build Coastguard Worker TaskScope inner_scope(SequenceToken::Create(), /* is_thread_bound=*/true);
141*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CurrentTaskIsThreadBound());
142*6777b538SAndroid Build Coastguard Worker }
143*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CurrentTaskIsThreadBound());
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CurrentTaskIsThreadBound());
147*6777b538SAndroid Build Coastguard Worker
148*6777b538SAndroid Build Coastguard Worker {
149*6777b538SAndroid Build Coastguard Worker TaskScope scope(SequenceToken::Create(), /* is_thread_bound=*/true);
150*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CurrentTaskIsThreadBound());
151*6777b538SAndroid Build Coastguard Worker {
152*6777b538SAndroid Build Coastguard Worker TaskScope inner_scope(SequenceToken::Create(),
153*6777b538SAndroid Build Coastguard Worker /* is_thread_bound=*/false);
154*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CurrentTaskIsThreadBound());
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CurrentTaskIsThreadBound());
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CurrentTaskIsThreadBound());
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker } // namespace base::internal
163