17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci#include <string>
167c804472Sopenharmony_ci#include <fstream>
177c804472Sopenharmony_ci#include <filesystem>
187c804472Sopenharmony_ci#include <sys/stat.h>
197c804472Sopenharmony_ci#include "gtest/gtest.h"
207c804472Sopenharmony_ci#define private public
217c804472Sopenharmony_ci#define protected public
227c804472Sopenharmony_ci#include "CommandLineInterface.h"
237c804472Sopenharmony_ci#include "FileSystem.h"
247c804472Sopenharmony_ci#include "JsAppImpl.h"
257c804472Sopenharmony_ci#include "TraceTool.h"
267c804472Sopenharmony_ci#include "CommandParser.h"
277c804472Sopenharmony_ci
287c804472Sopenharmony_cinamespace {
297c804472Sopenharmony_ci    class JsAppImplTest : public ::testing::Test {
307c804472Sopenharmony_ci    public:
317c804472Sopenharmony_ci        JsAppImplTest() {}
327c804472Sopenharmony_ci        ~JsAppImplTest() {}
337c804472Sopenharmony_ci    protected:
347c804472Sopenharmony_ci        static void CopyFileToDirectory(const std::filesystem::path& sourceFile,
357c804472Sopenharmony_ci            const std::filesystem::path& destDirectory)
367c804472Sopenharmony_ci        {
377c804472Sopenharmony_ci            // 确保目标目录存在
387c804472Sopenharmony_ci            if (!std::filesystem::exists(destDirectory)) {
397c804472Sopenharmony_ci                std::filesystem::create_directories(destDirectory);
407c804472Sopenharmony_ci            }
417c804472Sopenharmony_ci            // 生成目标文件路径
427c804472Sopenharmony_ci            std::filesystem::path destFile = destDirectory / sourceFile.filename();
437c804472Sopenharmony_ci            // 复制文件
447c804472Sopenharmony_ci            std::filesystem::copy_file(sourceFile, destFile,
457c804472Sopenharmony_ci                std::filesystem::copy_options::overwrite_existing);
467c804472Sopenharmony_ci            std::cout << "File copied successfully to " << destFile << std::endl;
477c804472Sopenharmony_ci        }
487c804472Sopenharmony_ci
497c804472Sopenharmony_ci        static void SetUpTestCase()
507c804472Sopenharmony_ci        {
517c804472Sopenharmony_ci            CommandLineInterface::GetInstance().Init("pipeName");
527c804472Sopenharmony_ci            TraceTool::GetInstance().InitPipe();
537c804472Sopenharmony_ci            testConfigPath = FileSystem::GetApplicationPath() + FileSystem::separator + ".." +
547c804472Sopenharmony_ci                FileSystem::separator + "config" + FileSystem::separator;
557c804472Sopenharmony_ci            std::string srcBrkPath = FileSystem::GetApplicationPath() + FileSystem::separator +
567c804472Sopenharmony_ci                "foundation/arkui/ui_lite/tools/qt/simulator/font/line_cj.brk";
577c804472Sopenharmony_ci            std::string srcFontPath = FileSystem::GetApplicationPath() + FileSystem::separator +
587c804472Sopenharmony_ci                "foundation/arkui/ui_lite/tools/qt/simulator/font/SourceHanSansSC-Regular.otf";
597c804472Sopenharmony_ci            CopyFileToDirectory(srcBrkPath, testConfigPath);
607c804472Sopenharmony_ci            CopyFileToDirectory(srcFontPath, testConfigPath);
617c804472Sopenharmony_ci        }
627c804472Sopenharmony_ci
637c804472Sopenharmony_ci        static std::string testConfigPath;
647c804472Sopenharmony_ci    };
657c804472Sopenharmony_ci    std::string JsAppImplTest::testConfigPath = "";
667c804472Sopenharmony_ci
677c804472Sopenharmony_ci    // 测试拷贝构造函数是否被删除
687c804472Sopenharmony_ci    TEST_F(JsAppImplTest, CopyConstructorDeletedTest)
697c804472Sopenharmony_ci    {
707c804472Sopenharmony_ci        EXPECT_TRUE(std::is_copy_constructible<JsApp>::value == false);
717c804472Sopenharmony_ci    }
727c804472Sopenharmony_ci
737c804472Sopenharmony_ci    // 测试赋值运算符是否被删除
747c804472Sopenharmony_ci    TEST_F(JsAppImplTest, AssignmentOperatorDeletedTest)
757c804472Sopenharmony_ci    {
767c804472Sopenharmony_ci        EXPECT_TRUE(std::is_copy_assignable<JsApp>::value == false);
777c804472Sopenharmony_ci    }
787c804472Sopenharmony_ci
797c804472Sopenharmony_ci    TEST_F(JsAppImplTest, StartTest)
807c804472Sopenharmony_ci    {
817c804472Sopenharmony_ci        JsAppImpl::GetInstance().isFinished = true;
827c804472Sopenharmony_ci        JsAppImpl::GetInstance().Start();
837c804472Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::milliseconds(10)); // sleep 10 ms
847c804472Sopenharmony_ci        JsAppImpl::GetInstance().isInterrupt = true;
857c804472Sopenharmony_ci        EXPECT_FALSE(JsAppImpl::GetInstance().isFinished);
867c804472Sopenharmony_ci    }
877c804472Sopenharmony_ci
887c804472Sopenharmony_ci    TEST_F(JsAppImplTest, InterruptTest)
897c804472Sopenharmony_ci    {
907c804472Sopenharmony_ci        JsAppImpl::GetInstance().jsAbility = std::make_unique<OHOS::ACELite::JSAbility>();
917c804472Sopenharmony_ci        JsAppImpl::GetInstance().Interrupt();
927c804472Sopenharmony_ci        EXPECT_TRUE(JsAppImpl::GetInstance().isFinished);
937c804472Sopenharmony_ci        EXPECT_TRUE(JsAppImpl::GetInstance().isInterrupt);
947c804472Sopenharmony_ci    }
957c804472Sopenharmony_ci
967c804472Sopenharmony_ci    TEST_F(JsAppImplTest, InitJsAppTest)
977c804472Sopenharmony_ci    {
987c804472Sopenharmony_ci        JsAppImpl::GetInstance().isFinished = true;
997c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap.clear();
1007c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-s"] = { "" };
1017c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-lws"] = { "" };
1027c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-n"] = { "" };
1037c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-hs"] = { "" };
1047c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-d"] = { "" };
1057c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-p"] = { "" };
1067c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-j"] = { "" };
1077c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap["-url"] = { "" };
1087c804472Sopenharmony_ci        JsAppImpl::GetInstance().InitJsApp();
1097c804472Sopenharmony_ci        CommandParser::GetInstance().argsMap.clear();
1107c804472Sopenharmony_ci        JsAppImpl::GetInstance().isInterrupt = true;
1117c804472Sopenharmony_ci        EXPECT_FALSE(JsAppImpl::GetInstance().isFinished);
1127c804472Sopenharmony_ci    }
1137c804472Sopenharmony_ci
1147c804472Sopenharmony_ci    TEST_F(JsAppImplTest, StartJsAppTest1)
1157c804472Sopenharmony_ci    {
1167c804472Sopenharmony_ci        // jsAbility not nullptr
1177c804472Sopenharmony_ci        JsAppImpl::GetInstance().isFinished = true;
1187c804472Sopenharmony_ci        JsAppImpl::GetInstance().jsAbility = std::make_unique<OHOS::ACELite::JSAbility>();
1197c804472Sopenharmony_ci        JsAppImpl::GetInstance().StartJsApp();
1207c804472Sopenharmony_ci        EXPECT_TRUE(JsAppImpl::GetInstance().isFinished);
1217c804472Sopenharmony_ci    }
1227c804472Sopenharmony_ci
1237c804472Sopenharmony_ci    TEST_F(JsAppImplTest, StartJsAppTest2)
1247c804472Sopenharmony_ci    {
1257c804472Sopenharmony_ci        JsAppImpl::GetInstance().jsAbility = nullptr;
1267c804472Sopenharmony_ci        JsAppImpl::GetInstance().isFinished = true;
1277c804472Sopenharmony_ci        // urlPath empty
1287c804472Sopenharmony_ci        JsAppImpl::GetInstance().isDebug = true;
1297c804472Sopenharmony_ci        JsAppImpl::GetInstance().debugServerPort = 9999;
1307c804472Sopenharmony_ci        JsAppImpl::GetInstance().urlPath = "";
1317c804472Sopenharmony_ci        JsAppImpl::GetInstance().StartJsApp();
1327c804472Sopenharmony_ci        EXPECT_TRUE(JsAppImpl::GetInstance().isFinished);
1337c804472Sopenharmony_ci    }
1347c804472Sopenharmony_ci
1357c804472Sopenharmony_ci    TEST_F(JsAppImplTest, StartJsAppTest3)
1367c804472Sopenharmony_ci    {
1377c804472Sopenharmony_ci        JsAppImpl::GetInstance().jsAbility = nullptr;
1387c804472Sopenharmony_ci        JsAppImpl::GetInstance().isFinished = true;
1397c804472Sopenharmony_ci        // urlPath not empty
1407c804472Sopenharmony_ci        JsAppImpl::GetInstance().isDebug = true;
1417c804472Sopenharmony_ci        JsAppImpl::GetInstance().debugServerPort = 9999;
1427c804472Sopenharmony_ci        JsAppImpl::GetInstance().urlPath = "pages/Index";
1437c804472Sopenharmony_ci        JsAppImpl::GetInstance().StartJsApp();
1447c804472Sopenharmony_ci        EXPECT_FALSE(JsAppImpl::GetInstance().isFinished);
1457c804472Sopenharmony_ci    }
1467c804472Sopenharmony_ci}