1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #define private public
17 #define protected public
18 
19 #include <gtest/gtest.h>
20 
21 #include "channel.h"
22 #include "fi_log.h"
23 
24 #undef LOG_TAG
25 #define LOG_TAG "ChannelTest"
26 
27 namespace OHOS {
28 namespace Msdp {
29 namespace DeviceStatus {
30 namespace {
31 constexpr size_t DEFAULT_WAIT_TIME { 10 };
32 }
33 using namespace testing::ext;
34 
35 class ChannelTest : public testing::Test {
36 public:
SetUpTestCase()37     static void SetUpTestCase() {}
TearDownTestCase()38     static void TearDownTestCase() {}
SetUp()39     void SetUp() {}
TearDown()40     void TearDown() {}
41 };
42 
43 /**
44  * @tc.name: ChannelTest001
45  * @tc.desc: test channel throuthput when sending speed is greater than receiving speed.
46  * @tc.type: FUNC
47  */
48 HWTEST_F(ChannelTest, ChannelTest001, TestSize.Level0)
49 {
50     CALL_TEST_DEBUG;
51     auto [sender, receiver] = Channel<size_t>::OpenChannel();
52     constexpr size_t count = Channel<size_t>::QUEUE_CAPACITY;
53     receiver.Enable();
54 
__anonb4f9918d0202() 55     std::thread worker([sender = sender, count]() mutable {
56         for (size_t index = 0; index < count; ++index) {
57             EXPECT_EQ(sender.Send(index), Channel<size_t>::NO_ERROR);
58         }
59     });
60     for (size_t expected = 0; expected < count;) {
61         size_t received = receiver.Receive();
62         EXPECT_EQ(received, expected);
63         if ((++expected % 10) == 0) {
64             std::this_thread::sleep_for(std::chrono::milliseconds(DEFAULT_WAIT_TIME));
65         }
66     }
67     if (worker.joinable()) {
68         worker.join();
69     }
70 }
71 
72 /**
73  * @tc.name: ChannelTest002
74  * @tc.desc: test channel throuthput when sending speed is less than receiving speed.
75  * @tc.type: FUNC
76  */
77 HWTEST_F(ChannelTest, ChannelTest002, TestSize.Level0)
78 {
79     CALL_TEST_DEBUG;
80     auto [sender, receiver] = Channel<size_t>::OpenChannel();
81     constexpr size_t count = Channel<size_t>::QUEUE_CAPACITY;
82     receiver.Enable();
83 
__anonb4f9918d0302() 84     std::thread worker([sender = sender, count]() mutable {
85         for (size_t index = 0; index < count;) {
86             EXPECT_EQ(sender.Send(index), Channel<size_t>::NO_ERROR);
87             if ((++index % 10) == 0) {
88                 std::this_thread::sleep_for(std::chrono::milliseconds(DEFAULT_WAIT_TIME));
89             }
90         }
91     });
92     for (size_t expected = 0; expected < count; ++expected) {
93         size_t received = receiver.Receive();
94         ASSERT_EQ(received, expected);
95     }
96     if (worker.joinable()) {
97         worker.join();
98     }
99 }
100 
101 /**
102  * @tc.name: ChannelTest003
103  * @tc.desc: Disallow sending of events when channel is inactive.
104  * @tc.type: FUNC
105  */
106 HWTEST_F(ChannelTest, ChannelTest003, TestSize.Level0)
107 {
108     CALL_TEST_DEBUG;
109     auto [sender, receiver] = Channel<size_t>::OpenChannel();
110     const size_t data = 1;
111     EXPECT_EQ(sender.Send(data), Channel<size_t>::INACTIVE_CHANNEL);
112 }
113 
114 /**
115  * @tc.name: ChannelTest004
116  * @tc.desc: Disallow sending of events when queue is full.
117  * @tc.type: FUNC
118  */
119 HWTEST_F(ChannelTest, ChannelTest004, TestSize.Level0)
120 {
121     CALL_TEST_DEBUG;
122     auto [sender, receiver] = Channel<size_t>::OpenChannel();
123     size_t data = 1;
124     receiver.Enable();
125 
126     for (size_t index = 0; index < Channel<size_t>::QUEUE_CAPACITY; ++index) {
127         EXPECT_EQ(sender.Send(data++), Channel<size_t>::NO_ERROR);
128     };
129     EXPECT_EQ(sender.Send(data), Channel<size_t>::QUEUE_IS_FULL);
130 }
131 } // namespace DeviceStatus
132 } // namespace Msdp
133 } // namespace OHOS
134