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