1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License.
5ca0551cfSopenharmony_ci * You may obtain a copy of the License at
6ca0551cfSopenharmony_ci *
7ca0551cfSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ca0551cfSopenharmony_ci *
9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and
13ca0551cfSopenharmony_ci * limitations under the License.
14ca0551cfSopenharmony_ci */
15ca0551cfSopenharmony_ci
16ca0551cfSopenharmony_ci#ifndef OHOS_IDL_MODULE_TEST_IDL_COMMON_H
17ca0551cfSopenharmony_ci#define OHOS_IDL_MODULE_TEST_IDL_COMMON_H
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_ci#include <gtest/gtest.h>
20ca0551cfSopenharmony_ci#include <string>
21ca0551cfSopenharmony_ci#define private public
22ca0551cfSopenharmony_ci#define protected public
23ca0551cfSopenharmony_ci#include "codegen/code_emitter.h"
24ca0551cfSopenharmony_ci#include "codegen/code_generator.h"
25ca0551cfSopenharmony_ci#include "codegen/ts_code_emitter.h"
26ca0551cfSopenharmony_ci#undef private
27ca0551cfSopenharmony_ci#undef protected
28ca0551cfSopenharmony_ci#include "metadata/metadata_builder.h"
29ca0551cfSopenharmony_ci#include "metadata/metadata_dumper.h"
30ca0551cfSopenharmony_ci#include "metadata/metadata_reader.h"
31ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h"
32ca0551cfSopenharmony_ci#include "parser/parser.h"
33ca0551cfSopenharmony_ci#include "util/file.h"
34ca0551cfSopenharmony_ci#include "util/logger.h"
35ca0551cfSopenharmony_ci#include "util/options.h"
36ca0551cfSopenharmony_ci#include "util/string.h"
37ca0551cfSopenharmony_ci#include "util/string_builder.h"
38ca0551cfSopenharmony_ci#include "idl_file.h"
39ca0551cfSopenharmony_ci#include "securec.h"
40ca0551cfSopenharmony_ci
41ca0551cfSopenharmony_cinamespace OHOS {
42ca0551cfSopenharmony_cinamespace Idl {
43ca0551cfSopenharmony_cinamespace TestCommon {
44ca0551cfSopenharmony_ciconst int ERR_FAIL = -1;
45ca0551cfSopenharmony_ciconst int ERR_OK = 0;
46ca0551cfSopenharmony_ci
47ca0551cfSopenharmony_ciclass IdlCommon {
48ca0551cfSopenharmony_cipublic:
49ca0551cfSopenharmony_ci    IdlCommon() = default;
50ca0551cfSopenharmony_ci    ~IdlCommon() = default;
51ca0551cfSopenharmony_ci
52ca0551cfSopenharmony_ci    int Ready(int argc, char** argv)
53ca0551cfSopenharmony_ci    {
54ca0551cfSopenharmony_ci        Options options(argc, argv);
55ca0551cfSopenharmony_ci        std::shared_ptr<MetaComponent> metadata = nullptr;
56ca0551cfSopenharmony_ci
57ca0551cfSopenharmony_ci        if (options.DoCompile()) {
58ca0551cfSopenharmony_ci            Parser parser(options);
59ca0551cfSopenharmony_ci            if (!parser.Parse(options.GetSourceFile())) {
60ca0551cfSopenharmony_ci                return ERR_FAIL;
61ca0551cfSopenharmony_ci            }
62ca0551cfSopenharmony_ci
63ca0551cfSopenharmony_ci            MetadataBuilder builder(parser.GetModule());
64ca0551cfSopenharmony_ci            metadata = builder.Build();
65ca0551cfSopenharmony_ci            metadata_ = metadata;
66ca0551cfSopenharmony_ci            if (metadata == nullptr) {
67ca0551cfSopenharmony_ci                return ERR_FAIL;
68ca0551cfSopenharmony_ci            }
69ca0551cfSopenharmony_ci        }
70ca0551cfSopenharmony_ci
71ca0551cfSopenharmony_ci        if (options.DoDumpMetadata()) {
72ca0551cfSopenharmony_ci            MetadataDumper dumper(metadata.get());
73ca0551cfSopenharmony_ci            dumper.Dump("");
74ca0551cfSopenharmony_ci        }
75ca0551cfSopenharmony_ci
76ca0551cfSopenharmony_ci        if (options.DoSaveMetadata()) {
77ca0551cfSopenharmony_ci            File metadataFile(options.GetMetadataFile(), File::WRITE);
78ca0551cfSopenharmony_ci            if (!metadataFile.IsValid()) {
79ca0551cfSopenharmony_ci                return ERR_FAIL;
80ca0551cfSopenharmony_ci            }
81ca0551cfSopenharmony_ci
82ca0551cfSopenharmony_ci            MetadataSerializer serializer(metadata.get());
83ca0551cfSopenharmony_ci            serializer.Serialize();
84ca0551cfSopenharmony_ci            uintptr_t data = serializer.GetData();
85ca0551cfSopenharmony_ci            int size = serializer.GetDataSize();
86ca0551cfSopenharmony_ci
87ca0551cfSopenharmony_ci            metadataFile.WriteData(reinterpret_cast<void*>(data), size);
88ca0551cfSopenharmony_ci            metadataFile.Flush();
89ca0551cfSopenharmony_ci            metadataFile.Close();
90ca0551cfSopenharmony_ci        }
91ca0551cfSopenharmony_ci
92ca0551cfSopenharmony_ci        if (options.DoGenerateCode()) {
93ca0551cfSopenharmony_ci            if (metadata == nullptr) {
94ca0551cfSopenharmony_ci                String metadataFile = options.GetMetadataFile();
95ca0551cfSopenharmony_ci                metadata = MetadataReader::ReadMetadataFromFile(metadataFile);
96ca0551cfSopenharmony_ci                if (metadata == nullptr) {
97ca0551cfSopenharmony_ci                    return ERR_FAIL;
98ca0551cfSopenharmony_ci                }
99ca0551cfSopenharmony_ci            }
100ca0551cfSopenharmony_ci            if (options.GetTargetLanguage().Equals("ts")) {
101ca0551cfSopenharmony_ci                this->tsCodeGen_ = std::make_shared<TsCodeEmitter>(metadata.get());
102ca0551cfSopenharmony_ci                this->tsCodeGen_->SetDirectory(options.GetGenerationDirectory());
103ca0551cfSopenharmony_ci            }
104ca0551cfSopenharmony_ci        }
105ca0551cfSopenharmony_ci        return 0;
106ca0551cfSopenharmony_ci    }
107ca0551cfSopenharmony_ci
108ca0551cfSopenharmony_ci    int PrepareIdlFile(
109ca0551cfSopenharmony_ci        const std::string &fileName, const std::string &fileContent, const std::string &fileLicense = LICENSE_CONTENT)
110ca0551cfSopenharmony_ci    {
111ca0551cfSopenharmony_ci        String filePath = String::Format("%s/%s", "./", fileName.c_str());
112ca0551cfSopenharmony_ci        File file(filePath, File::WRITE);
113ca0551cfSopenharmony_ci        if (!file.IsValid()) {
114ca0551cfSopenharmony_ci            GTEST_LOG_(INFO) << "OPEN FILE FAIL";
115ca0551cfSopenharmony_ci            return ERR_FAIL;
116ca0551cfSopenharmony_ci        }
117ca0551cfSopenharmony_ci
118ca0551cfSopenharmony_ci        StringBuilder stringBuilder;
119ca0551cfSopenharmony_ci        stringBuilder.Append(fileLicense.c_str());
120ca0551cfSopenharmony_ci        stringBuilder.Append(fileContent.c_str());
121ca0551cfSopenharmony_ci
122ca0551cfSopenharmony_ci        String data = stringBuilder.ToString();
123ca0551cfSopenharmony_ci        file.WriteData(data.string(), data.GetLength());
124ca0551cfSopenharmony_ci        file.Flush();
125ca0551cfSopenharmony_ci        file.Close();
126ca0551cfSopenharmony_ci        return ERR_OK;
127ca0551cfSopenharmony_ci    }
128ca0551cfSopenharmony_ci
129ca0551cfSopenharmony_ci    std::shared_ptr<MetaComponent> metadata_ = nullptr;
130ca0551cfSopenharmony_ci    std::shared_ptr<TsCodeEmitter> tsCodeGen_ = nullptr;
131ca0551cfSopenharmony_ci};
132ca0551cfSopenharmony_ci
133ca0551cfSopenharmony_ciclass ParameterArgv {
134ca0551cfSopenharmony_cipublic:
135ca0551cfSopenharmony_ci    ParameterArgv(const char** args, const int argc) : argc_(argc)
136ca0551cfSopenharmony_ci    {
137ca0551cfSopenharmony_ci        argv_ = new char* [argc_] {nullptr};
138ca0551cfSopenharmony_ci        for (int i = 0; i < argc_; ++i) {
139ca0551cfSopenharmony_ci            const int itemSize = strlen(args[i]);
140ca0551cfSopenharmony_ci            argv_[i] = new char[itemSize + 1] {0};
141ca0551cfSopenharmony_ci            if (strcpy_s(argv_[i], itemSize + 1, args[i])) {
142ca0551cfSopenharmony_ci                GTEST_LOG_(ERROR) << "strcpy_s error [!EOK]";
143ca0551cfSopenharmony_ci            }
144ca0551cfSopenharmony_ci        }
145ca0551cfSopenharmony_ci    };
146ca0551cfSopenharmony_ci    ~ParameterArgv()
147ca0551cfSopenharmony_ci    {
148ca0551cfSopenharmony_ci        if (argv_ == nullptr) {
149ca0551cfSopenharmony_ci            return;
150ca0551cfSopenharmony_ci        }
151ca0551cfSopenharmony_ci
152ca0551cfSopenharmony_ci        for (int i = 0; i < argc_; ++i) {
153ca0551cfSopenharmony_ci            if (argv_[i] == nullptr) {
154ca0551cfSopenharmony_ci                continue;
155ca0551cfSopenharmony_ci            }
156ca0551cfSopenharmony_ci            delete[] argv_[i];
157ca0551cfSopenharmony_ci            argv_[i] = nullptr;
158ca0551cfSopenharmony_ci        }
159ca0551cfSopenharmony_ci        delete[] argv_;
160ca0551cfSopenharmony_ci        argv_ = nullptr;
161ca0551cfSopenharmony_ci    };
162ca0551cfSopenharmony_ci
163ca0551cfSopenharmony_ci    char** GetArgv()
164ca0551cfSopenharmony_ci    {
165ca0551cfSopenharmony_ci        return argv_;
166ca0551cfSopenharmony_ci    };
167ca0551cfSopenharmony_ci
168ca0551cfSopenharmony_ci    char** argv_;
169ca0551cfSopenharmony_ci    const int argc_;
170ca0551cfSopenharmony_ci};
171ca0551cfSopenharmony_ci}
172ca0551cfSopenharmony_ci}
173ca0551cfSopenharmony_ci}
174ca0551cfSopenharmony_ci#endif  // OHOS_IDL_MODULE_TEST_IDL_COMMON_H