xref: /aosp_15_r20/external/curl/tests/devtest.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 Fandrich, 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
26*6236dae4SAndroid Build Coastguard Worker# This script is intended for developers to test some internals of the
27*6236dae4SAndroid Build Coastguard Worker# runtests.pl harness. Don't try to use this unless you know what you're
28*6236dae4SAndroid Build Coastguard Worker# doing!
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Worker# An example command-line that starts a test http server for test 11 and waits
31*6236dae4SAndroid Build Coastguard Worker# for the user before stopping it:
32*6236dae4SAndroid Build Coastguard Worker#   ./devtest.pl --verbose serverfortest https echo "Started https" protoport https preprocess 11 pause echo Stopping stopservers echo Done
33*6236dae4SAndroid Build Coastguard Worker# curl can connect to the server while it's running like this:
34*6236dae4SAndroid Build Coastguard Worker#   curl -vkL https://localhost:<protoport>/11
35*6236dae4SAndroid Build Coastguard Worker
36*6236dae4SAndroid Build Coastguard Workeruse strict;
37*6236dae4SAndroid Build Coastguard Workeruse warnings;
38*6236dae4SAndroid Build Coastguard Workeruse 5.006;
39*6236dae4SAndroid Build Coastguard Worker
40*6236dae4SAndroid Build Coastguard WorkerBEGIN {
41*6236dae4SAndroid Build Coastguard Worker    # Define srcdir to the location of the tests source directory. This is
42*6236dae4SAndroid Build Coastguard Worker    # usually set by the Makefile, but for out-of-tree builds with direct
43*6236dae4SAndroid Build Coastguard Worker    # invocation of runtests.pl, it may not be set.
44*6236dae4SAndroid Build Coastguard Worker    if(!defined $ENV{'srcdir'}) {
45*6236dae4SAndroid Build Coastguard Worker        use File::Basename;
46*6236dae4SAndroid Build Coastguard Worker        $ENV{'srcdir'} = dirname(__FILE__);
47*6236dae4SAndroid Build Coastguard Worker    }
48*6236dae4SAndroid Build Coastguard Worker    push(@INC, $ENV{'srcdir'});
49*6236dae4SAndroid Build Coastguard Worker}
50*6236dae4SAndroid Build Coastguard Worker
51*6236dae4SAndroid Build Coastguard Workeruse globalconfig;
52*6236dae4SAndroid Build Coastguard Workeruse servers qw(
53*6236dae4SAndroid Build Coastguard Worker    initserverconfig
54*6236dae4SAndroid Build Coastguard Worker    protoport
55*6236dae4SAndroid Build Coastguard Worker    serverfortest
56*6236dae4SAndroid Build Coastguard Worker    stopservers
57*6236dae4SAndroid Build Coastguard Worker);
58*6236dae4SAndroid Build Coastguard Workeruse runner qw(
59*6236dae4SAndroid Build Coastguard Worker    readtestkeywords
60*6236dae4SAndroid Build Coastguard Worker    singletest_preprocess
61*6236dae4SAndroid Build Coastguard Worker);
62*6236dae4SAndroid Build Coastguard Workeruse testutil qw(
63*6236dae4SAndroid Build Coastguard Worker    setlogfunc
64*6236dae4SAndroid Build Coastguard Worker);
65*6236dae4SAndroid Build Coastguard Workeruse getpart;
66*6236dae4SAndroid Build Coastguard Worker
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker#######################################################################
69*6236dae4SAndroid Build Coastguard Worker# logmsg is our general message logging subroutine.
70*6236dae4SAndroid Build Coastguard Worker# This function is currently required to be here by servers.pm
71*6236dae4SAndroid Build Coastguard Worker# This is copied from runtests.pl
72*6236dae4SAndroid Build Coastguard Worker#
73*6236dae4SAndroid Build Coastguard Workermy $uname_release = `uname -r`;
74*6236dae4SAndroid Build Coastguard Workermy $is_wsl = $uname_release =~ /Microsoft$/;
75*6236dae4SAndroid Build Coastguard Workersub logmsg {
76*6236dae4SAndroid Build Coastguard Worker    for(@_) {
77*6236dae4SAndroid Build Coastguard Worker        my $line = $_;
78*6236dae4SAndroid Build Coastguard Worker        if ($is_wsl) {
79*6236dae4SAndroid Build Coastguard Worker            # use \r\n for WSL shell
80*6236dae4SAndroid Build Coastguard Worker            $line =~ s/\r?\n$/\r\n/g;
81*6236dae4SAndroid Build Coastguard Worker        }
82*6236dae4SAndroid Build Coastguard Worker        print "$line";
83*6236dae4SAndroid Build Coastguard Worker    }
84*6236dae4SAndroid Build Coastguard Worker}
85*6236dae4SAndroid Build Coastguard Worker
86*6236dae4SAndroid Build Coastguard Worker#######################################################################
87*6236dae4SAndroid Build Coastguard Worker# Parse and store the protocols in curl's Protocols: line
88*6236dae4SAndroid Build Coastguard Worker# This is copied from runtests.pl
89*6236dae4SAndroid Build Coastguard Worker#
90*6236dae4SAndroid Build Coastguard Workersub parseprotocols {
91*6236dae4SAndroid Build Coastguard Worker    my ($line)=@_;
92*6236dae4SAndroid Build Coastguard Worker
93*6236dae4SAndroid Build Coastguard Worker    @protocols = split(' ', lc($line));
94*6236dae4SAndroid Build Coastguard Worker
95*6236dae4SAndroid Build Coastguard Worker    # Generate a "proto-ipv6" version of each protocol to match the
96*6236dae4SAndroid Build Coastguard Worker    # IPv6 <server> name and a "proto-unix" to match the variant which
97*6236dae4SAndroid Build Coastguard Worker    # uses Unix domain sockets. This works even if support isn't
98*6236dae4SAndroid Build Coastguard Worker    # compiled in because the <features> test will fail.
99*6236dae4SAndroid Build Coastguard Worker    push @protocols, map(("$_-ipv6", "$_-unix"), @protocols);
100*6236dae4SAndroid Build Coastguard Worker
101*6236dae4SAndroid Build Coastguard Worker    # 'http-proxy' is used in test cases to do CONNECT through
102*6236dae4SAndroid Build Coastguard Worker    push @protocols, 'http-proxy';
103*6236dae4SAndroid Build Coastguard Worker
104*6236dae4SAndroid Build Coastguard Worker    # 'none' is used in test cases to mean no server
105*6236dae4SAndroid Build Coastguard Worker    push @protocols, 'none';
106*6236dae4SAndroid Build Coastguard Worker}
107*6236dae4SAndroid Build Coastguard Worker
108*6236dae4SAndroid Build Coastguard Worker
109*6236dae4SAndroid Build Coastguard Worker#######################################################################
110*6236dae4SAndroid Build Coastguard Worker# Initialize @protocols from the curl binary under test
111*6236dae4SAndroid Build Coastguard Worker#
112*6236dae4SAndroid Build Coastguard Workersub init_protocols {
113*6236dae4SAndroid Build Coastguard Worker    for (`$CURL -V 2>$dev_null`) {
114*6236dae4SAndroid Build Coastguard Worker        if(m/^Protocols: (.*)$/) {
115*6236dae4SAndroid Build Coastguard Worker            parseprotocols($1);
116*6236dae4SAndroid Build Coastguard Worker        }
117*6236dae4SAndroid Build Coastguard Worker    }
118*6236dae4SAndroid Build Coastguard Worker}
119*6236dae4SAndroid Build Coastguard Worker
120*6236dae4SAndroid Build Coastguard Worker
121*6236dae4SAndroid Build Coastguard Worker#######################################################################
122*6236dae4SAndroid Build Coastguard Worker# Initialize the test harness to run tests
123*6236dae4SAndroid Build Coastguard Worker#
124*6236dae4SAndroid Build Coastguard Workersub init_tests {
125*6236dae4SAndroid Build Coastguard Worker    setlogfunc(\&logmsg);
126*6236dae4SAndroid Build Coastguard Worker    init_protocols();
127*6236dae4SAndroid Build Coastguard Worker    initserverconfig();
128*6236dae4SAndroid Build Coastguard Worker}
129*6236dae4SAndroid Build Coastguard Worker
130*6236dae4SAndroid Build Coastguard Worker#######################################################################
131*6236dae4SAndroid Build Coastguard Worker# Main test loop
132*6236dae4SAndroid Build Coastguard Worker
133*6236dae4SAndroid Build Coastguard Workerinit_tests();
134*6236dae4SAndroid Build Coastguard Worker
135*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
136*6236dae4SAndroid Build Coastguard Worker# Parse command-line options and commands
137*6236dae4SAndroid Build Coastguard Worker#
138*6236dae4SAndroid Build Coastguard Workerwhile(@ARGV) {
139*6236dae4SAndroid Build Coastguard Worker    if($ARGV[0] eq "-h") {
140*6236dae4SAndroid Build Coastguard Worker        print "Usage: devtest.pl [--verbose] [command [arg]...]\n";
141*6236dae4SAndroid Build Coastguard Worker        print "command is one of:\n";
142*6236dae4SAndroid Build Coastguard Worker        print "  echo X\n";
143*6236dae4SAndroid Build Coastguard Worker        print "  pause\n";
144*6236dae4SAndroid Build Coastguard Worker        print "  preprocess\n";
145*6236dae4SAndroid Build Coastguard Worker        print "  protocols *|X[,Y...]\n";
146*6236dae4SAndroid Build Coastguard Worker        print "  protoport X\n";
147*6236dae4SAndroid Build Coastguard Worker        print "  serverfortest X[,Y...]\n";
148*6236dae4SAndroid Build Coastguard Worker        print "  stopservers\n";
149*6236dae4SAndroid Build Coastguard Worker        print "  sleep N\n";
150*6236dae4SAndroid Build Coastguard Worker        exit 0;
151*6236dae4SAndroid Build Coastguard Worker    }
152*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "--verbose") {
153*6236dae4SAndroid Build Coastguard Worker        $verbose = 1;
154*6236dae4SAndroid Build Coastguard Worker    }
155*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "sleep") {
156*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
157*6236dae4SAndroid Build Coastguard Worker        sleep $ARGV[0];
158*6236dae4SAndroid Build Coastguard Worker    }
159*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "echo") {
160*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
161*6236dae4SAndroid Build Coastguard Worker        print $ARGV[0] . "\n";
162*6236dae4SAndroid Build Coastguard Worker    }
163*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "pause") {
164*6236dae4SAndroid Build Coastguard Worker        print "Press Enter to continue: ";
165*6236dae4SAndroid Build Coastguard Worker        readline STDIN;
166*6236dae4SAndroid Build Coastguard Worker    }
167*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "protocols") {
168*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
169*6236dae4SAndroid Build Coastguard Worker        if($ARGV[0] eq "*") {
170*6236dae4SAndroid Build Coastguard Worker            init_protocols();
171*6236dae4SAndroid Build Coastguard Worker        }
172*6236dae4SAndroid Build Coastguard Worker        else {
173*6236dae4SAndroid Build Coastguard Worker            @protocols = split(",", $ARGV[0]);
174*6236dae4SAndroid Build Coastguard Worker        }
175*6236dae4SAndroid Build Coastguard Worker        print "Set " . scalar @protocols . " protocols\n";
176*6236dae4SAndroid Build Coastguard Worker    }
177*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "preprocess") {
178*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
179*6236dae4SAndroid Build Coastguard Worker        loadtest("${TESTDIR}/test${ARGV[0]}");
180*6236dae4SAndroid Build Coastguard Worker        readtestkeywords();
181*6236dae4SAndroid Build Coastguard Worker        singletest_preprocess($ARGV[0]);
182*6236dae4SAndroid Build Coastguard Worker    }
183*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "protoport") {
184*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
185*6236dae4SAndroid Build Coastguard Worker        my $port = protoport($ARGV[0]);
186*6236dae4SAndroid Build Coastguard Worker        print "protoport: $port\n";
187*6236dae4SAndroid Build Coastguard Worker    }
188*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "serverfortest") {
189*6236dae4SAndroid Build Coastguard Worker        shift @ARGV;
190*6236dae4SAndroid Build Coastguard Worker        my ($why, $e) = serverfortest(split(/,/, $ARGV[0]));
191*6236dae4SAndroid Build Coastguard Worker        print "serverfortest: $e $why\n";
192*6236dae4SAndroid Build Coastguard Worker    }
193*6236dae4SAndroid Build Coastguard Worker    elsif($ARGV[0] eq "stopservers") {
194*6236dae4SAndroid Build Coastguard Worker        my $err = stopservers();
195*6236dae4SAndroid Build Coastguard Worker        print "stopservers: $err\n";
196*6236dae4SAndroid Build Coastguard Worker    }
197*6236dae4SAndroid Build Coastguard Worker    else {
198*6236dae4SAndroid Build Coastguard Worker        print "Error: Unknown command: $ARGV[0]\n";
199*6236dae4SAndroid Build Coastguard Worker        print "Continuing anyway\n";
200*6236dae4SAndroid Build Coastguard Worker    }
201*6236dae4SAndroid Build Coastguard Worker    shift @ARGV;
202*6236dae4SAndroid Build Coastguard Worker}
203