]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
test1554: check translatable string options in OS400 wrapper
authorPatrick Monnerat <patrick@monnerat.net>
Thu, 10 Aug 2023 22:30:17 +0000 (00:30 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 17 Aug 2023 15:34:35 +0000 (17:34 +0200)
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

packages/OS400/README.OS400
packages/OS400/ccsidcurl.c
tests/check-translatable-options.pl [new file with mode: 0755]
tests/data/Makefile.inc
tests/data/test1544 [new file with mode: 0644]

index efaf05972369fdfd681cf559e419c8f674323c5b..59627d7bdb744fcc9263336b9510ae862eb6e740 100644 (file)
@@ -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()
index c59617ef5f4dabbf63efc7e5bec56cffc80db65b..48f1f5fbdc7b460ee497ba9fd63af8748ac696e1 100644 (file)
@@ -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);
 
diff --git a/tests/check-translatable-options.pl b/tests/check-translatable-options.pl
new file mode 100755 (executable)
index 0000000..3830e5d
--- /dev/null
@@ -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;
index 54294381243dcc15c0788e911bb7089f89569680..e13e4a73d0f00b1fcae0474300f0416a97e185e9 100644 (file)
@@ -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 \
diff --git a/tests/data/test1544 b/tests/data/test1544
new file mode 100644 (file)
index 0000000..861c4fb
--- /dev/null
@@ -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>