F´ Flight Software - C/C++ Documentation NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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.