xref: /aosp_15_r20/external/curl/tests/libtest/test613.pl (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl
2*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
3*6236dae4SAndroid Build Coastguard Worker#                                  _   _ ____  _
4*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
5*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
6*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
7*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
8*6236dae4SAndroid Build Coastguard Worker#
9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
10*6236dae4SAndroid Build Coastguard Worker#
11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
14*6236dae4SAndroid Build Coastguard Worker#
15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
18*6236dae4SAndroid Build Coastguard Worker#
19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
21*6236dae4SAndroid Build Coastguard Worker#
22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
23*6236dae4SAndroid Build Coastguard Worker#
24*6236dae4SAndroid Build Coastguard Worker###########################################################################
25*6236dae4SAndroid Build Coastguard Worker# Prepare a directory with known files and clean up afterwards
26*6236dae4SAndroid Build Coastguard Workeruse Time::Local;
27*6236dae4SAndroid Build Coastguard Worker
28*6236dae4SAndroid Build Coastguard Workerif ( $#ARGV < 1 )
29*6236dae4SAndroid Build Coastguard Worker{
30*6236dae4SAndroid Build Coastguard Worker    print "Usage: $0 prepare|postprocess dir [logfile]\n";
31*6236dae4SAndroid Build Coastguard Worker    exit 1;
32*6236dae4SAndroid Build Coastguard Worker}
33*6236dae4SAndroid Build Coastguard Worker
34*6236dae4SAndroid Build Coastguard Worker# <precheck> expects an error message on stdout
35*6236dae4SAndroid Build Coastguard Workersub errout {
36*6236dae4SAndroid Build Coastguard Worker    print $_[0] . "\n";
37*6236dae4SAndroid Build Coastguard Worker    exit 1;
38*6236dae4SAndroid Build Coastguard Worker}
39*6236dae4SAndroid Build Coastguard Worker
40*6236dae4SAndroid Build Coastguard Workerif ($ARGV[0] eq "prepare")
41*6236dae4SAndroid Build Coastguard Worker{
42*6236dae4SAndroid Build Coastguard Worker    my $dirname = $ARGV[1];
43*6236dae4SAndroid Build Coastguard Worker    mkdir $dirname || errout "$!";
44*6236dae4SAndroid Build Coastguard Worker    chdir $dirname;
45*6236dae4SAndroid Build Coastguard Worker
46*6236dae4SAndroid Build Coastguard Worker    # Create the files in alphabetical order, to increase the chances
47*6236dae4SAndroid Build Coastguard Worker    # of receiving a consistent set of directory contents regardless
48*6236dae4SAndroid Build Coastguard Worker    # of whether the server alphabetizes the results or not.
49*6236dae4SAndroid Build Coastguard Worker    mkdir "asubdir" || errout "$!";
50*6236dae4SAndroid Build Coastguard Worker    chmod 0777, "asubdir";
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard Worker    open(FILE, ">plainfile.txt") || errout "$!";
53*6236dae4SAndroid Build Coastguard Worker    binmode FILE;
54*6236dae4SAndroid Build Coastguard Worker    print FILE "Test file to support curl test suite\n";
55*6236dae4SAndroid Build Coastguard Worker    close(FILE);
56*6236dae4SAndroid Build Coastguard Worker    # The mtime is specifically chosen to be an even number so that it can be
57*6236dae4SAndroid Build Coastguard Worker    # represented exactly on a FAT filesystem.
58*6236dae4SAndroid Build Coastguard Worker    utime time, timegm(0,0,12,1,0,100), "plainfile.txt";
59*6236dae4SAndroid Build Coastguard Worker    chmod 0666, "plainfile.txt";
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Worker    open(FILE, ">rofile.txt") || errout "$!";
62*6236dae4SAndroid Build Coastguard Worker    binmode FILE;
63*6236dae4SAndroid Build Coastguard Worker    print FILE "Read-only test file to support curl test suite\n";
64*6236dae4SAndroid Build Coastguard Worker    close(FILE);
65*6236dae4SAndroid Build Coastguard Worker    # The mtime is specifically chosen to be an even number so that it can be
66*6236dae4SAndroid Build Coastguard Worker    # represented exactly on a FAT filesystem.
67*6236dae4SAndroid Build Coastguard Worker    utime time, timegm(0,0,12,31,11,100), "rofile.txt";
68*6236dae4SAndroid Build Coastguard Worker    chmod 0444, "rofile.txt";
69*6236dae4SAndroid Build Coastguard Worker
70*6236dae4SAndroid Build Coastguard Worker    exit 0;
71*6236dae4SAndroid Build Coastguard Worker}
72*6236dae4SAndroid Build Coastguard Workerelsif ($ARGV[0] eq "postprocess")
73*6236dae4SAndroid Build Coastguard Worker{
74*6236dae4SAndroid Build Coastguard Worker    my $dirname = $ARGV[1];
75*6236dae4SAndroid Build Coastguard Worker    my $logfile = $ARGV[2];
76*6236dae4SAndroid Build Coastguard Worker
77*6236dae4SAndroid Build Coastguard Worker    # Clean up the test directory
78*6236dae4SAndroid Build Coastguard Worker    unlink "$dirname/rofile.txt";
79*6236dae4SAndroid Build Coastguard Worker    unlink "$dirname/plainfile.txt";
80*6236dae4SAndroid Build Coastguard Worker    rmdir "$dirname/asubdir";
81*6236dae4SAndroid Build Coastguard Worker
82*6236dae4SAndroid Build Coastguard Worker    rmdir $dirname || die "$!";
83*6236dae4SAndroid Build Coastguard Worker
84*6236dae4SAndroid Build Coastguard Worker    if ($logfile && -s $logfile) {
85*6236dae4SAndroid Build Coastguard Worker        # Process the directory file to remove all information that
86*6236dae4SAndroid Build Coastguard Worker        # could be inconsistent from one test run to the next (e.g.
87*6236dae4SAndroid Build Coastguard Worker        # file date) or may be unsupported on some platforms (e.g.
88*6236dae4SAndroid Build Coastguard Worker        # Windows). Also, since 7.17.0, the sftp directory listing
89*6236dae4SAndroid Build Coastguard Worker        # format can be dependent on the server (with a recent
90*6236dae4SAndroid Build Coastguard Worker        # enough version of libssh2) so this script must also
91*6236dae4SAndroid Build Coastguard Worker        # canonicalize the format.  Here are examples of the general
92*6236dae4SAndroid Build Coastguard Worker        # format supported:
93*6236dae4SAndroid Build Coastguard Worker        # -r--r--r--   12 ausername grp            47 Dec 31  2000 rofile.txt
94*6236dae4SAndroid Build Coastguard Worker        # -r--r--r--   1  1234  4321         47 Dec 31  2000 rofile.txt
95*6236dae4SAndroid Build Coastguard Worker        # The "canonical" format is similar to the first (which is
96*6236dae4SAndroid Build Coastguard Worker        # the one generated on a typical Linux installation):
97*6236dae4SAndroid Build Coastguard Worker        # -r-?r-?r-?   12 U         U              47 Dec 31  2000 rofile.txt
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Worker        my @canondir;
100*6236dae4SAndroid Build Coastguard Worker        open(IN, "<$logfile") || die "$!";
101*6236dae4SAndroid Build Coastguard Worker        while (<IN>) {
102*6236dae4SAndroid Build Coastguard Worker            /^(.)(..).(..).(..).\s*(\S+)\s+\S+\s+\S+\s+(\S+)\s+(\S+\s+\S+\s+\S+)\s+(.*)$/;
103*6236dae4SAndroid Build Coastguard Worker            if ($1 eq "d") {
104*6236dae4SAndroid Build Coastguard Worker                # Skip current and parent directory listing, because some SSH
105*6236dae4SAndroid Build Coastguard Worker                # servers (eg. OpenSSH for Windows) are not listing those
106*6236dae4SAndroid Build Coastguard Worker                if ($8 eq "." || $8 eq "..") {
107*6236dae4SAndroid Build Coastguard Worker                    next;
108*6236dae4SAndroid Build Coastguard Worker                }
109*6236dae4SAndroid Build Coastguard Worker                # Erase all directory metadata except for the name, as it is not
110*6236dae4SAndroid Build Coastguard Worker                # consistent for across all test systems and filesystems
111*6236dae4SAndroid Build Coastguard Worker                push @canondir, "d?????????    N U         U               N ???  N NN:NN $8\n";
112*6236dae4SAndroid Build Coastguard Worker            } elsif ($1 eq "-") {
113*6236dae4SAndroid Build Coastguard Worker                # Replace missing group and other permissions with user
114*6236dae4SAndroid Build Coastguard Worker                # permissions (eg. on Windows) due to them being shown as *
115*6236dae4SAndroid Build Coastguard Worker                my ($u, $g, $o) = ($2, $3, $4);
116*6236dae4SAndroid Build Coastguard Worker                if($g eq "**") {
117*6236dae4SAndroid Build Coastguard Worker                    $g = $u;
118*6236dae4SAndroid Build Coastguard Worker                }
119*6236dae4SAndroid Build Coastguard Worker                if($o eq "**") {
120*6236dae4SAndroid Build Coastguard Worker                    $o = $u;
121*6236dae4SAndroid Build Coastguard Worker                }
122*6236dae4SAndroid Build Coastguard Worker                # Erase user and group names, as they are not consistent across
123*6236dae4SAndroid Build Coastguard Worker                # all test systems
124*6236dae4SAndroid Build Coastguard Worker                my $line = sprintf("%s%s?%s?%s?%5d U         U %15d %s %s\n", $1,$u,$g,$o,$5,$6,$7,$8);
125*6236dae4SAndroid Build Coastguard Worker                push @canondir, $line;
126*6236dae4SAndroid Build Coastguard Worker            } else {
127*6236dae4SAndroid Build Coastguard Worker                # Unexpected format; just pass it through and let the test fail
128*6236dae4SAndroid Build Coastguard Worker                push @canondir, $_;
129*6236dae4SAndroid Build Coastguard Worker            }
130*6236dae4SAndroid Build Coastguard Worker        }
131*6236dae4SAndroid Build Coastguard Worker        close(IN);
132*6236dae4SAndroid Build Coastguard Worker
133*6236dae4SAndroid Build Coastguard Worker        @canondir = sort {substr($a,57) cmp substr($b,57)} @canondir;
134*6236dae4SAndroid Build Coastguard Worker        my $newfile = $logfile . ".new";
135*6236dae4SAndroid Build Coastguard Worker        open(OUT, ">$newfile") || die "$!";
136*6236dae4SAndroid Build Coastguard Worker        print OUT join('', @canondir);
137*6236dae4SAndroid Build Coastguard Worker        close(OUT);
138*6236dae4SAndroid Build Coastguard Worker
139*6236dae4SAndroid Build Coastguard Worker        unlink $logfile;
140*6236dae4SAndroid Build Coastguard Worker        rename $newfile, $logfile;
141*6236dae4SAndroid Build Coastguard Worker    }
142*6236dae4SAndroid Build Coastguard Worker
143*6236dae4SAndroid Build Coastguard Worker    exit 0;
144*6236dae4SAndroid Build Coastguard Worker}
145*6236dae4SAndroid Build Coastguard Workerprint "Unsupported command $ARGV[0]\n";
146*6236dae4SAndroid Build Coastguard Workerexit 1;
147