Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
929693c
test: add regression tests for BagTransportReader panic detection
zhexuany Feb 26, 2026
745399e
test: add S3 authenticated upload helpers and BAG panic regression test
zhexuany Feb 26, 2026
186f835
fix: S3 URL format detection and BagTransportReader async handling
zhexuany Feb 26, 2026
74b3dc4
refactor: modularize s3_tests.rs into smaller files
zhexuany Feb 26, 2026
4eabf67
fmt code
zhexuany Feb 26, 2026
c0f3a41
fix: race condition in S3 RoboReader tests cleanup
zhexuany Feb 26, 2026
cdbf4a2
fix: MCAP streaming parser now handles CHUNK records with compression
zhexuany Feb 26, 2026
720add7
fix: lazy credential loading for S3 client
zhexuany Feb 26, 2026
e68f38b
fix: track per-channel message counts in BAG parser
zhexuany Feb 26, 2026
04e7898
feat: add StreamingRoboReader API for high-performance streaming
zhexuany Feb 27, 2026
31e7722
test: add format-specific tests for MCAP, BAG, and RRD
zhexuany Feb 27, 2026
4a85f2d
feat: finalize fail-fast S3 streaming correctness and guardrails
zhexuany Feb 27, 2026
d72b5e9
docs: fix streaming rustdoc examples to current API
zhexuany Feb 27, 2026
1dbb3a3
fix: address review feedback and clippy regressions
zhexuany Feb 27, 2026
7bffb62
test: gate strict S3 suites behind explicit CI flag
zhexuany Feb 27, 2026
dcf11f5
refactor: remove legacy transport readers, unify S3 gating under sing…
zhexuany Feb 28, 2026
f294749
test: add S3 streaming tests for MCAP and BAG formats
zhexuany Feb 28, 2026
ece7e82
test: add S3 frame alignment tests for AlignedFrame
zhexuany Feb 28, 2026
7eb9f70
ci: fix MinIO credential env var names; test: add comprehensive Align…
zhexuany Feb 28, 2026
2278ed5
fix: add MINIO_USER/MINIO_PASSWORD support to AwsCredentials::from_env
zhexuany Feb 28, 2026
fd91193
ci: add missing MINIO_USER and MINIO_PASSWORD env vars to S3 test step
zhexuany Feb 28, 2026
dcb3f75
lint: fix len_zero clippy warning
zhexuany Feb 28, 2026
9102280
ci: exclude S3 tests from general Rust test jobs (no MinIO)
zhexuany Feb 28, 2026
28a3c77
fix: gate remote-dependent tests by feature flag
zhexuany Feb 28, 2026
2c292ea
ci: merge S3 test workflow into main CI
zhexuany Feb 28, 2026
10ab53f
fix(tests): eliminate race condition in S3 streaming reader tests
zhexuany Feb 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 36 additions & 52 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,17 @@ jobs:
run: cargo build --bin robocodec --package robocodec-cli

- name: Run tests
run: cargo test
run: cargo test --no-default-features

rust-test-coverage:
name: Rust Tests + Coverage
runs-on: ubuntu-latest
env:
MINIO_ENDPOINT: http://127.0.0.1:9000
MINIO_BUCKET: test-bucket
MINIO_REGION: us-east-1
MINIO_USER: minioadmin
MINIO_PASSWORD: minioadmin
steps:
- uses: actions/checkout@v4

Expand All @@ -88,8 +94,34 @@ jobs:
if: steps.cache-llvm-cov.outputs.cache-hit != 'true'
run: cargo install cargo-llvm-cov

# Note: Do NOT use --all-features or --features python here.
# PyO3's extension-module feature prevents linking in standalone test binaries.
- name: Start MinIO container
run: |
docker run -d --name minio \
-p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
minio/minio:latest \
server /data --console-address ":9001"

- name: Wait for MinIO to be ready
run: |
timeout 60 bash -c 'until curl -f http://127.0.0.1:9000/minio/health/live; do sleep 1; done'

- name: Install MinIO client
run: |
wget -q https://dl.min.io/client/mc/release/linux-amd64/mc -O /tmp/mc
chmod +x /tmp/mc

- name: Configure MinIO alias and create bucket
run: |
/tmp/mc alias set robocodec-test http://127.0.0.1:9000 minioadmin minioadmin
/tmp/mc mb robocodec-test/test-bucket --ignore-existing

- name: Upload test fixtures to MinIO
run: |
/tmp/mc cp tests/fixtures/robocodec_test_0.mcap robocodec-test/test-bucket/test/robocodec_test_0.mcap
/tmp/mc cp tests/fixtures/robocodec_test_15.bag robocodec-test/test-bucket/test/robocodec_test_15.bag

- name: Run tests with coverage
run: cargo llvm-cov --workspace --features remote --lcov --output-path lcov-rust.info

Expand All @@ -116,7 +148,7 @@ jobs:
run: cargo build --bin robocodec --package robocodec-cli

- name: Run tests
run: cargo test
run: cargo test --no-default-features

python-test:
name: Python Tests
Expand Down Expand Up @@ -196,51 +228,3 @@ jobs:

- name: Test Python examples for API compatibility
run: make test-examples

s3-test:
name: S3 Streaming Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable

- uses: Swatinem/rust-cache@v2

- name: Start MinIO container
run: |
docker run -d --name minio \
-p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
minio/minio:latest \
server /data --console-address ":9001"

- name: Wait for MinIO to be ready
run: |
timeout 60 bash -c 'until curl -f http://127.0.0.1:9000/minio/health/live; do sleep 1; done'

- name: Install MinIO client
run: |
wget -q https://dl.min.io/client/mc/release/linux-amd64/mc -O /tmp/mc
chmod +x /tmp/mc

- name: Configure MinIO alias and create bucket
run: |
/tmp/mc alias set robocodec-test http://127.0.0.1:9000 minioadmin minioadmin
/tmp/mc mb robocodec-test/test-bucket --ignore-existing

- name: Upload MCAP fixture to MinIO
run: |
/tmp/mc cp tests/fixtures/robocodec_test_0.mcap robocodec-test/test-bucket/test/robocodec_test_0.mcap

- name: Upload BAG fixture to MinIO
run: |
/tmp/mc cp tests/fixtures/robocodec_test_15.bag robocodec-test/test-bucket/test/robocodec_test_15.bag

- name: Run S3 tests
env:
MINIO_ENDPOINT: http://127.0.0.1:9000
MINIO_BUCKET: test-bucket
MINIO_REGION: us-east-1
run: cargo test --features remote -- s3_integration_tests
96 changes: 0 additions & 96 deletions .github/workflows/test-s3.yml

This file was deleted.

2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ The library exports these key types at the top level:
- **S3**: `s3://bucket/path/file.mcap` (with optional `?endpoint=` and `?region=` query params)
- **HTTP/HTTPS**: `https://example.com/file.mcap` (via HttpTransport)

Transport-based reading uses `McapTransportReader` internally for streaming from remote sources.
Transport-based reading dispatches to format readers via `FormatReader::open_from_transport`.

- **`RoboWriter`** - Unified writer with format auto-detection
- `create(path)` - Create writer based on extension
Expand Down
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ crate-type = ["rlib", "cdylib"]
[[example]]
name = "upload-fixtures"
path = "scripts/upload-fixtures.rs"
required-features = ["remote"]

[dependencies]
serde = { version = "1.0", features = ["derive"] }
Expand All @@ -60,7 +61,7 @@ zstd = "0.13"
lz4_flex = "0.11"
bzip2 = "0.4"
crc32fast = "1.4"
mcap = "0.24"
mcap = { version = "0.24", features = ["zstd", "lz4"] }
rosbag = "0.6"
bytemuck = "1.15"
chrono = "0.4"
Expand Down
Loading