1 /*
2 * Copyright (c) 2025 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 "helpers/serialisation_utils.h"
17
18 #include <algorithm>
19 #include <cstring>
20
21 #include <core/io/intf_file_manager.h>
22
23 #include <meta/interface/builtin_objects.h>
24 #include <meta/interface/intf_object_registry.h>
25 #include <meta/interface/serialization/intf_exporter.h>
26 #include <meta/interface/serialization/intf_importer.h>
27
28 #include "TestRunner.h"
29
META_BEGIN_NAMESPACE()30 META_BEGIN_NAMESPACE()
31
32 MemFile::MemFile(BASE_NS::vector<uint8_t> vec) : data_(BASE_NS::move(vec)) {}
33
GetMode() const34 MemFile::Mode MemFile::GetMode() const
35 {
36 return Mode::READ_WRITE;
37 }
Close()38 void MemFile::Close()
39 {
40 data_.clear();
41 }
Read(void * buffer,uint64_t count)42 uint64_t MemFile::Read(void* buffer, uint64_t count)
43 {
44 size_t read = std::min<size_t>(count, data_.size() - pos_);
45 if (read) {
46 std::memcpy_s(buffer, count, &data_[pos_], read);
47 pos_ += read;
48 }
49 return read;
50 }
Write(const void * buffer,uint64_t count)51 uint64_t MemFile::Write(const void* buffer, uint64_t count)
52 {
53 if (data_.size() < pos_ + count) {
54 data_.resize(pos_ + count);
55 }
56 size_t destSize = data_.size() - pos_;
57 std::memcpy_s(&data_[pos_], destSize, buffer, count);
58 pos_ += count;
59 return count;
60 }
Append(const void * buffer,uint64_t count,uint64_t flushSize)61 uint64_t MemFile::Append(const void* buffer, uint64_t count, uint64_t flushSize)
62 {
63 if (data_.size() < pos_ + count) {
64 data_.resize(pos_ + count);
65 }
66 size_t destSize = data_.size() - pos_;
67 std::memcpy_s(&data_[pos_], destSize, buffer, count);
68 pos_ += count;
69 return count;
70 }
GetLength() const71 uint64_t MemFile::GetLength() const
72 {
73 return data_.size();
74 }
Seek(uint64_t offset)75 bool MemFile::Seek(uint64_t offset)
76 {
77 bool ret = offset < data_.size();
78 if (ret) {
79 pos_ = offset;
80 }
81 return ret;
82 }
GetPosition() const83 uint64_t MemFile::GetPosition() const
84 {
85 return pos_;
86 }
Data() const87 BASE_NS::vector<uint8_t> MemFile::Data() const
88 {
89 return data_;
90 }
Destroy()91 void MemFile::Destroy()
92 {
93 delete this;
94 }
95
TestSerialiser(BASE_NS::vector<uint8_t> vec)96 TestSerialiser::TestSerialiser(BASE_NS::vector<uint8_t> vec) : data_(BASE_NS::move(vec)) {}
97
Export(const IObject::Ptr & object)98 bool TestSerialiser::Export(const IObject::Ptr& object)
99 {
100 data_.Seek(writePos_);
101 auto exporter = GetObjectRegistry().Create<IFileExporter>(META_NS::ClassId::JsonExporter);
102 exporter->SetInstanceIdMapping(mapping_);
103 exporter->SetResourceManager(resources_);
104 exporter->SetMetadata(metadata_);
105 bool ret = exporter->Export(data_, object);
106 writePos_ = data_.GetPosition();
107 return ret;
108 }
109
SetSerializationSettings(SerializationSettings s)110 void TestSerialiser::SetSerializationSettings(SerializationSettings s)
111 {
112 auto& ctx = GetObjectRegistry().GetGlobalSerializationData();
113 ctx.SetDefaultSettings(s);
114 }
115
Import()116 IObject::Ptr TestSerialiser::Import()
117 {
118 data_.Seek(readPos_);
119 auto importer = GetObjectRegistry().Create<IFileImporter>(META_NS::ClassId::JsonImporter);
120 importer->SetResourceManager(resources_);
121 IObject::Ptr result = importer->Import(data_);
122 readPos_ = data_.GetPosition();
123 mapping_ = importer->GetInstanceIdMapping();
124 metadata_ = importer->GetMetadata();
125 return result;
126 }
127
LoadFile(BASE_NS::string_view path)128 bool TestSerialiser::LoadFile(BASE_NS::string_view path)
129 {
130 auto f = CORE_NS::GetPluginRegister().GetFileManager().OpenFile(path);
131 if (!f) {
132 return false;
133 }
134
135 BASE_NS::vector<uint8_t> vec;
136 vec.resize(f->GetLength());
137 f->Read(vec.data(), vec.size());
138 data_ = MemFile { BASE_NS::move(vec) };
139 return true;
140 }
141
Dump(BASE_NS::string_view file)142 void TestSerialiser::Dump(BASE_NS::string_view file)
143 {
144 WriteToFile(data_.Data(), file);
145 }
146
Get() const147 BASE_NS::string TestSerialiser::Get() const
148 {
149 return BASE_NS::string(
150 BASE_NS::string_view(reinterpret_cast<const char*>(data_.Data().data()), data_.Data().size()));
151 }
152
GetData() const153 BASE_NS::vector<uint8_t> TestSerialiser::GetData() const
154 {
155 return data_.Data();
156 }
157
GetInstanceIdMapping() const158 BASE_NS::unordered_map<InstanceId, InstanceId> TestSerialiser::GetInstanceIdMapping() const
159 {
160 return mapping_;
161 }
SetInstanceIdMapping(BASE_NS::unordered_map<InstanceId,InstanceId> map)162 void TestSerialiser::SetInstanceIdMapping(BASE_NS::unordered_map<InstanceId, InstanceId> map)
163 {
164 mapping_ = BASE_NS::move(map);
165 }
SetResourceManager(CORE_NS::IResourceManager::Ptr p)166 void TestSerialiser::SetResourceManager(CORE_NS::IResourceManager::Ptr p)
167 {
168 resources_ = BASE_NS::move(p);
169 }
SetMetadata(SerMetadata m)170 void TestSerialiser::SetMetadata(SerMetadata m)
171 {
172 metadata_ = BASE_NS::move(m);
173 }
GetMetadata() const174 SerMetadata TestSerialiser::GetMetadata() const
175 {
176 return metadata_;
177 }
178
WriteToFile(const BASE_NS::vector<uint8_t> & vec,BASE_NS::string_view file)179 void WriteToFile(const BASE_NS::vector<uint8_t>& vec, BASE_NS::string_view file)
180 {
181 auto f = CORE_NS::GetPluginRegister().GetFileManager().CreateFile(file);
182 if (f) {
183 f->Write(vec.data(), vec.size());
184 f->Close();
185 }
186 }
187
188 META_END_NAMESPACE()
189