• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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