strobengine 0.3.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 (85) hide show
  1. {strobengine-0.3.0 → strobengine-0.4.1}/.github/workflows/ci.yml +4 -4
  2. {strobengine-0.3.0 → strobengine-0.4.1}/.github/workflows/docker-release.yml +6 -6
  3. {strobengine-0.3.0 → strobengine-0.4.1}/.github/workflows/publish-test.yml +9 -9
  4. {strobengine-0.3.0 → strobengine-0.4.1}/.github/workflows/publish.yml +9 -9
  5. strobengine-0.4.1/CHANGELOG.md +356 -0
  6. {strobengine-0.3.0 → strobengine-0.4.1}/Cargo.lock +756 -95
  7. {strobengine-0.3.0 → strobengine-0.4.1}/Cargo.toml +19 -2
  8. strobengine-0.4.1/PKG-INFO +83 -0
  9. strobengine-0.4.1/README.md +66 -0
  10. strobengine-0.4.1/docs/cli.md +147 -0
  11. strobengine-0.4.1/docs/dependencies.md +39 -0
  12. strobengine-0.4.1/docs/grpc.md +223 -0
  13. strobengine-0.4.1/docs/http3.md +164 -0
  14. strobengine-0.4.1/docs/install.md +52 -0
  15. strobengine-0.4.1/docs/quickstart.md +116 -0
  16. strobengine-0.4.1/docs/release.md +57 -0
  17. strobengine-0.4.1/docs/roadmap.md +136 -0
  18. strobengine-0.4.1/docs/table_of_contents.md +28 -0
  19. {strobengine-0.3.0 → strobengine-0.4.1}/docs/testing.md +2 -0
  20. strobengine-0.4.1/docs/websockets.md +304 -0
  21. strobengine-0.4.1/examples/grpc.py +147 -0
  22. strobengine-0.4.1/examples/http3.py +101 -0
  23. strobengine-0.4.1/examples/websocket.py +147 -0
  24. {strobengine-0.3.0 → strobengine-0.4.1}/pyproject.toml +2 -2
  25. strobengine-0.4.1/rust-toolchain.toml +4 -0
  26. strobengine-0.4.1/scripts/release.py +108 -0
  27. {strobengine-0.3.0 → strobengine-0.4.1}/src/config.rs +172 -0
  28. {strobengine-0.3.0 → strobengine-0.4.1}/src/lib.rs +224 -83
  29. {strobengine-0.3.0 → strobengine-0.4.1}/src/metrics.rs +76 -0
  30. strobengine-0.4.1/src/protocols/grpc.rs +438 -0
  31. strobengine-0.4.1/src/protocols/grpc_parser.rs +149 -0
  32. strobengine-0.4.1/src/protocols/grpc_reflection.rs +139 -0
  33. strobengine-0.4.1/src/protocols/http.rs +150 -0
  34. strobengine-0.4.1/src/protocols/http3.rs +585 -0
  35. strobengine-0.4.1/src/protocols/mod.rs +108 -0
  36. strobengine-0.4.1/src/protocols/websocket.rs +1011 -0
  37. {strobengine-0.3.0 → strobengine-0.4.1}/src/strobengine/_strobengine.pyi +44 -0
  38. {strobengine-0.3.0 → strobengine-0.4.1}/src/strobengine/cli.py +327 -19
  39. {strobengine-0.3.0 → strobengine-0.4.1}/src/strobengine/engine.py +40 -0
  40. {strobengine-0.3.0 → strobengine-0.4.1}/src/strobengine/reporter.py +39 -6
  41. strobengine-0.4.1/tests/e2e/mock_server.py +132 -0
  42. strobengine-0.4.1/tests/e2e/test_grpc_e2e.py +78 -0
  43. strobengine-0.4.1/tests/e2e/test_http3_e2e.py +74 -0
  44. strobengine-0.4.1/tests/e2e/test_websocket_e2e.py +182 -0
  45. strobengine-0.4.1/tests/fixtures/service.proto +16 -0
  46. {strobengine-0.3.0 → strobengine-0.4.1}/tests/test_reporter.py +1 -0
  47. {strobengine-0.3.0 → strobengine-0.4.1}/uv.lock +1 -1
  48. strobengine-0.3.0/CHANGELOG.md +0 -188
  49. strobengine-0.3.0/PKG-INFO +0 -307
  50. strobengine-0.3.0/README.md +0 -290
  51. strobengine-0.3.0/docs/roadmap.md +0 -91
  52. strobengine-0.3.0/src/worker.rs +0 -165
  53. strobengine-0.3.0/tests/e2e/mock_server.py +0 -69
  54. {strobengine-0.3.0 → strobengine-0.4.1}/.dockerignore +0 -0
  55. {strobengine-0.3.0 → strobengine-0.4.1}/.gitignore +0 -0
  56. {strobengine-0.3.0 → strobengine-0.4.1}/.pre-commit-config.yaml +0 -0
  57. {strobengine-0.3.0 → strobengine-0.4.1}/.python-version +0 -0
  58. {strobengine-0.3.0 → strobengine-0.4.1}/Dockerfile +0 -0
  59. {strobengine-0.3.0 → strobengine-0.4.1}/LICENSE +0 -0
  60. {strobengine-0.3.0 → strobengine-0.4.1}/Makefile +0 -0
  61. {strobengine-0.3.0 → strobengine-0.4.1}/cliff.toml +0 -0
  62. {strobengine-0.3.0 → strobengine-0.4.1}/docs/benchmarks.md +0 -0
  63. {strobengine-0.3.0 → strobengine-0.4.1}/docs/docker.md +0 -0
  64. {strobengine-0.3.0 → strobengine-0.4.1}/docs/http_methods.md +0 -0
  65. {strobengine-0.3.0 → strobengine-0.4.1}/docs/infrastructure.md +0 -0
  66. {strobengine-0.3.0 → strobengine-0.4.1}/examples/http_methods.py +0 -0
  67. {strobengine-0.3.0 → strobengine-0.4.1}/examples/load_test.py +0 -0
  68. {strobengine-0.3.0 → strobengine-0.4.1}/examples/spike_test.py +0 -0
  69. {strobengine-0.3.0 → strobengine-0.4.1}/examples/stress_test.py +0 -0
  70. {strobengine-0.3.0 → strobengine-0.4.1}/src/chaos.rs +0 -0
  71. {strobengine-0.3.0 → strobengine-0.4.1}/src/logging.rs +0 -0
  72. {strobengine-0.3.0 → strobengine-0.4.1}/src/progress.rs +0 -0
  73. {strobengine-0.3.0 → strobengine-0.4.1}/src/strobengine/__init__.py +0 -0
  74. {strobengine-0.3.0 → strobengine-0.4.1}/src/strobengine/constants.py +0 -0
  75. {strobengine-0.3.0 → strobengine-0.4.1}/src/strobengine/py.typed +0 -0
  76. {strobengine-0.3.0 → strobengine-0.4.1}/tests/__init__.py +0 -0
  77. {strobengine-0.3.0 → strobengine-0.4.1}/tests/conftest.py +0 -0
  78. {strobengine-0.3.0 → strobengine-0.4.1}/tests/e2e/__init__.py +0 -0
  79. {strobengine-0.3.0 → strobengine-0.4.1}/tests/e2e/conftest.py +0 -0
  80. {strobengine-0.3.0 → strobengine-0.4.1}/tests/e2e/test_cli_interface.py +0 -0
  81. {strobengine-0.3.0 → strobengine-0.4.1}/tests/e2e/test_http_scenarios.py +0 -0
  82. {strobengine-0.3.0 → strobengine-0.4.1}/tests/e2e/test_performance_sanity.py +0 -0
  83. {strobengine-0.3.0 → strobengine-0.4.1}/tests/test_cli.py +0 -0
  84. {strobengine-0.3.0 → strobengine-0.4.1}/tests/test_engine.py +0 -0
  85. {strobengine-0.3.0 → strobengine-0.4.1}/tests/test_logging.py +0 -0
@@ -21,15 +21,15 @@ jobs:
21
21
  runs-on: ubuntu-latest
22
22
  steps:
23
23
  - name: Checkout Code
24
- uses: actions/checkout@v7
24
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
25
25
 
26
26
  - name: Setup Rust Toolchain
27
- uses: dtolnay/rust-toolchain@stable
27
+ uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable
28
28
  with:
29
29
  components: clippy, rustfmt
30
30
 
31
31
  - name: Cache Cargo Dependencies
32
- uses: swatinem/rust-cache@v2
32
+ uses: swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
33
33
 
34
34
  - name: Run Rust Lints & Tests
35
35
  run: |
@@ -42,7 +42,7 @@ jobs:
42
42
  runs-on: ubuntu-latest
43
43
  steps:
44
44
  - name: Checkout Code
45
- uses: actions/checkout@v7
45
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
46
46
 
47
47
  - name: Setup uv
48
48
  uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
@@ -16,23 +16,23 @@ jobs:
16
16
 
17
17
  steps:
18
18
  - name: Checkout Code
19
- uses: actions/checkout@v7
19
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
20
20
 
21
21
  - name: Set up QEMU (for multi-arch support)
22
- uses: docker/setup-qemu-action@v4
22
+ uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4
23
23
 
24
24
  - name: Set up Docker Buildx
25
- uses: docker/setup-buildx-action@v4
25
+ uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
26
26
 
27
27
  - name: Log in to Docker Hub
28
- uses: docker/login-action@v4
28
+ uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4
29
29
  with:
30
30
  username: ${{ secrets.DOCKERHUB_USERNAME }}
31
31
  password: ${{ secrets.DOCKERHUB_TOKEN }}
32
32
 
33
33
  - name: Extract Docker Metadata (Tags & Labels)
34
34
  id: meta
35
- uses: docker/metadata-action@v6
35
+ uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6
36
36
  with:
37
37
  images: ${{ secrets.DOCKERHUB_USERNAME }}/strobengine
38
38
  tags: |
@@ -41,7 +41,7 @@ jobs:
41
41
  type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
42
42
 
43
43
  - name: Build and Push Docker Image
44
- uses: docker/build-push-action@v7
44
+ uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7
45
45
  with:
46
46
  context: .
47
47
  file: ./Dockerfile
@@ -25,15 +25,15 @@ jobs:
25
25
  - os: macos-latest
26
26
  target: x86_64
27
27
  steps:
28
- - uses: actions/checkout@v7
28
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
29
29
 
30
30
  - name: Set up Python
31
- uses: actions/setup-python@v7
31
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
32
32
  with:
33
33
  python-version-file: '.python-version'
34
34
 
35
35
  - name: Build wheels via Maturin
36
- uses: PyO3/maturin-action@v1
36
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
37
37
  with:
38
38
  target: ${{ matrix.target }}
39
39
  args: --release --out dist --find-interpreter
@@ -41,7 +41,7 @@ jobs:
41
41
  sdist: false
42
42
 
43
43
  - name: Upload wheel artifacts
44
- uses: actions/upload-artifact@v7
44
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
45
45
  with:
46
46
  name: wheels-${{ matrix.os }}-${{ matrix.target }}
47
47
  path: dist/*.whl
@@ -50,16 +50,16 @@ jobs:
50
50
  name: Build source distribution
51
51
  runs-on: ubuntu-latest
52
52
  steps:
53
- - uses: actions/checkout@v7
53
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
54
54
 
55
55
  - name: Build sdist
56
- uses: PyO3/maturin-action@v1
56
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
57
57
  with:
58
58
  command: sdist
59
59
  args: --out dist
60
60
 
61
61
  - name: Upload sdist artifact
62
- uses: actions/upload-artifact@v7
62
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
63
63
  with:
64
64
  name: sdist
65
65
  path: dist/*.tar.gz
@@ -74,14 +74,14 @@ jobs:
74
74
 
75
75
  steps:
76
76
  - name: Download all build artifacts
77
- uses: actions/download-artifact@v8
77
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
78
78
  with:
79
79
  pattern: '*'
80
80
  path: dist
81
81
  merge-multiple: true
82
82
 
83
83
  - name: Publish to TestPyPI
84
- uses: pypa/gh-action-pypi-publish@release/v1
84
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
85
85
  with:
86
86
  repository-url: https://test.pypi.org/legacy/
87
87
  packages-dir: dist/
@@ -28,15 +28,15 @@ jobs:
28
28
  - os: macos-latest
29
29
  target: x86_64
30
30
  steps:
31
- - uses: actions/checkout@v7
31
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
32
32
 
33
33
  - name: Set up Python
34
- uses: actions/setup-python@v7
34
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
35
35
  with:
36
36
  python-version-file: '.python-version'
37
37
 
38
38
  - name: Build wheels via Maturin
39
- uses: PyO3/maturin-action@v1
39
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
40
40
  with:
41
41
  target: ${{ matrix.target }}
42
42
  args: --release --out dist --find-interpreter
@@ -44,7 +44,7 @@ jobs:
44
44
  sdist: false
45
45
 
46
46
  - name: Upload wheel artifacts
47
- uses: actions/upload-artifact@v7
47
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
48
48
  with:
49
49
  name: wheels-${{ matrix.os }}-${{ matrix.target }}
50
50
  path: dist/*.whl
@@ -53,16 +53,16 @@ jobs:
53
53
  name: Build source distribution
54
54
  runs-on: ubuntu-latest
55
55
  steps:
56
- - uses: actions/checkout@v7
56
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
57
57
 
58
58
  - name: Build sdist
59
- uses: PyO3/maturin-action@v1
59
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
60
60
  with:
61
61
  command: sdist
62
62
  args: --out dist
63
63
 
64
64
  - name: Upload sdist artifact
65
- uses: actions/upload-artifact@v7
65
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
66
66
  with:
67
67
  name: sdist
68
68
  path: dist/*.tar.gz
@@ -77,13 +77,13 @@ jobs:
77
77
 
78
78
  steps:
79
79
  - name: Download all build artifacts
80
- uses: actions/download-artifact@v8
80
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
81
81
  with:
82
82
  pattern: '*'
83
83
  path: dist
84
84
  merge-multiple: true
85
85
 
86
86
  - name: Publish to PyPI
87
- uses: pypa/gh-action-pypi-publish@release/v1
87
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
88
88
  with:
89
89
  packages-dir: dist/
@@ -0,0 +1,356 @@
1
+ # Changelog
2
+
3
+ All notable changes to `strobengine` will be documented in this file.
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
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
28
+ ## [0.4.0] - 2026-08-23
29
+
30
+ ### Bug Fixes
31
+
32
+ - *(e2e)* Add binary echo and error handling to WebSocket mock server
33
+ - *(websocket)* Add per-iteration timeout to prevent worker hangs
34
+ - *(protocols)* Pass timeout_secs to WebSocketEngine
35
+ - *(websocket)* Lazy connect for pub/sub sessions and test fixes
36
+ - *(metrics)* Populate new QUIC fields in all protocol constructors
37
+ - *(http3)* Defer endpoint creation to first use via OnceCell
38
+ - *(protocol)* Replace panic with graceful HTTP/1.1 fallback for HTTP/3 errors
39
+ - *(grpc)* Replace .expect() panics with proper error propagation
40
+ - *(grpc)* Use copy_to_bytes to read all chunks in RawDecoder #105
41
+ - *(http3)* Reject invalid HTTP methods instead of silently defaulting to GET #109
42
+ - *(http3)* Reset prev_lost_packets after reconnect
43
+ - *(websocket)* Replace unwrap() with safe pattern matching on session streams #113
44
+ - *(websocket)* Replace expect() with safe downcast on PersistentWsSession
45
+ - *(e2e)* Add discard WebSocket endpoint and fix flaky pub/sub test
46
+
47
+ ### Documentation
48
+
49
+ - Update project description to include WebSocket support
50
+ - *(websocket)* Add CLI usage examples and table of contents
51
+ - *(gRPC)* Add gRPC load testing documentation
52
+ - Add gRPC entry to documentation index
53
+ - Add gRPC to README tagline, crates, examples, and options
54
+ - Update roadmap to reflect actual implementation status
55
+ - Remove stale limitations from gRPC documentation
56
+ - *(readme)* Add pub/sub CLI flags to subcommand tables
57
+ - *(websockets)* Add pub/sub mode documentation and examples
58
+ - Update TOC, endpoint table, and roadmap for pub/sub
59
+ - *(examples)* Add WebSocket load testing examples
60
+ - *(http3)* Add HTTP/3 protocol documentation
61
+ - Update TOC, roadmap, and README for HTTP/3
62
+ - *(examples)* Add HTTP/3 load testing examples
63
+ - *(release)* Add operational release process documentation
64
+
65
+ ### Features
66
+
67
+ - *(protocols)* Define ProtocolEngine trait and detect_protocol factory
68
+ - *(protocols)* Implement HttpEngine with ProtocolEngine trait
69
+ - *(protocols)* Implement WebSocketEngine for handshake testing
70
+ - *(protocols)* Implement modular ProtocolEngine trait and WebSocket handshake engine #75
71
+ - *(config)* Add WsMode enum for WebSocket execution modes
72
+ - *(protocols)* Add WebSocket headers and PingPong mode support
73
+ - *(engine)* Wire WsMode through Python API to Rust engine
74
+ - *(websocket)* Add WsMode execution modes, headers, and E2E tests #77
75
+ - *(config)* Add Stream variant and ws_payload to TestConfig
76
+ - *(protocols)* Implement WsMode::Stream with payload injection
77
+ - *(engine)* Pass ws_payload through to WebSocket engine
78
+ - *(websocket)* Add WsMode::Stream support and custom payload injection #78
79
+ - *(engine)* Wire ws_payload and Stream mode through Python API
80
+ - *(engine)* Wire ws_payload and Stream mode through Python API #79
81
+ - *(cli)* Add --ws-mode and --ws-payload options to CLI commands
82
+ - *(protocols)* Add chaos injection to WebSocket engine
83
+ - *(engine)* Pass chaos to WebSocket engine in both entry points
84
+ - *(ws)* Add websocket chaos testing (#82)
85
+ - *(config)* Add gRPC fields to TestConfig
86
+ - *(protocols)* Implement GrpcEngine with ProtocolEngine trait
87
+ - *(stubs)* Add gRPC fields to TestConfig type stubs
88
+ - *(engine)* Add gRPC fields to RequestOptions and TestConfig wiring
89
+ - *(cli)* Add gRPC flags to load, stress, and spike subcommands
90
+ - *(grpc)* Handle MetadataCorruption chaos fault
91
+ - *(reporter)* Annotate status code 0 and gRPC protocol in output
92
+ - *(grpc)* Add hex payload decoding with 0x prefix convention
93
+ - *(grpc)* Add runtime .proto parsing and JSON-to-protobuf conversion
94
+ - *(grpc)* Add proto_schema support and pre-serialize JSON payloads
95
+ - Add proto_path to TestConfig, RequestOptions, and CLI
96
+ - Add grpc_use_reflection config option
97
+ - *(grpc)* Add server reflection client with v1/v1alpha fallback
98
+ - *(grpc)* Add lazy reflection initialization with OnceCell
99
+ - *(metrics)* Add is_reconnect and connection_latency_us fields
100
+ - *(protocol)* Add new RequestMetric fields to HTTP and gRPC engines
101
+ - *(protocol)* Add worker context methods to ProtocolEngine
102
+ - *(config)* Add WebSocket persistent connection fields
103
+ - *(websocket)* Add PersistentWsSession and context-based iteration
104
+ - *(core)* Integrate worker-local context in execute_test
105
+ - *(metrics)* Add pub/sub timestamp fields and payload encoding
106
+ - *(config)* Add ws_role, ws_publish_interval_ms, ws_subscribers
107
+ - *(websocket)* Add publisher/subscriber sessions and role dispatch
108
+ - *(protocols)* Wire pub/sub config to WebSocketEngine
109
+ - *(core)* Aggregate e2e latencies in worker metric collector
110
+ - *(typing)* Add pub/sub config and e2e latency to type stubs
111
+ - *(engine)* Add pub/sub fields to RequestOptions
112
+ - *(cli)* Add --ws-role, --ws-publish-interval, --ws-subscribers
113
+ - *(reporter)* Display avg E2E latency for pub/sub tests
114
+ - *(config)* Add http3_enabled, quic_zero_rtt, quic_max_idle_timeout_ms
115
+ - *(protocol)* Implement Http3Engine with QUIC transport
116
+ - *(protocol)* Register http3 module and add URL routing
117
+ - *(core)* Route http3:// and h3:// URLs through detect_protocol
118
+ - *(metrics)* Add quic_handshake_us, quic_0rtt_used, quic_retransmits
119
+ - *(http3)* Enable TLS session resumption and 0-RTT connection attempts
120
+ - *(cli)* Add --http3, --quic-zero-rtt, --quic-max-idle-timeout flags
121
+ - *(scripts)* Add automated release script with dry-run support
122
+
123
+ ### Miscellaneous Tasks
124
+
125
+ - *(pre-commit)* Enable e2e tests in pytest hook
126
+ - Add rust-toolchain.toml for reproducible builds
127
+ - Remove e2e test from pre commit hooks
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
131
+
132
+ ### Other
133
+
134
+ - *(deps)* Add async-trait and tokio-tungstenite, switch reqwest to rustls
135
+ - *(deps)* Add tonic, prost, prost-types, and base64 for gRPC support
136
+ - *(deps)* Add hex crate for protobuf payload decoding
137
+ - *(deps)* Add prost-reflect, protox, serde_json for proto parsing
138
+ - *(deps)* Add tonic-reflection and tokio-stream
139
+ - *(deps)* Add quinn, h3, h3-quinn for HTTP/3 support
140
+
141
+ ### Refactoring
142
+
143
+ - *(core)* Use ProtocolEngine trait in execute_test worker loop
144
+ - *(engine)* Simplify detect_protocol to accept TestConfig
145
+ - *(grpc)* Wire proto_path through detect_protocol and lib.rs
146
+ - *(grpc)* Pass grpc_use_reflection through detect_protocol
147
+ - *(cli)* Validate --ws-role with StrEnum choices
148
+ - *(protocol)* Extract is_protocol_url helper to deduplicate scheme checks #103
149
+ - *(cli)* Extract _build_request_options helper to deduplicate construction #107
150
+
151
+ ### Styling
152
+
153
+ - *(scripts)* Format release.py with ruff
154
+
155
+ ### Testing
156
+
157
+ - *(e2e)* Add WebSocket echo endpoint to mock server
158
+ - *(e2e)* Add WebSocket load test and unreachable server test
159
+ - *(e2e)* Add WebSocket tests
160
+ - *(e2e)* Add WebSocket PingPong and custom header E2E tests
161
+ - *(e2e)* Add WebSocket Stream mode and default payload E2E tests (#80)
162
+ - *(e2e)* Add WebSocket Stream mode and default payload E2E tests
163
+ - *(e2e)* Add WebSocket chaos mode E2E test
164
+ - *(e2e)* Strengthen WebSocket chaos test assertions
165
+ - *(e2e)* Add gRPC unreachable server test
166
+ - *(e2e)* Add gRPC chaos, headers, and deadline E2E tests
167
+ - *(e2e)* Add asyncio.wait_for timeout to gRPC E2E tests
168
+ - *(e2e)* Add WebSocket broadcast endpoint to mock server
169
+ - *(e2e)* Add pub/sub and streaming E2E tests with timeout guards
170
+ - *(e2e)* Add HTTP/3 error-path and CLI option tests
171
+ ## [0.3.0] - 2026-08-13
172
+
173
+ ### Bug Fixes
174
+
175
+ - *(logging)* Log warning on invalid EnvFilter string (#59)
176
+ - *(logging)* Warn when log file creation fails (#60)
177
+ - *(cli)* Auto-detect value-taking flags in positional arg detection (#61)
178
+ - *(cli)* Map trace log level to custom level 5 instead of DEBUG (#63)
179
+
180
+ ### Documentation
181
+
182
+ - *(readme)* Add custom HTTP headers usage examples (#55)
183
+ - Add --form flag to README CLI reference
184
+ - Update roadmap to reflect recent project changes (#62)
185
+ - *(worker)* Document u64::MAX fallback for extreme latencies (#66)
186
+ - Consolidate testing guide into docs/testing.md
187
+ - *(docker)* Add Docker usage documentation
188
+ - *(changelog)* Add v0.3.0 release notes
189
+
190
+ ### Features
191
+
192
+ - *(rust)* Add form payload support to TestConfig and Content-Type logic
193
+ - *(python)* Add --form flag and type stubs
194
+ - *(cli)* Add --form payload support for URL-encoded request bodies (#56)
195
+ - *(metrics)* Add latency distribution, status code aggregation, and structured JSON repor (#72)
196
+
197
+ ### Miscellaneous Tasks
198
+
199
+ - *(dev)* Setup pre-commit hooks and Makefile for local pre-push checks (#58)
200
+ - *(github)* Add Docker build and push workflow for releases
201
+ - Rename GitHub organization strobe-ops to strobeops
202
+ - *(release)* Merge release branch for v0.3.0 #74
203
+
204
+ ### Other
205
+
206
+ - *(deps)* Add urlencoding crate for form payload encoding
207
+ - *(deps)* Add aiohttp dev dependency for e2e test server
208
+ - *(docker)* Add multi-stage Dockerfile for Maturin package
209
+ - *(docker)* Add .dockerignore to optimize build context
210
+ - *(docker)* Switch runtime container execution to non-root user
211
+ - *(rust)* Bump version to 0.3.0
212
+
213
+ ### Refactoring
214
+
215
+ - *(engine)* Unify load test execution via ConcurrencyStrategy (#54)
216
+ - *(worker)* Remove unused status_code and is_error from RequestMetric (#57)
217
+ - *(progress)* Remove unused `_total_duration` param from `create_progress_bar` (#64)
218
+
219
+ ### Testing
220
+
221
+ - Remove trivial allocator unit test (#65)
222
+ - *(e2e)* Add async mock server with status, delay, echo, and flaky endpoints
223
+ - Add e2e mock server (#67)
224
+ - *(e2e)* Add `cli_bin` fixture to detect strobengine CLI path (#68)
225
+ - *(e2e)* Harden mock server with AppKey types and header normalization
226
+ - *(e2e)* Switch mock_server fixture to threaded AppRunner
227
+ - *(e2e)* Add HTTP scenario tests against mock server
228
+ - *(e2e)* Harden mock server and consolidate testing docs
229
+ - *(e2e)* Add subprocess-based CLI interface tests (#70)
230
+ - *(e2e)* Configure --e2e pytest flag and CI pipeline step (#71)
231
+ ## [0.2.1] - 2026-08-03
232
+
233
+ ### Bug Fixes
234
+
235
+ - *(types)* Correct headers type in _strobengine.pyi from dict to list of tuples (#41)
236
+ - Replace build_client panic with proper error propagation (#42)
237
+ - Replace std::process::exit with safe PyKeyboardInterrupt on SIGINT (#43)
238
+ - *(progress)* Guard against zero total_duration in progress bar calculation (#44)
239
+ - Improve worker shutdown and panic handling (#45)
240
+ - *(metrics)* Normalize counter types to AtomicU64 for 32-bit safety (#46)
241
+ - *(cli)* Add type annotation to _output_results summary parameter (#48)
242
+
243
+ ### Documentation
244
+
245
+ - Add comment explaining SystemExit re-raise pattern (#50)
246
+
247
+ ### Miscellaneous Tasks
248
+
249
+ - Remove unnecessary clippy allow on run_load_test (#47)
250
+ - Add multi-architecture matrix for macOS wheel builds (#52)
251
+ - Prepare for release 0.2.1
252
+
253
+ ### Refactoring
254
+
255
+ - Extract magic number 8192 to named constant METRIC_CHANNEL_BUFFER (#49)
256
+ - Extract magic numbers to named constants across Rust and Python (#51)
257
+ ## [0.2.0] - 2026-08-02
258
+
259
+ ### Bug Fixes
260
+
261
+ - *(progress)* Downgrade expected HTTP errors from warn to debug
262
+ - *(cli)* Move logging flags to subcommands for natural syntax
263
+ - *(engine)* Resolve null options and attribute access bugs (#38)
264
+
265
+ ### Documentation
266
+
267
+ - Add benchmark methodology, infrastructure setup, and project roadmap
268
+ - Add tool versions to benchmark methodology (#29)
269
+ - Document verbosity, progress bar, and CLI flags
270
+ - Update roadmap to reflect changes (#34)
271
+ - Add HTTP method, body, and header documentation
272
+ - Add code examples (#37)
273
+ - *(changelog)* Update CHANGELOG.md for v0.2.0 release
274
+
275
+ ### Features
276
+
277
+ - *(reporter)* Add metric descriptions to CLI summary output (#30)
278
+ - Add chaos testing engine (#32)
279
+ - Add indicatif dependency for progress bar rendering
280
+ - Add progress bar module and live render loop
281
+ - *(metrics)* Add atomic fields to LiveCounters for active workers and latency tracking
282
+ - *(worker)* Track active workers and update live request metrics
283
+ - *(config)* Support no_progress flag in TestConfig
284
+ - *(engine)* Spawn live progress bar during load test runs
285
+ - *(cli)* Add --no-progress option to suppress live progress bar
286
+ - Progress indicators (#33)
287
+ - Add HTTP request configuration
288
+ - Support custom HTTP requests
289
+ - *(cli)* Add HTTP request options
290
+ - Add support for HTTP methods, request bodies, and custom headers (#35)
291
+ - Implement graceful shutdown on SIGINT (#39)
292
+
293
+ ### Miscellaneous Tasks
294
+
295
+ - *(release)* Prepare v0.1.0 changelog and tag
296
+ - Add PyPI publish workflow with tag-based triggering (#26)
297
+ - *(pyproject)* Add license metadata and project URLs, bump version
298
+ - *(release)* Merge v0.2.0 release prep into main (#40)
299
+
300
+ ### Performance
301
+
302
+ - Switch global allocator to mimalloc for reduced lock contention (#28)
303
+ - Optimize connection pooling with tcp_nodelay, pre-warming, and body consumption (#31)
304
+
305
+ ### Refactoring
306
+
307
+ - *(engine)* Encapsulate request options into RequestOptions dataclass (#36)
308
+
309
+ ### Testing
310
+
311
+ - *(config)* Simplify header setup in custom config test
312
+ ## [0.1.0] - 2026-07-23
313
+
314
+ ### Bug Fixes
315
+
316
+ - *(tests)* Fix backward-compat tests to go through main()
317
+ - *(docs)* Correct print_summary import and add results display to examples
318
+ - *(docs)* Correct print_summary import and add results display to examples (#23)
319
+
320
+ ### Documentation
321
+
322
+ - *(changelog)* Configure git-cliff and generate initial CHANGELOG.md (#16)
323
+ - Add logging flags and tracing crates to README
324
+
325
+ ### Features
326
+
327
+ - *(config)* Add TestConfig pyclass with Python default arguments (#5)
328
+ - *(metrics)* Add TestSummary pyclass and calculate_summary (#6)
329
+ - Add StrobEngine class with sync and async interfaces (#11)
330
+ - Dynamic load profiling (#17)
331
+ - *(cli)* Add -V/--version flag with importlib.metadata
332
+ - *(rust)* Add tracing instrumentation and init_logging binding
333
+ - *(cli)* Add -v/-q/--log-file flags with stderr logging
334
+ - *(logging)* Unify system logging (#20)
335
+
336
+ ### Miscellaneous Tasks
337
+
338
+ - Add Python environment and build artifacts to .gitignore
339
+ - Initialize strobengine hybrid workspace architecture
340
+ - *(cargo)* Fix formatting and wrap comment for abi3-py38 feature (#1)
341
+ - *(python)* Add __all__ to package init for explicit public API (#8)
342
+ - Add GitHub Actions workflow for Rust and Python checks (#10)
343
+ - Update minimum Python version to 3.13 for abi3-py313
344
+ - *(lint)* Add ruff rules and auto-fix pyupgrade suggestions
345
+ - Bump minimum python version to 3.13 and expand ruff rules (#21)
346
+ - Add TestPyPI publish workflow with OIDC trusted publishing
347
+ - Lower minimum Python version to 3.11 for broader compatibility
348
+ - Lower minimum Python version to 3.11 for broader compatibility (#24)
349
+ - Add testpypi environment to publish workflow
350
+ - Add testpypi environment to publish workflow (#25)
351
+ - Add PyPI publish workflow with tag-based triggering
352
+
353
+ ### Refactoring
354
+
355
+ - Clean up __init__.py public API exports (#14)
356
+ - *(cli)* Migrate CLI from argparse to typer (#18)