xref: /aosp_15_r20/external/vboot_reference/tests/subprocess_tests.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2019 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  */
5*8617a60dSAndroid Build Coastguard Worker 
6*8617a60dSAndroid Build Coastguard Worker #include <stdlib.h>
7*8617a60dSAndroid Build Coastguard Worker #include <string.h>
8*8617a60dSAndroid Build Coastguard Worker 
9*8617a60dSAndroid Build Coastguard Worker #include "subprocess.h"
10*8617a60dSAndroid Build Coastguard Worker #include "common/tests.h"
11*8617a60dSAndroid Build Coastguard Worker 
12*8617a60dSAndroid Build Coastguard Worker #define TEST_STRING "hello world"
13*8617a60dSAndroid Build Coastguard Worker #define TEST_STRING_LN TEST_STRING "\n"
14*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_output_to_buffer(void)15*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_output_to_buffer(void)
16*8617a60dSAndroid Build Coastguard Worker {
17*8617a60dSAndroid Build Coastguard Worker 	char output_buffer[__builtin_strlen(TEST_STRING_LN)];
18*8617a60dSAndroid Build Coastguard Worker 
19*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target output = {
20*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER,
21*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
22*8617a60dSAndroid Build Coastguard Worker 			.buf = output_buffer,
23*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(output_buffer),
24*8617a60dSAndroid Build Coastguard Worker 		},
25*8617a60dSAndroid Build Coastguard Worker 	};
26*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {
27*8617a60dSAndroid Build Coastguard Worker 		"echo", TEST_STRING, NULL
28*8617a60dSAndroid Build Coastguard Worker 	};
29*8617a60dSAndroid Build Coastguard Worker 
30*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &subprocess_null, &output, NULL), 0,
31*8617a60dSAndroid Build Coastguard Worker 		"Return value of \"echo 'hello world'\" is 0");
32*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(memcmp(output_buffer, TEST_STRING_LN, sizeof(output_buffer)), 0,
33*8617a60dSAndroid Build Coastguard Worker 		"Output is \"hello world\\n\"");
34*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(output.buffer.bytes_consumed, sizeof(output_buffer),
35*8617a60dSAndroid Build Coastguard Worker 		"The entire output buffer should have been used.");
36*8617a60dSAndroid Build Coastguard Worker }
37*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_output_to_buffer_null_terminated(void)38*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_output_to_buffer_null_terminated(void)
39*8617a60dSAndroid Build Coastguard Worker {
40*8617a60dSAndroid Build Coastguard Worker 	char output_buffer[__builtin_strlen(TEST_STRING_LN) + 1];
41*8617a60dSAndroid Build Coastguard Worker 
42*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target output = {
43*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
44*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
45*8617a60dSAndroid Build Coastguard Worker 			.buf = output_buffer,
46*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(output_buffer),
47*8617a60dSAndroid Build Coastguard Worker 		},
48*8617a60dSAndroid Build Coastguard Worker 	};
49*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {
50*8617a60dSAndroid Build Coastguard Worker 		"echo", TEST_STRING, NULL
51*8617a60dSAndroid Build Coastguard Worker 	};
52*8617a60dSAndroid Build Coastguard Worker 
53*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &subprocess_null, &output, NULL), 0,
54*8617a60dSAndroid Build Coastguard Worker 		"Return value of \"echo 'hello world'\" is 0");
55*8617a60dSAndroid Build Coastguard Worker 	TEST_STR_EQ(output_buffer, TEST_STRING_LN,
56*8617a60dSAndroid Build Coastguard Worker 		    "Output is \"hello world\\n\"");
57*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(output.buffer.bytes_consumed, sizeof(output_buffer) - 1,
58*8617a60dSAndroid Build Coastguard Worker 		"The entire output buffer should have been used.");
59*8617a60dSAndroid Build Coastguard Worker }
60*8617a60dSAndroid Build Coastguard Worker 
61*8617a60dSAndroid Build Coastguard Worker #define TEST_STRING_2 "hello\0world!"
62*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_input_buffer(void)63*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_input_buffer(void)
64*8617a60dSAndroid Build Coastguard Worker {
65*8617a60dSAndroid Build Coastguard Worker 	char input_buffer[sizeof(TEST_STRING_2)];
66*8617a60dSAndroid Build Coastguard Worker 	char output_buffer[20];
67*8617a60dSAndroid Build Coastguard Worker 	char error_buffer[20];
68*8617a60dSAndroid Build Coastguard Worker 
69*8617a60dSAndroid Build Coastguard Worker 	memcpy(input_buffer, TEST_STRING_2, sizeof(input_buffer));
70*8617a60dSAndroid Build Coastguard Worker 
71*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target input = {
72*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER,
73*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
74*8617a60dSAndroid Build Coastguard Worker 			.buf = input_buffer,
75*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(input_buffer),
76*8617a60dSAndroid Build Coastguard Worker 		},
77*8617a60dSAndroid Build Coastguard Worker 	};
78*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target output = {
79*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
80*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
81*8617a60dSAndroid Build Coastguard Worker 			.buf = output_buffer,
82*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(output_buffer),
83*8617a60dSAndroid Build Coastguard Worker 		},
84*8617a60dSAndroid Build Coastguard Worker 	};
85*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target error = {
86*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
87*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
88*8617a60dSAndroid Build Coastguard Worker 			.buf = error_buffer,
89*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(error_buffer),
90*8617a60dSAndroid Build Coastguard Worker 		},
91*8617a60dSAndroid Build Coastguard Worker 	};
92*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {"cat", NULL};
93*8617a60dSAndroid Build Coastguard Worker 
94*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &input, &output, &error), 0,
95*8617a60dSAndroid Build Coastguard Worker 		"Return value of \"cat\" is 0");
96*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(memcmp(output_buffer, TEST_STRING_2, sizeof(TEST_STRING_2)),
97*8617a60dSAndroid Build Coastguard Worker 		0, "Output is \"hello\\0world!\"");
98*8617a60dSAndroid Build Coastguard Worker 	TEST_STR_EQ(error_buffer, "", "No output captured on stderr");
99*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(output.buffer.bytes_consumed, sizeof(TEST_STRING_2),
100*8617a60dSAndroid Build Coastguard Worker 		"Bytes consumed is correct");
101*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(error.buffer.bytes_consumed, 0, "No bytes used for error");
102*8617a60dSAndroid Build Coastguard Worker }
103*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_input_null_terminated(void)104*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_input_null_terminated(void)
105*8617a60dSAndroid Build Coastguard Worker {
106*8617a60dSAndroid Build Coastguard Worker 	char input_buffer[20];
107*8617a60dSAndroid Build Coastguard Worker 	char output_buffer[20];
108*8617a60dSAndroid Build Coastguard Worker 	char error_buffer[20];
109*8617a60dSAndroid Build Coastguard Worker 
110*8617a60dSAndroid Build Coastguard Worker 	memcpy(input_buffer, TEST_STRING_2, sizeof(TEST_STRING_2));
111*8617a60dSAndroid Build Coastguard Worker 
112*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target input = {
113*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
114*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
115*8617a60dSAndroid Build Coastguard Worker 			.buf = input_buffer,
116*8617a60dSAndroid Build Coastguard Worker 		},
117*8617a60dSAndroid Build Coastguard Worker 	};
118*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target output = {
119*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
120*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
121*8617a60dSAndroid Build Coastguard Worker 			.buf = output_buffer,
122*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(output_buffer),
123*8617a60dSAndroid Build Coastguard Worker 		},
124*8617a60dSAndroid Build Coastguard Worker 	};
125*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target error = {
126*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
127*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
128*8617a60dSAndroid Build Coastguard Worker 			.buf = error_buffer,
129*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(error_buffer),
130*8617a60dSAndroid Build Coastguard Worker 		},
131*8617a60dSAndroid Build Coastguard Worker 	};
132*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {"cat", NULL};
133*8617a60dSAndroid Build Coastguard Worker 
134*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &input, &output, &error), 0,
135*8617a60dSAndroid Build Coastguard Worker 		"Return value of \"cat\" is 0");
136*8617a60dSAndroid Build Coastguard Worker 	TEST_STR_EQ(output_buffer, "hello", "Output is \"hello\"");
137*8617a60dSAndroid Build Coastguard Worker 	TEST_STR_EQ(error_buffer, "", "No output captured on stderr");
138*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(output.buffer.bytes_consumed, 5, "5 bytes used");
139*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(error.buffer.bytes_consumed, 0, "No bytes used for error");
140*8617a60dSAndroid Build Coastguard Worker }
141*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_small_output_buffer(void)142*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_small_output_buffer(void)
143*8617a60dSAndroid Build Coastguard Worker {
144*8617a60dSAndroid Build Coastguard Worker 	char output_buffer[3];
145*8617a60dSAndroid Build Coastguard Worker 
146*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target output = {
147*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
148*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
149*8617a60dSAndroid Build Coastguard Worker 			.buf = output_buffer,
150*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(output_buffer),
151*8617a60dSAndroid Build Coastguard Worker 		},
152*8617a60dSAndroid Build Coastguard Worker 	};
153*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {
154*8617a60dSAndroid Build Coastguard Worker 		"echo", TEST_STRING, NULL
155*8617a60dSAndroid Build Coastguard Worker 	};
156*8617a60dSAndroid Build Coastguard Worker 
157*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &subprocess_null, &output, NULL), 0,
158*8617a60dSAndroid Build Coastguard Worker 		"Return value of \"echo 'hello world'\" is 0");
159*8617a60dSAndroid Build Coastguard Worker 	TEST_STR_EQ(output_buffer, "he",
160*8617a60dSAndroid Build Coastguard Worker 		    "Output is \"he\" (truncated to small buffer)");
161*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(output.buffer.bytes_consumed, sizeof(output_buffer) - 1,
162*8617a60dSAndroid Build Coastguard Worker 		"The entire output buffer should have been used.");
163*8617a60dSAndroid Build Coastguard Worker }
164*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_return_code_failure(void)165*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_return_code_failure(void)
166*8617a60dSAndroid Build Coastguard Worker {
167*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {"false", NULL};
168*8617a60dSAndroid Build Coastguard Worker 
169*8617a60dSAndroid Build Coastguard Worker 	TEST_NEQ(subprocess_run(argv, NULL, NULL, NULL), 0,
170*8617a60dSAndroid Build Coastguard Worker 		 "Return value of \"false\" is nonzero");
171*8617a60dSAndroid Build Coastguard Worker }
172*8617a60dSAndroid Build Coastguard Worker 
173*8617a60dSAndroid Build Coastguard Worker struct cb_ctx {
174*8617a60dSAndroid Build Coastguard Worker 	char buffer[49 * 1024];
175*8617a60dSAndroid Build Coastguard Worker 	char *ptr;
176*8617a60dSAndroid Build Coastguard Worker };
177*8617a60dSAndroid Build Coastguard Worker 
input_cb(char * buf,size_t buf_sz,void * data)178*8617a60dSAndroid Build Coastguard Worker static ssize_t input_cb(char *buf, size_t buf_sz, void *data)
179*8617a60dSAndroid Build Coastguard Worker {
180*8617a60dSAndroid Build Coastguard Worker 	struct cb_ctx *ctx = (struct cb_ctx *)data;
181*8617a60dSAndroid Build Coastguard Worker 	size_t len = (ctx->buffer + sizeof(ctx->buffer)) - ctx->ptr;
182*8617a60dSAndroid Build Coastguard Worker 	if (len > buf_sz)
183*8617a60dSAndroid Build Coastguard Worker 		len = buf_sz;
184*8617a60dSAndroid Build Coastguard Worker 	memcpy(buf, ctx->ptr, len);
185*8617a60dSAndroid Build Coastguard Worker 	ctx->ptr += len;
186*8617a60dSAndroid Build Coastguard Worker 	return len;
187*8617a60dSAndroid Build Coastguard Worker }
188*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_input_from_cb(void)189*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_input_from_cb(void)
190*8617a60dSAndroid Build Coastguard Worker {
191*8617a60dSAndroid Build Coastguard Worker 	struct cb_ctx ctx;
192*8617a60dSAndroid Build Coastguard Worker 	char output_buffer[sizeof(ctx.buffer)];
193*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {"cat", NULL};
194*8617a60dSAndroid Build Coastguard Worker 
195*8617a60dSAndroid Build Coastguard Worker 	/* Initialize the input buffer with some data */
196*8617a60dSAndroid Build Coastguard Worker 	for (size_t i = 0; i < sizeof(ctx.buffer); i++)
197*8617a60dSAndroid Build Coastguard Worker 		ctx.buffer[i] = (char)i;
198*8617a60dSAndroid Build Coastguard Worker 	ctx.ptr = ctx.buffer;
199*8617a60dSAndroid Build Coastguard Worker 
200*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target output = {
201*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER,
202*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
203*8617a60dSAndroid Build Coastguard Worker 			.buf = output_buffer,
204*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(output_buffer),
205*8617a60dSAndroid Build Coastguard Worker 		},
206*8617a60dSAndroid Build Coastguard Worker 	};
207*8617a60dSAndroid Build Coastguard Worker 
208*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target input = {
209*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_CALLBACK,
210*8617a60dSAndroid Build Coastguard Worker 		.callback = {
211*8617a60dSAndroid Build Coastguard Worker 			.cb = input_cb,
212*8617a60dSAndroid Build Coastguard Worker 			.data = &ctx,
213*8617a60dSAndroid Build Coastguard Worker 		},
214*8617a60dSAndroid Build Coastguard Worker 	};
215*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &input, &output, NULL), 0,
216*8617a60dSAndroid Build Coastguard Worker 		"Return value of \"cat\" is zero.");
217*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(memcmp(ctx.buffer, output_buffer, sizeof(output_buffer)), 0,
218*8617a60dSAndroid Build Coastguard Worker 		"The input buffer is equal to the output buffer.");
219*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(output.buffer.bytes_consumed, sizeof(output_buffer),
220*8617a60dSAndroid Build Coastguard Worker 		"The entire output buffer should have been used.");
221*8617a60dSAndroid Build Coastguard Worker }
222*8617a60dSAndroid Build Coastguard Worker 
output_cb(char * buf,size_t buf_sz,void * data)223*8617a60dSAndroid Build Coastguard Worker static ssize_t output_cb(char *buf, size_t buf_sz, void *data)
224*8617a60dSAndroid Build Coastguard Worker {
225*8617a60dSAndroid Build Coastguard Worker 	struct cb_ctx *ctx = (struct cb_ctx *)data;
226*8617a60dSAndroid Build Coastguard Worker 	if (ctx->ptr + buf_sz > ctx->buffer + sizeof(ctx->buffer)) {
227*8617a60dSAndroid Build Coastguard Worker 		TEST_TRUE(0, "Test failed as there is not enough space in the "
228*8617a60dSAndroid Build Coastguard Worker 			  "output buffer.");
229*8617a60dSAndroid Build Coastguard Worker 		return -1;
230*8617a60dSAndroid Build Coastguard Worker 	}
231*8617a60dSAndroid Build Coastguard Worker 	memcpy(ctx->ptr, buf, buf_sz);
232*8617a60dSAndroid Build Coastguard Worker 	ctx->ptr += buf_sz;
233*8617a60dSAndroid Build Coastguard Worker 	return 0;
234*8617a60dSAndroid Build Coastguard Worker }
235*8617a60dSAndroid Build Coastguard Worker 
test_subprocess_output_to_cb(void)236*8617a60dSAndroid Build Coastguard Worker static void test_subprocess_output_to_cb(void)
237*8617a60dSAndroid Build Coastguard Worker {
238*8617a60dSAndroid Build Coastguard Worker 	struct cb_ctx ctx;
239*8617a60dSAndroid Build Coastguard Worker 	char output_buffer[sizeof(ctx.buffer)];
240*8617a60dSAndroid Build Coastguard Worker 	const char *const argv[] = {
241*8617a60dSAndroid Build Coastguard Worker 		"bc", "-l", NULL
242*8617a60dSAndroid Build Coastguard Worker 	};
243*8617a60dSAndroid Build Coastguard Worker 
244*8617a60dSAndroid Build Coastguard Worker 	ctx.ptr = ctx.buffer;
245*8617a60dSAndroid Build Coastguard Worker 
246*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target input = {
247*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER_NULL_TERMINATED,
248*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
249*8617a60dSAndroid Build Coastguard Worker 			.buf = (char *)"for (i = 0; i <= 10000; i += 1) i\n",
250*8617a60dSAndroid Build Coastguard Worker 		},
251*8617a60dSAndroid Build Coastguard Worker 	};
252*8617a60dSAndroid Build Coastguard Worker 
253*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target target_via_buffer = {
254*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_BUFFER,
255*8617a60dSAndroid Build Coastguard Worker 		.buffer = {
256*8617a60dSAndroid Build Coastguard Worker 			.buf = output_buffer,
257*8617a60dSAndroid Build Coastguard Worker 			.size = sizeof(output_buffer),
258*8617a60dSAndroid Build Coastguard Worker 		},
259*8617a60dSAndroid Build Coastguard Worker 	};
260*8617a60dSAndroid Build Coastguard Worker 
261*8617a60dSAndroid Build Coastguard Worker 	struct subprocess_target target_via_cb = {
262*8617a60dSAndroid Build Coastguard Worker 		.type = TARGET_CALLBACK,
263*8617a60dSAndroid Build Coastguard Worker 		.callback = {
264*8617a60dSAndroid Build Coastguard Worker 			.cb = output_cb,
265*8617a60dSAndroid Build Coastguard Worker 			.data = &ctx,
266*8617a60dSAndroid Build Coastguard Worker 		},
267*8617a60dSAndroid Build Coastguard Worker 	};
268*8617a60dSAndroid Build Coastguard Worker 
269*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &input, &target_via_buffer, NULL), 0,
270*8617a60dSAndroid Build Coastguard Worker 		"Return value is zero when using buffer.");
271*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(subprocess_run(argv, &input, &target_via_cb, NULL), 0,
272*8617a60dSAndroid Build Coastguard Worker 		"Return value is zero when using callback.");
273*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(ctx.ptr - ctx.buffer, target_via_buffer.buffer.bytes_consumed,
274*8617a60dSAndroid Build Coastguard Worker 		"Both commmand invocations used the same number of bytes.");
275*8617a60dSAndroid Build Coastguard Worker 	TEST_EQ(memcmp(output_buffer, ctx.buffer,
276*8617a60dSAndroid Build Coastguard Worker 		       target_via_buffer.buffer.bytes_consumed),
277*8617a60dSAndroid Build Coastguard Worker 		0, "Both output buffers are equivalent.");
278*8617a60dSAndroid Build Coastguard Worker }
279*8617a60dSAndroid Build Coastguard Worker 
main(int argc,char * argv[])280*8617a60dSAndroid Build Coastguard Worker int main(int argc, char *argv[])
281*8617a60dSAndroid Build Coastguard Worker {
282*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_output_to_buffer();
283*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_output_to_buffer_null_terminated();
284*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_input_buffer();
285*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_input_null_terminated();
286*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_small_output_buffer();
287*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_return_code_failure();
288*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_input_from_cb();
289*8617a60dSAndroid Build Coastguard Worker 	test_subprocess_output_to_cb();
290*8617a60dSAndroid Build Coastguard Worker 
291*8617a60dSAndroid Build Coastguard Worker 	return gTestSuccess ? 0 : 255;
292*8617a60dSAndroid Build Coastguard Worker }
293