F´ Flight Software - C/C++ Documentation NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
Loading...
Searching...
No Matches
NonPrimitiveStructTest.cpp
Go to the documentation of this file.
1// ======================================================================
2// \title NonPrimitiveStructTest.cpp
3// \author T. Chieu
4// \brief cpp file for NonPrimitiveStructTest class
5//
6// \copyright
7// Copyright (C) 2009-2022 California Institute of Technology.
8// ALL RIGHTS RESERVED. United States Government Sponsorship
9// acknowledged.
10//
11// ======================================================================
12
13#include "FppTest/struct/NonPrimitiveSerializableAc.hpp"
15
18#include "STest/Pick/Pick.hpp"
19
20#include "gtest/gtest.h"
21
22#include <sstream>
23
24// Test NonPrimitive struct class
25class NonPrimitiveStructTest : public ::testing::Test {
26protected:
27 void SetUp() override {
28 char buf[testString.getCapacity()];
29 FppTest::Utils::setString(buf, sizeof(buf));
30 testString = buf;
31
32 testEnum = static_cast<StructEnum::T>(STest::Pick::startLength(
33 StructEnum::A,
34 StructEnum::B
35 ));
36
37 for (U32 i = 0; i < StructArray::SIZE; i++) {
39 }
40
41 testStruct.set(
42 true,
44 static_cast<I16>(FppTest::Utils::getU32()),
45 static_cast<F64>(FppTest::Utils::getU32())
46 );
47
48 for (U32 i = 0; i < 3; i++) {
50 }
51
52 for (U32 i = 0; i < 3; i++) {
53 testStructArr[i].set(
54 true,
56 static_cast<I16>(FppTest::Utils::getU32()),
57 static_cast<F64>(FppTest::Utils::getU32())
58 );
59 }
60 }
61
62 void assertStructMembers(const NonPrimitive& s) {
63 ASSERT_EQ(s.getmString(), testString);
64 ASSERT_EQ(s.getmEnum(), testEnum);
65 ASSERT_EQ(s.getmArray(), testArray);
66 ASSERT_EQ(s.getmStruct(), testStruct);
67
68 for (U32 i = 0; i < 3; i++) {
69 ASSERT_EQ(s.getmU32Arr()[i], testU32Arr[i]);
70 }
71 for (U32 i = 0; i < 3; i++) {
72 ASSERT_EQ(s.getmStructArr()[i], testStructArr[i]);
73 }
74 }
75
76 void assertUnsuccessfulSerialization(NonPrimitive& s, U32 bufSize) {
77 U8 data[bufSize];
78 Fw::SerialBuffer buf(data, sizeof(data));
80
81 // Serialize
82 status = buf.serialize(s);
83 ASSERT_NE(status, Fw::FW_SERIALIZE_OK);
84
85 // Deserialize
86 status = buf.deserialize(s);
87 ASSERT_NE(status, Fw::FW_SERIALIZE_OK);
88 }
89
90 NonPrimitive::StringSize80 testString;
91 StructEnum testEnum;
92 StructArray testArray;
93 Primitive testStruct;
94 U32 testU32Arr[3];
95 Primitive testStructArr[3];
96};
97
98// Test struct constants and default constructor
100 NonPrimitive s;
101
102 StructArray defaultArray;
103 Primitive defaultStruct1(true, 0, 0, 3.14);
104 Primitive defaultStruct2(true, 0, 0, 1.16);
105
106 // Constants
107 ASSERT_EQ(
108 NonPrimitive::SERIALIZED_SIZE,
109 NonPrimitive::StringSize80::SERIALIZED_SIZE
110 + StructEnum::SERIALIZED_SIZE
111 + StructArray::SERIALIZED_SIZE
112 + Primitive::SERIALIZED_SIZE
113 + (3 * sizeof(U32))
114 + (3 * Primitive::SERIALIZED_SIZE)
115 );
116
117 // Default constructor
118 ASSERT_EQ(s.getmString(), "");
119 ASSERT_EQ(s.getmEnum(), StructEnum::C);
120 ASSERT_EQ(s.getmArray(), defaultArray);
121 ASSERT_EQ(s.getmStruct(), defaultStruct1);
122
123 for (U32 i = 0; i < 3; i++) {
124 ASSERT_EQ(s.getmU32Arr()[i], 0);
125 }
126 for (U32 i = 0; i < 3; i++) {
127 ASSERT_EQ(s.getmStructArr()[i], defaultStruct2);
128 }
129}
130
131// Test struct constructors
133 // Member constructor
134 NonPrimitive s1(testString, testEnum, testArray,
135 testStruct, testU32Arr, testStructArr);
136 assertStructMembers(s1);
137
138 // Scalar member constructor
139 NonPrimitive s2(testString, testEnum, testArray,
140 testStruct, testU32Arr[0], testStructArr[0]);
141
142 ASSERT_EQ(s2.getmString(), testString);
143 ASSERT_EQ(s2.getmEnum(), testEnum);
144 ASSERT_EQ(s2.getmArray(), testArray);
145 ASSERT_EQ(s2.getmStruct(), testStruct);
146
147 for (U32 i = 0; i < 3; i++) {
148 ASSERT_EQ(s2.getmU32Arr()[i], testU32Arr[0]);
149 }
150 for (U32 i = 0; i < 3; i++) {
151 ASSERT_EQ(s2.getmStructArr()[i], testStructArr[0]);
152 }
153
154 // Copy constructor
155 NonPrimitive s3(s1);
156 assertStructMembers(s3);
157}
158
159// Test struct assignment operator
161 NonPrimitive s1;
162 NonPrimitive s2(testString, testEnum, testArray,
163 testStruct, testU32Arr, testStructArr);
164
165 // Copy assignment
166 s1 = s2;
167 assertStructMembers(s1);
168
169 NonPrimitive& s1Ref = s1;
170 s1 = s1Ref;
171 ASSERT_EQ(&s1, &s1Ref);
172}
173
174// Test struct equality and inequality operators
176 NonPrimitive s1, s2;
177
178 ASSERT_TRUE(s1 == s2);
179 ASSERT_FALSE(s1 != s2);
180
181 s1.setmString(testString);
182
183 ASSERT_FALSE(s1 == s2);
184 ASSERT_TRUE(s1 != s2);
185
186 s2.setmString(testString);
187 s1.setmEnum(testEnum);
188
189 ASSERT_NE(s1, s2);
190 ASSERT_FALSE(s1 == s2);
191 ASSERT_TRUE(s1 != s2);
192
193 s2.setmEnum(testEnum);
194 s1.setmArray(testArray);
195
196 ASSERT_FALSE(s1 == s2);
197 ASSERT_TRUE(s1 != s2);
198
199 s2.setmArray(testArray);
200 s1.setmStruct(testStruct);
201
202 ASSERT_FALSE(s1 == s2);
203 ASSERT_TRUE(s1 != s2);
204
205 s2.setmStruct(testStruct);
206 s1.setmU32Arr(testU32Arr);
207
208 ASSERT_FALSE(s1 == s2);
209 ASSERT_TRUE(s1 != s2);
210
211 s2.setmU32Arr(testU32Arr);
212 s1.setmStructArr(testStructArr);
213
214 ASSERT_FALSE(s1 == s2);
215 ASSERT_TRUE(s1 != s2);
216
217 s2.setmStructArr(testStructArr);
218
219 ASSERT_TRUE(s1 == s2);
220 ASSERT_FALSE(s1 != s2);
221}
222
223// Test struct getter and setter functions
224TEST_F(NonPrimitiveStructTest, GetterSetterFunctions) {
225 NonPrimitive s1, s2;
226
227 // Set all members
228 s1.set(testString, testEnum, testArray,
229 testStruct, testU32Arr, testStructArr);
230 assertStructMembers(s1);
231
232 // Set individual members
233 s2.setmString(testString);
234 ASSERT_EQ(s2.getmString(), testString);
235
236 s2.setmEnum(testEnum);
237 ASSERT_EQ(s2.getmEnum(), testEnum);
238
239 s2.setmArray(testArray);
240 ASSERT_EQ(s2.getmArray(), testArray);
241
242 s2.setmStruct(testStruct);
243 ASSERT_EQ(s2.getmStruct(), testStruct);
244
245 s2.setmU32Arr(testU32Arr);
246 for (U32 i = 0; i < 3; i++) {
247 ASSERT_EQ(s2.getmU32Arr()[i], testU32Arr[i]);
248 }
249
250 s2.setmStructArr(testStructArr);
251 for (U32 i = 0; i < 3; i++) {
252 ASSERT_EQ(s2.getmStructArr()[i], testStructArr[i]);
253 }
254
255 // Check non-const getter
256 s2.getmStruct().setmU32(testU32Arr[0]);
257 ASSERT_EQ(s2.getmStruct().getmU32(), testU32Arr[0]);
258}
259
260// Test struct serialization and deserialization
262 NonPrimitive s(testString, testEnum, testArray,
263 testStruct, testU32Arr, testStructArr);
264 NonPrimitive sCopy;
265
266 U32 stringSerializedSize = testString.length() + sizeof(FwBuffSizeType);
267 U32 serializedSize = NonPrimitive::SERIALIZED_SIZE
268 - NonPrimitive::StringSize80::SERIALIZED_SIZE
269 + stringSerializedSize;
270 Fw::SerializeStatus status;
271
272 // Test successful serialization
273 U8 data[NonPrimitive::SERIALIZED_SIZE];
274 Fw::SerialBuffer buf(data, sizeof(data));
275
276 // Serialize
277 status = buf.serialize(s);
278
279 ASSERT_EQ(status, Fw::FW_SERIALIZE_OK);
280 ASSERT_EQ(buf.getBuffLength(), serializedSize);
281
282 // Deserialize
283 status = buf.deserialize(sCopy);
284
285 ASSERT_EQ(status, Fw::FW_SERIALIZE_OK);
286 ASSERT_EQ(s, sCopy);
287
288 // Test unsuccessful serialization
289 assertUnsuccessfulSerialization(s, stringSerializedSize - 1);
290 assertUnsuccessfulSerialization(s, stringSerializedSize
291 + StructEnum::SERIALIZED_SIZE - 1);
292 assertUnsuccessfulSerialization(s, stringSerializedSize
293 + StructEnum::SERIALIZED_SIZE + StructArray::SERIALIZED_SIZE - 1);
294 assertUnsuccessfulSerialization(s, stringSerializedSize
295 + StructEnum::SERIALIZED_SIZE + StructArray::SERIALIZED_SIZE
296 + Primitive::SERIALIZED_SIZE - 1);
297 assertUnsuccessfulSerialization(s, stringSerializedSize
298 + StructEnum::SERIALIZED_SIZE + StructArray::SERIALIZED_SIZE
299 + Primitive::SERIALIZED_SIZE + (3 * sizeof(U32)) - 1);
300 assertUnsuccessfulSerialization(s, serializedSize - 1);
301}
302
303// Test struct toString() and ostream operator functions
305 NonPrimitive s(testString, testEnum, testArray,
306 testStruct, testU32Arr, testStructArr);
307 std::stringstream buf1, buf2;
308
309 buf1 << s;
310
311 buf2 << "( "
312 << "mString = " << testString << ", "
313 << "mEnum = " << testEnum << ", "
314 << "mArray = " << testArray << ", "
315 << "mStruct = " << testStruct << ", "
316 << "mU32Arr = [ "
317 << testU32Arr[0] << ", "
318 << testU32Arr[1] << ", "
319 << testU32Arr[2] << " ], "
320 << "mStructArr = [ "
321 << testStructArr[0] << ", "
322 << testStructArr[1] << ", "
323 << testStructArr[2] << " ] "
324 << " )";
325
326 // Truncate string output
327 char buf2Str[FW_SERIALIZABLE_TO_STRING_BUFFER_SIZE];
328 Fw::StringUtils::string_copy(buf2Str, buf2.str().c_str(),
329 FW_SERIALIZABLE_TO_STRING_BUFFER_SIZE);
330
331 ASSERT_STREQ(buf1.str().c_str(), buf2Str);
332}
uint8_t U8
8-bit unsigned integer
Definition BasicTypes.h:26
U16 FwBuffSizeType
Definition FpConfig.h:30
TEST_F(NonPrimitiveStructTest, Default)
A variable-length serializable buffer.
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
NATIVE_UINT_TYPE getBuffLength() const
returns current buffer size
void assertUnsuccessfulSerialization(NonPrimitive &s, U32 bufSize)
void assertStructMembers(const NonPrimitive &s)
NonPrimitive::StringSize80 testString
void setString(char *buf, U32 size)
Definition Utils.cpp:41
U32 getU32()
Definition Utils.cpp:30
char * string_copy(char *destination, const char *source, U32 num)
copy string with null-termination guaranteed
SerializeStatus
forward declaration for string
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.