summaryrefslogtreecommitdiffstats
path: root/tools/wine_valgrind/chrome_tests.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tools/wine_valgrind/chrome_tests.sh')
-rwxr-xr-xtools/wine_valgrind/chrome_tests.sh414
1 files changed, 414 insertions, 0 deletions
diff --git a/tools/wine_valgrind/chrome_tests.sh b/tools/wine_valgrind/chrome_tests.sh
new file mode 100755
index 0000000..5b6f330
--- /dev/null
+++ b/tools/wine_valgrind/chrome_tests.sh
@@ -0,0 +1,414 @@
+#!/bin/sh
+# chromium-runtests.sh [testsuite]
+# Script to run a respectable subset of Chromium's test suite
+# (excepting parts that run the browser itself, and excepting layout tests).
+# Run from parent of src directory.
+# By default, runs all test suites. If you specify one testsuite
+# (e.g. base_unittests), it only runs that one.
+#
+# Chromium's test suite uses gtest, so each executable obeys the options
+# documented in the wiki at http://code.google.com/p/googletest
+# In particular, you can run a single test with --gtest_filter=Foo.Bar,
+# and get a full list of tests in each exe with --gtest_list_tests.
+#
+# Before running the tests, regardless of operating system:
+# 1) Make sure your system has at least one printer installed,
+# or printing_unittests and unit_tests' PrintJobTest.SimplePrint
+# will fail. A fake printer is fine, nothing will be printed.
+# 2) Install the test cert as described at
+# http://bugs.winehq.org/show_bug.cgi?id=20370
+# or net_unittests' HTTPSRequestTest.*, SSLClientSocketTest.*
+# and others may fail.
+#
+# Chrome doesn't start without the --no-sandbox
+# option in wine, so skip test suites that invoke it directly until I
+# figure out how to jam that in there.
+
+usage() {
+ cat <<_EOF_
+Usage: sh chromium-runtests.sh [--options] [suite ...]
+Runs chromium tests on Windows or Wine.
+Options:
+ --individual - run tests individually
+ --groups - run tests grouped by their major gtest name
+ --gtest_filter X - only run the tests matching X
+ --target X - test with Debug or Release binaries, default to Debug
+ --just-crashes - run only tests epected to crash
+ --just-fails - run only tests epected to fail
+ --just-flaky - run only tests epected to fail sometimes
+ --just-hangs - run only tests epected to hang
+ --list-failures - show list of expected failures
+ --logfiles - log to one file per test, in logs subdir, rather than stdout
+ --loops N - run tests N times
+ -n - dry run, only show what will be done
+ --suppression_dir - directory containing the suppression files
+ --timeout N - let each executable run for N seconds (default varies)
+ --used-suppressions - extract histogram of used valgrind suppressions from current contents of logs directory
+ --valgrind - run the tests under valgrind
+ --vnc N - run the tests inside a vnc server running on display N
+ --winedebug chan - e.g. --windebug +relay,+seh
+Currently supported suites:
+app_unittests base_unittests courgette_unittests googleurl_unittests
+ipc_tests media_unittests net_unittests printing_unittests sbox_unittests
+sbox_validation_tests setup_unittests tcmalloc_unittests unit_tests
+Default is to run all suites. It takes about five minutes to run them all
+together, 22 minutes to run them all individually.
+_EOF_
+ exit 1
+}
+
+# Tests, grouped by how long they take to run
+# Skip ones that require chrome itself for the moment
+SUITES_1="googleurl_unittests printing_unittests sbox_validation_tests setup_unittests"
+#SUITES_10="app_unittests courgette_unittests ipc_tests reliability_tests sbox_integration_tests sbox_unittests tab_switching_test tcmalloc_unittests url_fetch_test"
+SUITES_10="app_unittests courgette_unittests ipc_tests sbox_unittests tcmalloc_unittests"
+#SUITES_100="automated_ui_tests installer_util_unittests media_unittests nacl_ui_tests net_perftests net_unittests plugin_tests sync_unit_tests"
+SUITES_100="media_unittests net_unittests"
+#SUITES_1000="base_unittests interactive_ui_tests memory_test page_cycler_tests perf_tests test_shell_tests unit_tests"
+SUITES_1000="base_unittests unit_tests"
+#SUITES_10000="ui_tests startup_tests"
+
+THE_VALGRIND_CMD="/usr/local/valgrind-10903/bin/valgrind \
+--gen-suppressions=all \
+--leak-check=full \
+--num-callers=25 \
+--show-possible=no \
+--smc-check=all \
+--trace-children=yes \
+--track-origins=yes \
+-v \
+--workaround-gcc296-bugs=yes \
+"
+
+reduce_verbosity() {
+ # Filter out valgrind's extra -v output except for the 'used_suppression' lines
+ # Also remove extra carriage returns
+ awk '!/^--/ || /^--.*used_suppression:/' | tr -d '\015'
+}
+
+# Filter out known failures
+# Avoid tests that hung, failed, or crashed on windows in Dan's reference run,
+# or which fail in a way we don't care about on Wine,
+# or which hang or crash on wine in a way that keeps other tests from running.
+# Also lists url of bug report, if any.
+# Format with
+# sh chromium-runtests.sh --list-failures | sort | awk '{printf("%-21s %-20s %-52s %s\n", $1, $2, $3, $4);}'
+
+list_known_failures() {
+cat <<_EOF_
+app_unittests crash-valgrind IconUtilTest.TestCreateSkBitmapFromHICON http://bugs.winehq.org/show_bug.cgi?id=20634, not a bug, need to figure out how to handle DIB faults
+base_unittests hang EtwTraceControllerTest.EnableDisable http://bugs.winehq.org/show_bug.cgi?id=20946, advapi32.ControlTrace() not yet implemented
+base_unittests crash EtwTraceConsumer*Test.* http://bugs.winehq.org/show_bug.cgi?id=20946, advapi32.OpenTrace() unimplemented
+base_unittests crash EtwTraceProvider*Test.* http://bugs.winehq.org/show_bug.cgi?id=20946, advapi32.RegisterTraceGuids() unimplemented
+base_unittests dontcare BaseWinUtilTest.FormatMessageW
+base_unittests dontcare FileUtilTest.CountFilesCreatedAfter
+base_unittests dontcare FileUtilTest.GetFileCreationLocalTime
+base_unittests dontcare PEImageTest.EnumeratesPE Alexandre triaged
+base_unittests dontcare-winfail TimeTicks.HighResNow fails if run individually on windows
+base_unittests dontcare WMIUtilTest.*
+base_unittests fail HMACTest.HMACObjectReuse http://bugs.winehq.org/show_bug.cgi?id=20340
+base_unittests fail HMACTest.HmacSafeBrowsingResponseTest http://bugs.winehq.org/show_bug.cgi?id=20340
+base_unittests fail HMACTest.RFC2202TestCases http://bugs.winehq.org/show_bug.cgi?id=20340
+base_unittests fail_wine_vmware RSAPrivateKeyUnitTest.ShortIntegers
+base_unittests flaky-dontcare StatsTableTest.MultipleProcesses http://bugs.winehq.org/show_bug.cgi?id=20606
+base_unittests hang-dontcare DirectoryWatcherTest.*
+base_unittests hang-valgrind JSONReaderTest.Reading # not really a hang, takes 400 seconds
+base_unittests hang-valgrind RSAPrivateKeyUnitTest.InitRandomTest # not really a hang, takes 300 seconds
+base_unittests hang-valgrind TimerTest.RepeatingTimer*
+base_unittests hang-valgrind TimeTicks.WinRollover # not really a hang, takes 1000 seconds
+ipc_tests flaky IPCChannelTest.ChannelTest http://bugs.winehq.org/show_bug.cgi?id=20628
+ipc_tests flaky IPCChannelTest.SendMessageInChannelConnected http://bugs.winehq.org/show_bug.cgi?id=20628
+ipc_tests hang IPCSyncChannelTest.* http://bugs.winehq.org/show_bug.cgi?id=20390
+media_unittests crash FFmpegGlueTest.OpenClose
+media_unittests crash FFmpegGlueTest.Read
+media_unittests crash FFmpegGlueTest.Seek
+media_unittests crash FFmpegGlueTest.Write
+media_unittests fail_wine_vmware WinAudioTest.PCMWaveStreamTripleBuffer
+media_unittests hang-valgrind WinAudioTest.PCMWaveSlowSource
+net_unittests fail SSLClientSocketTest.Read_Interrupted http://bugs.winehq.org/show_bug.cgi?id=20748
+sbox_unittests fail JobTest.ProcessInJob
+sbox_unittests fail JobTest.TestCreation
+sbox_unittests fail JobTest.TestDetach
+sbox_unittests fail JobTest.TestExceptions
+sbox_unittests fail RestrictedTokenTest.AddAllSidToRestrictingSids
+sbox_unittests fail RestrictedTokenTest.AddMultipleRestrictingSids
+sbox_unittests fail RestrictedTokenTest.AddRestrictingSid
+sbox_unittests fail RestrictedTokenTest.AddRestrictingSidCurrentUser
+sbox_unittests fail RestrictedTokenTest.AddRestrictingSidLogonSession
+sbox_unittests fail RestrictedTokenTest.DefaultDacl
+sbox_unittests fail RestrictedTokenTest.DeleteAllPrivileges
+sbox_unittests fail RestrictedTokenTest.DeleteAllPrivilegesException
+sbox_unittests fail RestrictedTokenTest.DeletePrivilege
+sbox_unittests fail RestrictedTokenTest.DenyOwnerSid
+sbox_unittests fail RestrictedTokenTest.DenySid
+sbox_unittests fail RestrictedTokenTest.DenySids
+sbox_unittests fail RestrictedTokenTest.DenySidsException
+sbox_unittests fail RestrictedTokenTest.ResultToken
+sbox_unittests fail ServiceResolverTest.PatchesServices
+sbox_unittests flaky IPCTest.ClientFastServer
+sbox_validation_tests fail ValidationSuite.*
+unit_tests crash BlacklistManagerTest.* http://crbug.com/27726
+unit_tests crash SafeBrowsingProtocolParsingTest.TestGetHashWithMac http://bugs.winehq.org/show_bug.cgi?id=20340
+unit_tests crash-valgrind DnsMasterTest.MassiveConcurrentLookupTest
+unit_tests crash-valgrind NullModelTableViewTest.* http://bugs.winehq.org/show_bug.cgi?id=20553
+unit_tests crash-valgrind RenderViewTest.OnPrintPageAsBitmap http://bugs.winehq.org/show_bug.cgi?id=20657 (for wine oom)
+unit_tests crash-valgrind TableViewTest.* http://bugs.winehq.org/show_bug.cgi?id=20553
+unit_tests dontcare-hangwin UtilityProcessHostTest.ExtensionUnpacker
+unit_tests dontcare SpellCheckTest.SpellCheckText
+unit_tests fail EncryptorTest.EncryptionDecryption http://bugs.winehq.org/show_bug.cgi?id=20495
+unit_tests fail EncryptorTest.String16EncryptionDecryption http://bugs.winehq.org/show_bug.cgi?id=20495
+unit_tests hang-valgrind ExtensionAPIClientTest.* Not really a hang, just takes 30 minutes
+unit_tests fail ImporterTest.IEImporter http://bugs.winehq.org/show_bug.cgi?id=20625
+unit_tests fail RenderViewTest.InsertCharacters http://bugs.winehq.org/show_bug.cgi?id=20624
+unit_tests fail SafeBrowsingProtocolParsingTest.TestVerifyChunkMac http://bugs.winehq.org/show_bug.cgi?id=20340
+unit_tests fail SafeBrowsingProtocolParsingTest.TestVerifyUpdateMac http://bugs.winehq.org/show_bug.cgi?id=20340
+unit_tests fail_wine_vmware RenderProcessTest.TestTransportDIBAllocation
+_EOF_
+}
+
+# Times are in seconds, and are twice as high as slowest observed runtime so far in valgrind,
+# rounded to the nearest power of two multiple of 100 seconds.
+# TODO: make the returned value lower if --valgrind is not given
+get_expected_runtime() {
+ case "$timeout_manual" in
+ [0-9]*) echo $timeout_manual; return;;
+ esac
+
+ case $1 in
+ app_unittests) echo 200;;
+ base_unittests) echo 1000;;
+ courgette_unittests) echo 1000;;
+ googleurl_unittests) echo 200;;
+ ipc_tests) echo 400;;
+ media_unittests) echo 400;;
+ net_unittests) echo 2000;;
+ printing_unittests) echo 100;;
+ sbox_unittests) echo 100;;
+ sbox_validation_tests) echo 100;;
+ setup_unittests) echo 100;;
+ tcmalloc_unittests) echo 1000;;
+ unit_tests) echo 4000;;
+ *) echo "unknown test $1" >&2 ; exec false;;
+ esac
+}
+
+# Run $2... but kill it if it takes longer than $1 seconds
+alarm() { time perl -e 'alarm shift; exec @ARGV' "$@"; }
+
+init_runtime() {
+ CHROME_ALLOCATOR=winheap
+ export CHROME_ALLOCATOR
+
+ if test "$WINDIR" = ""
+ then
+ WINE=${WINE:-$HOME/wine-git/wine}
+ export WINE
+ WINESERVER=${WINESERVER:-$HOME/wine-git/server/wineserver}
+ WINEPREFIX=${WINEPREFIX:-$HOME/.wine-chromium-tests}
+ export WINEPREFIX
+ WINE_HEAP_REDZONE=16
+ export WINE_HEAP_REDZONE
+
+ if netstat -tlnp | grep :1337
+ then
+ echo Please kill the server listening on port 1337, or reboot. The net tests need this port.
+ exit 1
+ fi
+ if test ! -f /usr/share/ca-certificates/root_ca_cert.crt
+ then
+ echo "You need to do"
+ echo "sudo cp src/net/data/ssl/certificates/root_ca_cert.crt /usr/share/ca-certificates/"
+ echo "sudo vi /etc/ca-certificates.conf (and add the line root_ca_cert.crt)"
+ echo "sudo update-ca-certificates"
+ echo "else ssl tests will fail."
+ echo "(Alternately, modify this script to run Juan's importer, http://bugs.winehq.org/show_bug.cgi?id=20370#c4 )"
+ exit 1
+ fi
+
+ if test -n "$VNC"
+ then
+ export DISPLAY=":$VNC"
+ vncserver -kill "$DISPLAY" || true
+ vncserver "$DISPLAY" -ac -depth 24 -geometry 1024x768
+ fi
+ $dry_run rm -rf $WINEPREFIX
+ $dry_run test -f winetricks || wget http://kegel.com/wine/winetricks
+ $dry_run sh winetricks nocrashdialog corefonts gecko > /dev/null
+ $dry_run sleep 1
+ $dry_run $WINE winemine &
+ fi
+}
+
+shutdown_runtime() {
+ if test "$WINDIR" = ""
+ then
+ $dry_run $WINESERVER -k
+ if test -n "$VNC"
+ then
+ vncserver -kill "$DISPLAY"
+ fi
+ fi
+}
+
+# Looks up tests from our list of known bad tests. If $2 is not '.', picks tests expected to fail in a particular way.
+get_test_filter()
+{
+ mysuite=$1
+ myfilter=$2
+ list_known_failures | tee tmp.1 |
+ awk '$1 == "'$mysuite'" && /'$myfilter'/ {print $3}' |tee tmp.2 |
+ tr '\012' : |tee tmp.3 |
+ sed 's/:$/\n/'
+}
+
+# Output the logical and of the two gtest filters $1 and $2.
+# Handle the case where $1 is empty.
+and_gtest_filters()
+{
+ # FIXME: handle more complex cases
+ case "$1" in
+ "") ;;
+ *) echo -n "$1": ;;
+ esac
+ echo $2
+}
+
+# Expands a gtest filter spec to a plain old list of tests separated by whitespace
+expand_test_list()
+{
+ mysuite=$1 # e.g. base_unittests
+ myfilter=$2 # existing gtest_filter specification with wildcard
+ # List just the tests matching $myfilter, separated by colons
+ $WINE ./$mysuite.exe --gtest_filter=$myfilter --gtest_list_tests |
+ tr -d '\015' |
+ grep -v FLAKY |
+ perl -e 'while (<STDIN>) { chomp; if (/^[A-Z]/) { $testname=$_; } elsif (/./) { s/\s*//; print "$testname$_\n"} }'
+}
+
+# Parse arguments
+
+announce=true
+do_individual=no
+dry_run=
+extra_gtest_filter=
+fail_filter="."
+loops=1
+logfiles=
+SUITES=
+suppression_dirs=
+TARGET=Debug
+timeout_manual=
+VALGRIND_CMD=
+VNC=
+want_fails=no
+winedebug=
+
+while test "$1" != ""
+do
+ case $1 in
+ --individual) do_individual=yes;;
+ --groups) do_individual=groups;;
+ --gtest_filter) extra_gtest_filter=$2; shift;;
+ --just-crashes) fail_filter="crash"; want_fails=yes;;
+ --just-fails) fail_filter="fail"; want_fails=yes;;
+ --just-flaky) fail_filter="flaky"; want_fails=yes;;
+ --just-hangs) fail_filter="hang"; want_fails=yes;;
+ --list-failures) list_known_failures; exit 0;;
+ --list-failures-html) list_known_failures | sed 's,http://\(.*\),<a href="http://\1">\1</a>,;s/$/<br>/' ; exit 0;;
+ --loops) loops=$2; shift;;
+ -n) dry_run=true; announce=echo ;;
+ --suppression_dir) suppression_dirs="$suppression_dirs $2"; shift;;
+ --target) TARGET=$2; shift;;
+ --timeout) timeout_manual=$2; shift;;
+ --used-suppressions) cd logs; grep used_suppression *.log | sed 's/-1.*--[0-9]*-- used_suppression//'; exit 0;;
+ --valgrind) VALGRIND_CMD="$THE_VALGRIND_CMD";;
+ --vnc) VNC=$2; shift;;
+ --winedebug) winedebug=$2; shift;;
+ --logfiles) logfiles=yes;;
+ -*) usage; exit 1;;
+ *) SUITES="$SUITES $1" ;;
+ esac
+ shift
+done
+
+if test "$SUITES" = ""
+then
+ SUITES="$SUITES_1 $SUITES_10 $SUITES_100 $SUITES_1000"
+fi
+
+if test "$VALGRIND_CMD" != ""
+then
+ if test "$suppression_dirs" = ""
+ then
+ # Default value for winezeug.
+ suppression_dirs="../../../ ../../../../../valgrind"
+ # Also try the script dir.
+ suppression_dirs="$suppression_dirs $(dirname $0)"
+ fi
+ # Check suppression_dirs for suppression files to create suppression_options
+ suppression_options=
+ for dir in $suppression_dirs
+ do
+ for f in valgrind-suppressions chromium-valgrind-suppressions
+ do
+ if test -f "$dir/$f"
+ then
+ suppression_options="$suppression_options --suppressions=$dir/$f"
+ fi
+ done
+ done
+ VALGRIND_CMD="$VALGRIND_CMD $suppression_options"
+fi
+
+set -e
+
+trap shutdown_runtime 0
+init_runtime
+export WINEDEBUG=$winedebug
+
+set -x
+
+mkdir -p logs
+cd "src/chrome/$TARGET"
+
+i=1
+while test $i -le $loops
+do
+ for suite in $SUITES
+ do
+ expected_to_fail="`get_test_filter $suite $fail_filter`"
+ case $want_fails in
+ no) filterspec=`and_gtest_filters "${extra_gtest_filter}" -${expected_to_fail}` ;;
+ yes) filterspec=`and_gtest_filters "${extra_gtest_filter}" ${expected_to_fail}` ;;
+ esac
+ LOGCMD=
+
+ case $do_individual in
+ no)
+ $announce $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter=$filterspec
+ test "$logfiles" = yes && LOGCMD="> ../../../logs/$suite-$i.log"
+ $dry_run alarm `get_expected_runtime $suite` \
+ $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter=$filterspec 2>&1 | eval reduce_verbosity $LOGCMD || true
+ ;;
+ yes)
+ for test in `expand_test_list $suite $filterspec`
+ do
+ $announce $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test"
+ test "$logfiles" = yes && LOGCMD="> ../../../logs/$suite-$test-$i.log"
+ $dry_run alarm `get_expected_runtime $suite` \
+ $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test" 2>&1 | eval reduce_verbosity $LOGCMD || true
+ done
+ ;;
+ groups)
+ for test in `expand_test_list $suite $filterspec | sed 's/\..*//' | sort -u`
+ do
+ $announce $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test.*-${expected_to_fail}"
+ test "$logfiles" = yes && LOGCMD="> ../../../logs/$suite-$test-$i.log"
+ $dry_run alarm `get_expected_runtime $suite` \
+ $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test.*-${expected_to_fail}" 2>&1 | eval reduce_verbosity $LOGCMD || true
+ done
+ ;;
+ esac
+ done
+ i=`expr $i + 1`
+done