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