tests: introduce doctest infra + migrate llcommon/llmath/llcorehttp subsets (ctest green) [relates to #4445]#4852
Conversation
|
All contributors have signed the CLA ✍️ ✅ |
|
I have read the CLA Document and I hereby sign the CLA |
|
What are the changes to .gitignore and .gitattributes for? They seem in no relation to doctest and counterproductive, |
5fb6af0 to
dddc098
Compare
|
@Ansariel Thanks for the note! I’ve dropped the unrelated .gitignore/.gitattributes edits so this PR stays focused on doctest. |
There was a problem hiding this comment.
Pull Request Overview
This PR introduces a doctest-based unit testing framework to complement the existing TUT infrastructure, migrating initial test suites for llcommon, llmath, and llcorehttp. The changes keep the current TUT framework intact while establishing new doctest targets for gradual migration.
Key Changes
- Added header-only doctest framework with shared test helpers (
LL_CHECK_*macros for floating-point, range, and buffer comparisons) - Migrated 227 test cases across three modules:
llcommon_doctest(100 cases),llmath_doctest(93 cases),llcorehttp_doctest(34 cases) - Created deterministic HTTP test fakes (zero-latency transport, monotonic clock, queued responses) for network-free testing
Reviewed Changes
Copilot reviewed 66 out of 68 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
tools/testing/gen_tut_to_doctest.py |
Python script to auto-generate doctest stubs from TUT sources |
indra/test/{doctest_main.cpp,ll_doctest_helpers.h,tut_compat_doctest.h} |
Shared doctest infrastructure and TUT compatibility layer |
indra/llmath/tests_doctest/*.cpp |
Migrated vector/matrix/quaternion math tests to doctest |
indra/llcorehttp/tests_doctest/{http_fakes.h,http_fakes.cpp} |
Deterministic HTTP testing infrastructure |
indra/llcorehttp/tests_doctest/*_test_doctest.cpp |
Migrated HTTP component tests with fake transport |
indra/llcommon/tests_doctest/*_test_doctest.cpp |
Auto-generated TODO stubs for future llcommon migration |
indra/viewer_components/login/tests/lllogin_doctest.cpp |
New doctest-based login workflow tests |
indra/*/CMakeLists.txt |
Build configuration for new doctest targets |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Hey @akleshchev Thanks a lot for taking a look and for requesting the review here. Just to clarify: this PR is only meant to be a first step for a doctest-based test setup, not the full migration. I wanted to get early feedback before going any further. I also saw on Discord that Signal is stepping away, and I really appreciate that @Geenz is keeping the open source program moving forward. If this approach to the doctest infra, the CMake wiring and the way I’m migrating these first tests looks reasonable from your side, I’m happy to continue in follow-up PRs and adjust things to match what you’d like to see in the test suite. No rush at all, I know there’s a lot happening right now. Just wanted to make the intent clear and let you know I’m around to iterate on this. |
That's obvious from the todo) We do need a replacement, but with signal away I don't know who is responsible for the commisions, will ask around. P.S. You probably can make an AI do the bulk of the work here |
…ubsets (ctest green) Signed-off-by: Maycon Bekkers <mayconbekkers@gmail.com>
dddc098 to
4e3aeda
Compare
|
Quick follow-up on the doctest infra:
Locally (RelWithDebInfoOS,
All green ( |
I assume it's ready for a merge? @Geenz Please check this. Specifically if it's fine to include that header in viewer repo directly intead of something like a package. P.S. No idea why precommit got stuck, trying to fix it. |
PR secondlife#4852 (feat/doctest-poc-clean) introduces a comprehensive doctest migration with a fundamentally different architecture: TUT is kept running alongside doctest via a compatibility layer, with the header vendored at indra/extern/doctest/ and new test targets in tests_doctest/ subdirectories. Our branch attempted a full TUT replacement in the core test harness, which conflicts on 4 files: Doctest.cmake, LLAddBuildTest.cmake, test/CMakeLists.txt, and test.cpp. The approaches are incompatible. Revert all conflicting changes to develop baseline, keeping only the platform license file additions (licenses-linux.txt, licenses-mac.txt, licenses-win32.txt) which complement secondlife#4852's indra/extern/doctest/LICENSE. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Finished the llmath follow-up migration in small commits. llmath_doctest is green locally: 278 test cases, 1178 assertions, 0 failures. This batch only rewraps additional llmath suites; no new infra changes. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 88 out of 90 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (8)
indra/llmath/tests_doctest/alignment_test_doctest.cpp:1
std::coutis used but this file does not include<iostream>. Add#include <iostream>(or remove the debug prints) to avoid relying on indirect includes and potential compile failures on some toolchains.
indra/llmath/tests_doctest/alignment_test_doctest.cpp:1- Correct the spelling in the assertion message from 'LLAligment' to 'LLAlignment' to keep messages consistent and searchable.
tools/testing/gen_tut_to_doctest.py:1 extract_block()returns a slice even when it never finds a matching closing brace (e.g., malformed input or regex mismatch). In that caseend_indexremainsstart_index, producing an empty/incorrect body and an invalidend_index + 1. Consider explicitly detectingdepth != 0at loop exit and failing fast (e.g., raiseValueError/SystemExit) so the generator doesn't emit misleading stubs.
tools/testing/gen_tut_to_doctest.py:1- The generator hard-codes the doctest suite name to
llcommon, which makes it easy to accidentally generate incorrect suites for other modules. Make the suite name configurable (CLI arg like--suite) or infer it fromsrc_path/the destination directory so generated files consistently land in the correct suite.
indra/test/lltest_harness.h:1 lltest_init_logging()is documented as installing the fatal handler for the TUT runner, but the implementation inlltest_harness.cppdoesn't setLLError::setFatalFunction(...). Either update this comment to match current behavior, or move the fatal-handler installation intolltest_init_logging()so callers don't need to remember to do it separately.
indra/test/lltest_harness.cpp:1- The master thread recorder is heap-allocated and never released, which makes the harness own a permanent leak (especially visible for long-lived test runs or when embedding tests). Prefer a
static std::unique_ptr<LLTrace::ThreadRecorder>(or a function-local static value) and register cleanup viastd::atexit()if the underlying API requires explicit teardown.
indra/test/lltest_harness.cpp:1 - The master thread recorder is heap-allocated and never released, which makes the harness own a permanent leak (especially visible for long-lived test runs or when embedding tests). Prefer a
static std::unique_ptr<LLTrace::ThreadRecorder>(or a function-local static value) and register cleanup viastd::atexit()if the underlying API requires explicit teardown.
indra/llcorehttp/tests_doctest/http_fakes.cpp:1 FakeBufferArray::assign()appends into the existingBufferArraywithout clearing it first. If the sameFakeBufferArrayinstance is reused (multipleassign()calls), the resulting body will contain accumulated data rather than the last assigned payload. If the intended semantics are 'replace', clear/reset the buffer (e.g., drop+recreate, or otherwise truncate) before appending.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_CURRENT_BINARY_DIR}") | ||
|
|
||
| enable_testing() |
There was a problem hiding this comment.
The PR description says changes only affect unit-test targets behind LL_TESTS=ON, but enable_testing() is now unconditional at the indra root. If the intent is to keep non-test builds unchanged, gate this behind if(LL_TESTS) (or equivalent) and rely on per-module enable_testing()/add_test() only when tests are enabled.
| @@ -0,0 +1,39 @@ | |||
| # doctest quickstart | |||
There was a problem hiding this comment.
The file appears to start with a UTF-8 BOM (the invisible character before #). BOMs can cause noisy diffs and occasional tooling quirks (some linters/Markdown processors treat it as text). Consider removing the BOM so the first character is #.
| # doctest quickstart | |
| # doctest quickstart |
Relates to #4445.
This PR adds a header-only doctest setup and migrates a first wave of unit tests while keeping the legacy TUT harness for suites not yet ported. The goal is to land a minimal, working baseline that the team can iterate on module by module.
This affects only unit-test targets behind LL_TESTS=ON; viewer runtime and packages are unchanged.
What’s included
How to run locally
Scope / non-goals
Does not change viewer runtime or packaging.
TUT remains for non-migrated suites; removal will happen after follow-ups when coverage is sufficient.
Proposed follow-ups
Continue migrating remaining suites per module (llcommon -> llmath -> llcorehttp -> newview/test).
Once coverage is high enough, remove Tut.cmake glue and clean up LLAddBuildTest.cmake usage.