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.
- strobengine-0.4.0/.dockerignore +34 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/.github/workflows/ci.yml +8 -4
- strobengine-0.4.0/.github/workflows/docker-release.yml +53 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/.github/workflows/publish-test.yml +9 -9
- {strobengine-0.2.1 → strobengine-0.4.0}/.github/workflows/publish.yml +9 -9
- strobengine-0.4.0/.pre-commit-config.yaml +47 -0
- strobengine-0.4.0/CHANGELOG.md +333 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/Cargo.lock +768 -100
- {strobengine-0.2.1 → strobengine-0.4.0}/Cargo.toml +20 -2
- strobengine-0.4.0/Dockerfile +28 -0
- strobengine-0.4.0/Makefile +11 -0
- strobengine-0.2.1/README.md → strobengine-0.4.0/PKG-INFO +125 -19
- strobengine-0.2.1/PKG-INFO → strobengine-0.4.0/README.md +108 -36
- strobengine-0.4.0/docs/docker.md +94 -0
- strobengine-0.4.0/docs/grpc.md +223 -0
- strobengine-0.4.0/docs/http3.md +164 -0
- strobengine-0.4.0/docs/release.md +57 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/docs/roadmap.md +27 -21
- strobengine-0.4.0/docs/table_of_contents.md +23 -0
- strobengine-0.4.0/docs/testing.md +131 -0
- strobengine-0.4.0/docs/websockets.md +304 -0
- strobengine-0.4.0/examples/grpc.py +147 -0
- strobengine-0.4.0/examples/http3.py +101 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/examples/http_methods.py +7 -7
- strobengine-0.4.0/examples/load_test.py +27 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/examples/spike_test.py +1 -1
- {strobengine-0.2.1 → strobengine-0.4.0}/examples/stress_test.py +1 -1
- strobengine-0.4.0/examples/websocket.py +147 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/pyproject.toml +9 -5
- strobengine-0.4.0/rust-toolchain.toml +4 -0
- strobengine-0.4.0/scripts/release.py +108 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/src/config.rs +180 -0
- strobengine-0.4.0/src/lib.rs +659 -0
- strobengine-0.4.0/src/logging.rs +44 -0
- strobengine-0.4.0/src/metrics.rs +419 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/src/progress.rs +1 -1
- strobengine-0.4.0/src/protocols/grpc.rs +438 -0
- strobengine-0.4.0/src/protocols/grpc_parser.rs +149 -0
- strobengine-0.4.0/src/protocols/grpc_reflection.rs +139 -0
- strobengine-0.4.0/src/protocols/http.rs +150 -0
- strobengine-0.4.0/src/protocols/http3.rs +585 -0
- strobengine-0.4.0/src/protocols/mod.rs +108 -0
- strobengine-0.4.0/src/protocols/websocket.rs +1013 -0
- strobengine-0.4.0/src/strobengine/_strobengine.pyi +145 -0
- strobengine-0.4.0/src/strobengine/cli.py +739 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/src/strobengine/engine.py +50 -2
- strobengine-0.4.0/src/strobengine/reporter.py +209 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/tests/conftest.py +9 -0
- strobengine-0.4.0/tests/e2e/__init__.py +0 -0
- strobengine-0.4.0/tests/e2e/conftest.py +72 -0
- strobengine-0.4.0/tests/e2e/mock_server.py +132 -0
- strobengine-0.4.0/tests/e2e/test_cli_interface.py +149 -0
- strobengine-0.4.0/tests/e2e/test_grpc_e2e.py +78 -0
- strobengine-0.4.0/tests/e2e/test_http3_e2e.py +74 -0
- strobengine-0.4.0/tests/e2e/test_http_scenarios.py +84 -0
- strobengine-0.4.0/tests/e2e/test_performance_sanity.py +61 -0
- strobengine-0.4.0/tests/e2e/test_websocket_e2e.py +184 -0
- strobengine-0.4.0/tests/fixtures/service.proto +16 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/tests/test_engine.py +18 -5
- {strobengine-0.2.1 → strobengine-0.4.0}/tests/test_reporter.py +36 -5
- strobengine-0.4.0/uv.lock +799 -0
- strobengine-0.2.1/CHANGELOG.md +0 -131
- strobengine-0.2.1/examples/load_test.py +0 -14
- strobengine-0.2.1/src/lib.rs +0 -493
- strobengine-0.2.1/src/logging.rs +0 -34
- strobengine-0.2.1/src/metrics.rs +0 -150
- strobengine-0.2.1/src/strobengine/_strobengine.pyi +0 -72
- strobengine-0.2.1/src/strobengine/cli.py +0 -407
- strobengine-0.2.1/src/strobengine/reporter.py +0 -137
- strobengine-0.2.1/src/worker.rs +0 -162
- strobengine-0.2.1/uv.lock +0 -207
- {strobengine-0.2.1 → strobengine-0.4.0}/.gitignore +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/.python-version +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/LICENSE +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/cliff.toml +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/docs/benchmarks.md +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/docs/http_methods.md +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/docs/infrastructure.md +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/src/chaos.rs +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/src/strobengine/__init__.py +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/src/strobengine/constants.py +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/src/strobengine/py.typed +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/tests/__init__.py +0 -0
- {strobengine-0.2.1 → strobengine-0.4.0}/tests/test_cli.py +0 -0
- {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)
|