• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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 "gtest/gtest.h"
17 #include <cstdint>
18 #include <cstdlib>
19 #include <ctime>
20 #include <fstream>
21 #include <iostream>
22 #include <memory>
23 #include <sstream>
24 #include <string>
25 #include <unordered_map>
26 
27 #include <csetjmp>
28 #include <csignal>
29 #include <cstring>
30 #include <dirent.h>
31 #include <execinfo.h>
32 #include <fcntl.h>
33 #include <pwd.h>
34 #include <sys/stat.h>
35 #include <unistd.h>
36 
37 #include <gmock/gmock-actions.h>
38 #include <gmock/gmock-cardinalities.h>
39 #include <gmock/gmock-spec-builders.h>
40 #include <gmock/gmock.h>
41 #include <gtest/gtest.h>
42 
43 #include "metadata_stream.h"
44 #include "buffer_metadata_stream.h"
45 #include "file_metadata_stream.h"
46 #include "data_buf.h"
47 
48 using namespace testing::ext;
49 using namespace testing;
50 using namespace OHOS::Media;
51 
52 namespace OHOS {
53 namespace Media {
54 const int SIZE_1024 = 1024;
55 const int SIZE_512 = 512;
56 const int SIZE_255 = 255;
57 const int SIZE_20 = 20;
58 const int SIZE_10 = 10;
59 const int TEST_DIR_PERMISSIONS = 0777;
60 
61 class MemoryCheck {
62 public:
Start()63     void Start()
64     {
65         startVmSize = GetVmSize();
66         startVmRSS = GetVmRSS();
67         startFdCount = CountOpenFileDescriptors();
68     }
69 
End()70     void End()
71     {
72         endVmSize = GetVmSize();
73         endVmRSS = GetVmRSS();
74         endFdCount = CountOpenFileDescriptors();
75     }
76 
77     bool check = true;
78 
Compare() const79     bool Compare() const
80     {
81         if (check) {
82             if (startVmSize != endVmSize || startVmRSS != endVmRSS || startFdCount != endFdCount) {
83                 std::cout << "Difference in VmSize: " << endVmSize - startVmSize << std::endl;
84                 std::cout << "Difference in VmRSS: " << endVmRSS - startVmRSS << std::endl;
85                 std::cout << "Difference in File Descriptors: " << endFdCount - startFdCount << std::endl;
86                 return false;
87             }
88         }
89         return true;
90     }
91 
92 private:
GetVmSize() const93     long GetVmSize() const
94     {
95         return GetMemoryInfo("VmSize:");
96     }
97 
GetVmRSS() const98     long GetVmRSS() const
99     {
100         return GetMemoryInfo("VmRSS:");
101     }
102 
CountOpenFileDescriptors() const103     int CountOpenFileDescriptors() const
104     {
105         DIR *dir;
106         int fdCount = 0;
107         std::string dirPath = "/proc/" + std::to_string(getpid()) + "/fd/";
108         if ((dir = opendir(dirPath.c_str())) != nullptr) {
109             while (readdir(dir) != nullptr) {
110                 fdCount++;
111             }
112             closedir(dir);
113         } else {
114             std::cerr << "Could not open " << dirPath << std::endl;
115         }
116 
117         return fdCount;
118     }
119 
GetMemoryInfo(const std::string & name) const120     long GetMemoryInfo(const std::string &name) const
121     {
122         std::string line;
123         std::ifstream statusFile("/proc/self/status");
124 
125         while (std::getline(statusFile, line)) {
126             if (line.find(name) != std::string::npos) {
127                 return std::stol(line.substr(name.length()));
128             }
129         }
130 
131         return 0;
132     }
133 
134     long startVmSize = 0;
135     long startVmRSS = 0;
136     long endVmSize = 0;
137     long endVmRSS = 0;
138     int startFdCount = 0;
139     int endFdCount = 0;
140 };
141 
CountOpenFileDescriptors()142 int CountOpenFileDescriptors()
143 {
144     DIR *dir;
145     int fdCount = 0;
146     std::string dirPath = "/proc/" + std::to_string(getpid()) + "/fd/";
147     if ((dir = opendir(dirPath.c_str())) != nullptr) {
148         while (readdir(dir) != nullptr) {
149             fdCount++;
150         }
151         closedir(dir);
152     } else {
153         std::cerr << "Could not open " << dirPath << std::endl;
154     }
155 
156     return fdCount;
157 }
158 
159 
RemoveFile(const std::string & filePath)160 void RemoveFile(const std::string &filePath)
161 {
162     int result = remove(filePath.c_str());
163     if (result != 0) {
164         char errstr[METADATA_STREAM_ERROR_BUFFER_SIZE];
165         strerror_r(errno, errstr, sizeof(errstr));
166     }
167 }
168 
CreateIfNotExit(const std::string & filePath)169 std::string CreateIfNotExit(const std::string &filePath)
170 {
171     struct stat buffer;
172     if (stat(filePath.c_str(), &buffer) != 0) { // 文件不存在
173         std::ofstream file(filePath);
174         if (!file) {
175             std::cerr << "Failed to create file: " << filePath << std::endl;
176         } else {
177             file.close();
178         }
179     }
180     return filePath;
181 }
182 
183 class MetadataStreamTest : public testing::Test {
184 public:
MetadataStreamTest()185     MetadataStreamTest() {}
~MetadataStreamTest()186     ~MetadataStreamTest() override {}
187     std::string filePath = "/data/local/tmp/image/testfile.txt";
188     std::string filePathSource = "/data/local/tmp/image/test_exif_test.jpg";
189     std::string filePathDest = "/data/local/tmp/image/testfile_dest.png";
190     std::string backupFilePathSource = "/data/local/tmp/image/test_exif.jpg";
191     const ssize_t testSize[4] = {
192         1,
193         METADATA_STREAM_PAGE_SIZE + 1,
194         METADATA_STREAM_PAGE_SIZE,
195         METADATA_STREAM_PAGE_SIZE - 1
196     };
197     MemoryCheck memoryCheck;
198 
SetUp()199     void SetUp() override
200     {
201         // Create the directory
202         std::string dirPath = "/data/local/tmp/image";
203         if (access(dirPath.c_str(), F_OK) != 0) {
204             int ret = mkdir(dirPath.c_str(), TEST_DIR_PERMISSIONS);
205             if (ret != 0) {
206                 char buf[METADATA_STREAM_ERROR_BUFFER_SIZE];
207                 strerror_r(errno, buf, sizeof(buf));
208                 GTEST_LOG_(ERROR) << "Failed to create directory: " << dirPath << ", error: " << buf;
209             }
210         }
211 
212         // Backup the files
213         std::filesystem::copy(backupFilePathSource, filePathSource, std::filesystem::copy_options::overwrite_existing);
214         memoryCheck.check = true;
215         memoryCheck.Start();
216     }
217 
218     const static std::string tmpDirectory;
219     static bool alreadyExist;
220 
TearDown()221     void TearDown() override
222     {
223         memoryCheck.End();
224         memoryCheck.check = false;
225         if (!memoryCheck.Compare()) {
226             GTEST_LOG_(INFO) << "Memory leak detected";
227         }
228         RemoveFile(filePath.c_str());
229         RemoveFile(filePathDest.c_str());
230     }
231 
SetUpTestCase()232     static void SetUpTestCase()
233     {
234         // Create the directory
235         if (access(tmpDirectory.c_str(), F_OK) != 0) {
236             int ret = mkdir(tmpDirectory.c_str(), TEST_DIR_PERMISSIONS);
237             if (ret != 0) {
238                 char buf[METADATA_STREAM_ERROR_BUFFER_SIZE];
239                 strerror_r(errno, buf, sizeof(buf));
240                 GTEST_LOG_(ERROR) << "Failed to create directory: " << tmpDirectory << ", error: " << buf;
241             }
242             alreadyExist = false;
243         } else {
244             alreadyExist = true;
245         }
246     }
TearDownTestCase()247     static void TearDownTestCase()
248     {
249         if (!alreadyExist) {
250             rmdir(tmpDirectory.c_str());
251         }
252     }
253 };
254 
255 bool MetadataStreamTest::alreadyExist = false;
256 const std::string MetadataStreamTest::tmpDirectory = "/data/local/tmp/image";
257 
258 class MockFileWrapper : public FileWrapper {
259 public:
260     MOCK_METHOD(ssize_t, FWrite, (const void *src, size_t size, ssize_t nmemb, FILE *file), (override));
261     MOCK_METHOD(ssize_t, FRead, (void *destv, size_t size, ssize_t nmemb, FILE *file), (override));
262 
MockFileWrapper()263     MockFileWrapper()
264     {
265         // Set the default behavior of write to call the system's write function
266         ON_CALL(*this, FWrite(_, _, _, _))
267             .WillByDefault(Invoke([](const void *src, size_t size, ssize_t nmemb, FILE *file) {
268                 size_t result = ::fwrite(src, size, nmemb, file);
269                 if (result != static_cast<size_t>(nmemb)) {
270                     char errstr[METADATA_STREAM_ERROR_BUFFER_SIZE];
271                     strerror_r(errno, errstr, sizeof(errstr));
272                     std::cerr << "Failed to write to the file: " << errstr << std::endl;
273                 }
274                 return result;
275             }));
276         // Set the default behavior of read to call the system's read function
277         ON_CALL(*this, FRead(_, _, _, _)).WillByDefault(Invoke([](void *destv, size_t size, ssize_t nmemb, FILE *file) {
278             size_t result = ::fread(destv, size, nmemb, file);
279             if (result != static_cast<size_t>(nmemb)) {
280                 char errstr[METADATA_STREAM_ERROR_BUFFER_SIZE];
281                 strerror_r(errno, errstr, sizeof(errstr));
282                 std::cerr << "Failed to read from the file: " << errstr << std::endl;
283             }
284             return result;
285         }));
286     }
287 };
288 
289 /**
290  * @tc.name: FileMetadataStream_Write001
291  * @tc.desc: Test the Write function of FileMetadataStream, whether it can write
292  * normally and verify the written data
293  * @tc.type: FUNC
294  */
295 HWTEST_F(MetadataStreamTest, FileMetadataStream_Write001, TestSize.Level3)
296 {
297     // Create a FileMetadataStream object
298     FileMetadataStream stream(CreateIfNotExit(filePath));
299 
300     // Open the file
301     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
302 
303     // Create some data to write
304     byte data[SIZE_10] = {0};
305 
306     ASSERT_EQ(stream.Tell(), 0);
307 
308     // Write the data to the file
309     size_t bytesWritten = stream.Write(data, sizeof(data));
310 
311     // Check that the correct number of bytes were written
312     ASSERT_EQ(bytesWritten, sizeof(data));
313 
314     // Flush the file
315     stream.Flush();
316 
317     // Open the file again
318     int fileDescriptor = open(filePath.c_str(), O_RDONLY);
319     ASSERT_NE(fileDescriptor, -1);
320 
321     // Read the data from the file
322     byte buffer[SIZE_10];
323     ssize_t bytesRead = read(fileDescriptor, buffer, sizeof(buffer));
324 
325     // Check that the correct number of bytes were read
326     ASSERT_EQ(bytesRead, sizeof(data));
327 
328     // Check that the data read is the same as the data written
329     ASSERT_EQ(memcmp(data, buffer, sizeof(data)), 0);
330 
331     // Close the file
332     close(fileDescriptor);
333 }
334 
335 /**
336  * @tc.name: FileMetadataStream_Write002
337  * @tc.desc: Test the Write function of FileMetadataStream when the file is not
338  * open
339  * @tc.type: FUNC
340  */
341 HWTEST_F(MetadataStreamTest, FileMetadataStream_Write002, TestSize.Level3)
342 {
343     FileMetadataStream stream(filePath);
344     byte data[SIZE_10] = {0};
345     ASSERT_EQ(stream.Write(data, sizeof(data)), -1);
346 }
347 
348 /**
349  * @tc.name: FileMetadataStream_Write003
350  * @tc.desc: Test the Write function of FileMetadataStream when the amount of data
351  * written exceeds the remaining space in the file system
352  * @tc.type: FUNC
353  */
354 HWTEST_F(MetadataStreamTest, FileMetadataStream_Write003, TestSize.Level3)
355 {
356     // This test case requires an MetadataStream object that can simulate a read
357     // failure, so mock technology may be needed in actual testing
358     auto mockFileWrapper = std::make_unique<MockFileWrapper>();
359     // Set the behavior of the write function to always return -1, simulating a
360     // write failure
361     EXPECT_CALL(*mockFileWrapper.get(), FWrite(_, _, _, _)).WillOnce(Return(-1));
362 
363     FileMetadataStream stream(CreateIfNotExit(filePath), std::move(mockFileWrapper));
364 
365     // Test the Write function
366     byte buffer[SIZE_1024];
367     stream.Open(OpenMode::ReadWrite);
368     EXPECT_EQ(stream.Write(buffer, sizeof(buffer)), -1);
369 }
370 
371 /**
372  * @tc.name: FileMetadataStream_Write004
373  * @tc.desc: Test the Write function of FileMetadataStream when all data from the
374  * source image stream has been read
375  * @tc.type: FUNC
376  */
377 HWTEST_F(MetadataStreamTest, FileMetadataStream_Write004, TestSize.Level3)
378 {
379     FileMetadataStream stream1(filePathSource);
380     FileMetadataStream stream2(CreateIfNotExit(filePathDest));
381     ASSERT_TRUE(stream1.Open(OpenMode::ReadWrite));
382     ASSERT_TRUE(stream2.Open(OpenMode::ReadWrite));
383     // Read all data from stream1
384     byte buffer[METADATA_STREAM_PAGE_SIZE];
385     while (stream1.Read(buffer, sizeof(buffer)) > 0) {
386     }
387     // At this point, all data from stream1 has been read, so the write should
388     // return 0
389     byte *buf = new byte[stream1.GetSize()];
390     stream1.Read(buf, stream1.GetSize());
391     ASSERT_EQ(stream2.Write(buf, stream1.GetSize()), stream1.GetSize());
392     stream1.Flush();
393     stream2.Flush();
394     delete[] buf;
395 }
396 
397 /**
398  * @tc.name: FileMetadataStream_Write005
399  * @tc.desc: Test the Write function of FileMetadataStream when reading data from
400  * the source image stream fails
401  * @tc.type: FUNC
402  */
403 HWTEST_F(MetadataStreamTest, FileMetadataStream_Write005, TestSize.Level3)
404 {
405     // This test case requires an MetadataStream object that can simulate a read
406     // failure, so mock technology may be needed in actual testing
407     auto mockSourceFileWrapper = std::make_unique<MockFileWrapper>();
408     auto mockDestFileWrapper = std::make_unique<MockFileWrapper>();
409 
410     // Set the behavior of the write function to always return -1, simulating a
411     // write failure
412     EXPECT_CALL(*mockDestFileWrapper.get(), FWrite(_, _, _, _)).Times(Exactly(0));
413     EXPECT_CALL(*mockSourceFileWrapper.get(), FRead(_, _, _, _)).WillOnce(Return(-1));
414 
415     FileMetadataStream sourceStream(filePathSource, std::move(mockSourceFileWrapper));
416     FileMetadataStream destStream(filePath, std::move(mockDestFileWrapper));
417 
418     // Test the Write function
419     sourceStream.Open();
420     destStream.Open();
421     byte *buf = new byte[sourceStream.GetSize()];
422     EXPECT_EQ(sourceStream.Read(buf, sourceStream.GetSize()), -1);
423     delete[] buf;
424 }
425 
426 /**
427  * @tc.name: FileMetadataStream_Write001
428  * @tc.desc: Test the Write function of FileMetadataStream, whether it can write
429  * normally and verify the written data
430  * @tc.type: FUNC
431  */
432 HWTEST_F(MetadataStreamTest, FileMetadataStream_Write007, TestSize.Level3)
433 {
434     // Create a FileMetadataStream object
435     FileMetadataStream stream(CreateIfNotExit(filePath));
436 
437     // Open the file
438     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
439 
440     // Create some data to write
441     std::string data = "1Hello, world!";
442 
443     ASSERT_EQ(stream.Seek(0, SeekPos::BEGIN), 0);
444     ASSERT_EQ(stream.Tell(), 0);
445     // Write the data to the file
446     ASSERT_EQ(stream.Write((byte *)data.c_str(), data.size()), data.size());
447     ASSERT_EQ(stream.Tell(), data.size());
448     // Flush the file
449     stream.Flush();
450 
451     // Open the file again
452     int fileDescriptor = open(filePath.c_str(), O_RDONLY);
453     ASSERT_NE(fileDescriptor, -1);
454 
455     // Read the data from the file
456     byte buffer[SIZE_20];
457     read(fileDescriptor, buffer, sizeof(buffer));
458 
459     // Check that the data read is the same as the data written
460     ASSERT_EQ(memcmp(data.c_str(), buffer, data.size()), 0);
461 
462     // Close the file
463     close(fileDescriptor);
464 }
465 
466 HWTEST_F(MetadataStreamTest, FileMetadataStream_Write008, TestSize.Level3)
467 {
468     for (ssize_t size : testSize) {
469         RemoveFile(filePath);
470         FileMetadataStream stream(CreateIfNotExit(filePath));
471         ASSERT_TRUE(stream.Open());
472         byte *buf = new byte[size](); // Dynamically allocate the buffer with the current test size
473         ASSERT_EQ(stream.Write(buf, size), size);
474         ASSERT_EQ(stream.Flush(), true);
475         ASSERT_EQ(stream.GetSize(), size);
476 
477         // Open the file in binary mode and move the file pointer to the end to get the file size
478         std::ifstream file(filePath, std::ios::binary | std::ios::ate);
479         ASSERT_TRUE(file.is_open());
480 
481         // Get the file size
482         std::streamsize fileSize = file.tellg();
483         file.close();
484 
485         // Compare the file size with the current test size
486         ASSERT_EQ(fileSize, size);
487 
488         delete[] buf; // Don't forget to delete the dynamically allocated buffer
489     }
490 }
491 
492 /**
493  * @tc.name: FileMetadataStream_Open001
494  * @tc.desc: Test the Open function of FileMetadataStream when the file path does
495  * not exist
496  * @tc.type: FUNC
497  */
498 HWTEST_F(MetadataStreamTest, FileMetadataStream_Open001, TestSize.Level3)
499 {
500     // Test the case where the file path does not exist
501     std::string nonExistFilePath = "/data/local/tmp/image/non_exist_file.txt";
502     RemoveFile(nonExistFilePath.c_str());
503     FileMetadataStream stream1(CreateIfNotExit(nonExistFilePath));
504     ASSERT_TRUE(stream1.Open());
505     std::string sourceData = "Hello, world!";
506     stream1.Write((byte *)sourceData.c_str(), sourceData.size());
507     // Read data from stream1
508     byte buffer[SIZE_255];
509     stream1.Seek(0, SeekPos::BEGIN);
510     ssize_t bytesRead = stream1.Read(buffer, sourceData.size());
511     ASSERT_EQ(bytesRead, sourceData.size());
512     buffer[bytesRead] = '\0'; // Add string termination character
513     // Check if the read data is the same as the written data
514     ASSERT_STREQ((char *)buffer, sourceData.c_str());
515     ASSERT_TRUE(stream1.Flush());
516     RemoveFile(nonExistFilePath.c_str());
517 }
518 
519 /**
520  * @tc.name: FileMetadataStream_Open002
521  * @tc.desc: Test the Open function of FileMetadataStream when the file path exists
522  * but is not writable
523  * @tc.type: FUNC
524  */
525 HWTEST_F(MetadataStreamTest, FileMetadataStream_Open002, TestSize.Level3)
526 {
527     // Get the username of the current user
528     uid_t uid = getuid();
529     struct passwd *passwordEntry = getpwuid(uid);
530     if (passwordEntry == nullptr) {
531         perror("getpwuid");
532         return;
533     }
534     std::string username(passwordEntry->pw_name);
535 
536     // Test the case where the file path exists but is not writable
537     std::string nonWritableFilePath = "/data/local/tmp/image/non_writable_file.txt";
538     close(open(nonWritableFilePath.c_str(), O_CREAT, S_IRUSR));
539     FileMetadataStream stream2(nonWritableFilePath);
540     if (username == "root") {
541         // If the current user is root, then it can be opened successfully
542         ASSERT_TRUE(stream2.Open());
543     } else {
544         // If the current user is not root, then it cannot be opened
545         ASSERT_FALSE(stream2.Open());
546     }
547     RemoveFile(nonWritableFilePath.c_str());
548 }
549 
550 /**
551  * @tc.name: FileMetadataStream_Open003
552  * @tc.desc: Test the Open function of FileMetadataStream when the file is already
553  * open
554  * @tc.type: FUNC
555  */
556 HWTEST_F(MetadataStreamTest, FileMetadataStream_Open003, TestSize.Level3)
557 {
558     // Test the case where the file is already open
559     FileMetadataStream stream3(CreateIfNotExit(filePath));
560     ASSERT_TRUE(stream3.Open());
561     ASSERT_TRUE(stream3.Open());
562     ASSERT_TRUE(stream3.Flush());
563 }
564 
565 /**
566  * @tc.name: FileMetadataStream_Open004
567  * @tc.desc: Test the Open function of FileMetadataStream when the file does not
568  * exist
569  * @tc.type: FUNC
570  */
571 HWTEST_F(MetadataStreamTest, FileMetadataStream_Open004, TestSize.Level3)
572 {
573     // Test the case where the file does not exist
574     const char *nonExistentFilePath = "/path/to/nonexistent/file";
575     FileMetadataStream stream(nonExistentFilePath);
576     ASSERT_FALSE(stream.Open(OpenMode::Read));
577 }
578 
579 /**
580  * @tc.name: FileMetadataStream_Open005
581  * @tc.desc: Test the Open twice
582  * @tc.type: FUNC
583  */
584 HWTEST_F(MetadataStreamTest, FileMetadataStream_Open005, TestSize.Level3)
585 {
586     FileMetadataStream stream(filePathSource);
587     ASSERT_TRUE(stream.Open(OpenMode::Read));
588     ASSERT_TRUE(stream.Open(OpenMode::Read));
589 }
590 
591 /**
592  * @tc.name: FileMetadataStream_Read001
593  * @tc.desc: Test the Read function of FileMetadataStream, reading 512 bytes
594  * @tc.type: FUNC
595  */
596 HWTEST_F(MetadataStreamTest, FileMetadataStream_Read001, TestSize.Level3)
597 {
598     FileMetadataStream stream(filePathSource);
599     byte buffer[SIZE_1024];
600     stream.Open(OpenMode::ReadWrite);
601     // Simulate reading 512 bytes
602     ssize_t bytesRead = stream.Read(buffer, SIZE_512);
603     EXPECT_EQ(SIZE_512, bytesRead);
604 }
605 
606 /**
607  * @tc.name: FileMetadataStream_Read002
608  * @tc.desc: Test the Read function of FileMetadataStream, trying to read from a
609  * file that has not been opened
610  * @tc.type: FUNC
611  */
612 HWTEST_F(MetadataStreamTest, FileMetadataStream_Read002, TestSize.Level3)
613 {
614     FileMetadataStream stream(filePathSource);
615     byte buffer[SIZE_1024];
616     // Flush the stream to simulate an unopened file
617     ASSERT_FALSE(stream.Flush());
618     ssize_t bytesRead = stream.Read(buffer, SIZE_512);
619     EXPECT_EQ(-1, bytesRead);
620 }
621 
622 /**
623  * @tc.name: FileMetadataStream_MMap001
624  * @tc.desc: Test the MMap function of FileMetadataStream, trying to write to a
625  * memory-mapped file that is not writable
626  * @tc.type: FUNC
627  */
628 HWTEST_F(MetadataStreamTest, FileMetadataStream_MMap001, TestSize.Level3)
629 {
630     memoryCheck.check = false; // This test is expected to crash, so memory leak
631                                // check is not needed
632     // Assume there is an appropriate way to create or obtain the resources
633     // needed for the test YourResource test_resource; Test the behavior of the
634     // MMap function when isWriteable is false
635     FileMetadataStream stream(filePathSource);
636     byte *result = stream.GetAddr(false);
637     // Assume that checking whether result is not nullptr, or there is another
638     // appropriate verification method
639     ASSERT_EQ(result, nullptr);
640     stream.Open(OpenMode::ReadWrite);
641     result = stream.GetAddr(false);
642     ASSERT_NE(result, nullptr);
643 }
644 
645 /**
646  * @tc.name: FileMetadataStream_MMap002
647  * @tc.desc: Test the MMap function of FileMetadataStream, trying to write to a
648  * memory-mapped file that is writable
649  * @tc.type: FUNC
650  */
651 HWTEST_F(MetadataStreamTest, FileMetadataStream_MMap002, TestSize.Level3)
652 {
653     // Test the behavior of the MMap function when isWriteable is true
654     FileMetadataStream stream(filePathSource);
655     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
656     byte *result = stream.GetAddr(true);
657     ASSERT_NE(result, nullptr);
658     // Try to write data
659     result[0] = 123;
660 
661     // Read the data and check if it is the same as the written data
662     ASSERT_EQ(result[0], 123);
663 }
664 
665 /**
666  * @tc.name: FileMetadataStream_MMap003
667  * @tc.desc: Test whether the MMap function of FileMetadataStream can actually
668  * modify the content of the file
669  * @tc.type: FUNC
670  */
671 HWTEST_F(MetadataStreamTest, FileMetadataStream_MMap003, TestSize.Level3)
672 {
673     // Test whether MMap can actually modify the content of the file
674     FileMetadataStream stream(filePathSource);
675     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
676     byte *result = stream.GetAddr(true);
677     ASSERT_NE(result, nullptr);
678 
679     // Try to write data
680     result[0] = 123;
681 
682     stream.Seek(0, SeekPos::BEGIN);
683     byte buffer[1];
684     ASSERT_EQ(stream.Read(buffer, 1), 1);
685     ASSERT_EQ(buffer[0], 123);
686 
687     // Flush stream
688     ASSERT_TRUE(stream.Flush());
689     FileMetadataStream checkStream(filePathSource);
690     checkStream.Open(OpenMode::ReadWrite);
691     byte checkBuffer[1];
692     ASSERT_EQ(checkStream.Read(checkBuffer, 1), 1);
693 
694     // Check if the data in the file is the same as the data written
695     ASSERT_EQ(checkBuffer[0], 123);
696 }
697 
698 /**
699  * @tc.name: FileMetadataStream_CopyFrom001
700  * @tc.desc: Test the CopyFrom function of FileMetadataStream, copying data from
701  * one stream to another
702  * @tc.type: FUNC
703  */
704 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom001, TestSize.Level3)
705 {
706     FileMetadataStream src(filePathSource);
707     FileMetadataStream dest(CreateIfNotExit(filePathDest));
708 
709     src.Open();
710     // Write some known data to src
711     std::string data = "Hello, world!";
712     ASSERT_EQ(src.Tell(), 0);
713     ASSERT_GE(src.Write((byte *)data.c_str(), data.size()), 0);
714     ASSERT_TRUE(src.Flush());
715     // Call the Transfer function to transfer data from src to dest
716     dest.Open();
717     ASSERT_TRUE(dest.CopyFrom(src));
718     // Read data from dest and verify that it is the same as the data written to
719     // src
720     byte buffer[SIZE_255] = {0};
721 
722     ASSERT_EQ(dest.Seek(0, SeekPos::BEGIN), 0);
723     ASSERT_EQ(dest.Read(buffer, data.size()), data.size());
724     ASSERT_EQ(std::string(buffer, buffer + data.size()), data);
725 
726     // Verify that src is empty
727     ASSERT_EQ(dest.GetSize(), src.GetSize());
728 }
729 
730 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom002, TestSize.Level3)
731 {
732     BufferMetadataStream src;
733     FileMetadataStream dest(CreateIfNotExit(filePathDest));
734     ASSERT_TRUE(src.Open());
735     ASSERT_EQ(dest.Open(), true);
736     src.Write((byte *)"Hello, world!", 13);
737     char bufSrc[14] = {0};
738     src.Seek(0, SeekPos::BEGIN);
739     src.Read((byte *)bufSrc, 13);
740     ASSERT_STREQ(bufSrc, "Hello, world!");
741     ASSERT_TRUE(dest.CopyFrom(src));
742     dest.Seek(0, SeekPos::BEGIN);
743     char buf[14] = {0};
744     dest.Read((byte *)buf, 13);
745     ASSERT_STREQ(buf, "Hello, world!");
746     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), 13), 0);
747 }
748 
749 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom003, TestSize.Level3)
750 {
751     BufferMetadataStream src;
752     FileMetadataStream dest(CreateIfNotExit(filePathDest));
753     src.Open();
754     dest.Open();
755     char buff[METADATA_STREAM_PAGE_SIZE + 1] = {0};
756     src.Write((byte *)buff, sizeof(buff));
757     ASSERT_TRUE(dest.CopyFrom(src));
758     ASSERT_EQ(src.GetSize(), dest.GetSize());
759     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), 4097), 0);
760 }
761 
762 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom004, TestSize.Level3)
763 {
764     BufferMetadataStream src;
765     FileMetadataStream dest(CreateIfNotExit(filePathDest));
766     src.Open();
767     dest.Open();
768     char buff[METADATA_STREAM_PAGE_SIZE - 1] = {0};
769     src.Write((byte *)buff, sizeof(buff));
770     ASSERT_TRUE(dest.CopyFrom(src));
771     ASSERT_EQ(src.GetSize(), dest.GetSize());
772     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
773 }
774 
775 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom005, TestSize.Level3)
776 {
777     RemoveFile(filePath.c_str());
778     FileMetadataStream src(CreateIfNotExit(filePathDest));
779     BufferMetadataStream dest;
780     src.Open();
781     dest.Open();
782     char buff[METADATA_STREAM_PAGE_SIZE - 1] = {0};
783     ASSERT_EQ(src.Write((byte *)buff, sizeof(buff)), sizeof(buff));
784     ASSERT_TRUE(src.Flush());
785     ASSERT_EQ(src.Tell(), sizeof(buff));
786     ASSERT_EQ(src.GetSize(), sizeof(buff));
787     ASSERT_TRUE(dest.CopyFrom(src));
788     ASSERT_EQ(src.GetSize(), dest.GetSize());
789     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
790 }
791 
792 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom006, TestSize.Level3)
793 {
794     for (ssize_t size : testSize) {
795         RemoveFile(filePathDest.c_str());
796         FileMetadataStream src(CreateIfNotExit(filePathDest));
797         BufferMetadataStream dest;
798         src.Open();
799         dest.Open();
800         byte *buf = new byte[size]();
801         ASSERT_EQ(src.Write(buf, size), size);
802         ASSERT_TRUE(src.Flush());
803         ASSERT_EQ(src.Tell(), size);
804         ASSERT_EQ(src.GetSize(), size);
805         ASSERT_TRUE(dest.CopyFrom(src));
806         ASSERT_EQ(src.GetSize(), dest.GetSize());
807         ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
808         delete[] buf;
809     }
810 }
811 
812 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom007, TestSize.Level3)
813 {
814     for (ssize_t size : testSize) {
815         RemoveFile(filePath.c_str());
816         FileMetadataStream dest(CreateIfNotExit(filePathDest));
817         BufferMetadataStream src;
818         src.Open();
819         dest.Open();
820         byte *buf = new byte[size]();
821         ASSERT_EQ(src.Write(buf, size), size);
822         ASSERT_TRUE(src.Flush());
823         ASSERT_EQ(src.Tell(), size);
824         ASSERT_EQ(src.GetSize(), size);
825         ASSERT_TRUE(dest.CopyFrom(src));
826         ASSERT_EQ(src.GetSize(), dest.GetSize());
827         ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
828         delete[] buf;
829     }
830 }
831 
832 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom008, TestSize.Level3)
833 {
834     for (ssize_t size : testSize) {
835         RemoveFile(filePathDest.c_str());
836         RemoveFile(filePathSource.c_str());
837         FileMetadataStream src(CreateIfNotExit(filePathSource));
838         FileMetadataStream dest(CreateIfNotExit(filePathDest));
839         src.Open();
840         dest.Open();
841         byte *buf = new byte[size]();
842         ASSERT_EQ(src.Write(buf, size), size);
843         ASSERT_TRUE(src.Flush());
844         ASSERT_EQ(src.Tell(), size);
845         ASSERT_EQ(src.GetSize(), size);
846         ASSERT_TRUE(dest.CopyFrom(src));
847         ASSERT_EQ(src.GetSize(), dest.GetSize());
848         ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
849         delete[] buf;
850     }
851 }
852 
853 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom009, TestSize.Level3)
854 {
855     for (ssize_t size : testSize) {
856         RemoveFile(filePath.c_str());
857         BufferMetadataStream src;
858         BufferMetadataStream dest;
859         src.Open();
860         dest.Open();
861         byte *buf = new byte[size]();
862         ASSERT_EQ(src.Write(buf, size), size);
863         ASSERT_TRUE(src.Flush());
864         ASSERT_EQ(src.Tell(), size);
865         ASSERT_EQ(src.GetSize(), size);
866         ASSERT_TRUE(dest.CopyFrom(src));
867         ASSERT_EQ(src.GetSize(), dest.GetSize());
868         ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
869         delete[] buf;
870     }
871 }
872 
873 HWTEST_F(MetadataStreamTest, FileMetadataStream_CopyFrom010, TestSize.Level3)
874 {
875     for (ssize_t size : testSize) {
876         RemoveFile(filePathDest.c_str());
877         std::filesystem::copy(backupFilePathSource, filePathSource, std::filesystem::copy_options::overwrite_existing);
878         FileMetadataStream src(CreateIfNotExit(filePathDest));
879         FileMetadataStream dest(CreateIfNotExit(filePathSource));
880         src.Open();
881         dest.Open();
882         byte *buf = new byte[size]();
883         ASSERT_EQ(src.Write(buf, size), size);
884         ASSERT_TRUE(src.Flush());
885         ASSERT_EQ(src.Tell(), size);
886         ASSERT_EQ(src.GetSize(), size);
887         ASSERT_TRUE(dest.CopyFrom(src));
888         ASSERT_EQ(src.GetSize(), dest.GetSize());
889         ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
890         delete[] buf;
891     }
892 }
893 
894 HWTEST_F(MetadataStreamTest, FileMetadataStream_IsEof001, TestSize.Level3)
895 {
896     FileMetadataStream src(filePathSource);
897     src.Open();
898     byte buffer[1];
899     ASSERT_EQ(src.Seek(0, SeekPos::BEGIN), 0);
900     src.Read(buffer, sizeof(buffer));
901     ASSERT_FALSE(src.IsEof());
902     ASSERT_EQ(src.Seek(0, SeekPos::END), src.GetSize());
903     src.Read(buffer, sizeof(buffer));
904     ASSERT_TRUE(src.IsEof());
905 }
906 
907 /**
908  * @tc.name: FileMetadataStream_ReadByte001
909  * @tc.desc: Test the ReadByte function of FileMetadataStream, comparing its output
910  * with the Read function
911  * @tc.type: FUNC
912  */
913 HWTEST_F(MetadataStreamTest, FileMetadataStream_ReadByte001, TestSize.Level3)
914 {
915     FileMetadataStream stream(filePathSource);
916     stream.Open(OpenMode::ReadWrite);
917 
918     // Read 10 bytes using Read function
919     byte buffer[SIZE_10];
920     stream.Read(buffer, SIZE_10);
921 
922     // Reset the file offset
923     stream.Seek(0, SeekPos::BEGIN);
924 
925     // Read 10 bytes using ReadByte function
926     byte byteBuffer[SIZE_10];
927     for (int i = 0; i < SIZE_10; i++) {
928         byteBuffer[i] = stream.ReadByte();
929     }
930 
931     // Compare the results
932     for (int i = 0; i < SIZE_10; i++) {
933         EXPECT_EQ(buffer[i], byteBuffer[i]);
934     }
935 }
936 
937 /**
938  * @tc.name: FileMetadataStream_ReadByte002
939  * @tc.desc: Test the ReadByte function of FileMetadataStream, trying to read
940  * beyond the end of the file
941  * @tc.type: FUNC
942  */
943 HWTEST_F(MetadataStreamTest, FileMetadataStream_ReadByte002, TestSize.Level3)
944 {
945     FileMetadataStream stream(filePathSource);
946     stream.Open(OpenMode::ReadWrite);
947 
948     // Set the file offset to the end of the file
949     EXPECT_EQ(stream.Seek(0, SeekPos::END), stream.GetSize());
950 
951     // Try to read one more byte
952     int result = stream.ReadByte();
953 
954     // Check if the result is -1
955     EXPECT_EQ(result, -1);
956 }
957 
958 /**
959  * @tc.name: FileMetadataStream_CONSTRUCTOR001
960  * @tc.desc: Test the constructor of FileMetadataStream, checking if it can
961  * correctly initialize a stream from an existing file pointer
962  * @tc.type: FUNC
963  */
964 HWTEST_F(MetadataStreamTest, FileMetadataStream_CONSTRUCTOR001, TestSize.Level3)
965 {
966     FileMetadataStream stream(CreateIfNotExit(filePath));
967     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
968     std::string sourceData = "Hello, world!";
969     ASSERT_EQ(stream.Seek(5, SeekPos::BEGIN), 5);
970     ASSERT_EQ(stream.Write((byte *)sourceData.c_str(), sourceData.size()), sourceData.size());
971 
972     FileMetadataStream cloneStream(fileno(stream.fp_));
973     ASSERT_TRUE(stream.Flush());
974     ASSERT_TRUE(cloneStream.Open(OpenMode::ReadWrite));
975     // Read the data from cloneStream
976     byte buffer[SIZE_255];
977     cloneStream.Seek(5, SeekPos::BEGIN);
978     ssize_t bytesRead = cloneStream.Read(buffer, sourceData.size());
979     ASSERT_EQ(bytesRead, sourceData.size());
980     buffer[bytesRead] = '\0'; // Add string termination character
981 
982     // Check if the read data is the same as the data in the source file
983     ASSERT_STREQ((char *)buffer, sourceData.c_str());
984 
985     // Write some new data to cloneStream
986     std::string newData = "New data";
987     cloneStream.Write((byte *)newData.c_str(), newData.size());
988 
989     // Read the data from cloneStream again
990     cloneStream.Seek(0, SeekPos::BEGIN);
991     bytesRead = cloneStream.Read(buffer, sizeof(buffer) - 1);
992     buffer[bytesRead] = '\0'; // Add string termination character
993 
994     // Check if the read data contains the new data
995     ASSERT_STRNE((char *)buffer, newData.c_str());
996 }
997 
998 /**
999  * @tc.name: FileMetadataStream_CONSTRUCTOR002
1000  * @tc.desc: Test the constructor of FileMetadataStream, checking if it can
1001  * correctly initialize a stream from an existing file descriptor
1002  * @tc.type: FUNC
1003  */
1004 HWTEST_F(MetadataStreamTest, FileMetadataStream_CONSTRUCTOR002, TestSize.Level3)
1005 {
1006     // Create and open a temporary file
1007     std::string tempFile = tmpDirectory + "/testfile";
1008     int fileDescription = open(tempFile.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
1009     ASSERT_NE(fileDescription, -1);
1010 
1011     // Use the file descriptor to create a new FileMetadataStream object
1012     FileMetadataStream stream(fileDescription);
1013     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
1014     ASSERT_NE(stream.dupFD_, -1);
1015     // Check the state of the FileMetadataStream object
1016     ASSERT_TRUE(stream.fp_ != nullptr);
1017     ASSERT_EQ(stream.mappedMemory_, nullptr);
1018     ASSERT_EQ(stream.Tell(), 0);
1019 
1020     // Write data
1021     byte writeData[SIZE_10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
1022     ssize_t bytesWritten = stream.Write(writeData, sizeof(writeData));
1023     ASSERT_EQ(bytesWritten, sizeof(writeData));
1024 
1025     // Reset the file pointer to the beginning of the file
1026     stream.Seek(0, SeekPos::BEGIN);
1027 
1028     // Read data
1029     byte readData[SIZE_10] = {0};
1030     ssize_t bytesRead = stream.Read(readData, sizeof(readData));
1031     ASSERT_EQ(bytesRead, sizeof(readData));
1032 
1033     // Check if the read data is the same as the written data
1034     for (size_t i = 0; i < sizeof(writeData); ++i) {
1035         ASSERT_EQ(writeData[i], readData[i]);
1036     }
1037 
1038     // Close the file
1039     close(fileDescription);
1040     RemoveFile(tempFile.c_str());
1041 }
1042 
1043 /**
1044  * @tc.name: FileMetadataStream_CONSTRUCTOR003
1045  * @tc.desc: Test the constructor of FileMetadataStream, checking if it can
1046  * correctly initialize a stream from an existing file descriptor and handle
1047  * file operations
1048  * @tc.type: FUNC
1049  */
1050 HWTEST_F(MetadataStreamTest, FileMetadataStream_CONSTRUCTOR003, TestSize.Level3)
1051 {
1052     int fdCount = CountOpenFileDescriptors();
1053     std::string tempFile = tmpDirectory + "/testfile";
1054     int fileDescriptor = open(tempFile.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
1055     ASSERT_EQ(fdCount + 1, CountOpenFileDescriptors());
1056     int dupFD = dup(fileDescriptor);
1057     ASSERT_EQ(fdCount + 2, CountOpenFileDescriptors());
1058     ASSERT_NE(fileDescriptor, -1);
1059     FILE *fileStream = fdopen(dupFD, "r+"); // Change "rb" to "wb" for writing in binary mode
1060     ASSERT_EQ(fdCount + 2, CountOpenFileDescriptors());
1061     ;
1062     ASSERT_NE(fileStream, nullptr);
1063     std::string text = "Hello, world!";
1064     ssize_t result = fwrite(text.c_str(), sizeof(char), text.size(),
1065         fileStream); // Use sizeof(char) as the second argument
1066     ASSERT_EQ(ferror(fileStream), 0);
1067     ASSERT_EQ(result, text.size());
1068 
1069     // Reset the file pointer to the beginning of the file
1070     rewind(fileStream);
1071 
1072     ASSERT_EQ(fdCount + 2, CountOpenFileDescriptors());
1073     fileno(fileStream);
1074     ASSERT_EQ(fdCount + 2, CountOpenFileDescriptors());
1075 
1076     // Read and verify the data
1077     char buffer[SIZE_255];
1078     result = fread(buffer, sizeof(char), text.size(), fileStream);
1079     ASSERT_EQ(result, text.size());
1080     buffer[result] = '\0'; // Add string termination character
1081     ASSERT_STREQ(buffer, text.c_str());
1082 
1083     fclose(fileStream);
1084     ASSERT_EQ(fdCount + 1, CountOpenFileDescriptors());
1085     close(fileDescriptor);
1086     ASSERT_EQ(fdCount, CountOpenFileDescriptors());
1087 }
1088 
1089 /**
1090  * @tc.name: FileMetadataStream_CONSTRUCTOR004
1091  * @tc.desc: Test the constructor of FileMetadataStream, checking if it can
1092  * correctly initialize a stream from an existing file descriptor and handle
1093  * file operations using the stream's file pointer
1094  * @tc.type: FUNC
1095  */
1096 HWTEST_F(MetadataStreamTest, FileMetadataStream_CONSTRUCTOR004, TestSize.Level3)
1097 {
1098     std::string tempFile = tmpDirectory + "/testfile";
1099     int fileDescriptor = open(tempFile.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
1100     FileMetadataStream stream(fileDescriptor);
1101     int dupFD = stream.dupFD_;
1102     ASSERT_NE(fileDescriptor, -1);
1103     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
1104     FILE *fileStream = stream.fp_; // Change "rb" to "wb" for writing in binary mode
1105     // binary mode
1106     ASSERT_NE(fileStream, nullptr);
1107     std::string text = "Hello, world!";
1108     ssize_t result = fwrite(text.c_str(), sizeof(char), text.size(),
1109         fileStream); // Use sizeof(char) as the second argument
1110     ASSERT_EQ(ferror(fileStream), 0);
1111     ASSERT_EQ(result, text.size());
1112 
1113     // Reset the file pointer to the beginning of the file
1114     rewind(fileStream);
1115 
1116     // Read and verify the data
1117     char buffer[SIZE_255];
1118     result = fread(buffer, sizeof(char), text.size(), fileStream);
1119     ASSERT_EQ(result, text.size());
1120     buffer[result] = '\0'; // Add string termination character
1121     ASSERT_STREQ(buffer, text.c_str());
1122 
1123     fclose(fileStream);
1124     close(dupFD);
1125     close(fileDescriptor);
1126 }
1127 
1128 HWTEST_F(MetadataStreamTest, FileMetadataStream_CONSTRUCTOR005, TestSize.Level3)
1129 {
1130     int fileDescriptor = open(filePathSource.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
1131     FileMetadataStream *stream = new FileMetadataStream(fileDescriptor);
1132     ASSERT_FALSE(stream->IsOpen());
1133     ASSERT_TRUE(stream->Open());
1134     delete stream;
1135     stream = new FileMetadataStream(fileDescriptor);
1136     ASSERT_TRUE(stream->Open());
1137     delete stream;
1138 }
1139 
1140 /**
1141  * @tc.name: FileMetadataStream_DESTRUCTOR001
1142  * @tc.desc: Test the destructor of FileMetadataStream, checking if it can
1143  * correctly handle the deletion of a non-existing file
1144  * @tc.type: FUNC
1145  */
1146 HWTEST_F(MetadataStreamTest, FileMetadataStream_DESTRUCTOR001, TestSize.Level3)
1147 {
1148     FileMetadataStream *stream = new FileMetadataStream("/data/fileNotExist");
1149     ASSERT_FALSE(stream->Open());
1150     ASSERT_EQ(stream->Write((byte *)"Hello, the world", 16), -1);
1151     stream->GetAddr();
1152     ASSERT_FALSE(stream->Flush());
1153     delete stream;
1154 }
1155 
1156 /**
1157  * @tc.name: FileMetadataStream_Seek001
1158  * @tc.desc: Test the Seek function of FileMetadataStream, checking if it can
1159  * correctly change the position of the file pointer
1160  * @tc.type: FUNC
1161  */
1162 HWTEST_F(MetadataStreamTest, FileMetadataStream_Seek001, TestSize.Level3)
1163 {
1164     RemoveFile(filePath.c_str());
1165     FileMetadataStream stream(CreateIfNotExit(filePath));
1166     stream.Open(OpenMode::ReadWrite);
1167     std::string sourceData = "Hello, world!";
1168     ASSERT_EQ(stream.Tell(), 0);
1169     stream.Write((byte *)sourceData.c_str(), sourceData.size());
1170     ASSERT_EQ(stream.Tell(), sourceData.size());
1171     stream.Seek(2, SeekPos::BEGIN);
1172     ASSERT_EQ(stream.Tell(), 2);
1173     byte buffer[SIZE_255];
1174     ssize_t bytesRead = stream.Read(buffer, 1);
1175     buffer[bytesRead] = '\0'; // Add string termination character
1176     ASSERT_STREQ((char *)buffer, "l");
1177     ASSERT_EQ(stream.Tell(), 3);
1178     stream.Seek(3, SeekPos::CURRENT);
1179     ASSERT_EQ(stream.Tell(), 6);
1180     bytesRead = stream.Read(buffer, 1);
1181     buffer[bytesRead] = '\0'; // Add string termination character
1182     ASSERT_STREQ((char *)buffer, " ");
1183     stream.Seek(0, SeekPos::END);
1184     ASSERT_EQ(stream.Tell(), sourceData.size());
1185 }
1186 
1187 /**
1188  * @tc.name: BufferMetadataStream_Open001
1189  * @tc.desc: Test the Open function of BufferMetadataStream, checking if it can
1190  * correctly open a stream
1191  * @tc.type: FUNC
1192  */
1193 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Open001, TestSize.Level3)
1194 {
1195     BufferMetadataStream stream;
1196     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
1197 }
1198 
1199 /**
1200  * @tc.name: BufferMetadataStream_Read001
1201  * @tc.desc: Test the Read function of BufferMetadataStream, checking if it can
1202  * correctly read data from the stream
1203  * @tc.type: FUNC
1204  */
1205 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Read001, TestSize.Level3)
1206 {
1207     BufferMetadataStream stream;
1208     ASSERT_TRUE(stream.Open(OpenMode::ReadWrite));
1209 
1210     // Write a string
1211     std::string sourceData = "Hello, world!";
1212     ASSERT_EQ(stream.Tell(), 0);
1213     stream.Write((byte *)sourceData.c_str(), sourceData.size());
1214 
1215     // Read the string
1216     byte buffer[SIZE_255];
1217     stream.Seek(0, SeekPos::BEGIN);
1218     size_t bytesRead = stream.Read(buffer, sourceData.size());
1219     buffer[bytesRead] = '\0'; // Add string termination character
1220 
1221     // Compare the read string with the written string
1222     ASSERT_STREQ((char *)buffer, sourceData.c_str());
1223 }
1224 
1225 /**
1226  * @tc.name: BufferMetadataStream_Write001
1227  * @tc.desc: Test the Write function of BufferMetadataStream, checking if it can
1228  * correctly write data to the stream
1229  * @tc.type: FUNC
1230  */
1231 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Write001, TestSize.Level3)
1232 {
1233     BufferMetadataStream stream;
1234     byte data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
1235     stream.Open(OpenMode::ReadWrite);
1236     size_t size = sizeof(data) / sizeof(data[0]);
1237     int offset = 0;
1238     stream.Seek(0, SeekPos::BEGIN);
1239     ssize_t bytesWritten = stream.Write(data, size);
1240     ASSERT_EQ(bytesWritten, size);
1241     offset = stream.Tell();
1242     ASSERT_EQ(stream.Tell(), size);
1243     ASSERT_NE(offset, 0);
1244     byte readData[10] = {0};
1245     stream.Seek(0, SeekPos::BEGIN);
1246     ASSERT_EQ(stream.Tell(), 0);
1247     ssize_t bytesRead = stream.Read(readData, size);
1248     ASSERT_EQ(bytesRead, size);
1249 
1250     for (size_t i = 0; i < size; ++i) {
1251         ASSERT_EQ(data[i], readData[i]);
1252     }
1253 }
1254 
1255 /**
1256  * @tc.name: BufferMetadataStream_Write002
1257  * @tc.desc: Test the Write function of BufferMetadataStream, checking if it can
1258  * correctly write a string to the stream
1259  * @tc.type: FUNC
1260  */
1261 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Write002, TestSize.Level3)
1262 {
1263     BufferMetadataStream stream;
1264     stream.Open(OpenMode::ReadWrite);
1265     stream.Write((byte *)"Hello, world!", 13);
1266     ASSERT_EQ(stream.capacity_, METADATA_STREAM_PAGE_SIZE);
1267     ASSERT_EQ(stream.Tell(), 13);
1268 }
1269 
1270 /**
1271  * @tc.name: BufferMetadataStream_Write003
1272  * @tc.desc: Test the Write function of BufferMetadataStream, checking if it can
1273  * correctly handle large data
1274  * @tc.type: FUNC
1275  */
1276 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Write003, TestSize.Level3)
1277 {
1278     BufferMetadataStream stream;
1279     stream.Open(OpenMode::ReadWrite);
1280     byte data[METADATA_STREAM_PAGE_SIZE + 1] = {0};  // Create a 4097-byte data
1281     stream.Write(data, METADATA_STREAM_PAGE_SIZE + 1); // Write 4097 bytes of data
1282     ASSERT_GE(stream.capacity_,
1283         METADATA_STREAM_PAGE_SIZE + 1);                      // Check if the buffer capacity is at least 4097
1284     ASSERT_EQ(stream.Tell(), METADATA_STREAM_PAGE_SIZE + 1); // Check if the write position is correct
1285 }
1286 
1287 /**
1288  * @tc.name: BufferImageStream_Write004
1289  * @tc.desc: Test the Write function of BufferImageStream, checking if it can
1290  * correctly handle data of the exact buffer capacity
1291  * @tc.type: FUNC
1292  */
1293 HWTEST_F(MetadataStreamTest, BufferImageStream_Write004, TestSize.Level3)
1294 {
1295     BufferMetadataStream stream;
1296     stream.Open();
1297 
1298     byte data[METADATA_STREAM_PAGE_SIZE] = {0};  // Create a 4096-byte data
1299     stream.Write(data, METADATA_STREAM_PAGE_SIZE); // Write 4096 bytes of data
1300     ASSERT_EQ(stream.capacity_,
1301         METADATA_STREAM_PAGE_SIZE); // Check if the buffer capacity is 4096
1302     ASSERT_EQ(stream.Tell(),
1303         METADATA_STREAM_PAGE_SIZE); // Check if the write position is correct
1304 }
1305 
1306 /**
1307  * @tc.name: BufferImageStream_Write005
1308  * @tc.desc: Test the Write function of BufferImageStream, checking if it can
1309  * correctly handle fixed buffer size
1310  * @tc.type: FUNC
1311  */
1312 HWTEST_F(MetadataStreamTest, BufferImageStream_Write005, TestSize.Level3)
1313 {
1314     char text[] = "Hello, world!";
1315     BufferMetadataStream stream((byte *)text, sizeof(text), BufferMetadataStream::Fix);
1316     ASSERT_TRUE(stream.Open());
1317     ASSERT_EQ(stream.Write((byte *)"Hi", 2), 2);
1318     ASSERT_EQ(stream.Tell(), 2);
1319     ASSERT_STREQ(text, "Hillo, world!");
1320     ASSERT_EQ(stream.Write((byte *)"this is a very long text", 24), -1);
1321     ASSERT_STREQ(text, "Hillo, world!");
1322 }
1323 
1324 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Write006, TestSize.Level3)
1325 {
1326     for (ssize_t size : testSize) {
1327         BufferMetadataStream stream;
1328         ASSERT_TRUE(stream.Open());
1329         byte *buf = new byte[size](); // Dynamically allocate the buffer with the current test size
1330         ASSERT_EQ(stream.Write(buf, size), size);
1331         ASSERT_EQ(stream.GetSize(), size);
1332 
1333         delete[] buf; // Don't forget to delete the dynamically allocated buffer
1334     }
1335 }
1336 
1337 /**
1338  * @tc.name: BufferImageStream_Write006
1339  * @tc.desc: Test the Write function of BufferImageStream, checking if it can
1340  * correctly handle dynamic buffer size
1341  * @tc.type: FUNC
1342  */
1343 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Write007, TestSize.Level3)
1344 {
1345     char text[] = "Hello, world!";
1346     BufferMetadataStream stream((byte *)text, sizeof(text), BufferMetadataStream::Dynamic);
1347     ASSERT_TRUE(stream.Open());
1348     ASSERT_EQ(stream.Write((byte *)"Hi", 2), 2);
1349     ASSERT_EQ(stream.Tell(), 2);
1350     ASSERT_STREQ(text, "Hillo, world!");
1351     stream.Seek(0, SeekPos::BEGIN);
1352     ASSERT_EQ(stream.Write((byte *)"this is a very long text", 25), 25);
1353     ASSERT_STREQ((char *)stream.GetAddr(false), "this is a very long text");
1354 }
1355 
1356 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Write008, TestSize.Level3)
1357 {
1358     BufferMetadataStream stream;
1359     byte *buf = new byte[14];
1360     ASSERT_TRUE(stream.Open());
1361     stream.Write((uint8_t *)"Hello, world!\0", 14);
1362     stream.Seek(4, SeekPos::BEGIN);
1363     stream.Write((uint8_t *)"a", 1);
1364     stream.Write((uint8_t *)"b", 1);
1365     stream.Seek(0, SeekPos::BEGIN);
1366     stream.Read(buf, 14);
1367     ASSERT_STREQ((char *)buf, "Hellab world!");
1368     delete[] buf;
1369 }
1370 
1371 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Write009, TestSize.Level3)
1372 {
1373     BufferMetadataStream stream;
1374     byte *buf = new byte[2000];
1375     byte *buf2 = new byte[500];
1376     ASSERT_TRUE(stream.Open());
1377     stream.Write(buf, 2000);
1378     stream.Write(buf2, 500);
1379     stream.Write(buf2, 500);
1380     ASSERT_EQ(stream.GetSize(), 3000);
1381     ASSERT_EQ(stream.capacity_, 32768);
1382     delete[] buf;
1383     delete[] buf2;
1384 }
1385 
1386 /**
1387  * @tc.name: BufferMetadataStream_Close002
1388  * @tc.desc: Test the Close function of BufferMetadataStream after writing to the
1389  * stream
1390  * @tc.type: FUNC
1391  */
1392 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Close002, TestSize.Level3)
1393 {
1394     BufferMetadataStream stream;
1395     stream.Write((byte *)"Hello, world!", 13);
1396     ASSERT_NE(stream.buffer_, nullptr);
1397 }
1398 
1399 /**
1400  * @tc.name: BufferImageStream_Close003
1401  * @tc.desc: Test the Close function of BufferImageStream after releasing the
1402  * stream
1403  * @tc.type: FUNC
1404  */
1405 HWTEST_F(MetadataStreamTest, BufferImageStream_Close003, TestSize.Level3)
1406 {
1407     BufferMetadataStream stream;
1408     stream.Write((byte *)"Hello, world!", 13);
1409     delete[] stream.Release();
1410     ASSERT_EQ(stream.buffer_, nullptr);
1411 }
1412 
1413 /**
1414  * @tc.name: BufferMetadataStream_Close004
1415  * @tc.desc: Test the Close function of BufferMetadataStream after closing the
1416  * stream
1417  * @tc.type: FUNC
1418  */
1419 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Close004, TestSize.Level3)
1420 {
1421     BufferMetadataStream stream;
1422     stream.Write((byte *)"Hello, world!", 13);
1423     stream.Close();
1424     ASSERT_EQ(stream.buffer_, nullptr);
1425 }
1426 
1427 /**
1428  * @tc.name: BufferImageStream_Close006
1429  * @tc.desc: Test the Close function of BufferImageStream with a fixed size
1430  * buffer after releasing the stream
1431  * @tc.type: FUNC
1432  */
1433 HWTEST_F(MetadataStreamTest, BufferImageStream_Close006, TestSize.Level3)
1434 {
1435     char text[] = "Hello, world!";
1436     BufferMetadataStream stream((byte *)text, sizeof(text), BufferMetadataStream::Fix);
1437     stream.Release();
1438     ASSERT_EQ(stream.buffer_, nullptr);
1439 }
1440 
1441 /**
1442  * @tc.name: BufferImageStream_Close007
1443  * @tc.desc: Test the Close function of BufferImageStream with a dynamic size
1444  * buffer after writing and releasing the stream
1445  * @tc.type: FUNC
1446  */
1447 HWTEST_F(MetadataStreamTest, BufferImageStream_Close007, TestSize.Level3)
1448 {
1449     char text[] = "Hello, world!";
1450     BufferMetadataStream stream((byte *)text, sizeof(text), BufferMetadataStream::Dynamic);
1451     stream.Write((byte *)"this is a very very long text", 28);
1452     delete[] stream.Release();
1453 
1454     DataBuf dataBuf(10);
1455     dataBuf.WriteUInt8(0, 123);
1456     EXPECT_EQ(dataBuf.ReadUInt8(0), 123);
1457 }
1458 
1459 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CopyFrom001, TestSize.Level3)
1460 {
1461     FileMetadataStream src(filePathSource);
1462     BufferMetadataStream dest;
1463     src.Open();
1464     dest.Open();
1465     ASSERT_TRUE(dest.CopyFrom(src));
1466     ASSERT_EQ(src.GetSize(), dest.GetSize());
1467     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
1468 }
1469 
1470 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CopyFrom002, TestSize.Level3)
1471 {
1472     BufferMetadataStream src;
1473     BufferMetadataStream dest;
1474     src.Open();
1475     dest.Open();
1476     src.Write((byte *)"Hello, world!", 13);
1477     ASSERT_TRUE(dest.CopyFrom(src));
1478     ASSERT_EQ(src.GetSize(), dest.GetSize());
1479     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
1480 }
1481 
1482 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CopyFrom003, TestSize.Level3)
1483 {
1484     BufferMetadataStream src;
1485     BufferMetadataStream dest;
1486     src.Open();
1487     dest.Open();
1488     char buff[METADATA_STREAM_PAGE_SIZE + 1] = {0};
1489     src.Write((byte *)buff, METADATA_STREAM_PAGE_SIZE + 1);
1490     ASSERT_TRUE(dest.CopyFrom(src));
1491     ASSERT_EQ(src.GetSize(), dest.GetSize());
1492     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
1493 }
1494 
1495 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CopyFrom004, TestSize.Level3)
1496 {
1497     BufferMetadataStream src;
1498     BufferMetadataStream dest;
1499     src.Open();
1500     dest.Open();
1501     char buff[METADATA_STREAM_PAGE_SIZE - 1] = {0};
1502     src.Write((byte *)buff, METADATA_STREAM_PAGE_SIZE - 1);
1503     ASSERT_TRUE(dest.CopyFrom(src));
1504     ASSERT_EQ(src.GetSize(), dest.GetSize());
1505     ASSERT_EQ(memcmp(src.GetAddr(), dest.GetAddr(), src.GetSize()), 0);
1506 }
1507 
1508 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CopyFrom005, TestSize.Level3)
1509 {
1510     BufferMetadataStream temp;
1511     temp.Open();
1512     temp.Write((uint8_t*)"Hello, world", 13);
1513     BufferMetadataStream src(temp.GetAddr(), temp.GetSize(), BufferMetadataStream::Dynamic);
1514     FileMetadataStream dest(filePathSource);
1515     src.Open();
1516     dest.Open();
1517     bool ret = src.CopyFrom(dest);
1518     ASSERT_EQ(ret, true);
1519 }
1520 
1521 /**
1522  * @tc.name: BufferMetadataStream_ReadByte001
1523  * @tc.desc: test the ReadByte function of BufferMetadataStream
1524  * @tc.type: FUNC
1525  */
1526 HWTEST_F(MetadataStreamTest, BufferMetadataStream_ReadByte001, TestSize.Level3)
1527 {
1528     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_ReadByte001 start";
1529     byte *originData = nullptr;
1530     size_t size = 4;
1531     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Dynamic;
1532     int originalFd = 0;
1533     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1534     BufferMetadataStream stream = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1535     int ret = stream.ReadByte();
1536     ASSERT_EQ(ret, -1);
1537     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_ReadByte001 end";
1538 }
1539 
1540 /**
1541  * @tc.name: BufferMetadataStream_ReadByte002
1542  * @tc.desc: test the ReadByte function of BufferMetadataStream
1543  * @tc.type: FUNC
1544  */
1545 HWTEST_F(MetadataStreamTest, BufferMetadataStream_ReadByte002, TestSize.Level3)
1546 {
1547     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_ReadByte002 start";
1548     byte originData[4] = {1, 2, 3, 4};
1549     size_t size = 4;
1550     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Dynamic;
1551     int originalFd = 0;
1552     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1553     BufferMetadataStream stream = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1554     stream.currentOffset_ = 128;
1555     int ret = stream.ReadByte();
1556     ASSERT_EQ(ret, -1);
1557     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_ReadByte002 end";
1558 }
1559 
1560 /**
1561  * @tc.name: BufferMetadataStream_Seek001
1562  * @tc.desc: test the Seek function of BufferMetadataStream
1563  * @tc.type: FUNC
1564  */
1565 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Seek001, TestSize.Level3)
1566 {
1567     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Seek001 start";
1568     byte originData[4] = {1, 2, 3, 4};
1569     size_t size = 4;
1570     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Dynamic;
1571     int originalFd = 0;
1572     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1573     BufferMetadataStream stream = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1574     long offset = 0;
1575     SeekPos pos = SeekPos::END;
1576     long ret = stream.Seek(offset, pos);
1577     ASSERT_EQ(ret, 4);
1578     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Seek001 end";
1579 }
1580 
1581 /**
1582  * @tc.name: BufferMetadataStream_Seek002
1583  * @tc.desc: test the Seek function of BufferMetadataStream
1584  * @tc.type: FUNC
1585  */
1586 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Seek002, TestSize.Level3)
1587 {
1588     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Seek002 start";
1589     byte originData[4] = {1, 2, 3, 4};
1590     size_t size = 4;
1591     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Dynamic;
1592     int originalFd = 0;
1593     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1594     BufferMetadataStream stream = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1595     long offset = 128;
1596     SeekPos pos = SeekPos::BEGIN;
1597     long ret = stream.Seek(offset, pos);
1598     ASSERT_EQ(ret, 4);
1599     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Seek002 end";
1600 }
1601 
1602 /**
1603  * @tc.name: BufferMetadataStream_Read002
1604  * @tc.desc: test the Read function of BufferMetadataStream
1605  * @tc.type: FUNC
1606  */
1607 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Read002, TestSize.Level3)
1608 {
1609     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Read002 start";
1610     byte originData[4] = {1, 2, 3, 4};
1611     size_t size = 4;
1612     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Dynamic;
1613     int originalFd = 0;
1614     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1615     BufferMetadataStream stream = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1616     stream.currentOffset_ = 128;
1617     auto buf = static_cast<uint8_t *>(malloc(size));
1618     ssize_t ret = stream.Read(buf, size);
1619     ASSERT_EQ(ret, -1);
1620     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Read002 end";
1621 }
1622 
1623 /**
1624  * @tc.name: BufferMetadataStream_Read003
1625  * @tc.desc: test the Read function of BufferMetadataStream
1626  * @tc.type: FUNC
1627  */
1628 HWTEST_F(MetadataStreamTest, BufferMetadataStream_Read003, TestSize.Level3)
1629 {
1630     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Read003 start";
1631     byte originData[4] = {1, 2, 3, 4};
1632     size_t size = 4;
1633     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Dynamic;
1634     int originalFd = 0;
1635     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1636     BufferMetadataStream stream = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1637     auto buf = static_cast<uint8_t *>(malloc(size));
1638     ssize_t ret = stream.Read(buf, size);
1639     ASSERT_EQ(ret, -1);
1640     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_Read003 end";
1641 }
1642 
1643 /**
1644  * @tc.name: BufferMetadataStream_CopyFrom006
1645  * @tc.desc: test the CopyFrom function of BufferMetadataStream
1646  * @tc.type: FUNC
1647  */
1648 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CopyFrom006, TestSize.Level3)
1649 {
1650     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_CopyFrom006 start";
1651     BufferMetadataStream src;
1652     BufferMetadataStream dest;
1653     bool ret = dest.CopyFrom(src);
1654     ASSERT_EQ(ret, true);
1655     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_CopyFrom006 end";
1656 }
1657 
1658 /**
1659  * @tc.name: BufferMetadataStream_CopyFrom007
1660  * @tc.desc: test the CopyFrom function of BufferMetadataStream
1661  * @tc.type: FUNC
1662  */
1663 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CopyFrom007, TestSize.Level3)
1664 {
1665     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_CopyFrom007 start";
1666     BufferMetadataStream src;
1667     byte originData[4] = {1, 2, 3, 4};
1668     size_t size = 4;
1669     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Fix;
1670     int originalFd = 0;
1671     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1672     BufferMetadataStream dest = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1673     dest.capacity_ = 0;
1674     src.bufferSize_ = 8;
1675     bool ret = dest.CopyFrom(src);
1676     ASSERT_EQ(ret, false);
1677     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_CopyFrom007 end";
1678 }
1679 
1680 /**
1681  * @tc.name: BufferMetadataStream_CalculateNewCapacity001
1682  * @tc.desc: test the CalculateNewCapacity function of BufferMetadataStream
1683  * @tc.type: FUNC
1684  */
1685 HWTEST_F(MetadataStreamTest, BufferMetadataStream_CalculateNewCapacity001, TestSize.Level3)
1686 {
1687     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_CalculateNewCapacity001 start";
1688     BufferMetadataStream src;
1689     byte originData[4] = {1, 2, 3, 4};
1690     size_t size = 4;
1691     BufferMetadataStream::MemoryMode mode = BufferMetadataStream::MemoryMode::Fix;
1692     int originalFd = 0;
1693     const std::string &originalPath = "/data/local/tmp/image/test.txt";
1694     BufferMetadataStream stream = BufferMetadataStream(originData, size, mode, originalFd, originalPath);
1695     long currentOffset = 0;
1696     stream.expandCount_ = 5;
1697     long ret = stream.CalculateNewCapacity(currentOffset, size);
1698     ASSERT_EQ(ret, BufferMetadataStream::METADATA_STREAM_CAPACITY_30MB);
1699     GTEST_LOG_(INFO) << "MetadataStreamTest: BufferMetadataStream_CalculateNewCapacity001 end";
1700 }
1701 
1702 /**
1703  * @tc.name: FileMetadataStream_Read003
1704  * @tc.desc: Test the Read function of FileMetadataStream
1705  * @tc.type: FUNC
1706  */
1707 HWTEST_F(MetadataStreamTest, FileMetadataStream_Read003, TestSize.Level3)
1708 {
1709     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Read003 start";
1710     const std::string &filePath = "";
1711     FileMetadataStream stream = FileMetadataStream(filePath);
1712     stream.fp_ = fopen("/data/local/tmp/image/test_exif.jpg", "rb");
1713     byte buffer[SIZE_1024];
1714     ssize_t ret = stream.Read(buffer, 0);
1715     ASSERT_EQ(ret, 0);
1716     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Read003 end";
1717 }
1718 
1719 /**
1720  * @tc.name: FileMetadataStream_ReadByte003
1721  * @tc.desc: Test the ReadByte function of FileMetadataStream
1722  * @tc.type: FUNC
1723  */
1724 HWTEST_F(MetadataStreamTest, FileMetadataStream_ReadByte003, TestSize.Level3)
1725 {
1726     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_ReadByte003 start";
1727     const std::string &filePath = "/data/local/tmp/image/not_exist.jpg";
1728     FileMetadataStream stream = FileMetadataStream(filePath);
1729     int ret = stream.ReadByte();
1730     ASSERT_EQ(ret, -1);
1731     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_ReadByte003 end";
1732 }
1733 
1734 /**
1735  * @tc.name: FileMetadataStream_Seek002
1736  * @tc.desc: Test the Seek function of FileMetadataStream
1737  * @tc.type: FUNC
1738  */
1739 HWTEST_F(MetadataStreamTest, FileMetadataStream_Seek002, TestSize.Level3)
1740 {
1741     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Seek002 start";
1742     const std::string &filePath = "/data/local/tmp/image/not_exist.jpg";
1743     FileMetadataStream stream = FileMetadataStream(filePath);
1744     long offset = 0;
1745     SeekPos pos = SeekPos::BEGIN;
1746     long ret = stream.Seek(offset, pos);
1747     ASSERT_EQ(ret, -1);
1748     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Seek002 end";
1749 }
1750 
1751 /**
1752  * @tc.name: FileMetadataStream_Tell001
1753  * @tc.desc: Test the Tell function of FileMetadataStream
1754  * @tc.type: FUNC
1755  */
1756 HWTEST_F(MetadataStreamTest, FileMetadataStream_Tell001, TestSize.Level3)
1757 {
1758     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Tell001 start";
1759     const std::string &filePath = "/data/local/tmp/image/not_exist.jpg";
1760     FileMetadataStream stream = FileMetadataStream(filePath);
1761     long ret = 0;
1762     ret = stream.Tell();
1763     ASSERT_EQ(ret, -1);
1764     stream.initPath_ = FileMetadataStream::INIT_FROM_FD;
1765     ret = stream.Tell();
1766     ASSERT_EQ(ret, -1);
1767     stream.initPath_ = FileMetadataStream::INIT_FROM_UNKNOWN;
1768     ret = stream.Tell();
1769     ASSERT_EQ(ret, -1);
1770     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Tell001 end";
1771 }
1772 
1773 /**
1774  * @tc.name: FileMetadataStream_OpenFromFD001
1775  * @tc.desc: Test the OpenFromFD function of FileMetadataStream
1776  * @tc.type: FUNC
1777  */
1778 HWTEST_F(MetadataStreamTest, FileMetadataStream_OpenFromFD001, TestSize.Level3)
1779 {
1780     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_OpenFromFD001 start";
1781     const std::string &filePath = "/data/local/tmp/image/not_exist.jpg";
1782     FileMetadataStream stream = FileMetadataStream(filePath);
1783     const char *modeStr = "rb";
1784     bool ret = stream.OpenFromFD(modeStr);
1785     ASSERT_EQ(ret, false);
1786     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_OpenFromFD001 end";
1787 }
1788 
1789 /**
1790  * @tc.name: FileMetadataStream_Open006
1791  * @tc.desc: Test the Open function of FileMetadataStream
1792  * @tc.type: FUNC
1793  */
1794 HWTEST_F(MetadataStreamTest, FileMetadataStream_Open006, TestSize.Level3)
1795 {
1796     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Open006 start";
1797     const std::string &filePath = "/data/local/tmp/image/not_exist.jpg";
1798     FileMetadataStream stream = FileMetadataStream(filePath);
1799     stream.initPath_ = FileMetadataStream::INIT_FROM_UNKNOWN;
1800     OpenMode mode = OpenMode::Read;
1801     bool ret = stream.Open(mode);
1802     ASSERT_EQ(ret, false);
1803     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_Open006 end";
1804 }
1805 
1806 /**
1807  * @tc.name: FileMetadataStream_GetSize001
1808  * @tc.desc: Test the GetSize function of FileMetadataStream
1809  * @tc.type: FUNC
1810  */
1811 HWTEST_F(MetadataStreamTest, FileMetadataStream_GetSize001, TestSize.Level3)
1812 {
1813     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_GetSize001 start";
1814     const std::string &filePath = "/data/local/tmp/image/not_exist.jpg";
1815     FileMetadataStream stream = FileMetadataStream(filePath);
1816     ssize_t ret = stream.GetSize();
1817     ASSERT_EQ(ret, -1);
1818     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_GetSize001 end";
1819 }
1820 
1821 /**
1822  * @tc.name: FileMetadataStream_IsEof002
1823  * @tc.desc: Test the IsEof function of FileMetadataStream
1824  * @tc.type: FUNC
1825  */
1826 HWTEST_F(MetadataStreamTest, FileMetadataStream_IsEof002, TestSize.Level3)
1827 {
1828     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_IsEof002 start";
1829     const std::string &filePath = "/data/local/tmp/image/not_exist.jpg";
1830     FileMetadataStream stream = FileMetadataStream(filePath);
1831     bool ret = stream.IsEof();
1832     ASSERT_EQ(ret, true);
1833     GTEST_LOG_(INFO) << "MetadataStreamTest: FileMetadataStream_IsEof002 end";
1834 }
1835 } // namespace Media
1836 } // namespace OHOS