xref: /aosp_15_r20/external/cronet/base/state_transitions_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 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/state_transitions.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <ostream>
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
11*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker enum class State { kState1 = 0, kState2, kState3, kState4 };
18*6777b538SAndroid Build Coastguard Worker 
operator <<(std::ostream & o,const State & s)19*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& o, const State& s) {
20*6777b538SAndroid Build Coastguard Worker   return o << static_cast<int>(s);
21*6777b538SAndroid Build Coastguard Worker }
22*6777b538SAndroid Build Coastguard Worker 
TEST(StateTransitionsTest,Constructor)23*6777b538SAndroid Build Coastguard Worker TEST(StateTransitionsTest, Constructor) {
24*6777b538SAndroid Build Coastguard Worker   // No expectations, just make sure the constructor works.
25*6777b538SAndroid Build Coastguard Worker   const StateTransitions<State> transitions({
26*6777b538SAndroid Build Coastguard Worker       {State::kState1, {State::kState2, State::kState3}},
27*6777b538SAndroid Build Coastguard Worker       {State::kState2, {State::kState3, State::kState4}},
28*6777b538SAndroid Build Coastguard Worker   });
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker 
TEST(StateTransitionsTest,GetValidTransitions)31*6777b538SAndroid Build Coastguard Worker TEST(StateTransitionsTest, GetValidTransitions) {
32*6777b538SAndroid Build Coastguard Worker   const StateTransitions<State> transitions({
33*6777b538SAndroid Build Coastguard Worker       {State::kState1, {State::kState2, State::kState3}},
34*6777b538SAndroid Build Coastguard Worker       {State::kState2, {State::kState3, State::kState4}},
35*6777b538SAndroid Build Coastguard Worker   });
36*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(transitions.GetValidTransitions(State::kState1),
37*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(State::kState2, State::kState3));
38*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(transitions.GetValidTransitions(State::kState2),
39*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre(State::kState3, State::kState4));
40*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(transitions.GetValidTransitions(State::kState3),
41*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre());
42*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(transitions.GetValidTransitions(State::kState4),
43*6777b538SAndroid Build Coastguard Worker               testing::ElementsAre());
44*6777b538SAndroid Build Coastguard Worker }
45*6777b538SAndroid Build Coastguard Worker 
TEST(StateTransitionsTest,IsTransitionValid)46*6777b538SAndroid Build Coastguard Worker TEST(StateTransitionsTest, IsTransitionValid) {
47*6777b538SAndroid Build Coastguard Worker   const StateTransitions<State> transitions({
48*6777b538SAndroid Build Coastguard Worker       {State::kState1, {State::kState2, State::kState3}},
49*6777b538SAndroid Build Coastguard Worker       {State::kState2, {State::kState3, State::kState4}},
50*6777b538SAndroid Build Coastguard Worker   });
51*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(transitions.IsTransitionValid(State::kState1, State::kState2));
52*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(transitions.IsTransitionValid(State::kState2, State::kState3));
53*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(transitions.IsTransitionValid(State::kState1, State::kState4));
54*6777b538SAndroid Build Coastguard Worker   // kState3 was omitted from the definition.
55*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(transitions.IsTransitionValid(State::kState3, State::kState4));
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker 
TEST(StateTransitionsTest,DCHECK_STATE_TRANSITION)58*6777b538SAndroid Build Coastguard Worker TEST(StateTransitionsTest, DCHECK_STATE_TRANSITION) {
59*6777b538SAndroid Build Coastguard Worker   const StateTransitions<State> transitions({
60*6777b538SAndroid Build Coastguard Worker       {State::kState1, {State::kState2, State::kState3}},
61*6777b538SAndroid Build Coastguard Worker       {State::kState2, {State::kState3, State::kState4}},
62*6777b538SAndroid Build Coastguard Worker   });
63*6777b538SAndroid Build Coastguard Worker   DCHECK_STATE_TRANSITION(&transitions, State::kState1, State::kState2);
64*6777b538SAndroid Build Coastguard Worker   DCHECK_STATE_TRANSITION(&transitions, State::kState2, State::kState3);
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
67*6777b538SAndroid Build Coastguard Worker   // EXPECT_DEATH is not defined on IOS.
68*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_IOS)
69*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH(
70*6777b538SAndroid Build Coastguard Worker       DCHECK_STATE_TRANSITION(&transitions, State::kState1, State::kState4),
71*6777b538SAndroid Build Coastguard Worker       "Check failed.*Invalid transition: 0 -> 3");
72*6777b538SAndroid Build Coastguard Worker   // kState3 was omitted from the definition.
73*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH(
74*6777b538SAndroid Build Coastguard Worker       DCHECK_STATE_TRANSITION(&transitions, State::kState3, State::kState4),
75*6777b538SAndroid Build Coastguard Worker       "Check failed.*Invalid transition: 2 -> 3");
76*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_IOS)
77*6777b538SAndroid Build Coastguard Worker #endif  // DCHECK_IS_ON()
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker // Test that everything works OK with some other data type.
TEST(StateTransitionsTest,NonEnum)81*6777b538SAndroid Build Coastguard Worker TEST(StateTransitionsTest, NonEnum) {
82*6777b538SAndroid Build Coastguard Worker   const StateTransitions<std::string> transitions({
83*6777b538SAndroid Build Coastguard Worker       {"state1", {"state2", "state3"}},
84*6777b538SAndroid Build Coastguard Worker       {"state2", {"state3", "state4"}},
85*6777b538SAndroid Build Coastguard Worker   });
86*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(transitions.IsTransitionValid("state1", "state2"));
87*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(transitions.IsTransitionValid("state2", "state3"));
88*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(transitions.IsTransitionValid("state1", "state4"));
89*6777b538SAndroid Build Coastguard Worker   // kState3 was omitted from the definition.
90*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(transitions.IsTransitionValid("state3", "state4"));
91*6777b538SAndroid Build Coastguard Worker   DCHECK_STATE_TRANSITION(&transitions, "state1", "state2");
92*6777b538SAndroid Build Coastguard Worker   DCHECK_STATE_TRANSITION(&transitions, "state2", "state3");
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   // Try some states that are not in the specification at all.
95*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(transitions.IsTransitionValid("foo", "state2"));
96*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(transitions.IsTransitionValid("state1", "foo"));
97*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(transitions.IsTransitionValid("foo", "bar"));
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker }  // namespace base
101