42862c47bfe33278935f1b23c710e28017c522bd
[tools.git] / release-tools / release-aux / test_suite.sh
1 #! /bin/bash
2 # Copyright 2023 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the Apache License 2.0 (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9 # This script runs a test suite to check the functions in release-state-fn.sh
10 # and release-version-fn.sh.  It does this by setting up a small temporary
11 # repository with just enough fake data (in include/openssl/opensslv.h or
12 # VERSION.dat) to see that version data is updated correctly.
13
14 DEBUG=:
15 export LANG=C
16
17 HERE=$(cd $(dirname $0); pwd)
18 . $HERE/release-state-fn.sh
19 . $HERE/release-version-fn.sh
20
21 today="$(date '+%-d %b %Y')"
22
23 repo=release-test-$$.git
24 git init --quiet /var/tmp/$repo
25 cd /var/tmp/$repo
26 trap "cd $HERE; rm -rf /var/tmp/$repo" EXIT
27
28 echo "===== OpenSSL 3.0 version scheme"
29
30 cat > VERSION.dat <<_____
31 MAJOR=3
32 MINOR=2
33 PATCH=0
34 PRE_RELEASE_TAG=dev
35 BUILD_METADATA=
36 RELEASE_DATE=""
37 SHLIB_VERSION=3
38 _____
39 git add VERSION.dat
40 git commit -m 'Fake 3.2.0-dev' --quiet
41
42 declare -A expected
43
44 function check () {
45     local errs=0
46
47     for key in "${!expected[@]}"; do
48         if [ "${!key}" != "${expected[$key]}" ]; then
49             (( errs++ ))
50         fi
51     done
52
53     if [ $errs -gt 0 ]; then
54         echo >&2 "Got the wrong data:"
55         for key in "${!expected[@]}"; do
56             echo >&2 "    \$$key=${!key}"
57         done
58         echo >&2 "Expected:"
59         for key in "${!expected[@]}"; do
60             echo >&2 "    \$$key=${expected[$key]}"
61         done
62         exit 1
63     fi
64 }
65
66 echo "Initial read of VERSION.DAT"
67 expected=(
68     [TYPE]=dev
69     [SERIES]=3.2
70     [VERSION]=3.2.0
71     [FULL_VERSION]=3.2.0-dev
72     [PRE_RELEASE_TAG]=dev
73     [SHLIB_VERSION]=3
74     [RELEASE_FILES]='CHANGES.md;NEWS.md'
75 )
76 get_version
77 check
78
79 echo "Test release of 3.2.0-alpha1"
80 expected=(
81     [TYPE]=
82     [VERSION]=3.2.0
83     [FULL_VERSION]=3.2.0-alpha1
84     [PRE_RELEASE_TAG]=alpha1
85     [RELEASE_DATE]="$today"
86 )
87 next_release_state alpha
88 check
89
90 echo "Test post-release of 3.2.0-alpha1"
91 expected=(
92     [TYPE]=dev
93     [VERSION]=3.2.0
94     [FULL_VERSION]=3.2.0-alpha2-dev
95     [PRE_RELEASE_TAG]=alpha2-dev
96     [RELEASE_DATE]=
97 )
98 next_release_state alpha
99 check
100
101 echo "Test release of 3.2.0-beta1"
102 expected=(
103     [TYPE]=
104     [VERSION]=3.2.0
105     [FULL_VERSION]=3.2.0-beta1
106     [PRE_RELEASE_TAG]=beta1
107     [RELEASE_DATE]="$today"
108 )
109 next_release_state beta
110 check
111
112 echo "Test post-release of 3.2.0-beta1"
113 expected=(
114     [TYPE]=dev
115     [VERSION]=3.2.0
116     [FULL_VERSION]=3.2.0-beta2-dev
117     [PRE_RELEASE_TAG]=beta2-dev
118     [RELEASE_DATE]=
119 )
120 next_release_state beta
121 check
122
123 echo "Test release of 3.2.0"
124 expected=(
125     [TYPE]=
126     [VERSION]=3.2.0
127     [FULL_VERSION]=3.2.0
128     [PRE_RELEASE_TAG]=
129     [RELEASE_DATE]="$today"
130 )
131 next_release_state final
132 check
133
134 echo "Test post-release of 3.2.0"
135 expected=(
136     [TYPE]=dev
137     [VERSION]=3.2.1
138     [FULL_VERSION]=3.2.1-dev
139     [PRE_RELEASE_TAG]=dev
140     [RELEASE_DATE]=
141 )
142 next_release_state final
143 check
144
145 echo "Test release of 3.2.1"
146 expected=(
147     [TYPE]=
148     [VERSION]=3.2.1
149     [FULL_VERSION]=3.2.1
150     [PRE_RELEASE_TAG]=
151     [RELEASE_DATE]="$today"
152 )
153 next_release_state ''
154 check
155
156 echo "Test post-release of 3.2.1"
157 expected=(
158     [TYPE]=dev
159     [VERSION]=3.2.2
160     [FULL_VERSION]=3.2.2-dev
161     [PRE_RELEASE_TAG]=dev
162     [RELEASE_DATE]=
163 )
164 next_release_state ''
165 check
166
167 echo "Test switch to next minor release (3.3.0-dev)"
168 expected=(
169     [TYPE]=dev
170     [VERSION]=3.3.0
171     [FULL_VERSION]=3.3.0-dev
172     [PRE_RELEASE_TAG]=dev
173     [RELEASE_DATE]=
174 )
175 next_release_state minor
176 check
177
178 echo "Test writing $VERSION_FILE"
179 set_version
180 cat > expected-VERSION.dat <<_____
181 MAJOR=3
182 MINOR=3
183 PATCH=0
184 PRE_RELEASE_TAG=dev
185 BUILD_METADATA=
186 RELEASE_DATE=""
187 SHLIB_VERSION=3
188 _____
189 if ! diff_output="$(diff -u expected-VERSION.dat VERSION.dat)"; then
190     echo >&2 "$diff_output"
191     exit 1
192 fi
193
194 echo "===== OpenSSL 1.0.2 version scheme"
195
196 git restore .
197 git rm --quiet VERSION.dat
198 mkdir crypto
199 cat > crypto/opensslv.h <<_____
200 # define OPENSSL_VERSION_NUMBER  0x10002210L
201 # ifdef OPENSSL_FIPS
202 #  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.2zh-fips-dev  xx XXX xxxx"
203 # else
204 #  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.2zh-dev  xx XXX xxxx"
205 # endif
206 # define OPENSSL_VERSION_PTEXT   " part of " OPENSSL_VERSION_TEXT
207 _____
208 touch openssl.spec
209 git add openssl.spec crypto/opensslv.h
210 git commit -m 'Fake 1.0.2zh-dev' --quiet
211
212 echo "Test initial read of crypto/opensslv.h"
213 expected=(
214     [TYPE]=dev
215     [SERIES]=1.0.2
216     [VERSION]=1.0.2zh
217     [FULL_VERSION]=1.0.2zh-dev
218     [PRE_RELEASE_TAG]=dev
219     [SHLIB_VERSION]=1.0.0
220     [RELEASE_FILES]='README;CHANGES;NEWS;openssl.spec'
221 )
222 get_version
223 check
224
225 echo "Test release of 1.0.2zh"
226 expected=(
227     [TYPE]=
228     [VERSION]=1.0.2zh
229     [FULL_VERSION]=1.0.2zh
230     [PRE_RELEASE_TAG]=
231     [RELEASE_DATE]="$today"
232 )
233 next_release_state ''
234 check
235
236 echo "Test post-release of 1.0.2zh"
237 expected=(
238     [TYPE]=dev
239     [VERSION]=1.0.2zi
240     [FULL_VERSION]=1.0.2zi-dev
241     [PRE_RELEASE_TAG]=dev
242     [RELEASE_DATE]=
243 )
244 next_release_state ''
245 check
246     
247 echo "Test writing $VERSION_FILE"
248 set_version
249 cat > crypto/expected-opensslv.h <<_____
250 # define OPENSSL_VERSION_NUMBER  0x10002220L
251 # ifdef OPENSSL_FIPS
252 #  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.2zi-fips-dev  xx XXX xxxx"
253 # else
254 #  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.2zi-dev  xx XXX xxxx"
255 # endif
256 # define OPENSSL_VERSION_PTEXT   " part of " OPENSSL_VERSION_TEXT
257 _____
258 if ! diff_output="$(diff -u crypto/expected-opensslv.h crypto/opensslv.h)"; then
259     echo >&2 "$diff_output"
260     exit 1
261 fi
262
263 echo "===== PASS ====="