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