strobengine 0.4.0__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. {strobengine-0.4.0 → strobengine-0.4.1}/CHANGELOG.md +23 -0
  2. {strobengine-0.4.0 → strobengine-0.4.1}/Cargo.lock +1 -1
  3. {strobengine-0.4.0 → strobengine-0.4.1}/Cargo.toml +1 -1
  4. strobengine-0.4.1/PKG-INFO +83 -0
  5. strobengine-0.4.1/README.md +66 -0
  6. strobengine-0.4.1/docs/cli.md +147 -0
  7. strobengine-0.4.1/docs/dependencies.md +39 -0
  8. strobengine-0.4.1/docs/install.md +52 -0
  9. strobengine-0.4.1/docs/quickstart.md +116 -0
  10. {strobengine-0.4.0 → strobengine-0.4.1}/docs/roadmap.md +47 -6
  11. {strobengine-0.4.0 → strobengine-0.4.1}/docs/table_of_contents.md +6 -1
  12. {strobengine-0.4.0 → strobengine-0.4.1}/pyproject.toml +2 -2
  13. {strobengine-0.4.0 → strobengine-0.4.1}/src/protocols/websocket.rs +13 -15
  14. {strobengine-0.4.0 → strobengine-0.4.1}/src/strobengine/cli.py +13 -8
  15. {strobengine-0.4.0 → strobengine-0.4.1}/src/strobengine/engine.py +10 -3
  16. {strobengine-0.4.0 → strobengine-0.4.1}/src/strobengine/reporter.py +9 -5
  17. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/test_websocket_e2e.py +0 -2
  18. {strobengine-0.4.0 → strobengine-0.4.1}/uv.lock +1 -1
  19. strobengine-0.4.0/PKG-INFO +0 -375
  20. strobengine-0.4.0/README.md +0 -358
  21. {strobengine-0.4.0 → strobengine-0.4.1}/.dockerignore +0 -0
  22. {strobengine-0.4.0 → strobengine-0.4.1}/.github/workflows/ci.yml +0 -0
  23. {strobengine-0.4.0 → strobengine-0.4.1}/.github/workflows/docker-release.yml +0 -0
  24. {strobengine-0.4.0 → strobengine-0.4.1}/.github/workflows/publish-test.yml +0 -0
  25. {strobengine-0.4.0 → strobengine-0.4.1}/.github/workflows/publish.yml +0 -0
  26. {strobengine-0.4.0 → strobengine-0.4.1}/.gitignore +0 -0
  27. {strobengine-0.4.0 → strobengine-0.4.1}/.pre-commit-config.yaml +0 -0
  28. {strobengine-0.4.0 → strobengine-0.4.1}/.python-version +0 -0
  29. {strobengine-0.4.0 → strobengine-0.4.1}/Dockerfile +0 -0
  30. {strobengine-0.4.0 → strobengine-0.4.1}/LICENSE +0 -0
  31. {strobengine-0.4.0 → strobengine-0.4.1}/Makefile +0 -0
  32. {strobengine-0.4.0 → strobengine-0.4.1}/cliff.toml +0 -0
  33. {strobengine-0.4.0 → strobengine-0.4.1}/docs/benchmarks.md +0 -0
  34. {strobengine-0.4.0 → strobengine-0.4.1}/docs/docker.md +0 -0
  35. {strobengine-0.4.0 → strobengine-0.4.1}/docs/grpc.md +0 -0
  36. {strobengine-0.4.0 → strobengine-0.4.1}/docs/http3.md +0 -0
  37. {strobengine-0.4.0 → strobengine-0.4.1}/docs/http_methods.md +0 -0
  38. {strobengine-0.4.0 → strobengine-0.4.1}/docs/infrastructure.md +0 -0
  39. {strobengine-0.4.0 → strobengine-0.4.1}/docs/release.md +0 -0
  40. {strobengine-0.4.0 → strobengine-0.4.1}/docs/testing.md +0 -0
  41. {strobengine-0.4.0 → strobengine-0.4.1}/docs/websockets.md +0 -0
  42. {strobengine-0.4.0 → strobengine-0.4.1}/examples/grpc.py +0 -0
  43. {strobengine-0.4.0 → strobengine-0.4.1}/examples/http3.py +0 -0
  44. {strobengine-0.4.0 → strobengine-0.4.1}/examples/http_methods.py +0 -0
  45. {strobengine-0.4.0 → strobengine-0.4.1}/examples/load_test.py +0 -0
  46. {strobengine-0.4.0 → strobengine-0.4.1}/examples/spike_test.py +0 -0
  47. {strobengine-0.4.0 → strobengine-0.4.1}/examples/stress_test.py +0 -0
  48. {strobengine-0.4.0 → strobengine-0.4.1}/examples/websocket.py +0 -0
  49. {strobengine-0.4.0 → strobengine-0.4.1}/rust-toolchain.toml +0 -0
  50. {strobengine-0.4.0 → strobengine-0.4.1}/scripts/release.py +0 -0
  51. {strobengine-0.4.0 → strobengine-0.4.1}/src/chaos.rs +0 -0
  52. {strobengine-0.4.0 → strobengine-0.4.1}/src/config.rs +0 -0
  53. {strobengine-0.4.0 → strobengine-0.4.1}/src/lib.rs +0 -0
  54. {strobengine-0.4.0 → strobengine-0.4.1}/src/logging.rs +0 -0
  55. {strobengine-0.4.0 → strobengine-0.4.1}/src/metrics.rs +0 -0
  56. {strobengine-0.4.0 → strobengine-0.4.1}/src/progress.rs +0 -0
  57. {strobengine-0.4.0 → strobengine-0.4.1}/src/protocols/grpc.rs +0 -0
  58. {strobengine-0.4.0 → strobengine-0.4.1}/src/protocols/grpc_parser.rs +0 -0
  59. {strobengine-0.4.0 → strobengine-0.4.1}/src/protocols/grpc_reflection.rs +0 -0
  60. {strobengine-0.4.0 → strobengine-0.4.1}/src/protocols/http.rs +0 -0
  61. {strobengine-0.4.0 → strobengine-0.4.1}/src/protocols/http3.rs +0 -0
  62. {strobengine-0.4.0 → strobengine-0.4.1}/src/protocols/mod.rs +0 -0
  63. {strobengine-0.4.0 → strobengine-0.4.1}/src/strobengine/__init__.py +0 -0
  64. {strobengine-0.4.0 → strobengine-0.4.1}/src/strobengine/_strobengine.pyi +0 -0
  65. {strobengine-0.4.0 → strobengine-0.4.1}/src/strobengine/constants.py +0 -0
  66. {strobengine-0.4.0 → strobengine-0.4.1}/src/strobengine/py.typed +0 -0
  67. {strobengine-0.4.0 → strobengine-0.4.1}/tests/__init__.py +0 -0
  68. {strobengine-0.4.0 → strobengine-0.4.1}/tests/conftest.py +0 -0
  69. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/__init__.py +0 -0
  70. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/conftest.py +0 -0
  71. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/mock_server.py +0 -0
  72. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/test_cli_interface.py +0 -0
  73. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/test_grpc_e2e.py +0 -0
  74. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/test_http3_e2e.py +0 -0
  75. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/test_http_scenarios.py +0 -0
  76. {strobengine-0.4.0 → strobengine-0.4.1}/tests/e2e/test_performance_sanity.py +0 -0
  77. {strobengine-0.4.0 → strobengine-0.4.1}/tests/fixtures/service.proto +0 -0
  78. {strobengine-0.4.0 → strobengine-0.4.1}/tests/test_cli.py +0 -0
  79. {strobengine-0.4.0 → strobengine-0.4.1}/tests/test_engine.py +0 -0
  80. {strobengine-0.4.0 → strobengine-0.4.1}/tests/test_logging.py +0 -0
  81. {strobengine-0.4.0 → strobengine-0.4.1}/tests/test_reporter.py +0 -0
@@ -4,6 +4,27 @@ All notable changes to `strobengine` will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.4.1] - 2026-08-26
8
+
9
+ ### Bug Fixes
10
+
11
+ - *(pypi)* Configure readme base-url for relative link resolution
12
+ - *(cli)* Validate ws_mode with StrEnum to reject invalid strings
13
+ - *(cli)* URL-decode form values before passing to Rust
14
+ - *(websocket)* Count actual Pong payload size and fix PingPong status code
15
+ - *(reporter)* Handle GB and TB in _format_bytes
16
+
17
+ ### Documentation
18
+
19
+ - Add dependencies and installation guides
20
+ - Add quick start guide and CLI reference
21
+ - Update table of contents with new pages
22
+ - Slim README and link to documentation pages
23
+ - Add multi-target, reporting, SSE, messaging, and caching epics to roadmap
24
+
25
+ ### Testing
26
+
27
+ - *(e2e)* Remove bytes_received assertion from PingPong mode test
7
28
  ## [0.4.0] - 2026-08-23
8
29
 
9
30
  ### Bug Fixes
@@ -105,6 +126,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
105
126
  - Add rust-toolchain.toml for reproducible builds
106
127
  - Remove e2e test from pre commit hooks
107
128
  - *(ci)* Pin github actions to full commit SHAs
129
+ - *(release)* Bump version to 0.4.0
130
+ - Bump to 0.4.0 in uv.lock
108
131
 
109
132
  ### Other
110
133
 
@@ -1781,7 +1781,7 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
1781
1781
 
1782
1782
  [[package]]
1783
1783
  name = "strobengine"
1784
- version = "0.4.0"
1784
+ version = "0.4.1"
1785
1785
  dependencies = [
1786
1786
  "async-trait",
1787
1787
  "base64",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "strobengine"
3
- version = "0.4.0"
3
+ version = "0.4.1"
4
4
  edition = "2024"
5
5
  readme = "README.md"
6
6
 
@@ -0,0 +1,83 @@
1
+ Metadata-Version: 2.4
2
+ Name: strobengine
3
+ Version: 0.4.1
4
+ Requires-Dist: rich>=13.0.0
5
+ Requires-Dist: typer>=0.27.0
6
+ License-File: LICENSE
7
+ Summary: A load testing framework with a Python UI and a bare-metal Rust engine core.
8
+ Author-email: riccione <28346232+riccione@users.noreply.github.com>
9
+ License-Expression: Apache-2.0
10
+ Requires-Python: >=3.11
11
+ Description-Content-Type: text/markdown
12
+ Project-URL: Changelog, https://github.com/strobeops/strobengine/blob/main/CHANGELOG.md
13
+ Project-URL: Documentation, https://github.com/strobeops/strobengine
14
+ Project-URL: Homepage, https://github.com/strobeops/strobengine
15
+ Project-URL: Source, https://github.com/strobeops/strobengine
16
+
17
+ # strobengine
18
+
19
+ A high-performance HTTP, WebSocket, and gRPC load testing engine with a Python API and a bare-metal Rust core.
20
+
21
+ ## Install
22
+
23
+ ```bash
24
+ pip install strobengine
25
+ # or from source
26
+ git clone https://github.com/strobeops/strobengine.git && cd strobengine && uv sync
27
+ ```
28
+
29
+ > See [Installation Guide](docs/install.md) for Docker, PyPI, and development setup.
30
+
31
+ ## Quick Start
32
+
33
+ ```python
34
+ from strobengine import StrobEngine
35
+ from strobengine.reporter import print_summary
36
+
37
+ engine = StrobEngine(url="http://localhost:8080/api/health", concurrency=50, duration=30)
38
+ summary = engine.run()
39
+ print_summary(summary)
40
+ ```
41
+
42
+ ```bash
43
+ strobengine load http://localhost:8080/api/health -c 50 -d 30
44
+ ```
45
+
46
+ > See [Quick Start Guide](docs/quickstart.md) for Python API and CLI examples.
47
+
48
+ ## Documentation
49
+
50
+ | Section | Description |
51
+ |---------|-------------|
52
+ | [Installation](docs/install.md) | Build from source, Docker, PyPI |
53
+ | [Dependencies](docs/dependencies.md) | System requirements, Rust crates, Python packages |
54
+ | [Quick Start](docs/quickstart.md) | Python API and CLI usage examples |
55
+ | [CLI Reference](docs/cli.md) | All subcommands, flags, and options |
56
+ | [HTTP Methods](docs/http_methods.md) | Supported methods, request bodies, headers |
57
+ | [WebSocket](docs/websockets.md) | WS/WSS modes, pub/sub broadcasting, metrics |
58
+ | [gRPC](docs/grpc.md) | Unary calls, protobuf, deadline, chaos |
59
+ | [HTTP/3](docs/http3.md) | QUIC transport, 0-RTT resumption, loss recovery |
60
+ | [Docker](docs/docker.md) | Pulling images, running containers |
61
+ | [Testing](docs/testing.md) | Test structure, e2e, CI/CD |
62
+ | [Roadmap](docs/roadmap.md) | Planned features |
63
+
64
+ ## How to Contribute
65
+
66
+ 1. Fork the repository
67
+ 2. Create a feature branch (`git checkout -b feat/my-feature`)
68
+ 3. Install dependencies and set up pre-push Git hooks:
69
+ ```bash
70
+ uv sync
71
+ uv run pre-commit install --hook-type pre-push
72
+ ```
73
+ 4. Run formatting, linting, and tests manually (or let git push run them automatically):
74
+ ```bash
75
+ make check
76
+ ```
77
+ 5. Commit your changes following [Conventional Commits](https://www.conventionalcommits.org/)
78
+ 6. Push to your branch and open a Pull Request
79
+
80
+ ## License
81
+
82
+ This project is licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full text.
83
+
@@ -0,0 +1,66 @@
1
+ # strobengine
2
+
3
+ A high-performance HTTP, WebSocket, and gRPC load testing engine with a Python API and a bare-metal Rust core.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install strobengine
9
+ # or from source
10
+ git clone https://github.com/strobeops/strobengine.git && cd strobengine && uv sync
11
+ ```
12
+
13
+ > See [Installation Guide](docs/install.md) for Docker, PyPI, and development setup.
14
+
15
+ ## Quick Start
16
+
17
+ ```python
18
+ from strobengine import StrobEngine
19
+ from strobengine.reporter import print_summary
20
+
21
+ engine = StrobEngine(url="http://localhost:8080/api/health", concurrency=50, duration=30)
22
+ summary = engine.run()
23
+ print_summary(summary)
24
+ ```
25
+
26
+ ```bash
27
+ strobengine load http://localhost:8080/api/health -c 50 -d 30
28
+ ```
29
+
30
+ > See [Quick Start Guide](docs/quickstart.md) for Python API and CLI examples.
31
+
32
+ ## Documentation
33
+
34
+ | Section | Description |
35
+ |---------|-------------|
36
+ | [Installation](docs/install.md) | Build from source, Docker, PyPI |
37
+ | [Dependencies](docs/dependencies.md) | System requirements, Rust crates, Python packages |
38
+ | [Quick Start](docs/quickstart.md) | Python API and CLI usage examples |
39
+ | [CLI Reference](docs/cli.md) | All subcommands, flags, and options |
40
+ | [HTTP Methods](docs/http_methods.md) | Supported methods, request bodies, headers |
41
+ | [WebSocket](docs/websockets.md) | WS/WSS modes, pub/sub broadcasting, metrics |
42
+ | [gRPC](docs/grpc.md) | Unary calls, protobuf, deadline, chaos |
43
+ | [HTTP/3](docs/http3.md) | QUIC transport, 0-RTT resumption, loss recovery |
44
+ | [Docker](docs/docker.md) | Pulling images, running containers |
45
+ | [Testing](docs/testing.md) | Test structure, e2e, CI/CD |
46
+ | [Roadmap](docs/roadmap.md) | Planned features |
47
+
48
+ ## How to Contribute
49
+
50
+ 1. Fork the repository
51
+ 2. Create a feature branch (`git checkout -b feat/my-feature`)
52
+ 3. Install dependencies and set up pre-push Git hooks:
53
+ ```bash
54
+ uv sync
55
+ uv run pre-commit install --hook-type pre-push
56
+ ```
57
+ 4. Run formatting, linting, and tests manually (or let git push run them automatically):
58
+ ```bash
59
+ make check
60
+ ```
61
+ 5. Commit your changes following [Conventional Commits](https://www.conventionalcommits.org/)
62
+ 6. Push to your branch and open a Pull Request
63
+
64
+ ## License
65
+
66
+ This project is licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full text.
@@ -0,0 +1,147 @@
1
+ # CLI Reference
2
+
3
+ strobengine provides a CLI for running load tests from the terminal.
4
+
5
+ ## Default Behavior
6
+
7
+ By default, this spawns **10 concurrent workers** for **10 seconds** with a **10-second request timeout**. Results are displayed as a formatted table with total requests, errors, requests/sec, and latency percentiles (min, avg, p50, p90, p95, p99, max).
8
+
9
+ ## Subcommands
10
+
11
+ | Subcommand | Description |
12
+ |------------|-------------|
13
+ | `load` | Constant load test (default if no subcommand given) |
14
+ | `stress` | Ramp from starting to target concurrency, then hold |
15
+ | `spike` | Baseline -> peak -> baseline |
16
+
17
+ ## Load Subcommand Options
18
+
19
+ | Flag | Default | Description |
20
+ |------|---------|-------------|
21
+ | `-c`, `--concurrency` | `10` | Number of concurrent workers |
22
+ | `-d`, `--duration` | `10` | Duration in seconds |
23
+ | `-t`, `--timeout` | `10` | Per-request timeout in seconds |
24
+ | `--method` | `GET` | HTTP method (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) |
25
+ | `--body` | none | Request body (raw string) |
26
+ | `--form` | none | Form data body (e.g. key1=val1&key2=val2) |
27
+ | `--header` | none | Custom header key:value (repeatable) |
28
+ | `--chaos` | off | Enable fault injection (~10%% of requests) |
29
+ | `--no-progress` | off | Suppress live progress bar |
30
+ | `-v`, `-vv`, `-vvv` | warn | Increase verbosity (INFO, DEBUG, TRACE) |
31
+ | `-q`, `--quiet` | off | Suppress all output |
32
+ | `--log-file <path>` | none | Write logs to file |
33
+ | `--json` | off | Output raw JSON instead of formatted table |
34
+ | `--ws-mode` | `handshake` | WebSocket mode: `handshake`, `ping_pong`, `stream` |
35
+ | `--ws-payload` | none | WebSocket text payload for stream mode |
36
+ | `--ws-role` | none | WebSocket Pub/Sub role: `publisher`, `subscriber` |
37
+ | `--ws-publish-interval` | none | Publisher send interval in milliseconds |
38
+ | `--ws-subscribers` | none | Number of subscriber workers |
39
+ | `--grpc-service` | none | gRPC service name (e.g. helloworld.Greeter) |
40
+ | `--grpc-method` | none | gRPC method name (e.g. SayHello) |
41
+ | `--grpc-payload` | none | Base64-encoded protobuf payload |
42
+ | `--grpc-deadline-ms` | none | gRPC deadline in milliseconds |
43
+ | `--http3/--no-http3` | off | Enable HTTP/3 over QUIC |
44
+ | `--quic-zero-rtt` | off | Enable QUIC 0-RTT connection testing |
45
+ | `--quic-max-idle-timeout` | none | QUIC max idle timeout in ms |
46
+
47
+ ## Stress Subcommand Options
48
+
49
+ | Flag | Default | Description |
50
+ |------|---------|-------------|
51
+ | `--from` | `10` | Starting concurrency |
52
+ | `--to` | `200` | Target concurrency |
53
+ | `--ramp` | `60` | Ramp duration in seconds |
54
+ | `--hold` | `30` | Hold duration at target concurrency |
55
+ | `-t`, `--timeout` | `10` | Per-request timeout in seconds |
56
+ | `--method` | `GET` | HTTP method (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) |
57
+ | `--body` | none | Request body (raw string) |
58
+ | `--form` | none | Form data body (e.g. key1=val1&key2=val2) |
59
+ | `--header` | none | Custom header key:value (repeatable) |
60
+ | `--chaos` | off | Enable fault injection (~10%% of requests) |
61
+ | `--no-progress` | off | Suppress live progress bar |
62
+ | `-v`, `-vv`, `-vvv` | warn | Increase verbosity (INFO, DEBUG, TRACE) |
63
+ | `-q`, `--quiet` | off | Suppress all output |
64
+ | `--log-file <path>` | none | Write logs to file |
65
+ | `--json` | off | Output raw JSON |
66
+ | `--ws-mode` | `handshake` | WebSocket mode: `handshake`, `ping_pong`, `stream` |
67
+ | `--ws-payload` | none | WebSocket text payload for stream mode |
68
+ | `--ws-role` | none | WebSocket Pub/Sub role: `publisher`, `subscriber` |
69
+ | `--ws-publish-interval` | none | Publisher send interval in milliseconds |
70
+ | `--ws-subscribers` | none | Number of subscriber workers |
71
+ | `--grpc-service` | none | gRPC service name (e.g. helloworld.Greeter) |
72
+ | `--grpc-method` | none | gRPC method name (e.g. SayHello) |
73
+ | `--grpc-payload` | none | Base64-encoded protobuf payload |
74
+ | `--grpc-deadline-ms` | none | gRPC deadline in milliseconds |
75
+ | `--http3/--no-http3` | off | Enable HTTP/3 over QUIC |
76
+ | `--quic-zero-rtt` | off | Enable QUIC 0-RTT connection testing |
77
+ | `--quic-max-idle-timeout` | none | QUIC max idle timeout in ms |
78
+
79
+ ## Spike Subcommand Options
80
+
81
+ | Flag | Default | Description |
82
+ |------|---------|-------------|
83
+ | `--baseline` | `5` | Baseline concurrency |
84
+ | `--peak` | `500` | Peak concurrency |
85
+ | `--pre-spike` | `5` | Pre-spike duration in seconds |
86
+ | `--spike-duration` | `10` | Spike duration in seconds |
87
+ | `--post-spike` | `5` | Post-spike duration in seconds |
88
+ | `-t`, `--timeout` | `10` | Per-request timeout in seconds |
89
+ | `--method` | `GET` | HTTP method (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) |
90
+ | `--body` | none | Request body (raw string) |
91
+ | `--form` | none | Form data body (e.g. key1=val1&key2=val2) |
92
+ | `--header` | none | Custom header key:value (repeatable) |
93
+ | `--chaos` | off | Enable fault injection (~10%% of requests) |
94
+ | `--no-progress` | off | Suppress live progress bar |
95
+ | `-v`, `-vv`, `-vvv` | warn | Increase verbosity (INFO, DEBUG, TRACE) |
96
+ | `-q`, `--quiet` | off | Suppress all output |
97
+ | `--log-file <path>` | none | Write logs to file |
98
+ | `--json` | off | Output raw JSON |
99
+ | `--ws-mode` | `handshake` | WebSocket mode: `handshake`, `ping_pong`, `stream` |
100
+ | `--ws-payload` | none | WebSocket text payload for stream mode |
101
+ | `--ws-role` | none | WebSocket Pub/Sub role: `publisher`, `subscriber` |
102
+ | `--ws-publish-interval` | none | Publisher send interval in milliseconds |
103
+ | `--ws-subscribers` | none | Number of subscriber workers |
104
+ | `--grpc-service` | none | gRPC service name (e.g. helloworld.Greeter) |
105
+ | `--grpc-method` | none | gRPC method name (e.g. SayHello) |
106
+ | `--grpc-payload` | none | Base64-encoded protobuf payload |
107
+ | `--grpc-deadline-ms` | none | gRPC deadline in milliseconds |
108
+ | `--http3/--no-http3` | off | Enable HTTP/3 over QUIC |
109
+ | `--quic-zero-rtt` | off | Enable QUIC 0-RTT connection testing |
110
+ | `--quic-max-idle-timeout` | none | QUIC max idle timeout in ms |
111
+
112
+ ## Global Options
113
+
114
+ | Flag | Description |
115
+ |------|-------------|
116
+ | `-V`, `--version` | Show version and exit |
117
+
118
+ ## Verbosity Levels
119
+
120
+ | Flag | Level | Shows |
121
+ |------|-------|-------|
122
+ | (default) | `warn` | Errors and warnings only |
123
+ | `-v` | `info` | Engine start/stop, test configuration |
124
+ | `-vv` | `debug` | Worker spawn, HTTP errors, connection events |
125
+ | `-vvv` | `trace` | Per-request latency, status codes, chaos injection |
126
+ | `-q` | off | Suppress all log output (progress bar remains) |
127
+
128
+ Logs stream to **stderr** by default, keeping stdout clean for JSON output piping:
129
+
130
+ ```bash
131
+ strobengine load http://localhost:8080/api/health -vv --json > results.json
132
+ ```
133
+
134
+ ## Live Progress Bar
135
+
136
+ During test execution, a live progress bar displays on stderr with real-time telemetry:
137
+
138
+ ```
139
+ ⠋ [00:00:05] [==============>-------------] 40% | 1250 req/s | 20 VUs | 12 err | avg 4.2ms
140
+ ```
141
+
142
+ - **RPS**: Instantaneous requests per second (sampled every 200ms)
143
+ - **VUs**: Active virtual users / concurrent workers
144
+ - **Errors**: Total error count
145
+ - **Avg latency**: Running average across all completed requests
146
+
147
+ The progress bar auto-detects non-TTY environments (CI/CD, piped output) and suppresses itself. Use `--no-progress` to explicitly disable it on interactive terminals.
@@ -0,0 +1,39 @@
1
+ # Dependencies
2
+
3
+ ## System Requirements
4
+
5
+ - **Python** >= 3.11
6
+ - **Rust** stable (with `cargo`)
7
+ - **uv** (Python package manager)
8
+
9
+ ## Rust Crates
10
+
11
+ | Crate | Version | Purpose |
12
+ |-------|---------|---------|
13
+ | pyo3 | 0.29 | Python FFI bindings (stable ABI, abi3-py311) |
14
+ | reqwest | 0.13 | HTTP client with connection pooling |
15
+ | tonic | 0.14 | gRPC framework with TLS support |
16
+ | quinn | 0.11 | QUIC transport for HTTP/3 |
17
+ | h3 | 0.0.8 | HTTP/3 protocol implementation |
18
+ | h3-quinn | 0.0.10 | h3-Quinn bridge |
19
+ | tokio | 1.53 | Multi-threaded async runtime |
20
+ | tokio-util | 0.7 | CancellationToken for graceful worker shutdown |
21
+ | tracing | 0.1 | Structured logging instrumentation |
22
+ | tracing-subscriber | 0.3 | Log formatting and output (stderr/file) |
23
+ | indicatif | 0.17 | Terminal progress bar rendering |
24
+ | fastrand | 2 | Fast random number generation for chaos injection |
25
+ | http | 1 | HTTP method types and header primitives |
26
+ | bytes | 1 | Zero-copy byte buffer for request payloads |
27
+ | tokio-tungstenite | 0.26 | WebSocket client with TLS support |
28
+ | prost / prost-reflect | 0.14 / 0.16 | Protobuf encoding/decoding and reflection |
29
+ | base64 | 0.22 | Base64 payload decoding for gRPC |
30
+ | hex | 0.4 | Hex payload decoding for gRPC |
31
+
32
+ ## Python Dependencies
33
+
34
+ | Package | Version | Purpose |
35
+ |---------|---------|---------|
36
+ | pytest | >= 8.0 | Test runner |
37
+ | pytest-asyncio | >= 0.24 | Async test support |
38
+ | aiohttp | >= 3.14 | Mock server for E2E tests |
39
+ | ruff | >= 0.15 | Linting and formatting |
@@ -0,0 +1,52 @@
1
+ # Installation
2
+
3
+ ## From Source (Recommended)
4
+
5
+ ```bash
6
+ # Clone the repository
7
+ git clone https://github.com/strobeops/strobengine.git
8
+ cd strobengine
9
+
10
+ # Build the native extension and install the package
11
+ uv sync
12
+ ```
13
+
14
+ `uv sync` invokes [maturin](https://github.com/PyO3/maturin) under the hood, which compiles the Rust code into a native Python extension module and installs it into your virtual environment.
15
+
16
+ ## From Docker
17
+
18
+ Pull and run strobengine directly from Docker Hub:
19
+
20
+ ```bash
21
+ # Latest release
22
+ docker pull strobeops/strobengine:latest
23
+ docker run --rm -it strobeops/strobengine load http://host.docker.internal:8080/api/health -c 50 -d 30
24
+
25
+ # Specific version
26
+ docker pull strobeops/strobengine:0.3.0
27
+ ```
28
+
29
+ > See [Docker documentation](docker.md) for version tags, host networking, and building locally.
30
+
31
+ ## Verify Installation
32
+
33
+ ```bash
34
+ # Check version
35
+ strobengine --version
36
+
37
+ # Or via Python
38
+ uv run python -c "from strobengine import StrobEngine; print('OK')"
39
+ ```
40
+
41
+ ## Development Setup
42
+
43
+ ```bash
44
+ # Install with dev dependencies
45
+ uv sync
46
+
47
+ # Install pre-commit hooks (optional)
48
+ uv run pre-commit install --hook-type pre-push
49
+
50
+ # Run the full check suite
51
+ make check
52
+ ```
@@ -0,0 +1,116 @@
1
+ # Quick Start
2
+
3
+ ## Python API
4
+
5
+ ### Constant Load Test
6
+
7
+ ```python
8
+ from strobengine import StrobEngine
9
+ from strobengine.reporter import print_summary
10
+
11
+ engine = StrobEngine(url="http://localhost:8080/api/health", concurrency=50, duration=30)
12
+ summary = engine.run()
13
+ print_summary(summary)
14
+ ```
15
+
16
+ ### Ramp/Stress Test
17
+
18
+ ```python
19
+ engine = StrobEngine.stress_test(
20
+ "http://localhost:8080/api/health",
21
+ start_concurrency=10,
22
+ max_concurrency=200,
23
+ ramp_duration=60,
24
+ hold_duration=30,
25
+ )
26
+ summary = engine.run()
27
+ print_summary(summary)
28
+ ```
29
+
30
+ ### Spike Test
31
+
32
+ ```python
33
+ engine = StrobEngine.spike_test(
34
+ "http://localhost:8080/api/health",
35
+ baseline=5,
36
+ peak_concurrency=500,
37
+ pre_spike_duration=5,
38
+ spike_duration=10,
39
+ post_spike_duration=5,
40
+ )
41
+ summary = engine.run()
42
+ print_summary(summary)
43
+ ```
44
+
45
+ ### POST with JSON Body
46
+
47
+ ```python
48
+ from strobengine import StrobEngine, RequestOptions
49
+
50
+ engine = StrobEngine(
51
+ url="http://localhost:8080/api/data",
52
+ options=RequestOptions(
53
+ method="POST",
54
+ body='{"name": "test", "value": 42}',
55
+ headers=[("Authorization", "Bearer token123")],
56
+ ),
57
+ )
58
+ summary = engine.run()
59
+ print_summary(summary)
60
+ ```
61
+
62
+ ### gRPC Unary Call
63
+
64
+ ```python
65
+ engine = StrobEngine(
66
+ url="grpc://localhost:50051",
67
+ concurrency=10,
68
+ duration=30,
69
+ options=RequestOptions(
70
+ grpc_service="helloworld.Greeter",
71
+ grpc_method="SayHello",
72
+ grpc_payload="CgR0ZXN0",
73
+ ),
74
+ )
75
+ summary = engine.run()
76
+ print_summary(summary)
77
+ ```
78
+
79
+ ### Async Execution
80
+
81
+ For async contexts (FastAPI, Typer, etc.):
82
+
83
+ ```python
84
+ summary = await engine.run_async()
85
+ ```
86
+
87
+ ## CLI Usage
88
+
89
+ ```bash
90
+ # Constant load test (default subcommand)
91
+ strobengine http://localhost:8080/api/health -c 50 -d 30
92
+
93
+ # Ramp/stress test
94
+ strobengine stress http://localhost:8080/api/health --from 10 --to 500 --ramp 60 --hold 30
95
+
96
+ # Spike test
97
+ strobengine spike http://localhost:8080/api/health --baseline 5 --peak 1000 --pre-spike 5 --spike-duration 10 --post-spike 5
98
+
99
+ # JSON output for CI/CD
100
+ strobengine load http://localhost:8080/api/health --json
101
+
102
+ # Chaos/fault injection test (~10% of requests get faults)
103
+ strobengine load http://localhost:8080/api/health --chaos
104
+
105
+ # POST with JSON body
106
+ strobengine load http://localhost:8080/api/data --method POST --body '{"key": "val"}'
107
+
108
+ # gRPC unary call
109
+ strobengine load grpc://localhost:50051 \
110
+ --grpc-service helloworld.Greeter \
111
+ --grpc-method SayHello \
112
+ --grpc-payload CgR0ZXN0 \
113
+ -c 10 -d 30
114
+ ```
115
+
116
+ > See [CLI Reference](cli.md) for all available flags and options.
@@ -55,6 +55,35 @@ This document outlines the planned trajectory and upcoming feature epics for **s
55
55
 
56
56
  ---
57
57
 
58
+ ## Multi-Target Parallel Execution
59
+
60
+ ### Epic: Multi-Target Parallel Execution
61
+ *Target Focus: Concurrent Load Generation & Scripted Parallelism*
62
+
63
+ - [x] Intra-test worker task concurrency (`-c`/`--workers` mapped to Tokio async threads). `[v0.1.0]`
64
+ - [ ] Multi-target script orchestrator (`asyncio.gather` execution across multiple concurrent `StrobEngine` instances).
65
+ - [ ] Native multi-URL target parsing & concurrent execution via CLI.
66
+ - [ ] Process-level parallel execution runner integration (`pytest-xdist` parallel test pool orchestration).
67
+
68
+ ---
69
+
70
+ ## Reporting, Storage & Analytics
71
+
72
+ ### Epic: Test Persistence & Visual Reporting
73
+ *Target Focus: Long-Term Benchmark Tracking & Visualization*
74
+
75
+ - [ ] **Artifact Persistence Engine**
76
+ - [ ] Automatic disk storage for raw JSON execution metrics (`--output-dir`, `--save-report`).
77
+ - [ ] Standardized report schema featuring execution metadata (timestamps, CLI flags, system specs, latency percentiles).
78
+ - [ ] **HTML / Visual Report Generator**
79
+ - [ ] Standalone HTML report output with embedded latency distribution charts (p50, p90, p95, p99).
80
+ - [ ] Summary dashboards comparing current runs against historical baseline artifacts.
81
+ - [ ] **Export Formats**
82
+ - [ ] Markdown summary generation for CI/CD Pull Request integration (GitHub Actions step comments).
83
+ - [ ] CSV/JUnit XML exports for standard test runner ingestion.
84
+
85
+ ---
86
+
58
87
  ## Modern Web APIs
59
88
 
60
89
  ### Epic: Modern Web APIs
@@ -73,20 +102,32 @@ This document outlines the planned trajectory and upcoming feature epics for **s
73
102
  - [x] **HTTP/3 (QUIC)** `[v0.4.0] - 2026-08-23`
74
103
  - [x] UDP-based QUIC transport layer support. `[v0.4.0] - 2026-08-23`
75
104
  - [x] Zero-RTT connection testing and loss recovery benchmarking. `[v0.4.0] - 2026-08-23`
105
+ - [ ] **Server-Sent Events (SSE / HTTP Streaming)**
106
+ - [ ] Persistent HTTP streaming response parsing (Time-to-First-Byte, chunk latency, LLM stream benchmarking).
76
107
 
77
108
  ---
78
109
 
79
110
  ## Infrastructure & Streaming Protocols
80
111
 
81
- ### Epic: Infrastructure & Low-Level Transport
82
- *Target Focus: Enterprise & Deep Performance Testing*
112
+ ### Epic: Event-Driven Infrastructure & Message Queues
113
+ *Target Focus: Async Microservices & IoT Protocols*
83
114
 
115
+ - [ ] **MQTT (IoT / Telemetry)**
116
+ - [ ] Async MQTT client integration (`rumqttc`) for QoS 0/1/2 pub/sub benchmarking.
84
117
  - [ ] **Event Brokers**
85
- - [ ] **Apache Kafka**: High-throughput producer load testing and message ingestion benchmarking.
86
- - [ ] **MQTT**: IoT publish/subscribe message broker stress testing.
118
+ - [ ] **Apache Kafka / Redpanda**: Producer load testing and partition ingestion benchmarking.
119
+ - [ ] **RabbitMQ (AMQP)**: Queue message publish throughput and acknowledgment latencies.
120
+
121
+ ---
122
+
123
+ ### Epic: Infrastructure & Low-Level Transport
124
+ *Target Focus: Network Layers & Caching Tiers*
125
+
87
126
  - [ ] **Low-Level Transport**
88
- - [ ] **Raw TCP Socket Testing**: Custom payload socket streaming.
89
- - [ ] **Raw UDP Socket Testing**: High-frequency datagram hammering and packet loss evaluation.
127
+ - [ ] **Raw TCP / TLS Socket Streaming**: Custom binary payload socket streaming (`tokio::net::TcpStream`).
128
+ - [ ] **UDP / QUIC Raw Sockets**: High-frequency datagram hammering, jitter evaluation, and packet loss tracking.
129
+ - [ ] **In-Memory Caching Protocols**
130
+ - [ ] **Redis / RESP Protocol**: High-concurrency GET/SET operation benchmarking and connection pool stress testing.
90
131
 
91
132
  ---
92
133
 
@@ -2,10 +2,14 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- - [README](../README.md) -- Project overview, installation, quick start, CLI reference
5
+ - [README](../README.md) -- Project overview, quick start, and links
6
+ - [Installation](install.md) -- Build from source, Docker, PyPI
7
+ - [Dependencies](dependencies.md) -- System requirements, Rust crates, Python packages
6
8
 
7
9
  ## Features
8
10
 
11
+ - [Quick Start](quickstart.md) -- Python API and CLI usage examples
12
+ - [CLI Reference](cli.md) -- All subcommands, flags, and options
9
13
  - [HTTP Methods](http_methods.md) -- Supported HTTP methods, request bodies, headers, performance
10
14
  - [WebSocket Load Testing](websockets.md) -- WS/WSS modes, pub/sub broadcasting, custom payloads, headers, metrics
11
15
  - [gRPC Load Testing](grpc.md) -- Unary calls, protobuf payloads, deadline, chaos
@@ -21,3 +25,4 @@
21
25
  - [Infrastructure](infrastructure.md) -- Build system, dependencies, architecture
22
26
  - [Roadmap](roadmap.md) -- Planned features and project direction
23
27
  - [Benchmarks](benchmarks.md) -- Performance benchmarks and methodology
28
+ - [Release](release.md) -- Maintainer releases and versioning workflows
@@ -1,8 +1,8 @@
1
1
  [project]
2
2
  name = "strobengine"
3
- version = "0.4.0"
3
+ version = "0.4.1"
4
4
  description = "A load testing framework with a Python UI and a bare-metal Rust engine core."
5
- readme = "README.md"
5
+ readme = { file = "README.md", content-type = "text/markdown", base-url = "https://github.com/strobeops/strobengine/blob/main/" }
6
6
  license = "Apache-2.0"
7
7
  license-files = [
8
8
  "LICENSE",