1fb25420bSRobert Mustacchi#!/usr/bin/ksh
2fb25420bSRobert Mustacchi#
3fb25420bSRobert Mustacchi# This file and its contents are supplied under the terms of the
4fb25420bSRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0.
5fb25420bSRobert Mustacchi# You may only use this file in accordance with the terms of version
6fb25420bSRobert Mustacchi# 1.0 of the CDDL.
7fb25420bSRobert Mustacchi#
8fb25420bSRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this
9fb25420bSRobert Mustacchi# source.  A copy of the CDDL is also available via the Internet at
10fb25420bSRobert Mustacchi# http://www.illumos.org/license/CDDL.
11fb25420bSRobert Mustacchi#
12fb25420bSRobert Mustacchi
13fb25420bSRobert Mustacchi#
14*11029d9dSRobert Mustacchi# Copyright 2022 Oxide Computer Company
15fb25420bSRobert Mustacchi#
16fb25420bSRobert Mustacchi
17fb25420bSRobert Mustacchi#
18fb25420bSRobert Mustacchi# This contains a number of basic tests for ar(1). When adding something
19fb25420bSRobert Mustacchi# to ar or fixing a bug, please expand this!
20fb25420bSRobert Mustacchi#
21fb25420bSRobert Mustacchi
22fb25420bSRobert Mustacchiunalias -a
23fb25420bSRobert Mustacchiset -o pipefail
24fb25420bSRobert Mustacchi
25fb25420bSRobert Mustacchiar_arg0="$(basename $0)"
26fb25420bSRobert Mustacchiar_data="$(dirname $0)"
27fb25420bSRobert Mustacchiar_data0="$ar_data/ar_test0.o"
28fb25420bSRobert Mustacchiar_data1="$ar_data/ar_test1.o"
29fb25420bSRobert Mustacchiar_prog=/usr/bin/ar
30fb25420bSRobert Mustacchiar_tmpdir=/tmp/ar.$$
31fb25420bSRobert Mustacchi
32fb25420bSRobert Mustacchiar_f01="$ar_tmpdir/test01.a"
33fb25420bSRobert Mustacchiar_f10="$ar_tmpdir/test10.a"
34fb25420bSRobert Mustacchi
35fb25420bSRobert Mustacchiar_t01="ar_test0.o
36fb25420bSRobert Mustacchiar_test1.o"
37fb25420bSRobert Mustacchiar_t10="ar_test1.o
38fb25420bSRobert Mustacchiar_test0.o"
39fb25420bSRobert Mustacchi
40fb25420bSRobert Mustacchistrip_prog=/usr/bin/strip
41fb25420bSRobert Mustacchidump_prog=/usr/bin/dump
42fb25420bSRobert Mustacchinm_prog=/usr/bin/nm
43fb25420bSRobert Mustacchi
44fb25420bSRobert Mustacchiar_exit=0
45fb25420bSRobert Mustacchi
46fb25420bSRobert Mustacchifunction warn
47fb25420bSRobert Mustacchi{
48fb25420bSRobert Mustacchi	typeset msg="$*"
49fb25420bSRobert Mustacchi	[[ -z "$msg" ]] && msg="failed"
50fb25420bSRobert Mustacchi	print -u2 "TEST FAILED: $ar_arg0: $msg"
51fb25420bSRobert Mustacchi	ar_exit=1
52fb25420bSRobert Mustacchi}
53fb25420bSRobert Mustacchi
54fb25420bSRobert Mustacchifunction compare_files
55fb25420bSRobert Mustacchi{
56fb25420bSRobert Mustacchi	typeset base="$1"
57fb25420bSRobert Mustacchi	typeset comp="$2"
58fb25420bSRobert Mustacchi	typeset err=0
59fb25420bSRobert Mustacchi
60fb25420bSRobert Mustacchi	if ! $dump_prog -g $comp | sed 1d > $comp.dump; then
61fb25420bSRobert Mustacchi		warn "failed to dump -g $comp"
62fb25420bSRobert Mustacchi		err=1
63fb25420bSRobert Mustacchi	fi
64fb25420bSRobert Mustacchi
65fb25420bSRobert Mustacchi	if ! $nm_prog -P -tx $comp > $comp.nm; then
66fb25420bSRobert Mustacchi		warn "failed to nm $comp"
67fb25420bSRobert Mustacchi		err=1
68fb25420bSRobert Mustacchi	fi
69fb25420bSRobert Mustacchi
70fb25420bSRobert Mustacchi	if ! diff $base.dump $comp.dump; then
71fb25420bSRobert Mustacchi		warn "$base.dump and $comp.dump don't match"
72fb25420bSRobert Mustacchi		err=1
73fb25420bSRobert Mustacchi	fi
74fb25420bSRobert Mustacchi
75fb25420bSRobert Mustacchi	if ! diff $base.nm $comp.nm; then
76fb25420bSRobert Mustacchi		warn "$base.dump and $comp.dump don't match"
77fb25420bSRobert Mustacchi		err=1
78fb25420bSRobert Mustacchi	fi
79fb25420bSRobert Mustacchi
80fb25420bSRobert Mustacchi	return $err
81fb25420bSRobert Mustacchi}
82fb25420bSRobert Mustacchi
83fb25420bSRobert Mustacchi#
84fb25420bSRobert Mustacchi# To set things up, we first go and create two basic archives that we
85fb25420bSRobert Mustacchi# will then use as the basis for comaring various operations later.
86fb25420bSRobert Mustacchi#
87fb25420bSRobert Mustacchifunction setup_baseline
88fb25420bSRobert Mustacchi{
89fb25420bSRobert Mustacchi	if ! $ar_prog cr $ar_f01 $ar_data0 $ar_data1; then
90fb25420bSRobert Mustacchi		warn "failed to create basic archive $ar_f01"
91fb25420bSRobert Mustacchi	fi
92fb25420bSRobert Mustacchi
93fb25420bSRobert Mustacchi	if ! $ar_prog cr $ar_f10 $ar_data1 $ar_data0; then
94fb25420bSRobert Mustacchi		warn "failed to create basic archive $ar_f10"
95fb25420bSRobert Mustacchi	fi
96fb25420bSRobert Mustacchi
97fb25420bSRobert Mustacchi	if ! $dump_prog -g $ar_f01 | sed 1d > $ar_f01.dump; then
98fb25420bSRobert Mustacchi		warn "failed to dump archive $ar_f01"
99fb25420bSRobert Mustacchi	fi
100fb25420bSRobert Mustacchi
101fb25420bSRobert Mustacchi	if ! $dump_prog -g $ar_f10 | sed 1d > $ar_f10.dump; then
102fb25420bSRobert Mustacchi		warn "failed to dump archive $ar_f10"
103fb25420bSRobert Mustacchi	fi
104fb25420bSRobert Mustacchi
105fb25420bSRobert Mustacchi	if ! $nm_prog -P -tx $ar_f01 > $ar_f01.nm; then
106fb25420bSRobert Mustacchi		warn "failed to nm archive $ar_f01"
107fb25420bSRobert Mustacchi	fi
108fb25420bSRobert Mustacchi
109fb25420bSRobert Mustacchi	if ! $nm_prog -P -tx $ar_f10 > $ar_f10.nm; then
110fb25420bSRobert Mustacchi		warn "failed to nm archive $ar_f01"
111fb25420bSRobert Mustacchi	fi
112fb25420bSRobert Mustacchi
113fb25420bSRobert Mustacchi	print "TEST PASSED: basic archive creation"
114fb25420bSRobert Mustacchi}
115fb25420bSRobert Mustacchi
116fb25420bSRobert Mustacchifunction strip_archive
117fb25420bSRobert Mustacchi{
118fb25420bSRobert Mustacchi	typeset file="$1"
119fb25420bSRobert Mustacchi	typeset output=
120fb25420bSRobert Mustacchi
121fb25420bSRobert Mustacchi	if ! $strip_prog $file 2>/dev/null; then
122fb25420bSRobert Mustacchi		warn "failed to strip $alt"
123fb25420bSRobert Mustacchi		return 1
124fb25420bSRobert Mustacchi	fi
125fb25420bSRobert Mustacchi
126fb25420bSRobert Mustacchi	output=$($dump_prog -g $file)
127fb25420bSRobert Mustacchi	if [[ -n "$output" ]]; then
128fb25420bSRobert Mustacchi		warn "stripped file $file somehow has an ar header"
129fb25420bSRobert Mustacchi		return 1
130fb25420bSRobert Mustacchi	fi
131fb25420bSRobert Mustacchi
132fb25420bSRobert Mustacchi	return 0
133fb25420bSRobert Mustacchi}
134fb25420bSRobert Mustacchi
135fb25420bSRobert Mustacchi#
136fb25420bSRobert Mustacchi# Validate that stripping and regenerating a symbol table actually
137fb25420bSRobert Mustacchi# works.
138fb25420bSRobert Mustacchi#
139fb25420bSRobert Mustacchifunction test_s
140fb25420bSRobert Mustacchi{
141fb25420bSRobert Mustacchi	typeset alt="$ar_tmpdir/s.a"
142fb25420bSRobert Mustacchi	typeset output=
143fb25420bSRobert Mustacchi
144fb25420bSRobert Mustacchi	if ! cp $ar_f01 $alt; then
145fb25420bSRobert Mustacchi		warn "failed to copy file"
146fb25420bSRobert Mustacchi		return
147fb25420bSRobert Mustacchi	fi
148fb25420bSRobert Mustacchi
149fb25420bSRobert Mustacchi	if ! strip_archive $alt; then
150fb25420bSRobert Mustacchi		return
151fb25420bSRobert Mustacchi	fi
152fb25420bSRobert Mustacchi
153fb25420bSRobert Mustacchi	if ! $ar_prog s $alt; then
154fb25420bSRobert Mustacchi		warn "restore symbol table with ar s"
155fb25420bSRobert Mustacchi	fi
156fb25420bSRobert Mustacchi
157fb25420bSRobert Mustacchi	if compare_files "$ar_f01" "$alt"; then
158fb25420bSRobert Mustacchi		print "TEST PASSED: restoring stripped archive with -s"
159fb25420bSRobert Mustacchi	fi
160fb25420bSRobert Mustacchi
161fb25420bSRobert Mustacchi	if ! strip_archive $alt; then
162fb25420bSRobert Mustacchi		return
163fb25420bSRobert Mustacchi	fi
164fb25420bSRobert Mustacchi
165fb25420bSRobert Mustacchi	if ! $ar_prog st $alt >/dev/null; then
166fb25420bSRobert Mustacchi		warn "restore symbol table with ar st"
167fb25420bSRobert Mustacchi	fi
168fb25420bSRobert Mustacchi
169fb25420bSRobert Mustacchi	if compare_files "$ar_f01" "$alt"; then
170fb25420bSRobert Mustacchi		print "TEST PASSED: restoring stripped archive with -st"
171fb25420bSRobert Mustacchi	fi
172fb25420bSRobert Mustacchi
173fb25420bSRobert Mustacchi	if ! strip_archive $alt; then
174fb25420bSRobert Mustacchi		return
175fb25420bSRobert Mustacchi	fi
176fb25420bSRobert Mustacchi
177fb25420bSRobert Mustacchi	output=$($ar_prog sv $alt 2>&1)
178fb25420bSRobert Mustacchi	if [[ "$output" == "ar: writing $alt" ]]; then
179fb25420bSRobert Mustacchi		print "TEST PASSED: ar -sv has proper output"
180fb25420bSRobert Mustacchi	else
181fb25420bSRobert Mustacchi		warn "ar -sv has unexpected output: $output"
182fb25420bSRobert Mustacchi	fi
183fb25420bSRobert Mustacchi
184fb25420bSRobert Mustacchi	if compare_files "$ar_f01" "$alt"; then
185fb25420bSRobert Mustacchi		print "TEST PASSED: restoring stripped archive with -sv"
186fb25420bSRobert Mustacchi	fi
187fb25420bSRobert Mustacchi}
188fb25420bSRobert Mustacchi
189fb25420bSRobert Mustacchi#
190fb25420bSRobert Mustacchi# Ensure that use of -s and -r still works. This is a regression test
191fb25420bSRobert Mustacchi# for the original integration of standalone -s support.
192fb25420bSRobert Mustacchi#
193fb25420bSRobert Mustacchifunction test_rs
194fb25420bSRobert Mustacchi{
195fb25420bSRobert Mustacchi	typeset alt="$ar_tmpdir/rs.a"
196fb25420bSRobert Mustacchi
197fb25420bSRobert Mustacchi	if ! $ar_prog rs $alt $ar_data1 $ar_data0; then
198fb25420bSRobert Mustacchi		warn "ar -rs: did not create an archive"
199fb25420bSRobert Mustacchi	fi
200fb25420bSRobert Mustacchi
201fb25420bSRobert Mustacchi	if ! compare_files $ar_f10 $alt; then
202fb25420bSRobert Mustacchi		warn "ar -rs: did not create expected file"
203fb25420bSRobert Mustacchi	else
204fb25420bSRobert Mustacchi		print "TEST PASSED: ar -rs creates archives"
205fb25420bSRobert Mustacchi	fi
206fb25420bSRobert Mustacchi
207fb25420bSRobert Mustacchi	rm -f $alt
208fb25420bSRobert Mustacchi
209fb25420bSRobert Mustacchi	if ! $ar_prog crs $alt $ar_data1 $ar_data0; then
210fb25420bSRobert Mustacchi		warn "ar -crs: did not create an archive"
211fb25420bSRobert Mustacchi	fi
212fb25420bSRobert Mustacchi
213fb25420bSRobert Mustacchi	if ! compare_files $ar_f10 $alt; then
214fb25420bSRobert Mustacchi		warn "ar -crs: did not create expected file"
215fb25420bSRobert Mustacchi	else
216fb25420bSRobert Mustacchi		print "TEST PASSED: ar -crs creates archives"
217fb25420bSRobert Mustacchi	fi
218fb25420bSRobert Mustacchi}
219fb25420bSRobert Mustacchi
220fb25420bSRobert Mustacchi#
221fb25420bSRobert Mustacchi# Verify that basic ar -r invocations ultimately end up creating what
222fb25420bSRobert Mustacchi# we'd expect.
223fb25420bSRobert Mustacchi#
224fb25420bSRobert Mustacchifunction test_incremental
225fb25420bSRobert Mustacchi{
226fb25420bSRobert Mustacchi	typeset alt="$ar_tmpdir/incr.a"
227fb25420bSRobert Mustacchi
228fb25420bSRobert Mustacchi	if ! $ar_prog cr $alt $ar_data0; then
229fb25420bSRobert Mustacchi		warn "incremental archive: failed to create archive"
230fb25420bSRobert Mustacchi		return
231fb25420bSRobert Mustacchi	fi
232fb25420bSRobert Mustacchi
233fb25420bSRobert Mustacchi	if ! $ar_prog cr $alt $ar_data1; then
234fb25420bSRobert Mustacchi		warn "incremental archive: failed to add to archive"
235fb25420bSRobert Mustacchi		return
236fb25420bSRobert Mustacchi	fi
237fb25420bSRobert Mustacchi
238fb25420bSRobert Mustacchi	if ! compare_files $ar_f01 $alt; then
239fb25420bSRobert Mustacchi		warn "incremental archive: did not create expected file"
240fb25420bSRobert Mustacchi	else
241fb25420bSRobert Mustacchi		print "TEST PASSED: incremental archive creation"
242fb25420bSRobert Mustacchi	fi
243fb25420bSRobert Mustacchi
244fb25420bSRobert Mustacchi}
245fb25420bSRobert Mustacchi
246fb25420bSRobert Mustacchi#
247fb25420bSRobert Mustacchi# Validate that ar's various -a and -b variants work.
248fb25420bSRobert Mustacchi#
249fb25420bSRobert Mustacchifunction test_pos
250fb25420bSRobert Mustacchi{
251fb25420bSRobert Mustacchi	typeset alt="$ar_tmpdir/pos.a"
252fb25420bSRobert Mustacchi
253fb25420bSRobert Mustacchi	if ! $ar_prog cr $alt $ar_data1; then
254fb25420bSRobert Mustacchi		warn "positional tests: failed to create archive"
255fb25420bSRobert Mustacchi		return;
256fb25420bSRobert Mustacchi	fi
257fb25420bSRobert Mustacchi
258fb25420bSRobert Mustacchi	if ! $ar_prog -cra ar_test1.o $alt $ar_data0; then
259fb25420bSRobert Mustacchi		warn "positional tests: -a append failed"
260fb25420bSRobert Mustacchi		return
261fb25420bSRobert Mustacchi	fi
262fb25420bSRobert Mustacchi
263fb25420bSRobert Mustacchi	if ! compare_files $ar_f10 $alt; then
264fb25420bSRobert Mustacchi		warn "positional tests: -cra archive is incorrect"
265fb25420bSRobert Mustacchi	else
266fb25420bSRobert Mustacchi		print "TEST PASSED: positional tests: ar -cra"
267fb25420bSRobert Mustacchi	fi
268fb25420bSRobert Mustacchi
269fb25420bSRobert Mustacchi	rm -f $alt
270fb25420bSRobert Mustacchi
271fb25420bSRobert Mustacchi	if ! $ar_prog cr $alt $ar_data1; then
272fb25420bSRobert Mustacchi		warn "positional tests: failed to create archive"
273fb25420bSRobert Mustacchi		return;
274fb25420bSRobert Mustacchi	fi
275fb25420bSRobert Mustacchi
276fb25420bSRobert Mustacchi	if ! $ar_prog -crb ar_test1.o $alt $ar_data0; then
277fb25420bSRobert Mustacchi		warn "positional tests: -b prepend failed"
278fb25420bSRobert Mustacchi		return
279fb25420bSRobert Mustacchi	fi
280fb25420bSRobert Mustacchi
281fb25420bSRobert Mustacchi	if ! compare_files $ar_f01 $alt; then
282fb25420bSRobert Mustacchi		warn "positional tests: -crb archive is incorrect"
283fb25420bSRobert Mustacchi	else
284fb25420bSRobert Mustacchi		print "TEST PASSED: positional tests: ar -crb"
285fb25420bSRobert Mustacchi	fi
286fb25420bSRobert Mustacchi
287fb25420bSRobert Mustacchi	rm -f $alt
288fb25420bSRobert Mustacchi
289fb25420bSRobert Mustacchi	if ! $ar_prog cr $alt $ar_data1; then
290fb25420bSRobert Mustacchi		warn "positional tests: failed to create archive"
291fb25420bSRobert Mustacchi		return;
292fb25420bSRobert Mustacchi	fi
293fb25420bSRobert Mustacchi
294fb25420bSRobert Mustacchi	if ! $ar_prog -cri ar_test1.o $alt $ar_data0; then
295fb25420bSRobert Mustacchi		warn "positional tests: -i prepend failed"
296fb25420bSRobert Mustacchi		return
297fb25420bSRobert Mustacchi	fi
298fb25420bSRobert Mustacchi
299fb25420bSRobert Mustacchi	if ! compare_files $ar_f01 $alt; then
300fb25420bSRobert Mustacchi		warn "positional tests: -cri archive is incorrect"
301fb25420bSRobert Mustacchi	else
302fb25420bSRobert Mustacchi		print "TEST PASSED: positional tests: ar -cri"
303fb25420bSRobert Mustacchi	fi
304fb25420bSRobert Mustacchi
305fb25420bSRobert Mustacchi}
306fb25420bSRobert Mustacchi
307fb25420bSRobert Mustacchi#
308fb25420bSRobert Mustacchi# Go through and validate the various versions of ar x.
309fb25420bSRobert Mustacchi#
310fb25420bSRobert Mustacchifunction test_x
311fb25420bSRobert Mustacchi{
312fb25420bSRobert Mustacchi	typeset out0="$ar_tmpdir/ar_test0.o"
313fb25420bSRobert Mustacchi	typeset out1="$ar_tmpdir/ar_test1.o"
314fb25420bSRobert Mustacchi	typeset output=
315fb25420bSRobert Mustacchi
316fb25420bSRobert Mustacchi	rm -f $out0 $out1
317fb25420bSRobert Mustacchi
318fb25420bSRobert Mustacchi	if ! $ar_prog x $ar_f01; then
319fb25420bSRobert Mustacchi		warn "ar -x: failed to extract files"
320fb25420bSRobert Mustacchi	fi
321fb25420bSRobert Mustacchi
322fb25420bSRobert Mustacchi	if cmp -s $out0 $ar_data0 && cmp -s $out1 $ar_data1; then
323fb25420bSRobert Mustacchi		print "TEST PASSED: ar -x"
324fb25420bSRobert Mustacchi	else
325fb25420bSRobert Mustacchi		warn "ar -x: extracted files differs"
326fb25420bSRobert Mustacchi	fi
327fb25420bSRobert Mustacchi
328fb25420bSRobert Mustacchi	rm -f $out0 $out1
329fb25420bSRobert Mustacchi	echo elberth > $out0
330fb25420bSRobert Mustacchi
331fb25420bSRobert Mustacchi	#
332fb25420bSRobert Mustacchi	# For some reason, ar -Cx will actually fail if you have an
333fb25420bSRobert Mustacchi	# existing file. It seems a bit weird as it means you can't
334fb25420bSRobert Mustacchi	# extract existing files (depdendent on order), but that's how
335fb25420bSRobert Mustacchi	# it goes.
336fb25420bSRobert Mustacchi	#
337fb25420bSRobert Mustacchi	if $ar_prog Cx $ar_f01 ar_test0.o; then
338fb25420bSRobert Mustacchi		warn "ar -Cx: failed to extract file that wasn't in fs\n"
339fb25420bSRobert Mustacchi	fi
340fb25420bSRobert Mustacchi
341fb25420bSRobert Mustacchi	output=$(cat $out0)
342fb25420bSRobert Mustacchi	if [[ "$output" != "elberth" ]]; then
343fb25420bSRobert Mustacchi		warn "ar -Cx: overwrote pre-existing file"
344fb25420bSRobert Mustacchi	else
345fb25420bSRobert Mustacchi		print "TEST PASSED: ar -Cx did not overwrite existing file"
346fb25420bSRobert Mustacchi	fi
347fb25420bSRobert Mustacchi
348fb25420bSRobert Mustacchi	if ! $ar_prog Cx $ar_f01 ar_test1.o; then
349fb25420bSRobert Mustacchi		warn "ar -Cx: failed to extract file that wasn't in fs\n"
350fb25420bSRobert Mustacchi	fi
351fb25420bSRobert Mustacchi
352fb25420bSRobert Mustacchi	if cmp -s $out1 $ar_data1; then
353fb25420bSRobert Mustacchi		print "TEST PASSED: ar -Cx extracted file that didn't exist"
354fb25420bSRobert Mustacchi	else
355fb25420bSRobert Mustacchi		warn "ar -Cx: failed to extract file that exists"
356fb25420bSRobert Mustacchi	fi
357fb25420bSRobert Mustacchi}
358fb25420bSRobert Mustacchi
359fb25420bSRobert Mustacchi#
360fb25420bSRobert Mustacchi# Variant of -x that ensures we restore stripped archives.
361fb25420bSRobert Mustacchi#
362fb25420bSRobert Mustacchifunction test_xs
363fb25420bSRobert Mustacchi{
364fb25420bSRobert Mustacchi	typeset alt="$ar_tmpdir/xs.a"
365fb25420bSRobert Mustacchi	typeset out0="$ar_tmpdir/ar_test0.o"
366fb25420bSRobert Mustacchi	typeset out1="$ar_tmpdir/ar_test1.o"
367fb25420bSRobert Mustacchi
368fb25420bSRobert Mustacchi	rm -f $out0 $out1
369fb25420bSRobert Mustacchi
370fb25420bSRobert Mustacchi	if ! cp $ar_f01 $alt; then
371fb25420bSRobert Mustacchi		warn "failed to copy file"
372fb25420bSRobert Mustacchi		return
373fb25420bSRobert Mustacchi	fi
374fb25420bSRobert Mustacchi
375fb25420bSRobert Mustacchi	if ! strip_archive $alt; then
376fb25420bSRobert Mustacchi		return
377fb25420bSRobert Mustacchi	fi
378fb25420bSRobert Mustacchi
379fb25420bSRobert Mustacchi	if ! $ar_prog xs $alt; then
380fb25420bSRobert Mustacchi		warn "ar -xs: failed to extract files"
381fb25420bSRobert Mustacchi	fi
382fb25420bSRobert Mustacchi
383fb25420bSRobert Mustacchi	if cmp -s $out0 $ar_data0 && cmp -s $out1 $ar_data1 && \
384fb25420bSRobert Mustacchi	    compare_files "$ar_f01" "$alt"; then
385fb25420bSRobert Mustacchi		print "TEST PASSED: ar -xs"
386fb25420bSRobert Mustacchi	else
387fb25420bSRobert Mustacchi		warn "ar -xs: extracted and restore archive differ"
388fb25420bSRobert Mustacchi	fi
389fb25420bSRobert Mustacchi}
390fb25420bSRobert Mustacchi
391fb25420bSRobert Mustacchifunction test_m
392fb25420bSRobert Mustacchi{
393fb25420bSRobert Mustacchi	typeset alt="$ar_tmpdir/pos.a"
394fb25420bSRobert Mustacchi
395fb25420bSRobert Mustacchi	if ! cp $ar_f01 $alt; then
396fb25420bSRobert Mustacchi		warn "failed to copy file"
397fb25420bSRobert Mustacchi		return
398fb25420bSRobert Mustacchi	fi
399fb25420bSRobert Mustacchi
400fb25420bSRobert Mustacchi	if ! $ar_prog ma ar_test1.o $alt ar_test0.o; then
401fb25420bSRobert Mustacchi		warn "ar -ma: failed didn't work"
402fb25420bSRobert Mustacchi	fi
403fb25420bSRobert Mustacchi
404fb25420bSRobert Mustacchi	if compare_files "$ar_f10" "$alt"; then
405fb25420bSRobert Mustacchi		print "TEST PASSED: ar -ma"
406fb25420bSRobert Mustacchi	else
407fb25420bSRobert Mustacchi		warn "ar -ma: did not create expected archive"
408fb25420bSRobert Mustacchi	fi
409fb25420bSRobert Mustacchi
410fb25420bSRobert Mustacchi	if ! $ar_prog mb ar_test1.o $alt ar_test0.o; then
411fb25420bSRobert Mustacchi		warn "ar -ma: failed didn't work"
412fb25420bSRobert Mustacchi	fi
413fb25420bSRobert Mustacchi
414fb25420bSRobert Mustacchi	if compare_files "$ar_f01" "$alt"; then
415fb25420bSRobert Mustacchi		print "TEST PASSED: ar -mb"
416fb25420bSRobert Mustacchi	else
417fb25420bSRobert Mustacchi		warn "ar -mb: did not create expected archive"
418fb25420bSRobert Mustacchi	fi
419fb25420bSRobert Mustacchi}
420fb25420bSRobert Mustacchi
421fb25420bSRobert Mustacchifunction test_t
422fb25420bSRobert Mustacchi{
423fb25420bSRobert Mustacchi	typeset output=
424fb25420bSRobert Mustacchi
425fb25420bSRobert Mustacchi	output=$($ar_prog t $ar_f01)
426fb25420bSRobert Mustacchi	if [[ "$ar_t01" != "$output" ]]; then
427fb25420bSRobert Mustacchi		warn "ar t: mismatched output on $ar_t01, found $output"
428fb25420bSRobert Mustacchi	else
429fb25420bSRobert Mustacchi		print "TEST PASSED: ar -t (output 01)"
430fb25420bSRobert Mustacchi	fi
431fb25420bSRobert Mustacchi
432fb25420bSRobert Mustacchi	output=$($ar_prog t $ar_f10)
433fb25420bSRobert Mustacchi	if [[ "$ar_t10" != "$output" ]]; then
434fb25420bSRobert Mustacchi		warn "ar t: mismatched output on $ar_f10, found $output"
435fb25420bSRobert Mustacchi	else
436fb25420bSRobert Mustacchi		print "TEST PASSED: ar -t (output 10)"
437fb25420bSRobert Mustacchi	fi
438fb25420bSRobert Mustacchi}
439fb25420bSRobert Mustacchi
440*11029d9dSRobert Mustacchifunction test_q
441*11029d9dSRobert Mustacchi{
442*11029d9dSRobert Mustacchi	typeset alt="$ar_tmpdir/q.a"
443*11029d9dSRobert Mustacchi
444*11029d9dSRobert Mustacchi	if ! $ar_prog q $alt $ar_data1 $ar_data0; then
445*11029d9dSRobert Mustacchi		warn "ar -q: did not create an archive"
446*11029d9dSRobert Mustacchi	fi
447*11029d9dSRobert Mustacchi
448*11029d9dSRobert Mustacchi	if ! compare_files $ar_f10 $alt; then
449*11029d9dSRobert Mustacchi		warn "ar -q: did not create expected file"
450*11029d9dSRobert Mustacchi	else
451*11029d9dSRobert Mustacchi		print "TEST PASSED: ar -q creates archives"
452*11029d9dSRobert Mustacchi	fi
453*11029d9dSRobert Mustacchi
454*11029d9dSRobert Mustacchi	rm -f $alt
455*11029d9dSRobert Mustacchi
456*11029d9dSRobert Mustacchi	if ! $ar_prog cq $alt $ar_data1 $ar_data0; then
457*11029d9dSRobert Mustacchi		warn "ar -rs: did not create an archive"
458*11029d9dSRobert Mustacchi	fi
459*11029d9dSRobert Mustacchi
460*11029d9dSRobert Mustacchi	if ! compare_files $ar_f10 $alt; then
461*11029d9dSRobert Mustacchi		warn "ar -cq: did not create expected file"
462*11029d9dSRobert Mustacchi	else
463*11029d9dSRobert Mustacchi		print "TEST PASSED: ar -cq creates archives"
464*11029d9dSRobert Mustacchi	fi
465*11029d9dSRobert Mustacchi
466*11029d9dSRobert Mustacchi	rm -f $alt
467*11029d9dSRobert Mustacchi
468*11029d9dSRobert Mustacchi	if ! $ar_prog cqs $alt $ar_data1 $ar_data0; then
469*11029d9dSRobert Mustacchi		warn "ar -cqs: did not create an archive"
470*11029d9dSRobert Mustacchi	fi
471*11029d9dSRobert Mustacchi
472*11029d9dSRobert Mustacchi	if ! compare_files $ar_f10 $alt; then
473*11029d9dSRobert Mustacchi		warn "ar -cqs: did not create expected file"
474*11029d9dSRobert Mustacchi	else
475*11029d9dSRobert Mustacchi		print "TEST PASSED: ar -cqs creates archives"
476*11029d9dSRobert Mustacchi	fi
477*11029d9dSRobert Mustacchi
478*11029d9dSRobert Mustacchi}
479*11029d9dSRobert Mustacchi
480fb25420bSRobert Mustacchifunction test_err
481fb25420bSRobert Mustacchi{
482fb25420bSRobert Mustacchi	if $ar_prog $@ 2>/dev/null 1>/dev/null; then
483fb25420bSRobert Mustacchi		warn "should have failed with args "$@", but passed"
484fb25420bSRobert Mustacchi	else
485fb25420bSRobert Mustacchi		printf "TEST PASSED: invalid arguments %s\n" "$*"
486fb25420bSRobert Mustacchi	fi
487fb25420bSRobert Mustacchi}
488fb25420bSRobert Mustacchi
489fb25420bSRobert Mustacchi#
490fb25420bSRobert Mustacchi# Before we begin execution, set up the environment such that we have a
491fb25420bSRobert Mustacchi# standard locale and that umem will help us catch mistakes.
492fb25420bSRobert Mustacchi#
493fb25420bSRobert Mustacchiexport LC_ALL=C.UTF-8
494fb25420bSRobert Mustacchiexport LD_PRELOAD=libumem.so
495fb25420bSRobert Mustacchiexport UMEM_DEBUG=default
496fb25420bSRobert Mustacchi
497fb25420bSRobert Mustacchiif ! mkdir "$ar_tmpdir"; then
498fb25420bSRobert Mustacchi	printf "failed to make output directory %s\n" "$ar_tmpdir" >&2
499fb25420bSRobert Mustacchi	exit 1
500fb25420bSRobert Mustacchifi
501fb25420bSRobert Mustacchi
502fb25420bSRobert Mustacchiif ! cd "$ar_tmpdir"; then
503fb25420bSRobert Mustacchi	printf "failed to cd into output directory %s\n" "$ar_tmpdir" >&2
504fb25420bSRobert Mustacchi	exit 1
505fb25420bSRobert Mustacchifi
506fb25420bSRobert Mustacchi
507fb25420bSRobert Mustacchiif [[ ! -d "$ar_data" ]]; then
508fb25420bSRobert Mustacchi	printf "failed to find data directory %s\n" "$ar_data" >&2
509fb25420bSRobert Mustacchi	exit 1
510fb25420bSRobert Mustacchifi
511fb25420bSRobert Mustacchi
512fb25420bSRobert Mustacchiif [[ -n $AR ]]; then
513fb25420bSRobert Mustacchi	echo overwrote AR as $AR
514fb25420bSRobert Mustacchi	ar_prog=$AR
515fb25420bSRobert Mustacchifi
516fb25420bSRobert Mustacchi
517fb25420bSRobert Mustacchisetup_baseline
518fb25420bSRobert Mustacchitest_s
519fb25420bSRobert Mustacchitest_rs
520fb25420bSRobert Mustacchitest_incremental
521fb25420bSRobert Mustacchitest_pos
522fb25420bSRobert Mustacchitest_x
523fb25420bSRobert Mustacchitest_xs
524fb25420bSRobert Mustacchitest_m
525fb25420bSRobert Mustacchitest_t
526*11029d9dSRobert Mustacchitest_q
527fb25420bSRobert Mustacchi
528fb25420bSRobert Mustacchi#
529fb25420bSRobert Mustacchi# Note, there are many cases here which probably should be failures and
530fb25420bSRobert Mustacchi# aren't (e.g. ar -mabi) because that's how the tool works today. With
531fb25420bSRobert Mustacchi# proper regression testing of building 3rd party packages this could be
532fb25420bSRobert Mustacchi# changed.
533fb25420bSRobert Mustacchi#
534fb25420bSRobert Mustacchitest_err ""
535fb25420bSRobert Mustacchitest_err "-z"
536fb25420bSRobert Mustacchitest_err "-d"
537fb25420bSRobert Mustacchitest_err "-d" "$ar_tmpdir/enoent"
538fb25420bSRobert Mustacchitest_err "-d" "$ar_f01" "foobar.exe"
539fb25420bSRobert Mustacchitest_err "-m" "$ar_tmpdir/enoent"
540fb25420bSRobert Mustacchitest_err "-ma" "foobar.exe" "$ar_tmpdir/enoent"
541fb25420bSRobert Mustacchitest_err "-mb" "foobar.exe" "$ar_tmpdir/enoent"
542fb25420bSRobert Mustacchitest_err "-mi" "foobar.exe" "$ar_tmpdir/enoent"
543fb25420bSRobert Mustacchitest_err "-p" "$ar_tmpdir/enoent"
544fb25420bSRobert Mustacchitest_err "-P" "$ar_tmpdir/enoent"
545fb25420bSRobert Mustacchitest_err "-q"
546fb25420bSRobert Mustacchitest_err "-qa" "foobar.exe" "$ar_f0.a"
547fb25420bSRobert Mustacchitest_err "-qb" "foobar.exe" "$ar_f0.a"
548fb25420bSRobert Mustacchitest_err "-qi" "foobar.exe" "$ar_f0.a"
549fb25420bSRobert Mustacchitest_err "-qa" "ar_test0.o" "$ar_f0.a"
550fb25420bSRobert Mustacchitest_err "-qb" "ar_test0.o" "$ar_f0.a"
551fb25420bSRobert Mustacchitest_err "-qi" "ar_test0.o" "$ar_f0.a"
552fb25420bSRobert Mustacchitest_err "-r"
553fb25420bSRobert Mustacchitest_err "-ra" "foobar.exe"
554fb25420bSRobert Mustacchitest_err "-ra" "foobar.exe" "$ar_tmpdir/enoent"
555fb25420bSRobert Mustacchitest_err "-rb" "foobar.exe"
556fb25420bSRobert Mustacchitest_err "-rb" "foobar.exe" "$ar_tmpdir/enoent"
557fb25420bSRobert Mustacchitest_err "-ri" "foobar.exe"
558fb25420bSRobert Mustacchitest_err "-ri" "foobar.exe" "$ar_tmpdir/enoent"
559fb25420bSRobert Mustacchitest_err "-t"
560fb25420bSRobert Mustacchitest_err "-t" "$ar_tmpdir/enoent"
561fb25420bSRobert Mustacchitest_err "-x"
562fb25420bSRobert Mustacchitest_err "-x" "$ar_tmpdir/enoent"
563fb25420bSRobert Mustacchitest_err "-s"
564fb25420bSRobert Mustacchitest_err "-s" "$ar_tmpdir/enoent"
565fb25420bSRobert Mustacchitest_err "-s" "$ar_f01" "$ar_f10"
566fb25420bSRobert Mustacchitest_err "-sz" "$ar_f01"
567fb25420bSRobert Mustacchitest_err "-rd"
568fb25420bSRobert Mustacchitest_err "-xd"
569fb25420bSRobert Mustacchitest_err "-qp"
570fb25420bSRobert Mustacchi
571fb25420bSRobert Mustacchiif (( ar_exit == 0 )); then
572fb25420bSRobert Mustacchi	printf "All tests passed successfully!\n"
573fb25420bSRobert Mustacchifi
574fb25420bSRobert Mustacchi
575fb25420bSRobert Mustacchicd - >/dev/null
576fb25420bSRobert Mustacchirm -rf "$ar_tmpdir"
577fb25420bSRobert Mustacchiexit $ar_exit
578