Skip to content

Commit 2a671e3

Browse files
committed
add guidelines for creating a test suite in WAMR
1 parent 028dd3a commit 2a671e3

File tree

1 file changed

+194
-0
lines changed

1 file changed

+194
-0
lines changed

tests/unit/README.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# Guide to Creating a Test Suite for a New Feature in WAMR
2+
3+
This guide provides instructions for contributors on how to create a test suite for a new feature in the WAMR project. Follow these steps to ensure consistency and maintainability across the test framework.
4+
5+
---
6+
7+
## General Guidelines
8+
9+
- **Create a New Directory**:
10+
Always create a dedicated directory for a new feature under the `tests/unit/` directory.
11+
12+
- Reuse existing test cases and patch them when possible to avoid redundancy.
13+
- Name the directory in lowercase with words separated by hyphens (e.g., `new-feature`).
14+
15+
- **Avoid Committing `.wasm` Files**:
16+
Do not commit precompiled `.wasm` files. Instead:
17+
18+
- Generate `.wasm` files from `.wat` or `.c` source files.
19+
- Use `ExternalProject` and the `wasi-sdk` toolchain to compile `.wasm` files during the build process.
20+
21+
- **Keep Using `ctest` as the framework**:
22+
Continue to use `ctest` for running the test cases, as it is already integrated into the existing test framework.
23+
24+
---
25+
26+
## Writing `CMakeLists.txt` for the Test Suite
27+
28+
When creating a `CMakeLists.txt` file for your test suite, follow these best practices:
29+
30+
1. **Do Not Fetch Googletest Again**:
31+
The root `unit/CMakeLists.txt` already fetches Googletest. Avoid including or fetching it again in your test suite.
32+
33+
2. **Find LLVM on Demand**:
34+
If your test suite requires LLVM, use `find_package` to locate LLVM components as needed. Do not include LLVM globally unless required.
35+
36+
3. **Include `unit_common.cmake`**:
37+
Always include `../unit_common.cmake` in your `CMakeLists.txt` to avoid duplicating common configurations and utilities.
38+
39+
Example:
40+
41+
```cmake
42+
include("../unit_common.cmake")
43+
```
44+
45+
4. **Use `WAMR_RUNTIME_LIB_SOURCE`**:
46+
Replace long lists of runtime source files with the `WAMR_RUNTIME_LIB_SOURCE` variable to simplify your configuration.
47+
48+
Example:
49+
50+
```cmake
51+
target_sources(your_test_target PRIVATE ${WAMR_RUNTIME_LIB_SOURCE})
52+
```
53+
54+
5. **Avoid Global Compilation Flags**:
55+
Do not define global compilation flags in the `unit` directory. Each test case should specify its own compilation flags based on its unique requirements.
56+
57+
---
58+
59+
## Generating `.wasm` Files
60+
61+
- **Compile `.wasm` Files Dynamically**:
62+
Use `ExternalProject` in your `CMakeLists.txt` to compile `.wasm` files from `.wat` or `.c` source files.
63+
- Use the `wasi-sdk` toolchain for `.c` or `.cc` source files.
64+
- Example configuration:
65+
```cmake
66+
ExternalProject_Add(
67+
generate_wasm
68+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps
69+
BUILD_ALWAYS YES
70+
CONFIGURE_COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -B build
71+
-DWASI_SDK_PREFIX=${WASI_SDK_DIR}
72+
-DCMAKE_TOOLCHAIN_FILE=${WASISDK_TOOLCHAIN}
73+
BUILD_COMMAND ${CMAKE_COMMAND} --build build
74+
INSTALL_COMMAND ${CMAKE_COMMAND} --install build --prefix ${CMAKE_CURRENT_BINARY_DIR}/wasm-apps
75+
)
76+
```
77+
- **Example for `wasm-apps` Directory**:
78+
Place your source files in a `wasm-apps/` subdirectory within your test suite directory.
79+
80+
- Create a `CMakeLists.txt` in `wasm-apps/` to handle the compilation of these files.
81+
- Example `CMakeLists.txt` for `wasm-apps/`:
82+
83+
```cmake
84+
cmake_minimum_required(VERSION 3.13)
85+
project(wasm_apps)
86+
87+
add_executable(example example.c)
88+
set_target_properties(example PROPERTIES SUFFIX .wasm)
89+
install(TARGETS example DESTINATION .)
90+
```
91+
92+
---
93+
94+
## Compiling and Running Test Cases
95+
96+
To compile and run the test cases, follow these steps:
97+
98+
1. **Generate Build Files**:
99+
100+
```bash
101+
cmake -S . -B build
102+
```
103+
104+
2. **Build the Test Suite**:
105+
106+
```bash
107+
cmake --build build
108+
```
109+
110+
3. **Run the Tests**:
111+
112+
```bash
113+
ctest --test-dir build --output-on-failure
114+
```
115+
116+
This will compile and execute all test cases in the test suite, displaying detailed output for any failures.
117+
118+
4. **List all Tests**:
119+
To see all available test cases, use:
120+
121+
```bash
122+
ctest --test-dir build -N
123+
```
124+
125+
5. **Run a Specific Test**:
126+
To run a specific test case, use:
127+
```bash
128+
ctest --test-dir build -R <test_name> --output-on-failure
129+
```
130+
131+
---
132+
133+
## Collecting Code Coverage Data
134+
135+
To collect code coverage data using `lcov`, follow these steps:
136+
137+
1. **Build with Coverage Flags**:
138+
Ensure the test suite is built with coverage flags enabled:
139+
140+
```bash
141+
cmake -S . -B build -DCOLLECT_CODE_COVERAGE=1
142+
cmake --build build
143+
```
144+
145+
2. **Run the Tests**:
146+
Execute the test cases as described above.
147+
148+
3. **Generate Coverage Report**:
149+
Use `lcov` to collect and generate the coverage report:
150+
151+
```bash
152+
lcov --capture --directory build --output-file coverage.all.info
153+
lcov --extract coverage.all.info "*/core/iwasm/*" "*/core/shared/*" --output-file coverage.info
154+
genhtml coverage.info --output-directory coverage-report
155+
```
156+
157+
4. **View the Report**:
158+
Open the `index.html` file in the `coverage-report` directory to view the coverage results in your browser.
159+
160+
5. **Summary of Coverage**:
161+
To get a summary of the coverage data, use:
162+
163+
```bash
164+
lcov --summary coverage.info
165+
```
166+
167+
---
168+
169+
## Example Directory Structure
170+
171+
Here’s an example of how your test suite directory might look:
172+
173+
```
174+
new-feature/
175+
├── CMakeLists.txt
176+
├── new_feature_test.cc
177+
├── wasm-apps/
178+
| ├── CMakeLists.txt
179+
│ ├── example.c
180+
│ └── example.wat
181+
```
182+
183+
---
184+
185+
## Additional Notes
186+
187+
- **Testing Framework**: Use Googletest for writing unit tests. Refer to existing test cases in the `tests/unit/` directory for examples.
188+
- **Documentation**: Add comments in your test code to explain the purpose of each test case.
189+
- **Edge Cases**: Ensure your test suite covers edge cases and potential failure scenarios.
190+
- **Reuse Utilities**: Leverage existing utilities in `common/` (e.g., `mock_allocator.h`, `test_helper.h`) to simplify your test code.
191+
192+
---
193+
194+
By following these guidelines, you can create a well-structured and maintainable test suite that integrates seamlessly with the WAMR testing framework.

0 commit comments

Comments
 (0)