/fwts

The tool fwts comprises of over fifty tests that are designed to exercise and test different aspects of a machine's firmware.

Primary LanguageC

README for the FirmWare Test Suite (fwts)
=========================================

Quick Start Guide
=================

1) Dependencies:

Ubuntu Distro x86_64
	autoconf automake libglib2.0-dev libtool libpcre3-dev
	flex bison dkms libfdt-dev libbsd-dev

Ubuntu Distro ppc64el
	autoconf automake libglib2.0-dev libtool libpcre3-dev
	flex bison dkms libfdt-dev device-tree-compiler libpci-dev libbsd-dev

RHEL Distro ppc64el
	autoconf automake kernel-devel libtool flex flex-devel bison dkms
	libfdt libfdt-devel dtc pcre-devel pcre2 pcre2-devel
	pcre2-utf16 pcre2-utf32 glib2 glib2-devel pciutils pciutils-devel zlib-devel
	make libbsd-devel

Ubuntu Distro ARM64
	autoconf automake libglib2.0-dev libtool libpcre3-dev
	flex bison dkms libfdt-dev libbsd-dev

2) Kernel configuration

Some tests depend on special Linux kernel configuration settings. These include:

* CONFIG_CGROUP_FREEZER=y
* CONFIG_DMI_SYSFS=y
* CONFIG_EFI_TEST=m

3) To build and install (only if building from source)

	autoreconf -ivf
	./configure
	make
	sudo make install

To get help:

	fwts --help

To run all the default tests, use:

	sudo fwts

..this will dump the results into results.log

To see the available tests, use:

	fwts --show-tests

Advanced Options Guide
======================

Running Specific Tests
----------------------

Run specific tests, e.g. check syntax of DSDT:

	sudo fwts syntaxcheck

You can run multiple tests too:

	sudo fwts syntaxcheck fan battery

To see all the available tests:

	sudo fwts --show-tests-full

Changing the output
-------------------

To dump the results to another file:

	sudo fwts --results-output=myresults.log

or the short form:

	sudo fwts -r myresults.log

or to stderr or stdout and redirect:

	sudo fwts -r stderr
	sudo fwts -r stdout > mylog.log

or a shorter form for stdout:

	sudo fwts - > mylog.log

If the output is written to stdout, the width of the log is based on the
width of the tty.  The default width when writing to a log file may be
changed to N characters wide using -w N or --log-width=N, e.g.

	sudo fwts --log-width=90 - > mylog.log

The log has various columns that can be enabled, here is an example:

00012 13/12/12 12:55:04 wakealarm      Test ACPI Wakealarm.
00013 13/12/12 12:55:04 wakealarm      -------------------------------------------------------------
00014 13/12/12 12:55:04 wakealarm      Test 1 of 4: Check existence of /sys/class/rtc/rtc0
00015 13/12/12 12:55:04 wakealarm      /wakealarm.
00016 13/12/12 12:55:04 wakealarm      PASSED: Test 1, /sys/class/rtc/rtc0/wakealarm found.
00017 13/12/12 12:55:04 wakealarm      
00018 13/12/12 12:55:04 wakealarm      Test 2 of 4: Trigger wakealarm for 1 seconds in the future.
00019 13/12/12 12:55:04 wakealarm      Trigger wakealarm for 1 seconds in the future.
00020 13/12/12 12:55:04 wakealarm      PASSED: Test 2, RTC wakealarm was triggered successfully.
00021 13/12/12 12:55:04 wakealarm      
00022 13/12/12 12:55:04 wakealarm      Test 3 of 4: Check if wakealarm is fired.
00023 13/12/12 12:55:07 wakealarm      PASSED: Test 3, RTC wakealarm triggered and fired
00024 13/12/12 12:55:07 wakealarm      successfully.
00025 13/12/12 12:55:07 wakealarm      
00026 13/12/12 12:55:07 wakealarm      Test 4 of 4: Multiple wakealarm firing tests.
00027 13/12/12 12:55:07 wakealarm      Trigger wakealarm for 1 seconds in the future.
00028 13/12/12 12:55:09 wakealarm      Trigger wakealarm for 2 seconds in the future.
00029 13/12/12 12:55:12 wakealarm      Trigger wakealarm for 3 seconds in the future.
00030 13/12/12 12:55:16 wakealarm      Trigger wakealarm for 4 seconds in the future.
00031 13/12/12 12:55:21 wakealarm      PASSED: Test 4, RTC wakealarm triggered and fired
00032 13/12/12 12:55:21 wakealarm      successfully.
00033 13/12/12 12:55:21 wakealarm      
00034 13/12/12 12:55:21 wakealarm      =============================================================
00035 13/12/12 12:55:21 wakealarm      4 passed, 0 failed, 0 warnings, 0 aborted, 0 skipped, 0 info
00036 13/12/12 12:55:21 wakealarm      only.
00037 13/12/12 12:55:21 wakealarm      ============================================================
^     ^        ^        ^
|     |        |        |
|     |        |        +--- %owner (name of test that ran)
|     |        |
|     |        +--- %time
|     |
|     +--- %date 
|
+--- %line (line number)

Also, there is an optional %field that indicates the type of message being logged:

	sudo fwts wakealarm --log-format="%line %date %time %field %owner"

..this generates results.log containing:

00013 13/12/12 12:53:11 HED wakealarm      Test ACPI Wakealarm.
00014 13/12/12 12:53:11 SEP wakealarm      ---------------------------------------------------------
00015 13/12/12 12:53:11 INF wakealarm      Test 1 of 4: Check existence of /sys/class/rtc/rtc0
00016 13/12/12 12:53:11 INF wakealarm      /wakealarm.
00017 13/12/12 12:53:11 PAS wakealarm      PASSED: Test 1, /sys/class/rtc/rtc0/wakealarm found.
00018 13/12/12 12:53:11 NLN wakealarm      
00019 13/12/12 12:53:11 INF wakealarm      Test 2 of 4: Trigger wakealarm for 1 seconds in the
00020 13/12/12 12:53:11 INF wakealarm      future.
00021 13/12/12 12:53:11 INF wakealarm      Trigger wakealarm for 1 seconds in the future.
00022 13/12/12 12:53:11 PAS wakealarm      PASSED: Test 2, RTC wakealarm was triggered successfully.
00023 13/12/12 12:53:11 NLN wakealarm      
00024 13/12/12 12:53:11 INF wakealarm      Test 3 of 4: Check if wakealarm is fired.
00025 13/12/12 12:53:14 PAS wakealarm      PASSED: Test 3, RTC wakealarm triggered and fired
00026 13/12/12 12:53:14 PAS wakealarm      successfully.
00027 13/12/12 12:53:14 NLN wakealarm      
00028 13/12/12 12:53:14 INF wakealarm      Test 4 of 4: Multiple wakealarm firing tests.
00029 13/12/12 12:53:14 INF wakealarm      Trigger wakealarm for 1 seconds in the future.
00030 13/12/12 12:53:16 INF wakealarm      Trigger wakealarm for 2 seconds in the future.
00031 13/12/12 12:53:19 INF wakealarm      Trigger wakealarm for 3 seconds in the future.
00032 13/12/12 12:53:23 INF wakealarm      Trigger wakealarm for 4 seconds in the future.
00033 13/12/12 12:53:28 PAS wakealarm      PASSED: Test 4, RTC wakealarm triggered and fired
00034 13/12/12 12:53:28 PAS wakealarm      successfully.
00035 13/12/12 12:53:28 NLN wakealarm      
00036 13/12/12 12:53:28 SEP wakealarm      =========================================================
00037 13/12/12 12:53:28 SUM wakealarm      4 passed, 0 failed, 0 warnings, 0 aborted, 0 skipped, 0
00038 13/12/12 12:53:28 SUM wakealarm      info only.
00039 13/12/12 12:53:28 SEP wakealarm      =========================================================
                         ^
                         |
 +-----------------------+
 |
RES = result (PASSED or FAILED)
ERR = error (something fatal happened!)
WRN = warning (not a critical failure, but may need looking at)
DBG = debug output (deprecated)
INF = information fields
SUM = summary
NLN = new line (empty field)
ADV = advice information
HED = heading
TAG = tag information
SEP = separator (just pretty printing)
PAS = Test Passed
FAL = Test Failed
SKP = Test Skipped
ABT = Test Aborted
INO = Information only 

use:
	fwts --log-fields to show all available fields

One can filter on these fields using --log-filter, e.g.

	sudo fwts --log-filter=RES,SUM  

.. just collect results and summary of tests

	sudo fwts --log-filter=ALL,~SEP

.. all fields except the separators


One can also re-arrange or modify the log format using --log-format, e.g.

	sudo fwts --log-format="%line %field %time: " mtrr -

this produces:

00011 SEP 12:13:07: --------------------------------------------------------------------------------
00012 INF 12:13:07: MTRR overview
00013 INF 12:13:07: -------------
00014 INF 12:13:07: Reg 0: 0x00000000ffc00000 - 0x0000000100000000 (     4 MB)   Write-Protect
00015 INF 12:13:07: Reg 1: 0x0000000000000000 - 0x0000000080000000 (  2048 MB)   Write-Back
00016 INF 12:13:07: Reg 2: 0x0000000080000000 - 0x00000000c0000000 (  1024 MB)   Write-Back
00017 INF 12:13:07: Reg 3: 0x00000000c0000000 - 0x00000000e0000000 (   512 MB)   Write-Back
00018 INF 12:13:07: Reg 4: 0x00000000dc000000 - 0x00000000e0000000 (    64 MB)   Uncached
00019 INF 12:13:07: Reg 5: 0x00000000db000000 - 0x00000000dc000000 (    16 MB)   Uncached
00020 INF 12:13:07: Reg 6: 0x0000000100000000 - 0x0000000180000000 (  2048 MB)   Write-Back
00021 INF 12:13:07: Reg 7: 0x0000000180000000 - 0x00000001a0000000 (   512 MB)   Write-Back
00022 INF 12:13:07: Reg 8: 0x000000019f000000 - 0x00000001a0000000 (    16 MB)   Uncached
00023 INF 12:13:07: Reg 9: 0x000000019e800000 - 0x000000019f000000 (     8 MB)   Uncached
00024 NLN 12:13:07: 
00025 INF 12:13:07: Test 1 of 3: Validate the kernel MTRR IOMEM setup.
00026 PAS 12:13:07: PASSED: Test 1, Memory ranges seem to have correct attributes.
00027 NLN 12:13:07: 
00028 INF 12:13:07: Test 2 of 3: Validate the MTRR setup across all processors.
00029 PAS 12:13:07: PASSED: Test 2, All processors have the a consistent MTRR setup.
00030 NLN 12:13:07: 
00031 INF 12:13:07: Test 3 of 3: Check for AMD MtrrFixDramModEn being cleared by the BIOS.
00032 SKP 12:13:07: SKIPPED: Test 3, CPU is not an AMD, cannot test.
00033 NLN 12:13:07: 
00034 SEP 12:13:07: ================================================================================
00035 SUM 12:13:07: 2 passed, 0 failed, 0 warnings, 0 aborted, 1 skipped, 0 info only.
00036 SEP 12:13:07: ================================================================================

Available fields are:

%line   - log line number
%time	- current time
%date 	- current date
%owner  - name of the test program (the owner of the the current test)
%field  - the 3 letter record identifier field (e.g. SEP, RES, etc..)

Test Progress Feedback
======================

Use the --show-progress to dump out the test progress to stderr. Output is as follows:

Test: Test ACPI Wakealarm.                                                  
  Check existence of /sys/class/rtc/rtc0/wakealarm.       1 passed                                 
  Trigger wakealarm for 1 seconds in the future.          1 passed                                 
  Check if wakealarm is fired.                            1 passed                                 
  Multiple wakealarm firing tests.                        1 passed   

PASSED or FAILED?
=================

The --stdout-summary flag outputs to stdout PASSED or FAILED if test(s) passed or failed. It's essentially
for one-shot test modes where you want to run one test and see if it passed or failed without having to
look at the results log, e.g.

sudo fwts mtrr --stdout-summary

The exit code returns 1 for test failure and 0 for test success, so the
test suite can be run from a shell script and one can detect if the test worked or not, e.g.

#!/bin/bash
LOG=stdout
sudo fwts dmi_decode --results-output=$LOG
failed=$?

Resources
=========

fwts git repository:
	git://kernel.ubuntu.com/hwe/fwts.git
	https://kernel.ubuntu.com/git/hwe/fwts.git/

fwts reference guide:
	https://wiki.ubuntu.com/FirmwareTestSuite/Reference

fwts LiveCD:
	http://fwts.ubuntu.com/fwts-live/

fwts-devel mailing list:
	fwts-devel@lists.ubuntu.com
	https://lists.ubuntu.com/mailman/listinfo/fwts-devel