Annotation of embedaddon/curl/tests/getpart.pm, revision 1.1.1.1
1.1 misho 1: #***************************************************************************
2: # _ _ ____ _
3: # Project ___| | | | _ \| |
4: # / __| | | | |_) | |
5: # | (__| |_| | _ <| |___
6: # \___|\___/|_| \_\_____|
7: #
8: # Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
9: #
10: # This software is licensed as described in the file COPYING, which
11: # you should have received as part of this distribution. The terms
12: # are also available at https://curl.haxx.se/docs/copyright.html.
13: #
14: # You may opt to use, copy, modify, merge, publish, distribute and/or sell
15: # copies of the Software, and permit persons to whom the Software is
16: # furnished to do so, under the terms of the COPYING file.
17: #
18: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19: # KIND, either express or implied.
20: #
21: ###########################################################################
22:
23: #use strict;
24:
25: my @xml;
26: my $xmlfile;
27:
28: my $warning=0;
29: my $trace=0;
30:
31: sub decode_base64 {
32: tr:A-Za-z0-9+/::cd; # remove non-base64 chars
33: tr:A-Za-z0-9+/: -_:; # convert to uuencoded format
34: my $len = pack("c", 32 + 0.75*length); # compute length byte
35: return unpack("u", $len . $_); # uudecode and print
36: }
37:
38: sub decode_hex {
39: my $s = $_;
40: # remove everything not hex
41: $s =~ s/[^A-Fa-f0-9]//g;
42: # encode everything
43: $s =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;
44: return $s;
45: }
46:
47: sub getpartattr {
48: # if $part is undefined (ie only one argument) then
49: # return the attributes of the section
50:
51: my ($section, $part)=@_;
52:
53: my %hash;
54: my $inside=0;
55:
56: # print "Section: $section, part: $part\n";
57:
58: for(@xml) {
59: # print "$inside: $_";
60: if(!$inside && ($_ =~ /^ *\<$section/)) {
61: $inside++;
62: }
63: if((1 ==$inside) && ( ($_ =~ /^ *\<$part([^>]*)/) ||
64: !(defined($part)) )
65: ) {
66: $inside++;
67: my $attr=$1;
68:
69: while($attr =~ s/ *([^=]*)= *(\"([^\"]*)\"|([^\> ]*))//) {
70: my ($var, $cont)=($1, $2);
71: $cont =~ s/^\"(.*)\"$/$1/;
72: $hash{$var}=$cont;
73: }
74: last;
75: }
76: # detect end of section when part wasn't found
77: elsif((1 ==$inside) && ($_ =~ /^ *\<\/$section\>/)) {
78: last;
79: }
80: elsif((2 ==$inside) && ($_ =~ /^ *\<\/$part/)) {
81: $inside--;
82: }
83: }
84: return %hash;
85: }
86:
87: sub getpart {
88: my ($section, $part)=@_;
89:
90: my @this;
91: my $inside=0;
92: my $base64=0;
93: my $hex=0;
94: my $line;
95:
96: for(@xml) {
97: $line++;
98: if(!$inside && ($_ =~ /^ *\<$section/)) {
99: $inside++;
100: }
101: elsif(($inside >= 1) && ($_ =~ /^ *\<$part[ \>]/)) {
102: if($inside > 1) {
103: push @this, $_;
104: }
105: elsif($_ =~ /$part [^>]*base64=/) {
106: # attempt to detect our base64 encoded part
107: $base64=1;
108: }
109: elsif($_ =~ /$part [^>]*hex=/) {
110: # attempt to detect a hex-encoded part
111: $hex=1;
112: }
113: $inside++;
114: }
115: elsif(($inside >= 2) && ($_ =~ /^ *\<\/$part[ \>]/)) {
116: if($inside > 2) {
117: push @this, $_;
118: }
119: $inside--;
120: }
121: elsif(($inside >= 1) && ($_ =~ /^ *\<\/$section/)) {
122: if($inside > 1) {
123: print STDERR "$xmlfile:$line:1: error: missing </$part> tag before </$section>\n";
124: @this = ("format error in $xmlfile");
125: }
126: if($trace && @this) {
127: print STDERR "*** getpart.pm: $section/$part returned data!\n";
128: }
129: if($warning && !@this) {
130: print STDERR "*** getpart.pm: $section/$part returned empty!\n";
131: }
132: if($base64) {
133: # decode the whole array before returning it!
134: for(@this) {
135: my $decoded = decode_base64($_);
136: $_ = $decoded;
137: }
138: }
139: elsif($hex) {
140: # decode the whole array before returning it!
141: for(@this) {
142: my $decoded = decode_hex($_);
143: $_ = $decoded;
144: }
145: }
146: return @this;
147: }
148: elsif($inside >= 2) {
149: push @this, $_;
150: }
151: }
152: if($trace && @this) {
153: # section/part has data but end of section not detected,
154: # end of file implies end of section.
155: print STDERR "*** getpart.pm: $section/$part returned data!\n";
156: }
157: if($warning && !@this) {
158: # section/part does not exist or has no data without an end of
159: # section; end of file implies end of section.
160: print STDERR "*** getpart.pm: $section/$part returned empty!\n";
161: }
162: return @this;
163: }
164:
165: sub partexists {
166: my ($section, $part)=@_;
167:
168: my $inside = 0;
169:
170: for(@xml) {
171: if(!$inside && ($_ =~ /^ *\<$section/)) {
172: $inside++;
173: }
174: elsif((1 == $inside) && ($_ =~ /^ *\<$part[ \>]/)) {
175: return 1; # exists
176: }
177: elsif((1 == $inside) && ($_ =~ /^ *\<\/$section/)) {
178: return 0; # does not exist
179: }
180: }
181: return 0; # does not exist
182: }
183:
184: # Return entire document as list of lines
185: sub getall {
186: return @xml;
187: }
188:
189: sub loadtest {
190: my ($file)=@_;
191:
192: undef @xml;
193: $xmlfile = $file;
194:
195: if(open(XML, "<$file")) {
196: binmode XML; # for crapage systems, use binary
197: while(<XML>) {
198: push @xml, $_;
199: }
200: close(XML);
201: }
202: else {
203: # failure
204: if($warning) {
205: print STDERR "file $file wouldn't open!\n";
206: }
207: return 1;
208: }
209: return 0;
210: }
211:
212: sub fulltest {
213: return @xml;
214: }
215:
216: # write the test to the given file
217: sub savetest {
218: my ($file)=@_;
219:
220: if(open(XML, ">$file")) {
221: binmode XML; # for crapage systems, use binary
222: for(@xml) {
223: print XML $_;
224: }
225: close(XML);
226: }
227: else {
228: # failure
229: if($warning) {
230: print STDERR "file $file wouldn't open!\n";
231: }
232: return 1;
233: }
234: return 0;
235: }
236:
237: #
238: # Strip off all lines that match the specified pattern and return
239: # the new array.
240: #
241:
242: sub striparray {
243: my ($pattern, $arrayref) = @_;
244:
245: my @array;
246:
247: for(@$arrayref) {
248: if($_ !~ /$pattern/) {
249: push @array, $_;
250: }
251: }
252: return @array;
253: }
254:
255: #
256: # pass array *REFERENCES* !
257: #
258: sub compareparts {
259: my ($firstref, $secondref)=@_;
260:
261: my $first = join("", @$firstref);
262: my $second = join("", @$secondref);
263:
264: # we cannot compare arrays index per index since with the base64 chunks,
265: # they may not be "evenly" distributed
266:
267: # NOTE: this no longer strips off carriage returns from the arrays. Is that
268: # really necessary? It ruins the testing of newlines. I believe it was once
269: # added to enable tests on win32.
270:
271: if($first ne $second) {
272: return 1;
273: }
274:
275: return 0;
276: }
277:
278: #
279: # Write a given array to the specified file
280: #
281: sub writearray {
282: my ($filename, $arrayref)=@_;
283:
284: open(TEMP, ">$filename");
285: binmode(TEMP,":raw"); # cygwin fix by Kevin Roth
286: for(@$arrayref) {
287: print TEMP $_;
288: }
289: close(TEMP);
290: }
291:
292: #
293: # Load a specified file and return it as an array
294: #
295: sub loadarray {
296: my ($filename)=@_;
297: my @array;
298:
299: open(TEMP, "<$filename");
300: while(<TEMP>) {
301: push @array, $_;
302: }
303: close(TEMP);
304: return @array;
305: }
306:
307: # Given two array references, this function will store them in two temporary
308: # files, run 'diff' on them, store the result and return the diff output!
309:
310: sub showdiff {
311: my ($logdir, $firstref, $secondref)=@_;
312:
313: my $file1="$logdir/check-generated";
314: my $file2="$logdir/check-expected";
315:
316: open(TEMP, ">$file1");
317: for(@$firstref) {
318: my $l = $_;
319: $l =~ s/\r/[CR]/g;
320: $l =~ s/\n/[LF]/g;
321: print TEMP $l;
322: print TEMP "\n";
323: }
324: close(TEMP);
325:
326: open(TEMP, ">$file2");
327: for(@$secondref) {
328: my $l = $_;
329: $l =~ s/\r/[CR]/g;
330: $l =~ s/\n/[LF]/g;
331: print TEMP $l;
332: print TEMP "\n";
333: }
334: close(TEMP);
335: my @out = `diff -u $file2 $file1 2>/dev/null`;
336:
337: if(!$out[0]) {
338: @out = `diff -c $file2 $file1 2>/dev/null`;
339: }
340:
341: return @out;
342: }
343:
344:
345: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>