Annotation of embedaddon/curl/tests/getpart.pm, revision 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>