1 [[!meta title="Manual test suite"]]
5 Some [[test results]] that might be useful to keep are saved.
8 Read this document from the branch used to prepare the release.
13 Keeping an eye on the changes between released versions is one of the
14 many safeguards against releasing crap.
19 Compare the to-be-released source code with previous version's one e.g.:
21 Boot the candidate ISO and find the commit it was build from with the
22 `tails-version` command.
24 Then, from the source tree, see the diff:
26 git diff --find-renames <old tag>..<ISO commit>
28 e.g. `git diff 0.17..06fa1ab80d55c9f29274b7459bd198edb1a8d53d`
32 Compare the list of bundled packages and versions with the one shipped last
33 time. `.packages` are usually attached to the email announcing the ISO is ready.
36 wiki/src/torrents/files/tails-i386-0.16.packages \
37 tails-i386-0.17.packages \
38 | wdiff --diff-input --terminal
42 - new packages that may cause harm or make the images unnecessarily
44 - packages that could be erroneously removed
45 - new versions of software we might not have audited yet (including:
46 does the combination of our configuration with software X version
47 Y+1 achieve the same wished results as with software X version Y?)
51 Check the image size has not changed much since the last release.
53 In a directory with many Tails ISO images:
55 find -iname "tails*.iso" -exec ls -lh '{}' \; | sort -rhk 5
57 # Automated test suite
59 Our long term goal is to eliminate the manual test suite (except the
60 parts which require real hardware) and have the automated test suite
61 run all our tests. It's design, and how to write new tests, are
62 documented on a [[dedicated page|test/automated_tests]].
64 ## Running the automated test suite
66 See [[test/setup]] and [[test/usage]].
68 ## Automated test suite migration progress
70 The manual test suite below either contains tests that cannot be
71 automated, has no automated test implemented yet, or has a test
72 implemented, but it either hasn't been reviewed, had a confirmed pass
73 by someone other than the test author, or has issues. The latter is
74 tracked by tickets prefixed with `todo/test_suite:`.
78 ## Security and fingerprinting
80 * Run the [tests the TBB folks
81 use](https://trac.torproject.org/projects/tor/wiki/doc/build/BuildSignoff#TestPagestoUse).
82 * Compare the fingerprint of Tails and the latest TBB using at least
83 <https://panopticlick.eff.org/>
84 - The exposed User-Agent should match the latest TBB's one.
85 - Update the [[fingerprint section|support/known_issues#fingerprint]] of the
86 known issues page if needed.
87 * WebRTC should be disabled:
88 - In `about:config` check that `media.peerconnection.enabled` is set to
90 - <http://mozilla.github.io/webrtc-landing/>, especially the `getUserMedia`
91 test. It's expected that the audio test works if you agree to share a
92 microphone with the remote website; anything else should fail.
93 - <http://net.ipcalf.com/> should display
94 `ifconfig | grep inet | grep -v inet6 | cut -d" " -f2 | tail -n1`
95 * One should be able to switch identities from the web browser.
96 * Running `getTorBrowserUserAgent` should produce the User-Agent set by the
97 installed version of Torbutton, and used in Iceweasel.
101 * Browsing (by IP) a HTTP or HTTPS server on the LAN should be possible.
102 * Browsing (by IP) a FTP server on the LAN should be possible.
106 * Check that an IRC session is really torified:
107 - if you are running an IRC server: check there
108 - else: see if the connection to the IRC server appears in Vidalia
110 * Check that you can initiate an OTR conversation.
111 * Check that IRC is working with the default OFTC profile.
112 * Check that XMPP is working with a new test profile.
113 * Check that Pidgin doesn't leak too much information when replying to
115 * Start Tails, launch Pidgin, and join #tails.
116 * Also join #tails from the webchat of OFTC on <https://webchat.oftc.net/>
117 using another nickname.
118 * Try to send `/ctcp <Tails_account_nick> COMMAND` from the webchat to pidgin:
119 - You should get no answer apart for the commands listed in [[!tails_ticket
121 - List of `/ctcp` commands, see [this page](http://www.wikkedwire.com/irccommands):
131 * The version of Tor should be the latest stable one, which is the highest version number
132 before alpha releases on <http://deb.torproject.org/torproject.org/pool/main/t/tor/>.
133 * Check that the firewall-level Tor enforcement is effective:
134 - check output of `iptables -L -n -v`
135 - check output of `iptables -t nat -L -n -v`
136 - try connecting to the Internet after unsetting `$http_proxy` and
137 `$HTTP_PROXY` using a piece of software that does not obey the
138 GNOME proxy settings, *and* is not explicitly torified in Tails:
140 unset http_proxy ; unset HTTP_PROXY
141 wget --no-proxy http://monip.org/
143 ... should only give you "Connection refused" error message.
144 * Check that IPv6 traffic is blocked:
145 - check output of `ip6tables -L -n`
146 - at a place with working IPv6: try connecting to a known-working
147 IPv6-enabled server on its IPv6 address over TCP and icmp6.
148 * After DHCP has been set up, `/etc/resolv.conf` must read `nameserver 127.0.0.1`.
149 * Before DHCP has been set up, `/etc/resolv.conf` must read `nameserver 127.0.0.1`.
150 * [[doc/first_steps/startup_options/bridge_mode]] should work:
151 1. Set up an administrator password.
152 1. Enable network configuration in Tails Greeter.
153 1. Configure a few bridges in Tor Launcher:
155 bridge 198.252.153.59:9001
156 obfs2 198.252.153.59:16492
157 obfs3 198.252.153.59:16493
160 1. Check that the only outgoing direct network connections go to the
163 sudo watch "netstat -taupen | grep ESTABLISHED"
165 * Verify that all destinations reached from an intensive Tails session
168 1. Boot Tails without the network in.
169 1. Set up an administration password.
170 1. Start dumping your whole session's network activity with `sudo
171 tcpdump -n -i any -w dump` (or better, do the dump on another machine,
172 or on the host OS if Tails is running in a VM).
174 1. Wait for Tor to be functional.
175 1. Save `/var/lib/tor/cached-microdesc-consensus` out of the VM (it's needed
176 to analyze the network dump later on).
177 1. Do *a lot* of network stuff (why not run do this while doing all
178 the other tests **but** I2P and the unsafe browser, which would
179 show many false positives?)
180 1. Then check all destinations, e.g. by using tshark and the script below:
182 # set DUMP to the output of tcpdump above
184 # set CONSENSUS to Tor's consensus from the Tails session
185 CONSENSUS=cached-microdesc-consensus
187 awk '/^r / { print $6 }' ${CONSENSUS} > ${NODES}
188 # Note that these default directory authorities may change! To be
189 # sure, check in Tor's source, src/or/config.c:~900
202 tshark -r ${DUMP} -T fields -e ip.dst | sort | uniq | \
204 ip_expr=$(echo ${x} | sed -e "s@\.@\\\.@g")
205 if echo ${DIR_AUTHS} | grep -qe "${ip_expr}"; then
208 if ! grep -qe "^${ip_expr}$" ${NODES}; then
214 Note that this script will produce some false positives, like your
215 gateway, broadcasts, etc.
219 See our [[stream isolation design
220 page|contribute/design/stream_isolation]] for details such as port
221 numbers, that are not duplicated here to avoid desynchronization.
223 Assumptions for the following tests: first, Tor stream isolation
224 features properly do their work; second, our `torrc` sets the right
225 `SocksPort` options to implement what we want.
227 **Note**: the following commands would advantageously be replaced with
228 the appropriate tcpdump or tshark filters.
230 * Make sure Claws Mail use its dedicated `SocksPort` when connecting
231 to IMAP / POP3 / SMTP servers:
233 sudo watch -n 0.1 'netstat -taupen | grep claws'
235 * Make sure these use the `SocksPort` dedicated for Tails-specific applications:
236 - htpdate — as root, run:
238 service htpdate stop \
239 && rm -f /var/run/htpdate/{done,success} \
240 && service htpdate start
242 ... with the following command running in another terminal:
244 sudo watch -n 0.1 'netstat -taupen | grep curl'
246 - security check — run `tails-security-check` with the following
247 command running in another terminal:
249 sudo watch -n 0.1 'netstat -taupen | grep perl'
251 - incremental upgrades — run `tails-upgrade-frontend-wrapper` with
252 the following command running in another terminal:
254 sudo watch -n 0.1 'netstat -taupen | grep perl'
256 * Make sure iceweasel uses its dedicated `SocksPort`: quit Iceweasel
257 then start it with the following command running in another
260 sudo watch -n 0.1 'netstat -taupen | grep iceweasel'
262 * Make sure other applications use the default system-wide
266 wget https://tails.boum.org/
268 ... with the following command running in another terminal:
270 sudo watch -n 0.1 'netstat -taupen | grep polipo'
272 - Gobby 0.5 — start Gobby 0.5 from the *Applications* menu and
273 connect to a server (for example `gobby.debian.org`), with the following command running in
276 sudo watch -n 0.1 'netstat -taupen | grep gobby'
278 - SSH — run (no need to authenticate the server or to login):
280 ssh lizard.tails.boum.org
282 ... with the following command running in another terminal:
284 sudo watch -n 0.1 'netstat -taupen | grep -E "connect-proxy|ssh"'
290 ... with the following command running in another terminal:
292 sudo watch -n 0.1 'netstat -taupen | grep whois'
294 * Make sure a random application run using `torify` and `torsocks`
295 uses the default system-wide `SocksPort`. Run:
297 torify /usr/bin/gobby-0.5
299 ... and connect to a server (for example `gobby.debian.org`), with the following command running
302 sudo watch -n 0.1 'netstat -taupen | grep gobby'
304 Then do the same test for:
306 torsocks /usr/bin/gobby-0.5
308 # Use of untrusted partitions
310 * Is any local hard-disk swap partition used as swap?
311 boot on a (possibly virtual) machine that has a cleartext swap
312 partition not managed by LVM. To verify that a local GTP partition is swap,
313 check its type code with `sgdisk -p`, Linux swap is code 8200.
315 This swap partition must not be used by Tails. Run `cat /proc/swaps`.
317 * Is a persistence volume on a local hard-disk partition used?
318 (Hint: setup a libvirt USB disk with GPT and a partition labeled
319 `TailsData`, set the `removable` flag on it, check that
320 tails-greeter proposes to enable persistence. Then remove the
321 `removable` flag, and check that tails-greeter does not propose to
322 enable persistence anymore.)
326 * Check mail over IMAP using:
327 - a "clearnet" IMAP server.
328 - a hidden service IMAP server (e.g. TorMail, jhiwjjlqpyawmpjx.onion, or
329 Riseup, zsolxunfmbfuq7wf.onion with SSL).
330 * Send an email using:
331 - a "clearnet" SMTP server.
332 - a hidden service SMTP server (see above).
333 * Check that the profile works and is torified:
334 1. Send an email using Claws and a non-anonymizing SMTP relay (a
335 SMTP relay that writes the IP address of the client it is
336 relaying email for in the Received header).
337 1. Then check that email's headers once received, especially the
339 * Also check that the EHLO/HELO SMTP message is not leaking anything
340 at the application level:
341 1. Start Claws using the panel icon.
342 2. Disable SSL/TLS for SMTP in Claws (so take precautions for not
343 leaking your password in plaintext by either changing it
344 temporarily or using a disposable account).
345 3. Run `sudo tcpdump -n -i lo -w dump` to capture the packets before
346 Tor encrypts it, then close tcpdump
347 4. Check the dump for the HELO/EHLO message and
348 verify that it only contains `localhost`: `tcpdump -A -r dump`
349 5. Check the `Received:` and `Message-Id` fields in the received
350 message: it must not leak the hostname, nor the local IP.
354 * I should be able to send a bug report with WhisperBack.
355 * When we receive this bug report on the tails-bugs mailing-list,
356 Schleuder tells us that it was sent encrypted.
360 1. Boot Tails without a network cable connected.
361 (e.g. `virsh domif-setlink tails-dev 52:54:00:05:17:62 down`.)
362 2. Set an administration password.
363 3. set the time to an obviously wrong one:
365 date --set="Mon, 01 Mar 2000 15:45:34 - 0800"
367 4. Connect the network cable.
368 (e.g. `virsh domif-setlink tails-dev 52:54:00:05:17:62 up`)
370 => the date should be corrected and Tor/Vidalia should start
373 # Erase memory on shutdown
375 - `memlockd` must be running
376 - `udev-watchdog` must monitor the right device when booted off USB (automate: [[!tails_ticket 5560]])
377 - `udev-watchdog` must monitor the right device when booted off DVD (automate: [[!tails_ticket 5560]])
378 - After booting from DVD, remove Tails boot medium and check that the
379 memory erasure process is started (`Loading new kernel`, at least).
380 (automate: [[!tails_ticket 5472]])
381 - After booting from USB, remove Tails boot medium and check that the
382 memory erasure process is started (`Loading new kernel`, at least).
384 # Root access control
386 * Check you can login as root with `su` neither with the `amnesia` password nor
388 * Check that the `$TAILS_USER_PASSWORD` variable, if still existing in the system
389 environment after the boot has finished, does not contain the clear text
392 # Virtualization support
394 * Test that Tails starts and the browser launches in VirtualBox.
398 * Make sure that I2P is up-to-date, at least if the
399 [changelogs](https://geti2p.net/en/blog/) mention that
400 security critical bugs were fixed.
401 * Check that "Applications -> Internet -> I2P" works:
402 - You get the "Starting I2P..." pop-up.
403 - The router console opens in Iceweasel upon success.
404 - You get the "I2P failed to start" pop-up on failure (e.g. no
405 network so tordate failed).
406 * Check that I2P connects to the network:
407 - Go to <http://127.0.0.1:7657/i2ptunnelmgr>
408 - You should get "Network: Hidden" in the "General" section.
409 - The numbers in the "Peers" section of the sidebar should be non-zero.
410 * Check that you can reach some eepsites within Iceweasel, like
411 <http://i2p-projekt.i2p> and <http://forum.i2p>.
412 * Check that you can connect to the I2P IRC server through Pidgin and
413 the preconfigured IRC account on 127.0.0.1.
417 * clone a repository over `git://`
418 * clone a repository over `https://`
419 * clone a repository over SSH
423 * Connecting over SSH to a server on the Internet should work (and
424 appear in Vidalia's connections list).
425 * Connecting (by IP) over SSH to a server on the LAN should work.
426 * Connecting to a sftp server on the Internet using GNOME's "Connect
427 to a server" should work.
431 grep -r deb.tails.boum.org /etc/apt/sources.list*
433 * Make sure the Tails repository suite in matching the release tag (for example
434 the release version number) is in APT sources.
435 * Make sure the Tails repository unversioned suites (e.g. `testing`,
436 `stable` and `devel`) are *not* in APT sources.
438 <a id="incremental-upgrades"></a>
440 # Incremental upgrades
442 * List the versions from which an upgrade paths to this one is described.
443 In the `stable` or `testing` branch:
445 git grep -l " version: '\?0.23'\?" wiki/src/upgrade/
447 * For each description file, open it and verify if it allows incremental upgrade
448 or only full upgrade.
450 * For each previous version from which an upgrade paths is described, install it
452 * For every incremental upgrade path: make sure the resulting updated
453 system "works fine" (boots and pretends to be the correct version).
454 * For upgrade paths that only propose a full upgrade: make sure the
455 user is told to do a manual upgrade.
457 If the IUKs and update-description files have been published on the
458 *alpha* channel already (see
459 <https://archive.torproject.org/amnesia.boum.org/tails/alpha/>):
461 echo 'TAILS_CHANNEL="alpha"' | sudo tee --append /etc/os-release && \
462 tails-upgrade-frontend-wrapper
464 Else, use a local test setup:
466 * A web server on the LAN.
467 * A copy of `wiki/src/update` from the `stable` or `testing` branch,
468 for example in `/var/www/tails/update/v1/Tails/0.14~rc2/i386/stable/updates.yml`
469 * A copy of the `iuk` directory of our HTTP mirrors,
470 for example in `/var/www/tails/stable/iuk/Tails_i386_0.14-rc2_to_0.14.iuk`.
472 To synchronize your local copy:
474 torsocks rsync -rt --progress rsync.torproject.org::amnesia-archive/tails/stable/iuk/ /var/www/tails/stable/iuk/
476 * Patch `/etc/hosts` in Tails to point to your web server:
478 echo "192.168.1.4 dl.amnesia.boum.org" | sudo tee --append /etc/hosts
480 * Patch sudo configuration to allow passing arbitrary arguments to
481 `tails-upgrade-frontend`:
484 -e 's,/usr/bin/tails-upgrade-frontend ""$,/usr/bin/tails-upgrade-frontend,' \
485 /etc/sudoers.d/zzz_upgrade
487 * Call the upgrader must be called, from inside the system to upgrade,
488 with every needed option to use the local web server rather than the
489 online one, for example:
491 DISABLE_PROXY=1 SSL_NO_VERIFY=1 \
492 tails-upgrade-frontend-wrapper --override-baseurl \
493 http://192.168.1.4/tails
497 Enable Windows camouflage via the Tails Greeter checkbox and:
499 * Tails OpenPGP Applet's context menu should look readable
500 * iceweasel should use a Internet Explorer theme
504 * On start, if no DNS server was configured in NetworkManager
505 (e.g. if there's no network connection), there must be an error.
506 * Once started, check that:
507 - it has no scary red theme when Windows Camouflage is activated.
508 - the iceweasel instance runs as the `clearnet` user.
509 - it has no proxy configured.
510 - no extensions are installed.
511 - there are no bookmarks.
512 * On exit, check that:
513 - make sure that its chroot gets properly teared down on exit (there
514 should be nothing mounted inside `/var/lib/unsafe-browser`).
516 # Real (non-VM) hardware
520 * Boot on bare-metal on USB.
521 * Boot on bare-metal on DVD.
522 * Measure boot time (from syslinux menu the GNOME dektop ready - quickly press
523 enter in the greeter), then on some reference bare metal hardware, and
524 compare with previous version. The new one should not be significantly
529 * Check that links to the online website (`Mirror:`) at the bottom of
530 bundled static web pages (`/usr/share/doc/tails/website/`) are working. Else, it probably means the
531 wiki was not built with a recent enough ikiwiki.
532 * Browse around in the documentation shipped in the image. Internal
533 links should be fine.
535 # Internationalization
537 Boot and check basic functionality is working for every supported
540 * The chosen keyboard layout must be applied.
541 * The virtual keyboard must work and be auto-configured to use the same keyboard
542 layout as the X session.
543 * The Startpage search engine must be localized for the languages we ship a
546 find /usr/share/amnesia/iceweasel/searchplugins/locale/ -iname startpage-*.xml
548 * The Wikipedia search engine must be localized for all languages.
552 * Check that every supported language is listed in the list of languages for
554 - Visit <https://translate.google.com/>.
555 - Right-click and choose "Check spelling".
556 - Right-click and check the list of available languages.
557 * For a few languages, check the spell checking:
558 - Type something in the textarea.
559 - Right-click and select a language.
560 - Verify that the spelling suggestion are from that language.
561 * Once [[!tails_ticket 5962]] is fixed, the browser spelling dictionary must be
562 localized (for languages that are supported by our branding extension).
566 * Check that Tails Greeter's "more options" screen displays properly
567 on a display with 600 px height.
568 * Check that all seems well during init (mostly that all services
569 start without errors), and that `/var/log/syslog` seems OK.
570 * MAT should be able to clean a PDF file, such as:
571 <http://examples.itextpdf.com/results/part3/chapter12/pdf_metadata.pdf>
572 * The Tails signing key shipped should be up-to-date (that is, neither it nor
573 one its subkeys must have expired, or be about to expire any time soon).
574 - `gpg --list-keys --with-colons 1202821CBE2CD9C1`
575 * The "Report an error" desktop launcher should open the [[support]]
576 page, both in English and in one language to which the website is
577 translated (automate: [[!tails_ticket 6904]]).
578 * One should be able to refresh the GnuPG keyring in Seahorse (with
579 the workaround documented in comment 4 on [[!tails_ticket 7051]],
580 until that ticket is fixed for real).
581 * Test that the hostname is not leaked via DHCP requests (automate: [[!tails_ticket 7712]]):
582 1. Install Wireshark in the system under testing.
583 1. Monitor the network until a periodic DHCP refresh is done, or
584 manually trigger one.
585 1. Click on the "DHCP Request" packet going out to the local DHCP server.
586 1. Look for `Option: (12) Host Name`. There should *not* be `Host
587 Name: amnesia` in there.