Skip to content

Commit 2656707

Browse files
committed
libexec: unit test validates command arguments
1 parent 2d17bb5 commit 2656707

File tree

1 file changed

+91
-85
lines changed

1 file changed

+91
-85
lines changed

source/intercept-library/library/test/ExecutorTest.cc

Lines changed: 91 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "LinkerMock.h"
2525
#include "Session.h"
2626
#include "Array.h"
27+
#include "er/Flags.h"
2728

2829
#include <cerrno>
2930

@@ -86,6 +87,19 @@ namespace {
8687
return el::Executor::Result { -1, error_code };
8788
}
8889

90+
MATCHER_P(CStyleArrayEqual, expecteds, "")
91+
{
92+
size_t idx = 0;
93+
for (const auto &expected: expecteds) {
94+
if (std::string_view(arg[idx]) != std::string_view(expected)) {
95+
*result_listener << "expected: " << expected << ", but got: " << arg[idx];
96+
return false;
97+
}
98+
++idx;
99+
}
100+
return true;
101+
}
102+
89103
TEST(Executor, fails_without_session)
90104
{
91105
el::Session session = el::session::init();
@@ -116,19 +130,18 @@ namespace {
116130
.WillOnce(Return(el::Resolver::Result{LS_PATH, 0}));
117131

118132
LinkerMock linker;
119-
// TODO: verify the arguments
120-
// const char* argv[] = {
121-
// session.reporter,
122-
// pear::flag::DESTINATION,
123-
// session.destination,
124-
// pear::flag::PATH,
125-
// LS_PATH,
126-
// pear::flag::COMMAND,
127-
// LS_ARGV[0],
128-
// LS_ARGV[1],
129-
// nullptr
130-
// };
131-
EXPECT_CALL(linker, execve(SILENT_SESSION.reporter, NotNull(), LS_ENVP))
133+
EXPECT_CALL(linker,execve(SILENT_SESSION.reporter,
134+
CStyleArrayEqual(std::vector<const char *> {
135+
SILENT_SESSION.reporter,
136+
er::flags::DESTINATION,
137+
SILENT_SESSION.destination,
138+
er::flags::EXECUTE,
139+
LS_PATH,
140+
er::flags::COMMAND,
141+
LS_ARGV[0],
142+
LS_ARGV[1]
143+
}),
144+
LS_ENVP))
132145
.Times(1)
133146
.WillOnce(Return(0));
134147
EXPECT_CALL(linker, error_code())
@@ -146,20 +159,19 @@ namespace {
146159
.WillOnce(Return(el::Resolver::Result{LS_PATH, 0}));
147160

148161
LinkerMock linker;
149-
// TODO: verify the arguments
150-
// const char* argv[] = {
151-
// session.reporter,
152-
// pear::flag::VERBOSE,
153-
// pear::flag::DESTINATION,
154-
// session.destination,
155-
// pear::flag::LIBRARY,
156-
// LS_PATH,
157-
// pear::flag::COMMAND,
158-
// LS_ARGV[0],
159-
// LS_ARGV[1],
160-
// nullptr
161-
// };
162-
EXPECT_CALL(linker, execve(VERBOSE_SESSION.reporter, NotNull(), LS_ENVP))
162+
EXPECT_CALL(linker, execve(VERBOSE_SESSION.reporter,
163+
CStyleArrayEqual(std::vector<const char *> {
164+
VERBOSE_SESSION.reporter,
165+
er::flags::DESTINATION,
166+
VERBOSE_SESSION.destination,
167+
er::flags::VERBOSE,
168+
er::flags::EXECUTE,
169+
LS_PATH,
170+
er::flags::COMMAND,
171+
LS_ARGV[0],
172+
LS_ARGV[1]
173+
}),
174+
LS_ENVP))
163175
.Times(1)
164176
.WillOnce(Return(0));
165177
EXPECT_CALL(linker, error_code())
@@ -192,20 +204,19 @@ namespace {
192204
.WillOnce(Return(el::Resolver::Result{LS_PATH, 0}));
193205

194206
LinkerMock linker;
195-
// TODO: verify the arguments
196-
// const char* argv[] = {
197-
// SILENT_SESSION.reporter,
198-
// pear::flag::VERBOSE,
199-
// pear::flag::DESTINATION,
200-
// SILENT_SESSION.destination,
201-
// pear::flag::FILE,
202-
// LS_FILE,
203-
// pear::flag::COMMAND,
204-
// LS_ARGV[0],
205-
// LS_ARGV[1],
206-
// nullptr
207-
// };
208-
EXPECT_CALL(linker, execve(VERBOSE_SESSION.reporter, NotNull(), LS_ENVP))
207+
EXPECT_CALL(linker, execve(VERBOSE_SESSION.reporter,
208+
CStyleArrayEqual(std::vector<const char *> {
209+
VERBOSE_SESSION.reporter,
210+
er::flags::DESTINATION,
211+
VERBOSE_SESSION.destination,
212+
er::flags::VERBOSE,
213+
er::flags::EXECUTE,
214+
LS_PATH,
215+
er::flags::COMMAND,
216+
LS_ARGV[0],
217+
LS_ARGV[1]
218+
}),
219+
LS_ENVP))
209220
.Times(1)
210221
.WillOnce(Return(0));
211222
EXPECT_CALL(linker, error_code())
@@ -223,22 +234,19 @@ namespace {
223234
.WillOnce(Return(el::Resolver::Result{LS_PATH, 0}));
224235

225236
LinkerMock linker;
226-
// TODO: verify the arguments
227-
// const char* argv[] = {
228-
// SILENT_SESSION.reporter,
229-
// pear::flag::VERBOSE,
230-
// pear::flag::DESTINATION,
231-
// SILENT_SESSION.destination,
232-
// pear::flag::FILE,
233-
// LS_FILE,
234-
// pear::flag::SEARCH_PATH
235-
// SEARCH_PATH
236-
// pear::flag::COMMAND,
237-
// LS_ARGV[0],
238-
// LS_ARGV[1],
239-
// nullptr
240-
// };
241-
EXPECT_CALL(linker, execve(VERBOSE_SESSION.reporter, NotNull(), LS_ENVP))
237+
EXPECT_CALL(linker, execve(VERBOSE_SESSION.reporter,
238+
CStyleArrayEqual(std::vector<const char *> {
239+
VERBOSE_SESSION.reporter,
240+
er::flags::DESTINATION,
241+
VERBOSE_SESSION.destination,
242+
er::flags::VERBOSE,
243+
er::flags::EXECUTE,
244+
LS_PATH,
245+
er::flags::COMMAND,
246+
LS_ARGV[0],
247+
LS_ARGV[1]
248+
}),
249+
LS_ENVP))
242250
.Times(1)
243251
.WillOnce(Return(0));
244252
EXPECT_CALL(linker, error_code())
@@ -258,20 +266,19 @@ namespace {
258266
.WillOnce(Return(el::Resolver::Result{LS_PATH, 0}));
259267

260268
LinkerMock linker;
261-
// TODO: verify the arguments
262-
// const char* argv[] = {
263-
// VERBOSE_SESSION.reporter,
264-
// pear::flag::VERBOSE,
265-
// pear::flag::DESTINATION,
266-
// VERBOSE_SESSION.destination,
267-
// pear::flag::PATH,
268-
// LS_PATH,
269-
// pear::flag::COMMAND,
270-
// LS_ARGV[0],
271-
// LS_ARGV[1],
272-
// nullptr
273-
// };
274-
EXPECT_CALL(linker, posix_spawn(&pid, VERBOSE_SESSION.reporter, nullptr, nullptr, NotNull(), LS_ENVP))
269+
EXPECT_CALL(linker, posix_spawn(&pid, VERBOSE_SESSION.reporter, nullptr, nullptr,
270+
CStyleArrayEqual(std::vector<const char *> {
271+
VERBOSE_SESSION.reporter,
272+
er::flags::DESTINATION,
273+
VERBOSE_SESSION.destination,
274+
er::flags::VERBOSE,
275+
er::flags::EXECUTE,
276+
LS_PATH,
277+
er::flags::COMMAND,
278+
LS_ARGV[0],
279+
LS_ARGV[1]
280+
}),
281+
LS_ENVP))
275282
.Times(1)
276283
.WillOnce(Return(0));
277284
EXPECT_CALL(linker, error_code())
@@ -308,20 +315,19 @@ namespace {
308315
.WillOnce(Return(el::Resolver::Result{LS_PATH, 0}));
309316

310317
LinkerMock linker;
311-
// TODO: verify the arguments
312-
// const char* argv[] = {
313-
// VERBOSE_SESSION.reporter,
314-
// pear::flag::VERBOSE,
315-
// pear::flag::DESTINATION,
316-
// VERBOSE_SESSION.destination,
317-
// pear::flag::FILE,
318-
// LS_FILE,
319-
// pear::flag::COMMAND,
320-
// LS_ARGV[0],
321-
// LS_ARGV[1],
322-
// nullptr
323-
// };
324-
EXPECT_CALL(linker, posix_spawn(&pid, VERBOSE_SESSION.reporter, nullptr, nullptr, NotNull(), LS_ENVP))
318+
EXPECT_CALL(linker, posix_spawn(&pid, VERBOSE_SESSION.reporter, nullptr, nullptr,
319+
CStyleArrayEqual(std::vector<const char *> {
320+
VERBOSE_SESSION.reporter,
321+
er::flags::DESTINATION,
322+
VERBOSE_SESSION.destination,
323+
er::flags::VERBOSE,
324+
er::flags::EXECUTE,
325+
LS_PATH,
326+
er::flags::COMMAND,
327+
LS_ARGV[0],
328+
LS_ARGV[1]
329+
}),
330+
LS_ENVP))
325331
.Times(1)
326332
.WillOnce(Return(0));
327333
EXPECT_CALL(linker, error_code())

0 commit comments

Comments
 (0)