1 #include <cppunit/CompilerOutputter.h>
2 #include <cppunit/TestCaller.h>
3 #include <cppunit/TestFixture.h>
4 #include <cppunit/extensions/TestFactoryRegistry.h>
5 #include <cppunit/ui/text/TestRunner.h>
6
7 #include <cstring>
8
9 #include "passwordrecord.hh"
10
11 constexpr auto NAME_CHAR{"name"};
12 // Length includes '\0'
13 constexpr auto NAME_LEN{5};
14
15 constexpr auto HOST_CHAR{"host"};
16 // Length includes '\0'
17 constexpr auto HOST_LEN{5};
18
19 constexpr auto USERNAME_CHAR{"username"};
20 // Length includes '\0'
21 constexpr auto USERNAME_LEN{9};
22
23 constexpr auto PASSWORD_CHAR{"password"};
24 // Length includes '\0'
25 constexpr auto PASSWORD_LEN{9};
26
27 constexpr auto COMMENT_CHAR{"comment"};
28 // Length includes '\0'
29 constexpr auto COMMENT_LEN{8};
30
31 constexpr std::uint8_t serializedPasswordRecord[] = {
32 'n', 'a', 'm', 'e', '\0', 'h', 'o', 's', 't', '\0', 'u', 's',
33 'e', 'r', 'n', 'a', 'm', 'e', '\0', 'p', 'a', 's', 's', 'w',
34 'o', 'r', 'd', '\0', 'c', 'o', 'm', 'm', 'e', 'n', 't', '\0'};
35
makeTestPasswordRecordFromChar()36 inline yapet::PasswordRecord makeTestPasswordRecordFromChar() {
37 yapet::PasswordRecord passwordRecord{};
38
39 passwordRecord.name(NAME_CHAR);
40 passwordRecord.host(HOST_CHAR);
41 passwordRecord.username(USERNAME_CHAR);
42 passwordRecord.password(PASSWORD_CHAR);
43 passwordRecord.comment(COMMENT_CHAR);
44
45 return passwordRecord;
46 }
47
48 class PasswordRecordTest : public CppUnit::TestFixture {
49 public:
suite()50 static CppUnit::TestSuite *suite() {
51 CppUnit::TestSuite *suiteOfTests =
52 new CppUnit::TestSuite("Password Record");
53
54 suiteOfTests->addTest(new CppUnit::TestCaller<PasswordRecordTest>(
55 "Char Setter and getter",
56 &PasswordRecordTest::charSetterAndGetter));
57 suiteOfTests->addTest(new CppUnit::TestCaller<PasswordRecordTest>(
58 "uint8_t Setter and getter",
59 &PasswordRecordTest::uint8SetterAndGetter));
60 suiteOfTests->addTest(new CppUnit::TestCaller<PasswordRecordTest>(
61 "serialize and deserialize",
62 &PasswordRecordTest::serializeAndDeserialize));
63
64 suiteOfTests->addTest(new CppUnit::TestCaller<PasswordRecordTest>(
65 "deserialize non-matching size",
66 &PasswordRecordTest::deserializeNonMatchingSize));
67
68 suiteOfTests->addTest(new CppUnit::TestCaller<PasswordRecordTest>(
69 "Copy ctor and assignment", &PasswordRecordTest::copyCtor));
70 suiteOfTests->addTest(new CppUnit::TestCaller<PasswordRecordTest>(
71 "Move ctor and assignment", &PasswordRecordTest::moveCtor));
72
73 return suiteOfTests;
74 }
75
charSetterAndGetter()76 void charSetterAndGetter() {
77 yapet::PasswordRecord passwordRecord{makeTestPasswordRecordFromChar()};
78
79 CPPUNIT_ASSERT(
80 std::memcmp(passwordRecord.name(), NAME_CHAR, NAME_LEN) == 0);
81 CPPUNIT_ASSERT(
82 std::memcmp(passwordRecord.host(), HOST_CHAR, HOST_LEN) == 0);
83 CPPUNIT_ASSERT(std::memcmp(passwordRecord.username(), USERNAME_CHAR,
84 USERNAME_LEN) == 0);
85 CPPUNIT_ASSERT(std::memcmp(passwordRecord.password(), PASSWORD_CHAR,
86 PASSWORD_LEN) == 0);
87 CPPUNIT_ASSERT(std::memcmp(passwordRecord.comment(), COMMENT_CHAR,
88 COMMENT_LEN) == 0);
89 }
90
uint8SetterAndGetter()91 void uint8SetterAndGetter() {
92 yapet::PasswordRecord passwordRecord{};
93
94 passwordRecord.name(reinterpret_cast<const std::uint8_t *>(NAME_CHAR),
95 NAME_LEN);
96 passwordRecord.host(reinterpret_cast<const std::uint8_t *>(HOST_CHAR),
97 HOST_LEN);
98 passwordRecord.username(
99 reinterpret_cast<const std::uint8_t *>(USERNAME_CHAR),
100 USERNAME_LEN);
101 passwordRecord.password(
102 reinterpret_cast<const std::uint8_t *>(PASSWORD_CHAR),
103 PASSWORD_LEN);
104 passwordRecord.comment(
105 reinterpret_cast<const std::uint8_t *>(COMMENT_CHAR), COMMENT_LEN);
106
107 CPPUNIT_ASSERT(
108 std::memcmp(passwordRecord.name(), NAME_CHAR, NAME_LEN) == 0);
109 CPPUNIT_ASSERT(
110 std::memcmp(passwordRecord.host(), HOST_CHAR, HOST_LEN) == 0);
111 CPPUNIT_ASSERT(std::memcmp(passwordRecord.username(), USERNAME_CHAR,
112 USERNAME_LEN) == 0);
113 CPPUNIT_ASSERT(std::memcmp(passwordRecord.password(), PASSWORD_CHAR,
114 PASSWORD_LEN) == 0);
115 CPPUNIT_ASSERT(std::memcmp(passwordRecord.comment(), COMMENT_CHAR,
116 COMMENT_LEN) == 0);
117 }
118
serializeAndDeserialize()119 void serializeAndDeserialize() {
120 yapet::PasswordRecord passwordRecord{};
121
122 passwordRecord.name(NAME_CHAR);
123 passwordRecord.host(HOST_CHAR);
124 passwordRecord.username(USERNAME_CHAR);
125 passwordRecord.password(PASSWORD_CHAR);
126 passwordRecord.comment(COMMENT_CHAR);
127
128 auto serialized = passwordRecord.serialize();
129 CPPUNIT_ASSERT(serialized.size() == yapet::PasswordRecord::TOTAL_SIZE);
130 CPPUNIT_ASSERT(std::memcmp(
131 *serialized, serializedPasswordRecord,
132 NAME_LEN + HOST_LEN + USERNAME_LEN + PASSWORD_LEN + COMMENT_LEN));
133
134 yapet::PasswordRecord fromSerialized{serialized};
135
136 CPPUNIT_ASSERT(
137 std::memcmp(fromSerialized.name(), NAME_CHAR, NAME_LEN) == 0);
138 CPPUNIT_ASSERT(
139 std::memcmp(fromSerialized.host(), HOST_CHAR, HOST_LEN) == 0);
140 CPPUNIT_ASSERT(std::memcmp(fromSerialized.username(), USERNAME_CHAR,
141 USERNAME_LEN) == 0);
142 CPPUNIT_ASSERT(std::memcmp(fromSerialized.password(), PASSWORD_CHAR,
143 PASSWORD_LEN) == 0);
144 CPPUNIT_ASSERT(std::memcmp(fromSerialized.comment(), COMMENT_CHAR,
145 COMMENT_LEN) == 0);
146 }
147
deserializeNonMatchingSize()148 void deserializeNonMatchingSize() {
149 yapet::SecureArray tooSmall{yapet::PasswordRecord::TOTAL_SIZE - 1};
150 CPPUNIT_ASSERT_THROW(yapet::PasswordRecord{tooSmall},
151 yapet::DeserializationError);
152
153 yapet::SecureArray tooBig{yapet::PasswordRecord::TOTAL_SIZE + 1};
154 CPPUNIT_ASSERT_THROW(yapet::PasswordRecord{tooSmall},
155 yapet::DeserializationError);
156 }
157
copyCtor()158 void copyCtor() {
159 yapet::PasswordRecord passwordRecord{makeTestPasswordRecordFromChar()};
160
161 yapet::PasswordRecord copied{passwordRecord};
162
163 CPPUNIT_ASSERT(std::memcmp(copied.name(), NAME_CHAR, NAME_LEN) == 0);
164 CPPUNIT_ASSERT(std::memcmp(copied.host(), HOST_CHAR, HOST_LEN) == 0);
165 CPPUNIT_ASSERT(
166 std::memcmp(copied.username(), USERNAME_CHAR, USERNAME_LEN) == 0);
167 CPPUNIT_ASSERT(
168 std::memcmp(copied.password(), PASSWORD_CHAR, PASSWORD_LEN) == 0);
169 CPPUNIT_ASSERT(
170 std::memcmp(copied.comment(), COMMENT_CHAR, COMMENT_LEN) == 0);
171
172 CPPUNIT_ASSERT(passwordRecord.name() != copied.name());
173 CPPUNIT_ASSERT(passwordRecord.host() != copied.host());
174 CPPUNIT_ASSERT(passwordRecord.username() != copied.username());
175 CPPUNIT_ASSERT(passwordRecord.password() != copied.password());
176 CPPUNIT_ASSERT(passwordRecord.comment() != copied.comment());
177
178 yapet::PasswordRecord copyAssigned = passwordRecord;
179 CPPUNIT_ASSERT(std::memcmp(copyAssigned.name(), NAME_CHAR, NAME_LEN) ==
180 0);
181 CPPUNIT_ASSERT(std::memcmp(copyAssigned.host(), HOST_CHAR, HOST_LEN) ==
182 0);
183 CPPUNIT_ASSERT(std::memcmp(copyAssigned.username(), USERNAME_CHAR,
184 USERNAME_LEN) == 0);
185 CPPUNIT_ASSERT(std::memcmp(copyAssigned.password(), PASSWORD_CHAR,
186 PASSWORD_LEN) == 0);
187 CPPUNIT_ASSERT(std::memcmp(copyAssigned.comment(), COMMENT_CHAR,
188 COMMENT_LEN) == 0);
189
190 CPPUNIT_ASSERT(passwordRecord.name() != copyAssigned.name());
191 CPPUNIT_ASSERT(passwordRecord.host() != copyAssigned.host());
192 CPPUNIT_ASSERT(passwordRecord.username() != copyAssigned.username());
193 CPPUNIT_ASSERT(passwordRecord.password() != copyAssigned.password());
194 CPPUNIT_ASSERT(passwordRecord.comment() != copyAssigned.comment());
195 }
196
moveCtor()197 void moveCtor() {
198 yapet::PasswordRecord passwordRecord{makeTestPasswordRecordFromChar()};
199
200 yapet::PasswordRecord moved{std::move(passwordRecord)};
201
202 CPPUNIT_ASSERT(std::memcmp(moved.name(), NAME_CHAR, NAME_LEN) == 0);
203 CPPUNIT_ASSERT(std::memcmp(moved.host(), HOST_CHAR, HOST_LEN) == 0);
204 CPPUNIT_ASSERT(
205 std::memcmp(moved.username(), USERNAME_CHAR, USERNAME_LEN) == 0);
206 CPPUNIT_ASSERT(
207 std::memcmp(moved.password(), PASSWORD_CHAR, PASSWORD_LEN) == 0);
208 CPPUNIT_ASSERT(
209 std::memcmp(moved.comment(), COMMENT_CHAR, COMMENT_LEN) == 0);
210
211 CPPUNIT_ASSERT(passwordRecord.name() != moved.name());
212 CPPUNIT_ASSERT(passwordRecord.host() != moved.host());
213 CPPUNIT_ASSERT(passwordRecord.username() != moved.username());
214 CPPUNIT_ASSERT(passwordRecord.password() != moved.password());
215 CPPUNIT_ASSERT(passwordRecord.comment() != moved.comment());
216
217 passwordRecord = makeTestPasswordRecordFromChar();
218 yapet::PasswordRecord moveAssigned = std::move(passwordRecord);
219
220 CPPUNIT_ASSERT(std::memcmp(moveAssigned.name(), NAME_CHAR, NAME_LEN) ==
221 0);
222 CPPUNIT_ASSERT(std::memcmp(moveAssigned.host(), HOST_CHAR, HOST_LEN) ==
223 0);
224 CPPUNIT_ASSERT(std::memcmp(moveAssigned.username(), USERNAME_CHAR,
225 USERNAME_LEN) == 0);
226 CPPUNIT_ASSERT(std::memcmp(moveAssigned.password(), PASSWORD_CHAR,
227 PASSWORD_LEN) == 0);
228 CPPUNIT_ASSERT(std::memcmp(moveAssigned.comment(), COMMENT_CHAR,
229 COMMENT_LEN) == 0);
230
231 CPPUNIT_ASSERT(passwordRecord.name() != moveAssigned.name());
232 CPPUNIT_ASSERT(passwordRecord.host() != moveAssigned.host());
233 CPPUNIT_ASSERT(passwordRecord.username() != moveAssigned.username());
234 CPPUNIT_ASSERT(passwordRecord.password() != moveAssigned.password());
235 CPPUNIT_ASSERT(passwordRecord.comment() != moveAssigned.comment());
236 }
237 };
238
main()239 int main() {
240 CppUnit::TextUi::TestRunner runner;
241 runner.addTest(PasswordRecordTest::suite());
242 return runner.run() ? 0 : 1;
243 }
244