1#!/bin/bash
2#
3# This Source Code Form is subject to the terms of the Mozilla Public
4# License, v. 2.0. If a copy of the MPL was not distributed with this
5# file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7########################################################################
8#
9# tests/ssl_gtests/ssl_gtests.sh
10#
11# Script to drive the ssl gtest unit tests
12#
13# needs to work on all Unix and Windows platforms
14#
15# special strings
16# ---------------
17#   FIXME ... known problems, search for this string
18#   NOTE .... unexpected behavior
19#
20########################################################################
21
22ssl_gtest_certs() {
23  mkdir -p "${SSLGTESTDIR}"
24  cd "${SSLGTESTDIR}"
25
26  PROFILEDIR=`pwd`
27  if [ "${OS_ARCH}" = "WINNT" -a "$OS_NAME" = "CYGWIN_NT" ]; then
28    PROFILEDIR=`cygpath -m "${PROFILEDIR}"`
29  fi
30
31  ${BINDIR}/certutil -N -d "${PROFILEDIR}" --empty-password 2>&1
32  html_msg $? 0 "create ssl_gtest database"
33
34  pushd "${QADIR}"
35  . common/certsetup.sh
36  popd
37
38  counter=0
39  make_cert client rsa sign
40  make_cert rsa rsa sign kex
41  make_cert rsa2048 rsa2048 sign kex
42  make_cert rsa8192 rsa8192 sign kex
43  make_cert rsa_sign rsa sign
44  make_cert rsa_pss rsapss sign
45  make_cert rsa_pss384 rsapss384 sign
46  make_cert rsa_pss512 rsapss512 sign
47  make_cert rsa_pss_noparam rsapss_noparam sign
48  make_cert rsa_decrypt rsa kex
49  make_cert ecdsa256 p256 sign
50  make_cert ecdsa384 p384 sign
51  make_cert ecdsa521 p521 sign
52  make_cert ecdh_ecdsa p256 kex
53  make_cert rsa_ca rsa_ca ca
54  make_cert rsa_chain rsa_chain sign
55  make_cert rsa_pss_ca rsapss_ca ca
56  make_cert rsa_pss_chain rsapss_chain sign
57  make_cert rsa_ca_rsa_pss_chain rsa_ca_rsapss_chain sign
58  make_cert ecdh_rsa ecdh_rsa kex
59  make_cert dsa dsa sign
60  make_cert delegator_ecdsa256 delegator_p256 sign
61  make_cert delegator_rsae2048 delegator_rsae2048 sign
62  make_cert delegator_rsa_pss2048 delegator_rsa_pss2048 sign
63}
64
65############################## ssl_gtest_init ##########################
66# local shell function to initialize this script
67########################################################################
68ssl_gtest_init()
69{
70  SCRIPTNAME=ssl_gtest.sh      # sourced - $0 would point to all.sh
71
72  if [ -z "${CLEANUP}" ] ; then     # if nobody else is responsible for
73      CLEANUP="${SCRIPTNAME}"       # cleaning this script will do it
74  fi
75  if [ -z "${INIT_SOURCED}" -o "${INIT_SOURCED}" != "TRUE" ]; then
76      cd ../common
77      . ./init.sh
78  fi
79
80  SCRIPTNAME=ssl_gtest.sh
81  html_head SSL Gtests
82
83  if [ ! -d "${SSLGTESTDIR}" ]; then
84    ssl_gtest_certs
85  fi
86
87  cd "${SSLGTESTDIR}"
88}
89
90########################## ssl_gtest_start #########################
91# Local function to actually start the test
92####################################################################
93ssl_gtest_start()
94{
95  if [ ! -f ${BINDIR}/ssl_gtest ]; then
96    html_unknown "Skipping ssl_gtest (not built)"
97    return
98  fi
99
100  SSLGTESTREPORT="${SSLGTESTDIR}/report.xml"
101
102  local nshards=1
103  local prefix=""
104  local postfix=""
105
106  export -f parallel_fallback
107
108  # Determine the number of chunks.
109  if [ -n "$GTESTFILTER" ]; then
110    echo "DEBUG: Not parallelizing ssl_gtests because \$GTESTFILTER is set"
111  elif type parallel 2>/dev/null; then
112    nshards=$(parallel --number-of-cores || 1)
113  fi
114
115  if [ "$nshards" != 1 ]; then
116    local indices=$(for ((i=0; i<$nshards; i++)); do echo $i; done)
117    prefix="parallel -j$nshards --line-buffer --halt soon,fail=1"
118    postfix="\&\& exit 0 \|\| exit 1 ::: $indices"
119  fi
120
121  echo "DEBUG: ssl_gtests will be divided into $nshards chunk(s)"
122
123  # Run tests.
124  ${prefix:-parallel_fallback} \
125    GTEST_SHARD_INDEX={} \
126      GTEST_TOTAL_SHARDS=$nshards \
127        DYLD_LIBRARY_PATH="${DIST}/${OBJDIR}/lib" \
128          ${BINDIR}/ssl_gtest -d "${SSLGTESTDIR}" \
129            --gtest_output=xml:"${SSLGTESTREPORT}.{}" \
130            --gtest_filter="${GTESTFILTER-*}" \
131            $postfix
132
133  html_msg $? 0 "ssl_gtests ran successfully"
134
135  # Parse XML report(s).
136  gtest_parse_report "${SSLGTESTREPORT}".*
137}
138
139# Helper function used when 'parallel' isn't available.
140parallel_fallback()
141{
142  eval "${@//\{\}/0}"
143}
144
145ssl_gtest_cleanup()
146{
147  cd ${QADIR}
148  . common/cleanup.sh
149}
150
151################## main #################################################
152cd "$(dirname "$0")"
153ssl_gtest_init
154ssl_gtest_start
155ssl_gtest_cleanup
156