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