[RFC] GDB sanity test

Keith Seitz keiths@redhat.com
Tue Apr 19 19:01:17 GMT 2022


This RFC is meant to start a discussion about testing. As bunsen
starts to mature and more people rely on it, it is imperative that
contributions don't randomly break other projects.

In that vein, this is a basic sanity test that I've written for GDB
which imports a single gdb.{log,sum} from a test fixture (.tar.xz).
It double-checks all results and test counts.

To do this, I've written a custom gdb test script that outputs every
valid test outcome and run this on a fedora 33 VM.

I'm only including the actual test file, not the glue code
(tests/core.py) necessary to make it work.

Does this look like an acceptable approach?

Keith
---
 tests/bunsen/test_init.py                     |  11 +++
 tests/core.py                                 |  43 +++++++++
 .../test_gdb_sanity/gdb-sanity.tar.xz         | Bin 0 -> 2120 bytes
 .../fixtures/test_gdb_sanity/test_outcomes.c  |  24 +++++
 .../test_gdb_sanity/test_outcomes.exp         |  50 +++++++++++
 tests/gdb/test_gdb_sanity.py                  |  82 ++++++++++++++++++
 6 files changed, 210 insertions(+)
 create mode 100644 tests/bunsen/test_init.py
 create mode 100644 tests/core.py
 create mode 100644 tests/gdb/fixtures/test_gdb_sanity/gdb-sanity.tar.xz
 create mode 100644 tests/gdb/fixtures/test_gdb_sanity/test_outcomes.c
 create mode 100644 tests/gdb/fixtures/test_gdb_sanity/test_outcomes.exp
 create mode 100644 tests/gdb/test_gdb_sanity.py

diff --git a/tests/gdb/test_gdb_sanity.py b/tests/gdb/test_gdb_sanity.py
new file mode 100644
index 0000000..1ce65be
--- /dev/null
+++ b/tests/gdb/test_gdb_sanity.py
@@ -0,0 +1,82 @@
+# A quick sanity test that the ensures that bunsen can import a really
+# basic log/sum test run which contains all test outcomes.
+
+import os.path
+from tests.core import setup_bunsen_repo, import_results
+
+TEST_FIXTURE = 'tests/gdb/fixtures/test_gdb_sanity/gdb-sanity.tar.xz'
+PATH_STRING = '/home/fedora33/work/gdb/fsf/virgin/linux/gdb/testsuite'
+
+def assert_test_name(test, subtest):
+        assert test['name'] == 'gdb.gdb/test_outcomes.exp'
+        assert test['subtest'] == subtest
+
+def print_test(test):
+    print(f'{test["outcome"]}: {test["name"]}: {test["subtest"]}')
+
+def test_gdb_sanity(tmp_path):
+    # Initialize a new bunsen instance.
+    instance = setup_bunsen_repo(tmp_path)
+    assert instance is not None
+
+    # Make sure the fixture for this test exists.
+    fixture = os.path.join(os.getcwd(), TEST_FIXTURE)
+    assert os.path.exists(fixture)
+
+    # Import the results.
+    commits = import_results(fixture, instance)
+    assert commits is not None
+    assert len(commits) == 1
+
+    # Print out the commit info.
+    canonical, commit = commits[0]
+    print(f'successfully imported test fixture, commit {commit}')
+    print(f'(canonically {canonical}')
+
+    # Get all test results and info strings.
+    testrun = instance.testrun(commit)
+    all_tests = testrun.testcases
+    info = testrun.get_info_strings()
+
+    # Verify metadata.
+    assert info["branch"] == 'f33'
+    assert info["architecture"] == 'x86_64'
+    assert info['target_board'] == 'native-gdbserver/-m32'
+    assert testrun.source_commit == '1234567890123456789012345678901234567890'
+    assert info['version'] == '13.0.50.20220412-git'
+
+    # Verify the tests.  First the easy ones with one result each.
+    for outcome in {'FAIL', 'XPASS', 'XFAIL', 'KPASS', 'KFAIL',
+                    'UNTESTED', 'UNRESOLVED', 'UNSUPPORTED'}:
+        test = [t for t in all_tests if t['outcome'] == outcome]
+        assert len(test) == 1
+        test = test[0]
+        print_test(test)
+        assert_test_name(test, 'expect ' + outcome)
+
+    # PATH should also have one result.
+    test = [t for t in all_tests if t['outcome'] == 'PATH']
+    assert len(test) == 1
+    print_test(test[0])
+    #assert_test_name(test[0], PATH_STRING)
+
+    # PASS should have 3 results.  One of these will be a duplicate, one will
+    # contain only a path name (which elicits GDB's 'PATH' outcome).
+    passes = [t for t in all_tests if t['outcome'] == 'PASS']
+    assert len(passes) == 3
+
+    # Verify the PASS result resulting in a PATH outcome.
+    path = [t for t in passes if t['subtest'].startswith('expect PATH')]
+    assert len(path) == 1
+    path = path[0]
+    print_test(path)
+    assert_test_name(path, 'expect PATH ' + PATH_STRING)
+
+    # Now verify the remaining two PASS results, which have duplicate "subtest"
+    # names.  The parser will append " <<2>>" for the duplicate to keep subtest
+    # names unique.
+    passes.remove(path)
+    print_test(passes[0])
+    assert_test_name(passes[0], 'expect PASS')
+    print_test(passes[1])
+    assert_test_name(passes[1], 'expect PASS <<2>>')
\ No newline at end of file
-- 
2.35.1



More information about the Bunsen mailing list