test1554: check translatable string options in OS400 wrapper

This test runs a perl script that checks all string options are properly
translated by the OS400 character code conversion wrapper. It also
verifies these options are listed in alphanumeric order in the wrapper
switch statement.

Closes #11650
This commit is contained in:
Patrick Monnerat 2023-08-11 00:30:17 +02:00 коммит произвёл Daniel Stenberg
Родитель e90d356570
Коммит ae806395ab
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
5 изменённых файлов: 196 добавлений и 15 удалений

Просмотреть файл

@ -48,6 +48,7 @@ _ curl_easy_setopt_ccsid()
Variable arguments are a string pointer and a CCSID (unsigned int) for
options:
CURLOPT_ABSTRACT_UNIX_SOCKET
CURLOPT_ACCEPT_ENCODING
CURLOPT_ALTSVC
CURLOPT_AWS_SIGV4
CURLOPT_CAINFO
@ -56,17 +57,19 @@ options:
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIELIST
CURLOPT_COPYPOSTFIELDS
CURLOPT_CRLFILE
CURLOPT_CUSTOMREQUEST
CURLOPT_DEFAULT_PROTOCOL
CURLOPT_DNS_INTERFACE
CURLOPT_DNS_LOCAL_IP4
CURLOPT_DNS_LOCAL_IP6
CURLOPT_DNS_SERVERS
CURLOPT_DOH_URL
CURLOPT_EGDSOCKET
CURLOPT_ENCODING
CURLOPT_FTPPORT
CURLOPT_FTP_ACCOUNT
CURLOPT_FTP_ALTERNATIVE_TO_USER
CURLOPT_HAPROXY_CLIENT_IP
CURLOPT_HSTS
CURLOPT_INTERFACE
CURLOPT_ISSUERCERT
@ -88,6 +91,7 @@ options:
CURLOPT_PROXY_CAINFO
CURLOPT_PROXY_CAPATH
CURLOPT_PROXY_CRLFILE
CURLOPT_PROXY_ISSUERCERT
CURLOPT_PROXY_KEYPASSWD
CURLOPT_PROXY_PINNEDPUBLICKEY
CURLOPT_PROXY_SERVICE_NAME
@ -105,7 +109,7 @@ options:
CURLOPT_REDIR_PROTOCOLS_STR
CURLOPT_REFERER
CURLOPT_REQUEST_TARGET
CURLOPT_RTSP_SESSION_UID
CURLOPT_RTSP_SESSION_ID
CURLOPT_RTSP_STREAM_URI
CURLOPT_RTSP_TRANSPORT
CURLOPT_SASL_AUTHZID
@ -122,6 +126,7 @@ options:
CURLOPT_SSLKEY
CURLOPT_SSLKEYTYPE
CURLOPT_SSL_CIPHER_LIST
CURLOPT_SSL_EC_CURVES
CURLOPT_TLS13_CIPHERS
CURLOPT_TLSAUTH_PASSWORD
CURLOPT_TLSAUTH_TYPE
@ -145,13 +150,13 @@ CCSID conversion result length.
_ curl_formadd_ccsid()
In the variable argument list, string pointers should be followed by a (long)
CCSID for the following options:
CURLFORM_FILENAME
CURLFORM_CONTENTTYPE
CURLFORM_BUFFER
CURLFORM_FILE
CURLFORM_FILECONTENT
CURLFORM_CONTENTTYPE
CURLFORM_COPYCONTENTS
CURLFORM_COPYNAME
CURLFORM_FILE
CURLFORM_FILECONTENT
CURLFORM_FILENAME
CURLFORM_PTRNAME
If taken from an argument array, an additional array entry must follow each
entry containing one of the above option. This additional entry holds the CCSID
@ -165,19 +170,19 @@ _ curl_easy_getinfo_ccsid()
The following options are followed by a 'char * *' and a CCSID. Unlike
curl_easy_getinfo(), the value returned in the pointer should be released with
curl_free() after use:
CURLINFO_EFFECTIVE_URL
CURLINFO_CONTENT_TYPE
CURLINFO_EFFECTIVE_URL
CURLINFO_FTP_ENTRY_PATH
CURLINFO_LOCAL_IP
CURLINFO_PRIMARY_IP
CURLINFO_REDIRECT_URL
CURLINFO_REFERER
CURLINFO_PRIMARY_IP
CURLINFO_RTSP_SESSION_ID
CURLINFO_LOCAL_IP
CURLINFO_SCHEME
Likewise, the following options are followed by a struct curl_slist * * and a
CCSID.
CURLINFO_SSL_ENGINES
CURLINFO_COOKIELIST
CURLINFO_SSL_ENGINES
Lists returned should be released with curl_slist_free_all() after use.
Option CURLINFO_CERTINFO is followed by a struct curl_certinfo * * and a
CCSID. Returned structures should be freed with curl_certinfo_free_all()

Просмотреть файл

@ -1076,7 +1076,11 @@ curl_easy_setopt_ccsid(CURL *easy, CURLoption tag, ...)
switch(tag) {
/* BEGIN TRANSLATABLE STRING OPTIONS */
/* Keep option symbols in alphanumeric order and retain the BEGIN/END
armor comments. */
case CURLOPT_ABSTRACT_UNIX_SOCKET:
case CURLOPT_ACCEPT_ENCODING:
case CURLOPT_ALTSVC:
case CURLOPT_AWS_SIGV4:
case CURLOPT_CAINFO:
@ -1088,16 +1092,16 @@ curl_easy_setopt_ccsid(CURL *easy, CURLoption tag, ...)
case CURLOPT_CRLFILE:
case CURLOPT_CUSTOMREQUEST:
case CURLOPT_DEFAULT_PROTOCOL:
case CURLOPT_DNS_SERVERS:
case CURLOPT_DNS_INTERFACE:
case CURLOPT_DNS_LOCAL_IP4:
case CURLOPT_DNS_LOCAL_IP6:
case CURLOPT_DNS_SERVERS:
case CURLOPT_DOH_URL:
case CURLOPT_EGDSOCKET:
case CURLOPT_ENCODING:
case CURLOPT_FTPPORT:
case CURLOPT_FTP_ACCOUNT:
case CURLOPT_FTP_ALTERNATIVE_TO_USER:
case CURLOPT_HAPROXY_CLIENT_IP:
case CURLOPT_HSTS:
case CURLOPT_INTERFACE:
case CURLOPT_ISSUERCERT:
@ -1119,6 +1123,7 @@ curl_easy_setopt_ccsid(CURL *easy, CURLoption tag, ...)
case CURLOPT_PROXY_CAINFO:
case CURLOPT_PROXY_CAPATH:
case CURLOPT_PROXY_CRLFILE:
case CURLOPT_PROXY_ISSUERCERT:
case CURLOPT_PROXY_KEYPASSWD:
case CURLOPT_PROXY_PINNEDPUBLICKEY:
case CURLOPT_PROXY_SERVICE_NAME:
@ -1164,7 +1169,7 @@ curl_easy_setopt_ccsid(CURL *easy, CURLoption tag, ...)
case CURLOPT_USERNAME:
case CURLOPT_USERPWD:
case CURLOPT_XOAUTH2_BEARER:
case CURLOPT_HAPROXY_CLIENT_IP:
/* END TRANSLATABLE STRING OPTIONS */
s = va_arg(arg, char *);
ccsid = va_arg(arg, unsigned int);

Просмотреть файл

@ -0,0 +1,147 @@
#!/usr/bin/env perl
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
# / __| | | | |_) | |
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
# SPDX-License-Identifier: curl
#
#
###########################################################################
#
# Check the OS/400 translating wrapper properly handles all translatable
# string options.
use strict;
use warnings;
my $root=$ARGV[0] || ".";
my $incdir = "$root/include/curl";
my $os400dir = "$root/packages/OS400";
my $errcount = 0;
# Scan header file for string option definitions.
sub scan_header {
my ($f)=@_;
my $line = "";
my $incomment = 0;
my @stringopts;
open(my $h, "<", "$f");
while(<$h>) {
s/^\s*(.*?)\s*$/$1/; # Trim.
# Remove multi-line comment trail.
if($incomment) {
if($_ !~ /.*?\*\/\s*(.*)$/) {
next;
}
$_ = $1;
$incomment = 0;
}
if($line ne "") {
# Unfold line.
$_ = "$line $1";
$line = "";
}
if($_ =~ /^(.*)\\$/) {
$line = "$1 ";
next;
}
# Remove comments.
while($_ =~ /^(.*?)\/\*.*?\*\/(.*)$/) {
$_ = "$1 $2";
}
if($_ =~ /^(.*)\/\*/) {
$_ = "$1 ";
$incomment = 1;
}
s/^\s*(.*?)\s*$/$1/; # Trim again.
# Ignore preprocessor directives and blank lines.
if($_ =~ /^(?:#|$)/) {
next;
}
# Handle lines that may be continued as if they were folded.
if($_ !~ /[;,{}]$/ || $_ =~ /[^)],$/) {
# Folded line.
$line = $_;
next;
}
# Keep string options only.
if($_ =~ /CURLOPT(?:DEPRECATED)?\s*\(\s*([^, \t]+)\s*,\s*CURLOPTTYPE_STRINGPOINT/) {
push(@stringopts, $1);
}
}
close $h;
return @stringopts;
}
# Scan packages/OS400/ccsidcurl.c for translatable string option cases.
sub scan_wrapper_for_strings {
my ($f)=@_;
my $inarmor = 0;
my @stringopts;
open(my $h, "<", "$f");
while(<$h>) {
if($_ =~ /(BEGIN|END) TRANSLATABLE STRING OPTIONS/) {
$inarmor = $1 eq "BEGIN";
}
elsif($inarmor && $_ =~ /case\s+([^:]+):/) {
push(@stringopts, $1);
}
}
close $h;
return @stringopts;
}
# Get tranlatable string options from header file.
my @stringdefs = scan_header("$incdir/curl.h");
# Get translated string options.
my @stringrefs = scan_wrapper_for_strings("$os400dir/ccsidcurl.c");
# Lists should be equal: check differences.
my %diff;
@diff{@stringdefs} = 0..$#stringdefs;
delete @diff{@stringrefs};
foreach(keys %diff) {
print "$_ is not translated\n";
delete $diff{$_};
$errcount++;
}
@diff{@stringrefs} = 0..$#stringrefs;
delete @diff{@stringdefs};
foreach(keys %diff) {
print "translated option $_ does not exist\n";
$errcount++;
}
# Check translated string option cases are sorted alphanumerically.
foreach(my $i = 1; $i < $#stringrefs; $i++) {
if($stringrefs[$i] lt $stringrefs[$i - 1]) {
print("Translated string options are not sorted (" . $stringrefs[$i - 1] .
"/" . $stringrefs[$i] . ")\n");
$errcount++;
last;
}
}
exit !!$errcount;

Просмотреть файл

@ -192,7 +192,7 @@ test1508 test1509 test1510 test1511 test1512 test1513 test1514 test1515 \
test1516 test1517 test1518 test1519 test1520 test1521 test1522 test1523 \
test1524 test1525 test1526 test1527 test1528 test1529 test1530 test1531 \
test1532 test1533 test1534 test1535 test1536 test1537 test1538 test1539 \
test1540 test1542 test1543 \
test1540 test1542 test1543 test1544 \
\
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
test1558 test1559 test1560 test1561 test1562 test1563 test1564 test1565 \

24
tests/data/test1544 Normal file
Просмотреть файл

@ -0,0 +1,24 @@
<testcase>
<info>
<keywords>
source analysis
</keywords>
</info>
#
# Client-side
<client>
<server>
none
</server>
<name>
Verify all string options are translated by OS/400 wrapper
</name>
<command type="perl">
%SRCDIR/check-translatable-options.pl %SRCDIR/..
</command>
</client>
</testcase>