Index: tests/info.csv ================================================================== --- tests/info.csv +++ tests/info.csv @@ -6,17 +6,71 @@ ,,,,,,,,,, command,# Constraints,,,,,,,,, command,source [file join [file dirname [info script]] common.tcl],,,,,,,,, ,,,,,,,,,, command,# Helper functions,,,,,,,,, -command,"proc lcompare {list1 list2} {set m """";set u """";foreach i $list1 {if {$i ni $list2} {lappend m $i}};foreach i $list2 {if {$i ni $list1} {lappend u $i}};return [list ""missing"" $m ""unexpected"" $u]}",,,,,,,,, +command,"proc lcompare {list1 list2} { + set m """" + set u """" + foreach i $list1 { + if {$i ni $list2} { + lappend m $i + } + } + foreach i $list2 { + if {$i ni $list1} { + lappend u $i + } + } + return [list ""missing"" $m ""unexpected"" $u] +} +",,,,,,,,, command,proc exec_get {delim args} {return [split [exec openssl {*}$args] $delim]},,,,,,,,, -command,"proc exec_get_ciphers {} {set list [list];set data [exec openssl list -cipher-algorithms];foreach line [split $data ""\n""] {foreach {cipher null alias} [split [string trim $line]] {lappend list [string tolower $cipher]}};return [lsort -unique $list]}",,,,,,,,, -command,"proc exec_get_digests {} {set list [list];set data [exec openssl dgst -list];foreach line [split $data ""\n""] {foreach digest $line {if {[string match ""-*"" $digest]} {lappend list [string trimleft $digest ""-""]}}};return [lsort $list]}",,,,,,,,, -command,"proc exec_get_pkeys {} {set list [list];set data [exec openssl list -public-key-methods];foreach line [split $data ""\n""] {if {![string match ""*Type:*"" $line]} {lappend list [string trim $line]}};return $list}",,,,,,,,, +command,"proc exec_get_ciphers {} { + set list [list] + set data [exec openssl list -cipher-algorithms] + foreach line [split $data ""\n""] { + set line [string trim $line] + foreach {cipher ptr alias} [split [string trim $line]] { + lappend list [string tolower $cipher] + } + } + return [lsort -unique $list] +} +",,,,,,,,, +command,"proc exec_get_digests {} { + set list [list] + set data [exec openssl dgst -list] + foreach line [split $data ""\n""] { + foreach digest $line { + if {[string match ""-*"" $digest]} { + lappend list [string trimleft $digest ""-""]} + } + } + return [lsort $list] +} +",,,,,,,,, +command,"proc exec_get_pkeys {} { + set list [list] + set data [exec openssl list -public-key-methods] + foreach line [split $data ""\n""] { + set line [string trim $line] + if {[string match ""Type:*"" $line]} continue + lappend list [string trim $line] + } + return $list +} +",,,,,,,,, command,proc exec_get_macs {} {return [list cmac hmac]},,,,,,,,, -command,proc list_tolower {list} {set result [list];foreach element $list {lappend result [string tolower $element]};return $result},,,,,,,,, +command,"proc list_tolower {list} { + set result [list] + foreach element $list { + lappend result [string tolower $element] + } + return $result +} +",,,,,,,,, ,,,,,,,,,, command,# Test list ciphers,,,,,,,,, Ciphers List,All,,,lcompare [lsort [exec_get_ciphers]] [list_tolower [lsort [::tls::ciphers]]],,,missing {rc5 rc5-cbc rc5-cfb rc5-ecb rc5-ofb} unexpected {aes-128-ccm aes-128-gcm aes-192-ccm aes-192-gcm aes-256-ccm aes-256-gcm},,, ,,,,,,,,,, command,# Test list ciphers for protocols,,,,,,,,, Index: tests/info.test ================================================================== --- tests/info.test +++ tests/info.test @@ -15,17 +15,71 @@ # Constraints source [file join [file dirname [info script]] common.tcl] # Helper functions -proc lcompare {list1 list2} {set m "";set u "";foreach i $list1 {if {$i ni $list2} {lappend m $i}};foreach i $list2 {if {$i ni $list1} {lappend u $i}};return [list "missing" $m "unexpected" $u]} +proc lcompare {list1 list2} { + set m "" + set u "" + foreach i $list1 { + if {$i ni $list2} { + lappend m $i + } + } + foreach i $list2 { + if {$i ni $list1} { + lappend u $i + } + } + return [list "missing" $m "unexpected" $u] +} + proc exec_get {delim args} {return [split [exec openssl {*}$args] $delim]} -proc exec_get_ciphers {} {set list [list];set data [exec openssl list -cipher-algorithms];foreach line [split $data "\n"] {foreach {cipher null alias} [split [string trim $line]] {lappend list [string tolower $cipher]}};return [lsort -unique $list]} -proc exec_get_digests {} {set list [list];set data [exec openssl dgst -list];foreach line [split $data "\n"] {foreach digest $line {if {[string match "-*" $digest]} {lappend list [string trimleft $digest "-"]}}};return [lsort $list]} -proc exec_get_pkeys {} {set list [list];set data [exec openssl list -public-key-methods];foreach line [split $data "\n"] {if {![string match "*Type:*" $line]} {lappend list [string trim $line]}};return $list} +proc exec_get_ciphers {} { + set list [list] + set data [exec openssl list -cipher-algorithms] + foreach line [split $data "\n"] { + set line [string trim $line] + foreach {cipher ptr alias} [split [string trim $line]] { + lappend list [string tolower $cipher] + } + } + return [lsort -unique $list] +} + +proc exec_get_digests {} { + set list [list] + set data [exec openssl dgst -list] + foreach line [split $data "\n"] { + foreach digest $line { + if {[string match "-*" $digest]} { + lappend list [string trimleft $digest "-"]} + } + } + return [lsort $list] +} + +proc exec_get_pkeys {} { + set list [list] + set data [exec openssl list -public-key-methods] + foreach line [split $data "\n"] { + set line [string trim $line] + if {[string match "Type:*" $line]} continue + lappend list [string trim $line] + } + return $list +} + proc exec_get_macs {} {return [list cmac hmac]} -proc list_tolower {list} {set result [list];foreach element $list {lappend result [string tolower $element]};return $result} +proc list_tolower {list} { + set result [list] + foreach element $list { + lappend result [string tolower $element] + } + return $result +} + # Test list ciphers test Ciphers_List-1.1 {All} -body { Index: tests/make_test_files.tcl ================================================================== --- tests/make_test_files.tcl +++ tests/make_test_files.tcl @@ -1,70 +1,104 @@ # # Name: Make Test Files From CSV Files -# Version: 0.2 -# Date: August 6, 2022 +# Version: 0.3 +# Date: March 9, 2024 # Author: Brian O'Hagan # Email: brian199@comcast.net # Legal Notice: (c) Copyright 2020 by Brian O'Hagan # Released under the Apache v2.0 license. I would appreciate a copy of any modifications # made to this package for possible incorporation in a future release. # +# +# Parse CSV line +# +proc parse_csv {ch data} { + set buffer "" + set result [list] + set start 0 + set end [string length $data] + + while {$start < $end} { + if {[string index $data $start] eq "\""} { + # Quoted + if {[set index [string first "\"" $data [incr start]]] > -1} { + set next [string index $data [expr {$index + 1}]] + if {$next eq "\""} { + # Quote + append buffer [string range $data $start $index] + set start [incr index] + + } else { + # End of quoted data + append buffer [string range $data $start [incr index -1]] + set start [incr index 3] + lappend result $buffer + set buffer "" + } + + } else { + # Multi-line + append buffer [string range $data $start end] "\n" + gets $ch new + set data "\"" + append data $new + set start 0 + set end [string length $data] + } + + } else { + # Not quoted, so no embedded NL, quotes, or commas + set index [string first "," $data $start] + if {$index > -1} { + lappend result [string range $data $start [incr index -1]] + set start [incr index 2] + } else { + lappend result [string range $data $start end] + set start [string length $data] + } + } + } + return $result +} + # # Convert test case file into test files # proc process_config_file {filename} { set prev "" set test 0 - # Open file with test case indo + # Open file with test case indo set in [open $filename r] array set cases [list] # Open output test file set out [open [format %s.test [file rootname $filename]] w] array set cases [list] - + # Add setup commands to test file puts $out [format "# Auto generated test cases for %s" [file tail $filename]] #puts $out [format "# Auto generated test cases for %s created on %s" [file tail $filename] [clock format [clock seconds]]] - + # Package requires puts $out "\n# Load Tcl Test package" puts $out [subst -nocommands {if {[lsearch [namespace children] ::tcltest] == -1} {\n\tpackage require tcltest\n\tnamespace import ::tcltest::*\n}\n}] puts $out {set auto_path [concat [list [file dirname [file dirname [info script]]]] $auto_path]} puts $out "" - + # Generate test cases and add to test file while {[gets $in data] > -1} { # Skip comments set data [string trim $data] if {[string match "#*" $data]} continue - # Split comma separated fields with quotes - set list [list] - while {[string length $data] > 0} { - if {[string index $data 0] eq "\""} { - # Quoted - set end [string first "\"," $data] - if {$end == -1} {set end [expr {[string length $data]+1}]} - lappend list [string map [list {""} \"] [string range $data 1 [incr end -1]]] - set data [string range $data [incr end 3] end] - - } else { - # Not quoted, so no embedded NL, quotes, or commas - set index [string first "," $data] - if {$index == -1} {set index [expr {[string length $data]+1}]} - lappend list [string range $data 0 [incr index -1]] - set data [string range $data [incr index 2] end] - } - } + set list [parse_csv $in $data] # Get command or test case foreach {group name constraints setup body cleanup match result output errorOutput returnCodes} $list { if {$group eq "command"} { - # Pass-through command puts $out $name } elseif {$group ne "" && $body ne ""} { set group [string map [list " " "_"] $group] if {$group ne $prev} { @@ -77,10 +111,11 @@ if {[string index $name 0] ne {$}} { set buffer [format "\ntest %s-%d.%d {%s}" $group $test [incr cases($group)] $name] } else { set buffer [format "\ntest %s-%d.%d %s" $group $test [incr cases($group)] $name] } + foreach opt [list -constraints -setup -body -cleanup -match -result -output -errorOutput -returnCodes] { set cmd [string trim [set [string trimleft $opt "-"]]] if {$cmd ne ""} { if {$opt in [list -setup -body -cleanup]} { append buffer " " $opt " \{\n" @@ -121,8 +156,9 @@ # # Call script # foreach file [glob *.csv] { +puts $file process_config_file $file } exit