Running test-libmongoc
Overview
test-libmongoc is the executable holding most libmongoc and libbson tests. It uses a custom test framework (src/libmongoc/tests/TestSuite.h), not a mainstream one, so its invocation, filtering, and test-naming rules are unique. This skill explains how to run and select tests with it.
The executable is excluded from the CMake ALL target. Build it first with the --target flag:
cmake --build cmake-build --target test-libmongoc
Running tests
Typical invocation:
./cmake-build/src/libmongoc/test-libmongoc -d -f -l "<test-name-or-pattern>"
| Flag | Meaning |
|---|---|
-l |
Run tests matching a name or pattern. Repeatable — pass -l multiple times to select several tests in one run. |
-d |
Print debug output. Useful when a test hangs. |
-f |
Do not fork a process per test; abort on the first error. |
Run ./cmake-build/src/libmongoc/test-libmongoc --help for the full flag list.
-l matching rules
Matching against a test's name (TestSuite_TestMatchesName in TestSuite.c) is exact string, with one exception: a trailing * makes it a prefix match. There is no other wildcard support.
-l "*aggregate"does not work — a*is only special as the last character.- A trailing
*is a prefix match and over-matches siblings:-l "/crud/unified/aggregate*"also matches/crud/unified/aggregate-let,/crud/unified/aggregate-merge, etc. To run exactly one test, pass its full name without a*(e.g.-l "/crud/unified/aggregate").
Finding a test's name
A test's registration string may bundle a name and one or more space-separated [...] tags. At registration (_V_TestSuite_AddFull) the string is split on the first space: everything before it is the test's name, and the bracketed tags are stored separately as metadata. -l matches the name only — never include a tag in the pattern. Names come from one of two places:
- The second argument to a
TestSuite_Add*call. In/loadbalanced/connect/single [lock:live-server], the name is/loadbalanced/connect/singleand[lock:live-server]is a tag indicating the test needs a live MongoDB server. Match it with-l "/loadbalanced/connect/single". - A JSON spec test. Its name is the path starting at (and including) the
/aftersrc/libmongoc/tests/json, with.jsonremoved. Spec tests installed viainstall_json_test_suitealso get a[lock:live-server]tag appended and aTestSuite_CheckLivecheck, so they require a live server. Example:src/libmongoc/tests/json/crud/unified/aggregate.jsonhas the name/crud/unified/aggregate(leading/, no tag) — match it with-l "/crud/unified/aggregate".
Tip: test-libmongoc --list-tests prints every registered test name (all tests, unfiltered; tags are not shown). Pipe it through grep to find the exact name to pass to -l.
Registration functions (server requirements)
Tests register with the suite through these functions; which one is used tells you whether a live server is required:
| Function | Requires live server? | Notes |
|---|---|---|
TestSuite_Add |
No | Basic test. |
TestSuite_AddLive |
Yes | Needs a live MongoDB server. |
TestSuite_AddFull |
Depends | May use a context object or skip conditions. |
Common mistakes
- Including a
[...]tag in the-lpattern — tags are metadata, not part of the name;-lmatches the name only. Use-l "/crud/unified/aggregate", not-l "/crud/unified/aggregate [lock:live-server]". - Dropping the leading
/from a spec-test name — the name is/crud/unified/aggregate, notcrud/unified/aggregate. The leading slash is part of the name. - Assuming a trailing
*matches exactly one test — it is a prefix match and catches siblings. See the matching rules above. - Using a leading or interior wildcard —
-l "*aggregate"will not work; only a trailing*is supported. - Forgetting to build the target first —
test-libmongocis not built by the defaultALLtarget. - Expecting a fork-per-test by default when debugging — add
-fso the run aborts on the first failure instead of continuing, and-dto see where a hang occurs.