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