1/*
2 * Copyright (c) 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#include "gtest/gtest.h"
17#define private public
18#define protected public
19#include "VirtualScreenImpl.h"
20#include "CommandParser.h"
21
22namespace {
23    class VirtualScreenImplTest : public ::testing::Test {
24    public:
25        VirtualScreenImplTest() {}
26        ~VirtualScreenImplTest() {}
27    protected:
28        static void InitBuffer()
29        {
30            int retWidth = 100;
31            int retHeight = 100;
32            int jpgPix = 4;
33            int pixelSize = 4;
34            uint8_t defaultValue = 200;
35            jpgHeight = retHeight;
36            jpgWidth = retWidth;
37            jpgBufferSize = static_cast<long>(retWidth) * static_cast<long>(retHeight) * static_cast<long>(jpgPix);
38            jpgBuffer = new unsigned char[jpgBufferSize];
39            for (int i = 0; i < jpgBufferSize; i++) {
40                jpgBuffer[i] = defaultValue;
41            }
42        }
43
44        static void SetUpTestCase()
45        {
46            InitBuffer();
47            socket = std::make_unique<LocalSocket>();
48        }
49
50        static std::unique_ptr<LocalSocket> socket;
51        static unsigned long jpgBufferSize;
52        static unsigned char* jpgBuffer;
53        static int32_t jpgWidth;
54        static int32_t jpgHeight;
55    };
56
57    std::unique_ptr<LocalSocket> VirtualScreenImplTest::socket = nullptr;
58    unsigned char* VirtualScreenImplTest::jpgBuffer = nullptr;
59    unsigned long VirtualScreenImplTest::jpgBufferSize = 0;
60    int32_t VirtualScreenImplTest::jpgWidth = 0;
61    int32_t VirtualScreenImplTest::jpgHeight = 0;
62
63    TEST_F(VirtualScreenImplTest, IsRectValidTest)
64    {
65        int32_t width = 100;
66        int32_t height = 200;
67        VirtualScreenImpl::GetInstance().SetOrignalWidth(width);
68        VirtualScreenImpl::GetInstance().SetOrignalHeight(height);
69        int32_t x = -1;
70        int32_t y = 100;
71        EXPECT_FALSE(VirtualScreenImpl::GetInstance().IsRectValid(x, y, width, height));
72
73        x = 50;
74        y = -1;
75        EXPECT_FALSE(VirtualScreenImpl::GetInstance().IsRectValid(x, y, width, height));
76
77        x = 50;
78        y = 100;
79        width = 100;
80        height = 100;
81        EXPECT_FALSE(VirtualScreenImpl::GetInstance().IsRectValid(x, y, width, height));
82
83        width = 50;
84        height = 200;
85        EXPECT_FALSE(VirtualScreenImpl::GetInstance().IsRectValid(x, y, width, height));
86
87        width = 50;
88        height = 100;
89        EXPECT_TRUE(VirtualScreenImpl::GetInstance().IsRectValid(x, y, width, height));
90    }
91
92    TEST_F(VirtualScreenImplTest, GetScreenWidthTest)
93    {
94        int32_t width = 100;
95        VirtualScreenImpl::GetInstance().SetOrignalWidth(width);
96        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetScreenWidth(),
97            VirtualScreenImpl::GetInstance().GetOrignalWidth());
98    }
99
100    TEST_F(VirtualScreenImplTest, GetScreenHeightTest)
101    {
102        int32_t height = 200;
103        VirtualScreenImpl::GetInstance().SetOrignalHeight(height);
104        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetScreenHeight(),
105            VirtualScreenImpl::GetInstance().GetOrignalHeight());
106    }
107
108    TEST_F(VirtualScreenImplTest, InitAllTest)
109    {
110        CommandParser::GetInstance().deviceType = "liteWearable";
111        int32_t height = -1;
112        VirtualScreenImpl::GetInstance().SetOrignalWidth(jpgWidth);
113        VirtualScreenImpl::GetInstance().SetOrignalHeight(height);
114        VirtualScreenImpl::GetInstance().InitAll("aaa", "8888");
115        EXPECT_TRUE(VirtualScreenImpl::GetInstance().wholeBuffer == nullptr);
116        VirtualScreenImpl::GetInstance().SetOrignalHeight(jpgHeight);
117        VirtualScreenImpl::GetInstance().InitAll("aaa", "8888");
118        EXPECT_TRUE(VirtualScreenImpl::GetInstance().wholeBuffer != nullptr);
119        EXPECT_TRUE(VirtualScreenImpl::GetInstance().currentPos > 0);
120    }
121
122    TEST_F(VirtualScreenImplTest, GetFBBufferInfoTest)
123    {
124        OHOS::BufferInfo* info = VirtualScreenImpl::GetInstance().GetFBBufferInfo();
125        EXPECT_EQ(info->color, 0x44);
126    }
127
128    TEST_F(VirtualScreenImplTest, UpdateRegionTest)
129    {
130        int32_t width = 100;
131        int32_t height = 200;
132        VirtualScreenImpl::GetInstance().SetCompressionWidth(width);
133        VirtualScreenImpl::GetInstance().SetCompressionHeight(height);
134        int32_t x1 = 10;
135        int32_t y1 = 10;
136        int32_t x2 = 20;
137        int32_t y2 = 20;
138        VirtualScreenImpl::GetInstance().UpdateRegion(x1, y1, x2, y2);
139        int32_t expectVal = 26;
140        EXPECT_EQ(VirtualScreenImpl::GetInstance().regionWidth, expectVal);
141        EXPECT_EQ(VirtualScreenImpl::GetInstance().regionHeight, expectVal);
142    }
143
144    TEST_F(VirtualScreenImplTest, SendRegionBufferTest)
145    {
146        VirtualScreenImpl::GetInstance().SetCompressionWidth(jpgWidth);
147        VirtualScreenImpl::GetInstance().SetCompressionHeight(jpgHeight);
148
149        CommandParser::GetInstance().screenMode = CommandParser::ScreenMode::STATIC;
150        VirtualScreen::isOutOfSeconds = true;
151        VirtualScreenImpl::GetInstance().SendRegionBuffer();
152        EXPECT_TRUE(VirtualScreenImpl::GetInstance().jpgScreenBuffer == nullptr);
153        VirtualScreenImpl::GetInstance().FreeJpgMemory();
154        CommandParser::GetInstance().screenMode = CommandParser::ScreenMode::DYNAMIC;
155        VirtualScreen::isOutOfSeconds = false;
156        VirtualScreenImpl::GetInstance().SendRegionBuffer();
157        EXPECT_TRUE(VirtualScreenImpl::GetInstance().jpgScreenBuffer == nullptr);
158    }
159
160    TEST_F(VirtualScreenImplTest, FlushTest)
161    {
162        VirtualScreenImpl::GetInstance().SetCompressionWidth(jpgWidth);
163        VirtualScreenImpl::GetInstance().SetCompressionHeight(jpgHeight);
164        OHOS::Rect flushRect;
165
166        VirtualScreenImpl::GetInstance().isWebSocketConfiged = false;
167        VirtualScreenImpl::GetInstance().Flush(flushRect);
168        EXPECT_TRUE(VirtualScreenImpl::GetInstance().isChanged);
169
170        VirtualScreenImpl::GetInstance().isWebSocketConfiged = true;
171        CommandParser::GetInstance().isRegionRefresh = true;
172        VirtualScreenImpl::GetInstance().isFirstSend = false;
173        VirtualScreenImpl::GetInstance().Flush(flushRect);
174        EXPECT_FALSE(VirtualScreenImpl::GetInstance().isChanged);
175
176        CommandParser::GetInstance().isRegionRefresh = false;
177        VirtualScreenImpl::GetInstance().isFirstSend = false;
178        VirtualScreenImpl::GetInstance().Flush(flushRect);
179        EXPECT_FALSE(VirtualScreenImpl::GetInstance().isChanged);
180    }
181
182    TEST_F(VirtualScreenImplTest, CheckBufferSendTest)
183    {
184        VirtualScreenImpl::GetInstance().SetCompressionWidth(jpgWidth);
185        VirtualScreenImpl::GetInstance().SetCompressionHeight(jpgHeight);
186
187        VirtualScreenImpl::GetInstance().isChanged = false;
188        VirtualScreenImpl::GetInstance().CheckBufferSend();
189        EXPECT_FALSE(VirtualScreenImpl::GetInstance().isChanged);
190
191        VirtualScreenImpl::GetInstance().isChanged = true;
192        VirtualScreenImpl::GetInstance().isWebSocketConfiged = false;
193        VirtualScreenImpl::GetInstance().CheckBufferSend();
194        EXPECT_TRUE(VirtualScreenImpl::GetInstance().isChanged);
195
196        VirtualScreenImpl::GetInstance().isWebSocketConfiged = true;
197        CommandParser::GetInstance().isRegionRefresh = true;
198        VirtualScreenImpl::GetInstance().isFirstSend = false;
199        VirtualScreenImpl::GetInstance().CheckBufferSend();
200        EXPECT_FALSE(VirtualScreenImpl::GetInstance().isChanged);
201
202        CommandParser::GetInstance().isRegionRefresh = false;
203        VirtualScreenImpl::GetInstance().isFirstSend = false;
204        VirtualScreenImpl::GetInstance().CheckBufferSend();
205        EXPECT_FALSE(VirtualScreenImpl::GetInstance().isChanged);
206    }
207}