generate_ssl_tests.pl
4.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#! /usr/bin/env perl
# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the OpenSSL license (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html
## SSL testcase generator
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions;
use OpenSSL::Test qw/srctop_dir srctop_file/;
use OpenSSL::Test::Utils;
# This block needs to run before 'use lib srctop_dir' directives.
BEGIN {
OpenSSL::Test::setup("no_test_here");
}
use lib srctop_dir("util", "perl"); # for with_fallback
use lib srctop_dir("test", "ssl-tests"); # for ssltests_base
use with_fallback qw(Text::Template);
use vars qw/@ISA/;
push (@ISA, qw/Text::Template/);
use ssltests_base;
sub print_templates {
my $source = srctop_file("test", "ssl_test.tmpl");
my $template = Text::Template->new(TYPE => 'FILE', SOURCE => $source);
print "# Generated with generate_ssl_tests.pl\n\n";
my $num = scalar @ssltests::tests;
# Add the implicit base configuration.
foreach my $test (@ssltests::tests) {
$test->{"server"} = { (%ssltests::base_server, %{$test->{"server"}}) };
if (defined $test->{"server2"}) {
$test->{"server2"} = { (%ssltests::base_server, %{$test->{"server2"}}) };
} else {
if ($test->{"server"}->{"extra"} &&
defined $test->{"server"}->{"extra"}->{"ServerNameCallback"}) {
# Default is the same as server.
$test->{"reuse_server2"} = 1;
}
# Do not emit an empty/duplicate "server2" section.
$test->{"server2"} = { };
}
if (defined $test->{"resume_server"}) {
$test->{"resume_server"} = { (%ssltests::base_server, %{$test->{"resume_server"}}) };
} else {
if (defined $test->{"test"}->{"HandshakeMode"} &&
$test->{"test"}->{"HandshakeMode"} eq "Resume") {
# Default is the same as server.
$test->{"reuse_resume_server"} = 1;
}
# Do not emit an empty/duplicate "resume-server" section.
$test->{"resume_server"} = { };
}
$test->{"client"} = { (%ssltests::base_client, %{$test->{"client"}}) };
if (defined $test->{"resume_client"}) {
$test->{"resume_client"} = { (%ssltests::base_client, %{$test->{"resume_client"}}) };
} else {
if (defined $test->{"test"}->{"HandshakeMode"} &&
$test->{"test"}->{"HandshakeMode"} eq "Resume") {
# Default is the same as client.
$test->{"reuse_resume_client"} = 1;
}
# Do not emit an empty/duplicate "resume-client" section.
$test->{"resume_client"} = { };
}
}
# ssl_test expects to find a
#
# num_tests = n
#
# directive in the file. It'll then look for configuration directives
# for n tests, that each look like this:
#
# test-n = test-section
#
# [test-section]
# (SSL modules for client and server configuration go here.)
#
# [test-n]
# (Test configuration goes here.)
print "num_tests = $num\n\n";
# The conf module locations must come before everything else, because
# they look like
#
# test-n = test-section
#
# and you can't mix and match them with sections.
my $idx = 0;
foreach my $test (@ssltests::tests) {
my $testname = "${idx}-" . $test->{'name'};
print "test-$idx = $testname\n";
$idx++;
}
$idx = 0;
foreach my $test (@ssltests::tests) {
my $testname = "${idx}-" . $test->{'name'};
my $text = $template->fill_in(
HASH => [{ idx => $idx, testname => $testname } , $test],
DELIMITERS => [ "{-", "-}" ]);
print "# ===========================================================\n\n";
print "$text\n";
$idx++;
}
}
# Shamelessly copied from Configure.
sub read_config {
my $fname = shift;
open(INPUT, "< $fname") or die "Can't open input file '$fname'!\n";
local $/ = undef;
my $content = <INPUT>;
close(INPUT);
eval $content;
warn $@ if $@;
}
my $input_file = shift;
# Reads the tests into ssltests::tests.
read_config($input_file);
print_templates();
1;