GCC Code Coverage Report


Directory: ./
File: Os/Directory.cpp
Date: 2026-10-14 21:15:02
Exec Total Coverage
Lines: 76 92 82.6%
Functions: 10 12 83.3%
Branches: 37 55 67.3%

Line Branch Exec Source
1 // ======================================================================
2 // \title Os/Directory.cpp
3 // \brief common function implementation for Os::Directory
4 // ======================================================================
5 #include <Fw/Types/Assert.hpp>
6 #include <Os/Directory.hpp>
7
8 namespace Os {
9
10 2678 Directory::Directory()
11
3/3
✓ Branch 13 taken 42848 times.
✓ Branch 14 taken 2678 times.
✓ Branch 20 taken 2678 times.
45526 : m_is_open(false), m_handle_storage(), m_delegate(*DirectoryInterface::getDelegate(m_handle_storage)) {
12 2678 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
13 2678 }
14
15 5358 Directory::~Directory() {
16 5356 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
17
3/4
✗ Branch 3 not taken.
✓ Branch 4 taken 2678 times.
✓ Branch 5 taken 235 times.
✓ Branch 6 taken 2443 times.
5356 if (this->m_is_open) {
18 470 this->close();
19 }
20 5356 this->m_delegate.~DirectoryInterface();
21 5358 }
22
23 // ------------------------------------------------------------
24 // Directory operations delegating to implementation
25 // ------------------------------------------------------------
26 ✗ DirectoryHandle* Directory::getHandle() {
27 ✗ FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
28 ✗ return this->m_delegate.getHandle();
29 }
30
31 745 Directory::Status Directory::open(const char* path, OpenMode mode) {
32 745 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
33 745 FW_ASSERT(path != nullptr);
34 745 FW_ASSERT(mode >= 0 and mode < OpenMode::MAX_OPEN_MODE);
35 745 Status status = this->m_delegate.open(path, mode);
36
2/2
✓ Branch 0 taken 740 times.
✓ Branch 1 taken 5 times.
745 if (status == Status::OP_OK) {
37 740 this->m_is_open = true;
38 }
39 745 return status;
40 }
41
42 946 bool Directory::isOpen() {
43 946 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
44
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 946 times.
946 return this->m_is_open;
45 }
46 960 Directory::Status Directory::rewind() {
47 960 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
48
3/4
✗ Branch 3 not taken.
✓ Branch 4 taken 960 times.
✓ Branch 5 taken 87 times.
✓ Branch 6 taken 873 times.
960 if (not this->m_is_open) {
49 87 return Status::NOT_OPENED;
50 }
51 873 return this->m_delegate.rewind();
52 }
53
54 4175 Directory::Status Directory::read(char* fileNameBuffer, FwSizeType bufSize) {
55 4175 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
56
3/4
✗ Branch 3 not taken.
✓ Branch 4 taken 4175 times.
✓ Branch 5 taken 85 times.
✓ Branch 6 taken 4090 times.
4175 if (not this->m_is_open) {
57 85 return Status::NOT_OPENED;
58 }
59 4090 FW_ASSERT(fileNameBuffer != nullptr);
60 4090 FW_ASSERT(bufSize > 0);
61 4090 Status status = this->m_delegate.read(fileNameBuffer, bufSize);
62 4090 fileNameBuffer[bufSize - 1] = '\0'; // Guarantee null-termination
63 4090 return status;
64 }
65
66 3901 Directory::Status Directory::read(Fw::StringBase& filename) {
67 3901 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
68
3/4
✗ Branch 3 not taken.
✓ Branch 4 taken 3901 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 3900 times.
3901 if (not this->m_is_open) {
69 1 return Status::NOT_OPENED;
70 }
71 3900 return this->m_delegate.read(const_cast<char*>(filename.toChar()), filename.getCapacity());
72 }
73
74 828 void Directory::close() {
75 828 FW_ASSERT(&this->m_delegate == reinterpret_cast<DirectoryInterface*>(&this->m_handle_storage[0]));
76 828 this->m_is_open = false;
77 828 return this->m_delegate.close();
78 }
79
80 // ------------------------------------------------------------
81 // Common functions built on top of OS-specific functions
82 // ------------------------------------------------------------
83
84 306 Directory::Status Directory::getFileCount(FwSizeType& fileCount) {
85
2/4
✗ Branch 3 not taken.
✓ Branch 4 taken 306 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 306 times.
306 if (not this->m_is_open) {
86 ✗ return Status::NOT_OPENED;
87 }
88 // Rewind to ensure we start from the beginning of the stream
89
2/3
✓ Branch 4 taken 306 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 306 times.
306 if (this->rewind() != Status::OP_OK) {
90 ✗ return Status::OTHER_ERROR;
91 }
92 306 const FwSizeType loopLimit = std::numeric_limits<FwSizeType>::max();
93 306 FwSizeType count = 0;
94 306 char unusedBuffer[1]; // buffer must have size but is unused
95 306 Status readStatus = Status::OP_OK;
96 306 fileCount = 0;
97 // Count files by reading each file entry until there is NO_MORE_FILES
98
1/2
✓ Branch 0 taken 3999 times.
✗ Branch 1 not taken.
3999 for (FwSizeType iter = 0; iter < loopLimit; ++iter) {
99
1/1
✓ Branch 4 taken 3999 times.
3999 readStatus = this->read(unusedBuffer, sizeof(unusedBuffer));
100
2/2
✓ Branch 0 taken 306 times.
✓ Branch 1 taken 3693 times.
3999 if (readStatus == Status::NO_MORE_FILES) {
101 306 break;
102
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3693 times.
3693 } else if (readStatus != Status::OP_OK) {
103 ✗ return Status::OTHER_ERROR;
104 }
105 3693 count++;
106 }
107 306 fileCount = count;
108
2/3
✓ Branch 4 taken 306 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 306 times.
306 if (this->rewind() != Status::OP_OK) {
109 ✗ return Status::OTHER_ERROR;
110 }
111 306 return Status::OP_OK;
112 }
113
114 94 Directory::Status Directory::readDirectory(Fw::ExternalArray<Fw::String>& filenameArray, FwSizeType& filenameCount) {
115 94 FW_ASSERT(filenameArray.getElements() != nullptr);
116 94 FW_ASSERT(filenameArray.getSize() > 0);
117
2/4
✗ Branch 3 not taken.
✓ Branch 4 taken 94 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 94 times.
94 if (not this->m_is_open) {
118 ✗ return Status::NOT_OPENED;
119 }
120 // Rewind to ensure we start reading from the beginning of the stream
121
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 94 times.
94 if (this->rewind() != Status::OP_OK) {
122 ✗ return Status::OTHER_ERROR;
123 }
124
125 94 Status readStatus = Status::OP_OK;
126 94 Status returnStatus = Status::OP_OK;
127 FwSizeType index;
128 94 filenameCount = 0;
129 // Iterate through the directory and read the filenames into the array
130
2/2
✓ Branch 2 taken 190 times.
✓ Branch 3 taken 94 times.
284 for (index = 0; index < filenameArray.getSize(); index++) {
131 190 readStatus = this->read(filenameArray[index]);
132
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 190 times.
190 if (readStatus == Status::NO_MORE_FILES) {
133 ✗ break;
134
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 190 times.
190 } else if (readStatus != Status::OP_OK) {
135 ✗ return Status::OTHER_ERROR;
136 }
137 }
138 94 filenameCount = index;
139
140
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 94 times.
94 if (this->rewind() != Status::OP_OK) {
141 ✗ return Status::OTHER_ERROR;
142 }
143
144 94 return returnStatus;
145 }
146
147 ✗ Directory::Status Directory::readDirectory(Fw::String filenameArray[],
148 const FwSizeType filenameArraySize,
149 FwSizeType& filenameCount) {
150 ✗ Fw::ExternalArray<Fw::String> array(filenameArray, filenameArraySize);
151 ✗ return this->readDirectory(array, filenameCount);
152 ✗ }
153
154 } // namespace Os
155