summaryrefslogtreecommitdiffstats
path: root/bin/test_torbrowser-launcher.sh
blob: 34412078ea0387681cea2547c4f0edbbad9b9932 (plain)
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
#!/bin/bash

# Copyright 2015 Holger Levsen <holger@layer-acht.org>
# released under the GPLv=2

DEBUG=false
. /srv/jenkins/bin/common-functions.sh
common_init "$@"

set -e

cleanup_all() {
	set +e
	if [ "$1" = "quiet" ] ; then
		echo "$(date -u) - everything ran nicely, congrats."
	fi
	# kill xvfb and ffmpeg
	kill $XPID $FFMPEGPID 2>/dev/null|| true
	# preserve screenshots and video
	cd $TMPDIR
	[ ! -f $VIDEO ] || mv $VIDEO $RESULTS/
	cd $WORKSPACE
	[ ! -f screenshot.png ] || rm screenshot.png
	[ ! -f screenshot-thumb.png ] || rm screenshot-thumb.png
	[ ! -f screenshot_from_git.png ] || mv screenshot_from_git.png screenshot.png
	# shutdown and end session if it still exists
	STATUS=$(schroot -l --all-sessions | grep $SESSION || true)
	if [ -n "$STATUS" ] ; then
		echo "$(date -u ) - stopping dbus service."
		schroot --run-session -c $SESSION --directory /tmp -u root -- service dbus stop || true
		sleep 1
		schroot --end-session -c $SESSION || true
		echo "$(date -u ) - schroot session $SESSION end."
	fi
	# delete main work dir
	cd
	rm $TMPDIR $TBL_LOGFILE -rf
	# end
	echo "$(date -u) - $TMPDIR deleted. Cleanup done."
}

cleanup_duplicate_screenshots() {
	echo "$(date -u) - removing duplicate screenshots."
	MAXDIFF=2500 # pixels
	cd $RESULTS
	for i in $(ls -r1 *.png | xargs echo) ; do
		for j in $(ls -r1 *.png | xargs echo) ; do
			if [ "$j" = "$i" ] ; then
				break
			elif [ ! -f $j ] || [ ! -f $i ] ; then
				break
			fi
			PIXELS=$(compare -metric AE $i $j /dev/null 2>&1 || true)
			if [[ "$PIXELS" =~ ^[0-9]+$ ]] && [ $PIXELS -le $MAXDIFF ] ; then
				echo "$(date -u ) - removing $j, just $PIXELS pixels difference."
				rm $j
			fi
		done
	done
}

update_screenshot() {
	TIMESTAMP=$(date +%Y%m%d%H%M%S)
	ffmpeg -y -f x11grab -s $SIZE -i :$SCREEN.0 -frames 1 screenshot.png > /dev/null 2>&1
	convert screenshot.png -adaptive-resize 128x96 screenshot-thumb.png
	# for publishing
	cp screenshot.png $RESULTS/screenshot_$TIMESTAMP.png
	echo "screenshot_$TIMESTAMP.png preserved."
	# for the live screenshot plugin
	mv screenshot.png screenshot-thumb.png $WORKSPACE/
}

begin_session() {
	schroot --begin-session --session-name=$SESSION -c jenkins-torbrowser-launcher-$SUITE
	echo "Starting schroot session, schroot --run-session -c $SESSION -- now availble."
	schroot --run-session -c $SESSION --directory /tmp -u root -- mkdir $HOME
	schroot --run-session -c $SESSION --directory /tmp -u root -- chown jenkins:jenkins $HOME
}

end_session() {
	schroot --end-session -c $SESSION
	echo "$(date -u ) - schroot session $SESSION end."
	sleep 1
}

upgrade_to_newer_packaged_version_in() {
	local SUITE=$1
	echo
	echo "$(date -u ) - upgrading to torbrowser-launcher from $SUITE"
	echo "deb $MIRROR $SUITE main contrib" | schroot --run-session -c $SESSION --directory /tmp -u root -- tee -a /etc/apt/sources.list
	schroot --run-session -c $SESSION --directory /tmp -u root -- apt-get update
	schroot --run-session -c $SESSION --directory /tmp -u root -- apt-get -y install -t $SUITE torbrowser-launcher
}

build_and_upgrade_to_git_version() {
	echo
	echo "$(date -u ) - building Debian package based on branch $BRANCH from $GIT_URL."
	schroot --run-session -c $SESSION --directory $TMPDIR/git -- debuild -b -uc -us
	DEB=$(cd $TMPDIR ; ls torbrowser-launcher_*deb)
	CHANGES=$(cd $TMPDIR ; ls torbrowser-launcher_*changes)
	echo "$(date -u ) - $DEB will be installed."
	schroot --run-session -c $SESSION --directory $TMPDIR -u root -- dpkg -i $DEB
	rm $TMPDIR/git -r
	cat $TMPDIR/$CHANGES
	schroot --run-session -c $SESSION --directory $TMPDIR -- dcmd rm $CHANGES
}

download_and_launch() {
	echo
	echo "$(date -u) - Test download_and_launch begins."
	echo "$(date -u ) - starting dbus service."
	schroot --run-session -c $SESSION --directory /tmp -u root -- service dbus start
	sleep 2
	echo "$(date -u) - starting Xfvb on :$SCREEN.0 now."
	Xvfb -ac -br -screen 0 ${SIZE}x24 :$SCREEN &
	XPID=$!
	sleep 1
	export DISPLAY=":$SCREEN.0"
	echo export DISPLAY=":$SCREEN.0"
	unset http_proxy
	unset https_proxy
	#export LANGUAGE="de"
	#export LANG="de_DE.UTF-8"
	#export LC_ALL="de_DE.UTF-8"
	echo "$(date -u) - starting awesome."
	timeout -k 30m 29m schroot --run-session -c $SESSION --preserve-environment -- awesome &
	sleep 2
	DBUS_SESSION_FILE=$(mktemp)
	DBUS_SESSION_POINTER=$(schroot --run-session -c $SESSION --preserve-environment -- ls $HOME/.dbus/session-bus/ -t1 | head -1)
	schroot --run-session -c $SESSION --preserve-environment -- cat $HOME/.dbus/session-bus/$DBUS_SESSION_POINTER > $DBUS_SESSION_FILE
	. $DBUS_SESSION_FILE && export DBUS_SESSION_BUS_ADDRESS
	echo export DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS
	rm $DBUS_SESSION_FILE
	ffmpeg -f x11grab -s $SIZE -i :$SCREEN.0 $VIDEO > /dev/null 2>&1 &
	FFMPEGPID=$!
	echo "'$(date -u) - starting torbrowser tests'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send
	update_screenshot
	echo "$(date -u) - starting torbrowser-launcher the first time, opening settings dialog."
	export PYTHONUNBUFFERED=true
	( timeout -k 30m 29m schroot --run-session -c $SESSION --preserve-environment -- /usr/bin/torbrowser-launcher --settings 2>&1 |& tee $TBL_LOGFILE || true ) &
	sleep 10
	update_screenshot
	echo "$(date -u) - pressing <tab>"
	xvkbd -text "\t" > /dev/null 2>&1
	sleep 1
	TBL_VERSION=$(schroot --run-session -c $SESSION -- dpkg --status torbrowser-launcher |grep ^Version|cut -d " " -f2)
	if dpkg --compare-versions $TBL_VERSION lt 0.2.0-1~ ; then
		echo "$(date -u) - torbrowser-launcher version <0.2.0-1~ detected ($TBL_VERSION), pressing <tab> three times more."
		xvkbd -text "\t\t\t" > /dev/null 2>&1
		sleep 1
	elif dpkg --compare-versions $TBL_VERSION lt 0.2.2-1~ ; then
		echo "$(date -u) - torbrowser-launcher version <0.2.2-1~ detected ($TBL_VERSION), pressing <tab> twice more."
		xvkbd -text "\t\t" > /dev/null 2>&1
		sleep 1
	fi
	update_screenshot
	echo "$(date -u) - pressing <return>"
	xvkbd -text "\r" > /dev/null 2>&1
	sleep 5
	update_screenshot
	SETTINGS_DONE=$(pgrep -f "$SESSION --preserve-environment -- torbrowser-launcher --settings" || true)
	if [ -n "$SETTINGS_DONE" ] ; then
		echo "'$(date -u) - settings dialog still there, aborting.'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send -u critical
		update_screenshot
		cleanup_duplicate_screenshots
		exit 1
	fi
	for i in $(seq 1 40) ; do
		sleep 15
		STATUS="$(grep '^Download error:' $TBL_LOGFILE || true)"
		if [ -n "$STATUS" ] ; then
			echo "'$(date -u) - $STATUS'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send -u critical
			update_screenshot
			cleanup_duplicate_screenshots
			exit 1
		fi
		# this directory only exists once torbrower has been successfully installed
		# (and pattern matching doesnt work because of schroot…)

		STATUS="$(schroot --run-session -c $SESSION -- test ! -d $HOME/.local/share/torbrowser/tbb/x86_64/tor-browser_en-US/Browser -a ! -d $HOME/.local/share/torbrowser/tbb/x86_64/tor-browser_de/Browser || echo $(date -u ) - torbrowser downloaded and installed, configuring tor now. )"
		if [ -n "$STATUS" ] ; then
			sleep 10
			echo "'$STATUS'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send
			update_screenshot
			break
		fi
		update_screenshot
	done
	if [ ! -n "$STATUS" ] ; then
		echo "'$(date -u) - could not download torbrowser, please investigate.'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send -u critical
		update_screenshot
		cleanup_duplicate_screenshots
		exit 1
	fi
	echo "$(date -u) - waiting for torbrowser to start."
	for i in $(seq 1 6) ; do
		sleep 10
		# this directory only exist once torbrower has successfully started
		STATUS="$(schroot --run-session -c $SESSION -- test ! -d $HOME/.local/share/torbrowser/tbb/x86_64/tor-browser_en-US/Browser/TorBrowser/Data/Browser/profile.default || echo $(date -u ) - torbrowser running. )"
		if [ -n "$STATUS" ] ; then
			sleep 10
			echo "'$STATUS'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send
			update_screenshot
			break
		fi
	done
	if [ ! -n "$STATUS" ] ; then
		echo "'$(date -u) - could not start torbrowser, please investigate.'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send -u critical
		update_screenshot
		cleanup_duplicate_screenshots
		exit 1
	fi
	echo "$(date -u) - pressing <return>, to connect directly via tor."
	xvkbd -text "\r" > /dev/null 2>&1
	sleep 3
	update_screenshot
	for i in $(seq 1 6) ; do
		sleep 10
		update_screenshot
		TOR_RUNNING=$(gocr $WORKSPACE/screenshot.png 2>/dev/null | egrep "(Search securely|Tor Is NOT all you need to browse|There are many ways you can help)" || true)
		if [ -n "$TOR_RUNNING" ] ; then
			echo "$(date -u) - torbrowser is working is it should, good."
			break
		fi
	done
	if [ -z "$TOR_RUNNING" ] ; then
		echo "'$(date -u) - could not connect successfuly via tor or could not run torbrowser at all. Aborting.'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send -u critical
		update_screenshot
		cleanup_duplicate_screenshots
		cleanup_all
		exec /srv/jenkins/bin/abort.sh
		exit 0
	fi
	URL="https://www.debian.org"
	echo "$(date -u) - pressing <ctrl>-l - about to enter $URL as URL."
	xvkbd -text "\Cl" > /dev/null 2>&1
	sleep 3
	xvkbd -text "$URL" > /dev/null 2>&1
	update_screenshot
	sleep 0.5
	xvkbd -text "\r" > /dev/null 2>&1
	BONUS_LEVEL=""
	for i in $(seq 1 6) ; do
		sleep 5
		URL_LOADED=$(gocr $WORKSPACE/screenshot.png 2>/dev/null | grep -c "Debian" || true)
		update_screenshot
		if [ $URL_LOADED -ge 6 ] ; then
			echo "$(date -u) - $URL loaded fine, very much Debian in there, great."
			BONUS_LEVEL=" Well done."
			break
		fi
	done
	echo "'$(date -u) - torbrowser tests end.$BONUS_LEVEL'" | tee | xargs schroot --run-session -c $SESSION --preserve-environment -- notify-send
	update_screenshot
	echo "$(date) - telling awesome to quit."
	echo 'awesome.quit()' | schroot --run-session -c $SESSION --preserve-environment -- awesome-client
	sleep 1
	schroot --run-session -c $SESSION --directory /tmp -u root -- service dbus stop
	sleep 1
	echo "$(date -u ) - killing Xfvb and ffmpeg."
	kill $XPID $FFMPEGPID || true
	sleep 1
	echo "$(date -u ) - Test ends."
	echo
}

prepare_git_workspace_copy() {
	echo "$(date -u) - preparing git workspace copy in $TMPDIR/git"
	git branch -av
	mkdir $TMPDIR/git
	cp -r * $TMPDIR/git
	echo
}

#
# prepare
#
if [ -z "$1" ] ; then
	echo "call $0 with a suite as param."
	exit 1
fi
SUITE=$1
UPGRADE_SUITE=""
TMPDIR=$(mktemp -d)  # where everything actually happens
TBL_LOGFILE=$(mktemp)
SESSION="tbb-launcher-$SUITE-$(basename $TMPDIR)"
STARTTIME=$(date +%Y%m%d%H%M)
VIDEO=test-torbrowser-${SUITE}_$STARTTIME.mpg
SIZE=1024x768
SCREEN=$EXECUTOR_NUMBER
if [ "$2" = "git" ] ; then
	if [ "$3" = "merge"  ] ; then
		BRANCH=upstream-master-plus-debian-packaging
		DEBIAN_GIT_URL="git://git.debian.org/git/collab-maint/torbrowser-launcher.git"
		DEBIAN_BRANCH="debian/$4"
		COMMIT_HASH=$(git log -1 --oneline|cut -d " " -f1)
		echo "$(date -u) - Merging branch $DEBIAN_BRANCH into $COMMIT_HASH now."
		echo
		git log -1
		git checkout -b $BRANCH
		git remote add debian $DEBIAN_GIT_URL
		git fetch --no-tags debian
		git merge --no-stat --no-edit $DEBIAN_BRANCH
		BUILD_VERSION="$(dpkg-parsechangelog |grep ^Version:|cut -d " " -f2).0~jenkins-test-$COMMIT_HASH"
		COMMIT_MSG1="Automatically build by jenkins using the branch $DEBIAN_BRANCH (from $DEBIAN_GIT_URL) merged into $COMMIT_HASH."
		# GIT_URL AND GIT_BRANCH are set by jenkins
		COMMIT_MSG2="$COMMIT_HASH is from branch $(echo $GIT_BRANCH|cut -d '/' -f2) from $GIT_URL."
		dch -R $COMMIT_MSG1
		dch -v $BUILD_VERSION $COMMIT_MSG2
		prepare_git_workspace_copy
		# revert to original branch
		git reset --hard
		git checkout -f -q $COMMIT_HASH
		git branch -D $BRANCH
	else
		BRANCH=$3
		prepare_git_workspace_copy
	fi
elif [ "$SUITE" = "experimental" ] || [ "$2" = "experimental" ] ; then
	SUITE=unstable
	UPGRADE_SUITE=experimental
elif [ "$2" = "backports" ] ; then
	UPGRADE_SUITE=$SUITE-backports
elif [ "$2" = "unstable" ] ; then
	UPGRADE_SUITE=unstable
fi
WORKSPACE=$(pwd)
RESULTS=$WORKSPACE/results
rm -f $RESULTS/*.png $RESULTS/*.mpg
[ ! -f screenshot.png ] || mv screenshot.png screenshot_from_git.png
mkdir -p $RESULTS
cd $TMPDIR
trap cleanup_all INT TERM EXIT

#
# main
#
echo "$(date -u) - testing torbrowser-launcher on $SUITE now."
begin_session
if [ "$2" = "git" ] ; then
	build_and_upgrade_to_git_version
elif [ -n "$UPGRADE_SUITE" ] ; then
	upgrade_to_newer_packaged_version_in $UPGRADE_SUITE
fi
download_and_launch
end_session
cleanup_duplicate_screenshots

# the end
trap - INT TERM EXIT
cleanup_all quiet
echo "$(date -u) - the end."