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 <string>
17#include <vector>
18#include "gtest/gtest.h"
19#define private public
20#define protected public
21#include "VirtualScreenImpl.h"
22#include "MockGlobalResult.h"
23#include "CommandParser.h"
24#include "VirtualScreen.h"
25#include "CommandLineInterface.h"
26
27namespace {
28    class VirtualScreenImplTest : public ::testing::Test {
29    public:
30        VirtualScreenImplTest() {}
31        ~VirtualScreenImplTest() {}
32    protected:
33        static void InitBuffer()
34        {
35            int retHeight = 100;
36            int retWidth = 100;
37            int jpgPix = 4;
38            int pixelSize = 4;
39            uint8_t defaultVal = 200;
40            jpgWidth = retWidth;
41            jpgHeight = retHeight;
42            jpgBuffSize = static_cast<long>(retWidth) * static_cast<long>(retHeight) * static_cast<long>(jpgPix);
43            jpgBuff = new unsigned char[jpgBuffSize];
44            for (int i = 0; i < jpgBuffSize ; i++) {
45                jpgBuff[i] = defaultVal;
46            }
47        }
48
49        static void SetUpTestCase()
50        {
51            CommandLineInterface::GetInstance().InitPipe("phone");
52            socket = std::make_unique<LocalSocket>();
53        }
54
55        static std::unique_ptr<LocalSocket> socket;
56        static unsigned char* jpgBuff;
57        static unsigned long jpgBuffSize;
58        static int32_t jpgWidth;
59        static int32_t jpgHeight;
60    };
61
62    std::unique_ptr<LocalSocket> VirtualScreenImplTest::socket = nullptr;
63    unsigned char* VirtualScreenImplTest::jpgBuff = nullptr;
64    unsigned long VirtualScreenImplTest::jpgBuffSize = 0;
65    int32_t VirtualScreenImplTest::jpgWidth = 0;
66    int32_t VirtualScreenImplTest::jpgHeight = 0;
67
68    // 测试拷贝构造函数是否被删除
69    TEST_F(VirtualScreenImplTest, CopyConstructorDeletedTest)
70    {
71        EXPECT_TRUE(std::is_copy_constructible<VirtualScreenImpl>::value == false);
72    }
73
74    // 测试赋值运算符是否被删除
75    TEST_F(VirtualScreenImplTest, AssignmentOperatorDeletedTest)
76    {
77        EXPECT_TRUE(std::is_copy_assignable<VirtualScreenImpl>::value == false);
78    }
79
80    // VirtualScreen start
81    TEST_F(VirtualScreenImplTest, SetOrignalWidthTest)
82    {
83        int32_t width = 100;
84        VirtualScreenImpl::GetInstance().SetOrignalWidth(width);
85        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetOrignalWidth(), width);
86    }
87
88    TEST_F(VirtualScreenImplTest, SetCurrentRouterTest)
89    {
90        std::string router = "aaa";
91        VirtualScreenImpl::GetInstance().SetCurrentRouter(router);
92        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetCurrentRouter(), router);
93    }
94
95    TEST_F(VirtualScreenImplTest, SetAbilityCurrentRouterTest)
96    {
97        std::string router = "aaa";
98        VirtualScreenImpl::GetInstance().SetAbilityCurrentRouter(router);
99        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetAbilityCurrentRouter(), router);
100    }
101
102    TEST_F(VirtualScreenImplTest, SetOrignalHeightTest)
103    {
104        int32_t width = 100;
105        VirtualScreenImpl::GetInstance().SetOrignalHeight(width);
106        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetOrignalHeight(), width);
107    }
108
109    TEST_F(VirtualScreenImplTest, SetCompressionWidthTest)
110    {
111        int32_t width = 100;
112        VirtualScreenImpl::GetInstance().SetCompressionWidth(width);
113        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetCompressionWidth(), width);
114    }
115
116    TEST_F(VirtualScreenImplTest, SetCompressionHeightTest)
117    {
118        int32_t width = 100;
119        VirtualScreenImpl::GetInstance().SetCompressionHeight(width);
120        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetCompressionHeight(), width);
121    }
122
123    TEST_F(VirtualScreenImplTest, InitPipeTest)
124    {
125        std::string port = "8888";
126        g_run = false;
127        VirtualScreenImpl::GetInstance().InitPipe("aaa", port);
128        EXPECT_EQ(WebSocketServer::GetInstance().serverPort, atoi(port.c_str()));
129        EXPECT_TRUE(g_run);
130    }
131
132    TEST_F(VirtualScreenImplTest, InitVirtualScreenTest)
133    {
134        int width = 1111;
135        int height = 2222;
136        CommandParser::GetInstance().orignalResolutionWidth = width;
137        CommandParser::GetInstance().orignalResolutionHeight = height;
138        CommandParser::GetInstance().compressionResolutionWidth = width;
139        CommandParser::GetInstance().compressionResolutionHeight = height;
140        VirtualScreenImpl::GetInstance().InitVirtualScreen();
141        EXPECT_EQ(VirtualScreenImpl::GetInstance().orignalResolutionWidth, width);
142        EXPECT_EQ(VirtualScreenImpl::GetInstance().orignalResolutionHeight, height);
143        EXPECT_EQ(VirtualScreenImpl::GetInstance().compressionResolutionWidth, width);
144        EXPECT_EQ(VirtualScreenImpl::GetInstance().compressionResolutionHeight, height);
145    }
146
147    TEST_F(VirtualScreenImplTest, InitFrameCountTimerTest)
148    {
149        VirtualScreenImpl::GetInstance().inputMethodCountPerMinute = 0;
150        VirtualScreenImpl::GetInstance().InitFrameCountTimer();
151        EXPECT_FALSE(VirtualScreenImpl::GetInstance().frameCountTimer == nullptr);
152
153        VirtualScreenImpl::GetInstance().InitFrameCountTimer();
154        EXPECT_EQ(VirtualScreenImpl::GetInstance().inputMethodCountPerMinute, 0);
155    }
156
157    TEST_F(VirtualScreenImplTest, PrintFrameCountTest)
158    {
159        VirtualScreenImpl::GetInstance().inputMethodCountPerMinute = 0;
160        VirtualScreenImpl::GetInstance().PrintFrameCount();
161        EXPECT_EQ(VirtualScreenImpl::GetInstance().inputMethodCountPerMinute, 0);
162
163        VirtualScreenImpl::GetInstance().inputMethodCountPerMinute = 1;
164        VirtualScreenImpl::GetInstance().PrintFrameCount();
165        EXPECT_EQ(VirtualScreenImpl::GetInstance().inputMethodCountPerMinute, 0);
166    }
167
168    TEST_F(VirtualScreenImplTest, WidthAndHeightReverseTest)
169    {
170        int32_t width = 1080;
171        int32_t height = 2340;
172        VirtualScreenImpl::GetInstance().orignalResolutionHeight = height;
173        VirtualScreenImpl::GetInstance().orignalResolutionWidth = width;
174        VirtualScreenImpl::GetInstance().compressionResolutionHeight = height;
175        VirtualScreenImpl::GetInstance().compressionResolutionWidth = width;
176        VirtualScreenImpl::GetInstance().WidthAndHeightReverse();
177        EXPECT_EQ(VirtualScreenImpl::GetInstance().orignalResolutionHeight, width);
178        EXPECT_EQ(VirtualScreenImpl::GetInstance().orignalResolutionWidth, height);
179        EXPECT_EQ(VirtualScreenImpl::GetInstance().compressionResolutionHeight, width);
180        EXPECT_EQ(VirtualScreenImpl::GetInstance().compressionResolutionWidth, height);
181    }
182
183    TEST_F(VirtualScreenImplTest, SetVirtualScreenWidthAndHeightTest)
184    {
185        int32_t width = 1080;
186        int32_t height = 2340;
187        VirtualScreenImpl::GetInstance().orignalResolutionHeight = height;
188        VirtualScreenImpl::GetInstance().orignalResolutionWidth = width;
189        VirtualScreenImpl::GetInstance().compressionResolutionHeight = height;
190        VirtualScreenImpl::GetInstance().compressionResolutionWidth = width;
191        int32_t newWidth = 2000;
192        int32_t newHeight = 3000;
193        VirtualScreenImpl::GetInstance().SetVirtualScreenWidthAndHeight(newWidth, newHeight, newWidth, newHeight);
194        EXPECT_EQ(VirtualScreenImpl::GetInstance().orignalResolutionHeight, newHeight);
195        EXPECT_EQ(VirtualScreenImpl::GetInstance().orignalResolutionWidth, newWidth);
196        EXPECT_EQ(VirtualScreenImpl::GetInstance().compressionResolutionHeight, newHeight);
197        EXPECT_EQ(VirtualScreenImpl::GetInstance().compressionResolutionWidth, newWidth);
198    }
199
200    TEST_F(VirtualScreenImplTest, GetJpgQualityValueTest)
201    {
202        // <= 100000
203        int32_t width = 200;
204        int32_t height = 300;
205        int ret = VirtualScreenImpl::GetInstance().GetJpgQualityValue(width, height);
206        EXPECT_EQ(ret, 100); // 100 is jpeg quality
207        // <= 300000 && > 100000
208        width = 400;
209        height = 500;
210        ret = VirtualScreenImpl::GetInstance().GetJpgQualityValue(width, height);
211        EXPECT_EQ(ret, 90); // 90 is jpeg quality
212        width = 500;
213        height = 600;
214        ret = VirtualScreenImpl::GetInstance().GetJpgQualityValue(width, height);
215        EXPECT_EQ(ret, 90); // 90 is jpeg quality
216        // <= 500000 && > 300000
217        width = 600;
218        height = 700;
219        ret = VirtualScreenImpl::GetInstance().GetJpgQualityValue(width, height);
220        EXPECT_EQ(ret, 85); // 85 is jpeg quality
221        width = 500;
222        height = 1000;
223        ret = VirtualScreenImpl::GetInstance().GetJpgQualityValue(width, height);
224        EXPECT_EQ(ret, 85); // 85 is jpeg quality
225        // > 500000
226        width = 700;
227        height = 800;
228        ret = VirtualScreenImpl::GetInstance().GetJpgQualityValue(width, height);
229        EXPECT_EQ(ret, 75); // 75 is jpeg quality
230    }
231
232    TEST_F(VirtualScreenImplTest, SetLoadDocFlagTest)
233    {
234        VirtualScreenImpl::GetInstance().startLoadDoc = VirtualScreen::LoadDocType::INIT;
235        VirtualScreenImpl::GetInstance().SetLoadDocFlag(VirtualScreen::LoadDocType::FINISHED);
236        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetLoadDocFlag(), VirtualScreen::LoadDocType::FINISHED);
237    }
238
239    TEST_F(VirtualScreenImplTest, GetFastPreviewMsgTest)
240    {
241        VirtualScreenImpl::GetInstance().fastPreviewMsg = "";
242        VirtualScreenImpl::GetInstance().SetFastPreviewMsg("FastPreviewMsg");
243        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFastPreviewMsg(), "FastPreviewMsg");
244    }
245
246    TEST_F(VirtualScreenImplTest, JudgeAndDropFrameTest)
247    {
248        int frequency = 0; // 0 ms
249        VirtualScreenImpl::GetInstance().SetDropFrameFrequency(frequency);
250        EXPECT_EQ(VirtualScreenImpl::GetInstance().dropFrameFrequency, frequency);
251        EXPECT_FALSE(VirtualScreenImpl::GetInstance().JudgeAndDropFrame());
252
253        auto time1 = std::chrono::system_clock::now();
254        frequency = 1; // 1 ms
255        VirtualScreenImpl::GetInstance().SetDropFrameFrequency(frequency);
256        while (VirtualScreenImpl::GetInstance().JudgeAndDropFrame()) {
257            EXPECT_TRUE(VirtualScreenImpl::GetInstance().startDropFrameTime > time1);
258        }
259    }
260
261    TEST_F(VirtualScreenImplTest, JudgeStaticImageTest)
262    {
263        CommandParser::GetInstance().screenMode = CommandParser::ScreenMode::DYNAMIC;
264        EXPECT_TRUE(VirtualScreenImpl::GetInstance().JudgeStaticImage(1));
265
266        CommandParser::GetInstance().screenMode = CommandParser::ScreenMode::STATIC;
267        VirtualScreen::isOutOfSeconds = true;
268        EXPECT_FALSE(VirtualScreenImpl::GetInstance().JudgeStaticImage(1));
269
270        VirtualScreen::isOutOfSeconds = false;
271        VirtualScreen::isStartCount = true;
272        EXPECT_TRUE(VirtualScreenImpl::GetInstance().JudgeStaticImage(0));
273    }
274
275    TEST_F(VirtualScreenImplTest, StopSendStaticCardImageTest)
276    {
277        CommandParser::GetInstance().staticCard = false;
278        EXPECT_FALSE(VirtualScreenImpl::GetInstance().StopSendStaticCardImage(0));
279
280        CommandParser::GetInstance().staticCard = true;
281        EXPECT_TRUE(VirtualScreenImpl::GetInstance().StopSendStaticCardImage(-1));
282    }
283
284    TEST_F(VirtualScreenImplTest, RgbToJpgTest)
285    {
286        InitBuffer();
287        VirtualScreenImpl::GetInstance().jpgBufferSize = 0;
288        VirtualScreenImpl::GetInstance().RgbToJpg(jpgBuff, 3, 3);
289        EXPECT_TRUE(VirtualScreenImpl::GetInstance().jpgBufferSize > 0);
290        delete[] jpgBuff;
291        jpgBuff = nullptr;
292        if (VirtualScreenImpl::GetInstance().jpgScreenBuffer) {
293            free(VirtualScreenImpl::GetInstance().jpgScreenBuffer);
294            VirtualScreenImpl::GetInstance().jpgScreenBuffer = NULL;
295            VirtualScreenImpl::GetInstance().jpgBufferSize = 0;
296        }
297    }
298
299    TEST_F(VirtualScreenImplTest, SetFoldableTest)
300    {
301        VirtualScreenImpl::GetInstance().SetFoldable(true);
302        EXPECT_TRUE(VirtualScreenImpl::GetInstance().GetFoldable());
303
304        VirtualScreenImpl::GetInstance().SetFoldable(false);
305        EXPECT_FALSE(VirtualScreenImpl::GetInstance().GetFoldable());
306    }
307
308    TEST_F(VirtualScreenImplTest, SetFoldStatusTest)
309    {
310        VirtualScreenImpl::GetInstance().SetFoldStatus("fold");
311        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFoldStatus(), "fold");
312
313        VirtualScreenImpl::GetInstance().SetFoldStatus("unfold");
314        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFoldStatus(), "unfold");
315    }
316
317    TEST_F(VirtualScreenImplTest, SetFoldResolutionTest)
318    {
319        int32_t foldWidth = 300;
320        int32_t foldHeight = 400;
321        VirtualScreenImpl::GetInstance().SetFoldResolution(foldWidth, foldHeight);
322        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFoldWidth(), foldWidth);
323        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFoldHeight(), foldHeight);
324    }
325
326    TEST_F(VirtualScreenImplTest, SetCurrentResolutionTest)
327    {
328        int32_t foldWidth = 300;
329        int32_t foldHeight = 400;
330        VirtualScreenImpl::GetInstance().SetCurrentResolution(foldWidth, foldHeight);
331        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetCurrentWidth(), foldWidth);
332        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetCurrentHeight(), foldHeight);
333    }
334    // VirtualScreen end
335
336    TEST_F(VirtualScreenImplTest, InitFlushEmptyTimeTest)
337    {
338        VirtualScreenImpl::GetInstance().loadDocTimeStamp = 0;
339        VirtualScreenImpl::GetInstance().InitFlushEmptyTime();
340        EXPECT_TRUE(VirtualScreenImpl::GetInstance().loadDocTimeStamp > 0);
341    }
342
343    TEST_F(VirtualScreenImplTest, SendBufferOnTimerTest)
344    {
345        g_writeData = false;
346        VirtualScreenImpl::GetInstance().loadDocTempBuffer = nullptr;
347        VirtualScreenImpl::GetInstance().SendBufferOnTimer();
348
349        InitBuffer(); // jpgBuffer在loadDocTempBuffer释放时释放
350        VirtualScreenImpl::GetInstance().lengthTemp = jpgBuffSize;
351        VirtualScreenImpl::GetInstance().loadDocTempBuffer = jpgBuff;
352        VirtualScreenImpl::GetInstance().widthTemp = jpgWidth;
353        VirtualScreenImpl::GetInstance().heightTemp = jpgHeight;
354        VirtualScreenImpl::GetInstance().loadDocCopyBuffer = new unsigned char[0];
355        VirtualScreenImpl::GetInstance().SendBufferOnTimer();
356        EXPECT_TRUE(g_writeData);
357    }
358
359    TEST_F(VirtualScreenImplTest, CallbackTest)
360    {
361        CommandParser::GetInstance().staticCard = false;
362        VirtualScreenImpl::GetInstance().loadDocTimeStamp = 0;
363        CommandParser::GetInstance().screenMode = CommandParser::ScreenMode::DYNAMIC;
364        VirtualScreenImpl::GetInstance().SetLoadDocFlag(VirtualScreen::LoadDocType::INIT);
365        g_writeData = false;
366        InitBuffer();
367        int tm = 100;
368        VirtualScreenImpl::Callback(jpgBuff, jpgBuffSize, jpgWidth, jpgHeight, tm);
369        EXPECT_TRUE(g_writeData);
370        delete[] jpgBuff;
371        jpgBuff = nullptr;
372    }
373
374    TEST_F(VirtualScreenImplTest, FlushEmptyCallbackTest)
375    {
376        int tm = 100;
377        VirtualScreenImpl::GetInstance().loadDocTimeStamp = tm;
378        tm = 10;
379        VirtualScreenImpl::GetInstance().FlushEmptyCallback(tm);
380        EXPECT_NE(VirtualScreenImpl::GetInstance().flushEmptyTimeStamp, tm);
381        tm = 200;
382        VirtualScreenImpl::GetInstance().FlushEmptyCallback(tm);
383        EXPECT_EQ(VirtualScreenImpl::GetInstance().flushEmptyTimeStamp, tm);
384    }
385
386    TEST_F(VirtualScreenImplTest, InitAllTest)
387    {
388        std::string port = "8888";
389        VirtualScreenImpl::GetInstance().InitAll("aaa", port);
390        EXPECT_EQ(WebSocketServer::GetInstance().serverPort, atoi(port.c_str()));
391    }
392
393    TEST_F(VirtualScreenImplTest, GetScreenInfoTest)
394    {
395        int width = 1000;
396        VirtualScreenImpl::GetInstance().SetOrignalWidth(width);
397        ScreenInfo info = VirtualScreenImpl::GetInstance().GetScreenInfo();
398        EXPECT_EQ(info.orignalResolutionWidth, width);
399    }
400
401    TEST_F(VirtualScreenImplTest, InitFoldParamsTest)
402    {
403        int width = 1080;
404        int height = 2504;
405        std::string foldable = "true";
406        std::string foldStatus = "half_fold";
407        CommandParser& parser = CommandParser::GetInstance();
408        CommandParser::GetInstance().argsMap.clear();
409        CommandParser::GetInstance().argsMap["-foldable"] = { foldable };
410        CommandParser::GetInstance().argsMap["-foldStatus"] = { foldStatus };
411        CommandParser::GetInstance().argsMap["-fr"] = { std::to_string(width),  std::to_string(height) };
412        CommandParser::GetInstance().foldable = (foldable == "true");
413        CommandParser::GetInstance().foldStatus = foldStatus;
414        CommandParser::GetInstance().foldResolutionWidth = width;
415        CommandParser::GetInstance().foldResolutionHeight = height;
416        VirtualScreenImpl::GetInstance().InitFoldParams();
417        EXPECT_TRUE(VirtualScreenImpl::GetInstance().GetFoldable());
418        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFoldStatus(), "half_fold");
419        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFoldWidth(), width);
420        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetFoldHeight(), height);
421    }
422
423    TEST_F(VirtualScreenImplTest, SendPixmapTest_Err)
424    {
425        int height = 100;
426        int width = 100;
427        int pixSize = 4;
428        int length = height * width * pixSize;
429        VirtualScreenImpl::GetInstance().bufferSize = length + VirtualScreenImpl::GetInstance().headSize;
430        VirtualScreenImpl::GetInstance().wholeBuffer =
431            new uint8_t[LWS_PRE + VirtualScreenImpl::GetInstance().bufferSize];
432        VirtualScreenImpl::GetInstance().screenBuffer = VirtualScreenImpl::GetInstance().wholeBuffer + LWS_PRE;
433        // data is nullptr
434        bool ret = VirtualScreenImpl::GetInstance().SendPixmap(nullptr, length, width, height);
435        EXPECT_FALSE(ret);
436        // isWebSocketConfiged is false
437        VirtualScreenImpl::GetInstance().isWebSocketConfiged = false;
438        InitBuffer();
439        ret = VirtualScreenImpl::GetInstance().SendPixmap(jpgBuff, length, width, height);
440        EXPECT_FALSE(ret);
441        VirtualScreenImpl::GetInstance().isWebSocketConfiged = true;
442        // IsRegionRefresh function retrun true
443        bool temp = CommandParser::GetInstance().isRegionRefresh;
444        CommandParser::GetInstance().isRegionRefresh = true;
445        ret = VirtualScreenImpl::GetInstance().SendPixmap(jpgBuff, length, width, height);
446        CommandParser::GetInstance().isRegionRefresh = temp;
447        EXPECT_FALSE(ret);
448        delete[] jpgBuff;
449        jpgBuff = nullptr;
450    }
451
452    TEST_F(VirtualScreenImplTest, PageCallbackTest)
453    {
454        EXPECT_TRUE(VirtualScreenImpl::GetInstance().PageCallback("pages/Index"));
455    }
456
457    TEST_F(VirtualScreenImplTest, LoadContentCallbackTest)
458    {
459        EXPECT_TRUE(VirtualScreenImpl::GetInstance().LoadContentCallback("pages/Index"));
460    }
461
462    TEST_F(VirtualScreenImplTest, FastPreviewCallbackTest)
463    {
464        g_output = false;
465        std::string jsonStr = R"({"FastPreview" : "true"})";;
466        VirtualScreenImpl::GetInstance().FastPreviewCallback(jsonStr);
467        EXPECT_TRUE(g_output);
468    }
469
470    TEST_F(VirtualScreenImplTest, SendTest_Err)
471    {
472        int width = 100;
473        int pixSize = 4;
474        int height = 100;
475        int length = height * width * pixSize;
476        VirtualScreenImpl::GetInstance().bufferSize = length + VirtualScreenImpl::GetInstance().headSize;
477        VirtualScreenImpl::GetInstance().wholeBuffer =
478            new uint8_t[LWS_PRE + VirtualScreenImpl::GetInstance().bufferSize];
479        VirtualScreenImpl::GetInstance().screenBuffer = VirtualScreenImpl::GetInstance().wholeBuffer + LWS_PRE;
480        // static mode
481        CommandParser::ScreenMode tempMode = CommandParser::GetInstance().screenMode;
482        CommandParser::GetInstance().screenMode = CommandParser::ScreenMode::STATIC;
483        bool isOutOfSecondsTemp = VirtualScreen::isOutOfSeconds;
484        VirtualScreen::isOutOfSeconds = true;
485        InitBuffer();
486        VirtualScreenImpl::GetInstance().Send(jpgBuff, width, height);
487        VirtualScreen::isOutOfSeconds = false;
488        CommandParser::GetInstance().screenMode = tempMode;
489        EXPECT_NE(VirtualScreenImpl::GetInstance().screenBuffer, nullptr);
490        // height < 1
491        height = 0;
492        VirtualScreenImpl::GetInstance().Send(jpgBuff, width, height);
493        EXPECT_NE(VirtualScreenImpl::GetInstance().screenBuffer, nullptr);
494        height = 100;
495        // width < 1
496        width = 0;
497        VirtualScreenImpl::GetInstance().Send(jpgBuff, width, height);
498        EXPECT_NE(VirtualScreenImpl::GetInstance().screenBuffer, nullptr);
499        width = 100;
500        // jpgBufferSize > bufferSize - headSize
501        VirtualScreenImpl::GetInstance().bufferSize = VirtualScreenImpl::GetInstance().headSize;
502        VirtualScreenImpl::GetInstance().Send(jpgBuff, width, height);
503        EXPECT_NE(VirtualScreenImpl::GetInstance().screenBuffer, nullptr);
504        delete[] jpgBuff;
505        jpgBuff = nullptr;
506    }
507
508    TEST_F(VirtualScreenImplTest, InitResolutionTest_Err)
509    {
510        int width = 200;
511        int height = 100;
512        CommandParser::GetInstance().orignalResolutionWidth = width;
513        CommandParser::GetInstance().orignalResolutionHeight = height;
514        CommandParser::GetInstance().compressionResolutionWidth = width;
515        CommandParser::GetInstance().compressionResolutionHeight = height;
516        VirtualScreenImpl::GetInstance().InitResolution();
517        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetOrignalWidth(), width);
518        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetOrignalHeight(), height);
519        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetCompressionWidth(), width);
520        EXPECT_EQ(VirtualScreenImpl::GetInstance().GetCompressionHeight(), height);
521    }
522
523    TEST_F(VirtualScreenImplTest, LoadDocCallbackTest)
524    {
525        InitBuffer();
526        int tm = 100;
527        // timeStamp < loadDocTimeStamp
528        VirtualScreenImpl::GetInstance().loadDocTimeStamp = 200;
529        bool ret = VirtualScreenImpl::LoadDocCallback(jpgBuff, jpgBuffSize, jpgWidth, jpgHeight, tm);
530        VirtualScreenImpl::GetInstance().loadDocTimeStamp = 0;
531        EXPECT_FALSE(ret);
532        // GetLoadDocFlag is VirtualScreen::LoadDocType::FINISHED && length = 0
533        VirtualScreen::LoadDocType temp = VirtualScreenImpl::GetInstance().startLoadDoc;
534        VirtualScreenImpl::GetInstance().startLoadDoc = VirtualScreen::LoadDocType::FINISHED;
535        VirtualScreenImpl::GetInstance().loadDocTempBuffer = new uint8_t[1];
536        ret = VirtualScreenImpl::LoadDocCallback(jpgBuff, 0, jpgWidth, jpgHeight, tm);
537        EXPECT_FALSE(ret);
538        VirtualScreenImpl::GetInstance().startLoadDoc = temp;
539        delete[] jpgBuff;
540        jpgBuff = nullptr;
541    }
542
543    TEST_F(VirtualScreenImplTest, StartTimerTest)
544    {
545        g_writeData = false;
546        VirtualScreenImpl::GetInstance().isFlushEmpty = false;
547        VirtualScreenImpl::GetInstance().StartTimer();
548        EXPECT_FALSE(g_writeData);
549        VirtualScreenImpl::GetInstance().isFlushEmpty = true;
550        VirtualScreenImpl::GetInstance().StartTimer();
551        EXPECT_FALSE(g_writeData);
552    }
553
554    TEST_F(VirtualScreenImplTest, NoFlushEmptyFuncTest)
555    {
556        VirtualScreenImpl::GetInstance().onRenderTime = std::chrono::system_clock::now();
557        bool ret = VirtualScreenImpl::GetInstance().NoFlushEmptyFunc(300);
558        EXPECT_TRUE(ret);
559        VirtualScreenImpl::GetInstance().onRenderTime = std::chrono::system_clock::time_point::min();
560        ret = VirtualScreenImpl::GetInstance().NoFlushEmptyFunc(10000);
561        EXPECT_TRUE(ret);
562        ret = VirtualScreenImpl::GetInstance().NoFlushEmptyFunc(1);
563        EXPECT_FALSE(ret);
564    }
565
566    TEST_F(VirtualScreenImplTest, FlushEmptyFuncTest)
567    {
568        std::time_t timestamp = 1719273600; // 这个时间戳代表2024年7月25日00:00:00 UTC
569        std::time_t gap = 100;
570        int64_t timePassed = 9000;
571        int64_t time = 8000;
572        VirtualScreenImpl::GetInstance().onRenderTime = std::chrono::system_clock::from_time_t(timestamp);
573        VirtualScreenImpl::GetInstance().flushEmptyTime = std::chrono::system_clock::from_time_t(timestamp - gap);
574        VirtualScreenImpl::GetInstance().flushEmptyTimeStamp = 200;
575        VirtualScreenImpl::GetInstance().timeStampTemp = 100;
576        bool ret = VirtualScreenImpl::GetInstance().FlushEmptyFunc(std::chrono::system_clock::from_time_t(
577            timestamp + gap), timePassed);
578        EXPECT_TRUE(ret);
579
580        VirtualScreenImpl::GetInstance().timeStampTemp = 300;
581        ret = VirtualScreenImpl::GetInstance().FlushEmptyFunc(std::chrono::system_clock::from_time_t(
582            timestamp + gap), time);
583        EXPECT_FALSE(ret);
584
585        VirtualScreenImpl::GetInstance().timeStampTemp = 100;
586        VirtualScreenImpl::GetInstance().flushEmptyTime = std::chrono::system_clock::from_time_t(
587            timestamp + gap);
588        ret = VirtualScreenImpl::GetInstance().FlushEmptyFunc(std::chrono::system_clock::from_time_t(
589            timestamp + gap + gap + gap), timePassed);
590        EXPECT_TRUE(ret);
591
592        VirtualScreenImpl::GetInstance().timeStampTemp = 300;
593        ret = VirtualScreenImpl::GetInstance().FlushEmptyFunc(std::chrono::system_clock::from_time_t(
594            timestamp + gap), timePassed);
595        EXPECT_TRUE(ret);
596
597        ret = VirtualScreenImpl::GetInstance().FlushEmptyFunc(std::chrono::system_clock::from_time_t(
598            timestamp + gap), time);
599        EXPECT_FALSE(ret);
600    }
601}