From 3b8a64520dda3df135ffa4c7577eaf622bd85b4b Mon Sep 17 00:00:00 2001 From: Alex Bucknall Date: Wed, 18 Feb 2026 12:38:38 +0000 Subject: [PATCH] Add high-speed binary file upload to Notehub via Notecard Co-Authored-By: Claude Opus 4.6 --- .../{ => loopback}/binary_loopback_example.py | 0 examples/binary-mode/upload/README.md | 85 +++ .../upload/binary_upload_example.py | 90 +++ examples/binary-mode/upload/blues_logo.png | Bin 0 -> 222511 bytes examples/binary-mode/upload/receive_binary.py | 144 +++++ notecard/upload.py | 220 ++++++++ notecard/web.py | 10 +- test/test_upload.py | 521 ++++++++++++++++++ 8 files changed, 1068 insertions(+), 2 deletions(-) rename examples/binary-mode/{ => loopback}/binary_loopback_example.py (100%) create mode 100644 examples/binary-mode/upload/README.md create mode 100644 examples/binary-mode/upload/binary_upload_example.py create mode 100644 examples/binary-mode/upload/blues_logo.png create mode 100644 examples/binary-mode/upload/receive_binary.py create mode 100644 notecard/upload.py create mode 100644 test/test_upload.py diff --git a/examples/binary-mode/binary_loopback_example.py b/examples/binary-mode/loopback/binary_loopback_example.py similarity index 100% rename from examples/binary-mode/binary_loopback_example.py rename to examples/binary-mode/loopback/binary_loopback_example.py diff --git a/examples/binary-mode/upload/README.md b/examples/binary-mode/upload/README.md new file mode 100644 index 0000000..d4cd230 --- /dev/null +++ b/examples/binary-mode/upload/README.md @@ -0,0 +1,85 @@ +# Binary Upload Example + +Upload a binary file from a Notecard to a remote server via Notehub, using the note-python SDK's chunked upload mechanism. + +This example includes two scripts: + +- **`binary_upload_example.py`** — Runs on the host (e.g. Raspberry Pi) connected to a Notecard. Reads `blues_logo.png`, chunks it through the Notecard's binary buffer, and sends it to Notehub via `web.post`. +- **`receive_binary.py`** — A minimal HTTP server that receives the binary data routed from Notehub and saves it to disk. + +## Prerequisites + +- A [Blues Notecard](https://blues.com/products/notecard/) connected via USB serial +- A [Notehub](https://notehub.io) account and project +- Python 3.7+ +- `pyserial` and `note-python` installed (`pip install pyserial note-python`) +- [ngrok](https://ngrok.com/) (or another tunnel) to expose the receive server publicly + +## Setup + +### 1. Start the receive server + +On the machine where you want to receive files: + +```bash +python3 receive_binary.py +``` + +This starts an HTTP server on port 8080 (pass a different port as an argument if needed). Files are saved to the current directory. + +### 2. Expose the server with ngrok + +In a separate terminal: + +```bash +ngrok http 8080 +``` + +Copy the HTTPS forwarding URL (e.g. `https://abc123.ngrok.io`). + +### 3. Create a Notehub proxy route + +In [Notehub](https://notehub.io), go to your project's **Routes** and create a new **General HTTP/HTTPS** route: + +- **Route alias**: `upload` +- **URL**: your ngrok HTTPS URL + +### 4. Configure and run the upload script + +Edit `binary_upload_example.py` and set: + +- **`PRODUCT_UID`** — your Notehub product UID (e.g. `com.your-company:your-project`) +- **`ROUTE_ALIAS`** — the route alias from step 3 (default: `upload`) +- **Serial port** — update the `serial.Serial(...)` path to match your Notecard's port + +Then run: + +```bash +python3 binary_upload_example.py +``` + +The script will: + +1. Connect the Notecard to Notehub and wait for a connection +2. Read `blues_logo.png` (~222 KB) +3. Upload it in 64 KB chunks, printing progress after each chunk +4. Print a summary with total bytes, duration, and throughput + +### 5. Check the output + +The receive server prints a line for each file received: + +``` +Listening on port 8080. Saving files to: /your/current/directory +Press Ctrl+C to stop. + +[14:23:01] Received 222,511 bytes -> blues_logo.png +``` + +## Chunk size tuning + +The `MAX_CHUNK_SIZE` constant in `binary_upload_example.py` controls how large each chunk is. The Notecard's binary buffer can hold ~250 KB, but large single-chunk uploads over cellular can time out. The default of 64 KB is a good balance between throughput and reliability. Lower it to 32 KB if you experience timeouts on slow connections. + +## File naming + +Files are named using the Notecard's `label` field (sent as the `X-Notecard-Label` HTTP header by Notehub). If no label is present, the server generates a timestamped filename with an extension inferred from the file's magic bytes (`.png`, `.jpg`, `.pdf`, `.bin`, etc.). diff --git a/examples/binary-mode/upload/binary_upload_example.py b/examples/binary-mode/upload/binary_upload_example.py new file mode 100644 index 0000000..d684e70 --- /dev/null +++ b/examples/binary-mode/upload/binary_upload_example.py @@ -0,0 +1,90 @@ +"""note-python binary upload example. + +This example uploads binary data to a Notehub proxy route using the +high-speed chunked upload mechanism. The data is staged through the +Notecard's binary buffer and sent to Notehub via web.post. + +Before running this example: +1. Create a Proxy Route in your Notehub project (e.g. pointing to + https://httpbin.org/post or your own endpoint). +2. Set PRODUCT_UID below to your Notehub product UID. +3. Set ROUTE_ALIAS to the alias of your proxy route. + +Targets Raspberry Pi and other Linux systems. +""" +import os +import sys +import time + +sys.path.insert(0, os.path.abspath( + os.path.join(os.path.dirname(__file__), '..', '..'))) + +import serial # noqa: E402 + +import notecard # noqa: E402 +from notecard import hub # noqa: E402 +from notecard.upload import upload # noqa: E402 + + +PRODUCT_UID = 'com.your-company:your-product' +ROUTE_ALIAS = 'upload' +# Keep chunks small enough to reliably transfer over cellular. +# The Notecard buffer can hold ~250KB, but pushing that much data +# in a single web.post over cellular often times out. +MAX_CHUNK_SIZE = 65536 # 64 KB + + +def on_progress(info): + """Print upload progress after each chunk.""" + print(f' Chunk {info["chunk"]}/{info["total_chunks"]} ' + f'- {info["percent_complete"]:.1f}% ' + f'- {info["avg_bytes_per_sec"]:.0f} B/s ' + f'- ETA {info["eta_secs"]:.1f}s') + + +def run_example(): + """Connect to Notecard and upload binary data to Notehub.""" + port = serial.Serial('/dev/ttyUSB0', 115200) + card = notecard.OpenSerial(port, debug=True) + + # Connect the Notecard to Notehub. + hub.set(card, product=PRODUCT_UID, mode='continuous') + + # Wait for the Notecard to connect to Notehub. + print('Waiting for Notehub connection...') + while True: + rsp = hub.status(card) + connected = rsp.get('connected', False) + status_msg = rsp.get('status', '') + if connected: + print('Connected to Notehub.') + break + print(f' Not yet connected: {status_msg}') + time.sleep(2) + + # Read the image file to upload. + image_path = os.path.join(os.path.dirname(__file__), 'blues_logo.png') + with open(image_path, 'rb') as f: + data = f.read() + + print(f'Uploading {image_path} ({len(data)} bytes) ' + f'to route "{ROUTE_ALIAS}"...') + + result = upload( + card, + data, + route=ROUTE_ALIAS, + label='blues_logo.png', + content_type='image/png', + max_chunk_size=MAX_CHUNK_SIZE, + progress_cb=on_progress, + ) + + print(f'Upload complete: {result["bytes_uploaded"]} bytes ' + f'in {result["chunks"]} chunks, ' + f'{result["duration_secs"]:.1f}s ' + f'({result["bytes_per_sec"]:.0f} B/s)') + + +if __name__ == '__main__': + run_example() diff --git a/examples/binary-mode/upload/blues_logo.png b/examples/binary-mode/upload/blues_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ae29c9778f6a9f3faaf06a9a5204762e1a3f52b7 GIT binary patch literal 222511 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�VEA;+l|AB^9CR%gSk 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%0DFdr1)jQ|phdC>*`>W`^FZ14cDY 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/binary-mode/upload/receive_binary.py b/examples/binary-mode/upload/receive_binary.py new file mode 100644 index 0000000..90e4144 --- /dev/null +++ b/examples/binary-mode/upload/receive_binary.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 +"""Minimal HTTP server that receives binary files routed from Notehub. + +Receives binary files via a General HTTP/HTTPS route and saves them to +the current directory. + +Usage: + python3 receive_binary.py [port] + + Default port: 8080 + +Setup: + 1. Run this script (optionally with ngrok to expose it publicly): + python3 receive_binary.py + ngrok http 8080 + + 2. In Notehub, create a General HTTP/HTTPS route pointing to this + server's URL (or your ngrok URL). + + 3. Send a binary file from your Notecard: + {"req": "web.post", "route": "", "binary": true, ...} + + Files are saved to the current directory with a name derived from the + Notecard's "label" field, or falling back to a timestamped filename + with an extension inferred from the file's magic bytes. +""" + +import os +import sys +import time +from http.server import BaseHTTPRequestHandler, HTTPServer + +# Magic bytes used to infer file extensions +MAGIC_SIGNATURES = [ + (b"\x89PNG", "png"), + (b"\xff\xd8\xff", "jpg"), + (b"%PDF", "pdf"), + (b"GIF8", "gif"), + (b"PK\x03\x04", "zip"), + (b"\x1f\x8b", "gz"), +] + +DEFAULT_PORT = 8080 + + +def decode_chunked(data: bytes) -> bytes: + """Decode HTTP chunked transfer encoding.""" + output = b"" + pos = 0 + while pos < len(data): + end = data.find(b"\r\n", pos) + if end == -1: + break + size_str = data[pos:end].decode(errors="ignore").strip() + if not size_str: + break + try: + size = int(size_str, 16) + except ValueError: + break + if size == 0: + break + pos = end + 2 + output += data[pos:pos + size] + pos += size + 2 + return output + + +def infer_extension(data: bytes) -> str: + """Infer file extension from magic bytes.""" + for magic, ext in MAGIC_SIGNATURES: + if data[: len(magic)] == magic: + return ext + return "bin" + + +def make_filename(label: str, data: bytes) -> str: + """Return the label if provided, or a timestamped filename.""" + if label: + return label + ext = infer_extension(data) + timestamp = time.strftime("%Y%m%d_%H%M%S") + return f"received_{timestamp}.{ext}" + + +class BinaryReceiveHandler(BaseHTTPRequestHandler): + """Handle incoming binary POST requests from Notehub.""" + + def do_POST(self): + """Receive a binary file and save it to disk.""" + # Read body, handling both Content-Length and chunked encoding + content_length = self.headers.get("Content-Length") + transfer_encoding = self.headers.get("Transfer-Encoding", "") + + if content_length: + raw = self.rfile.read(int(content_length)) + else: + raw = self.rfile.read() + + if "chunked" in transfer_encoding.lower(): + body = decode_chunked(raw) + else: + body = raw + + if not body: + self._respond(400, "Empty body") + return + + # Notehub sets X-Notecard-Label to the note's label field + label = self.headers.get("X-Notecard-Label", "").strip() + filename = make_filename(label, body) + + filepath = os.path.join(os.getcwd(), filename) + with open(filepath, "wb") as f: + f.write(body) + + print(f"[{time.strftime('%H:%M:%S')}] Received {len(body):,} bytes -> {filename}") + self._respond(200, "OK") + + def _respond(self, code: int, message: str): + self.send_response(code) + self.send_header("Content-Type", "text/plain") + self.end_headers() + self.wfile.write(message.encode()) + + def log_message(self, format, *args): + """Suppress default request logging.""" + pass + + +def main(): + """Start the binary receive server.""" + port = int(sys.argv[1]) if len(sys.argv) > 1 else DEFAULT_PORT + server = HTTPServer(("", port), BinaryReceiveHandler) + print(f"Listening on port {port}. Saving files to: {os.getcwd()}") + print("Press Ctrl+C to stop.\n") + try: + server.serve_forever() + except KeyboardInterrupt: + print("\nStopped.") + + +if __name__ == "__main__": + main() diff --git a/notecard/upload.py b/notecard/upload.py new file mode 100644 index 0000000..e1203fd --- /dev/null +++ b/notecard/upload.py @@ -0,0 +1,220 @@ +"""High-speed binary file upload to Notehub via the Notecard.""" + +import sys +import time + +from notecard.cobs import cobs_encode +from notecard.notecard import Notecard + +if sys.implementation.name == 'cpython': + import hashlib + + def _md5_hash(data): + """Create an MD5 digest of the given data.""" + return hashlib.md5(data).hexdigest() +else: + from .md5 import digest as _md5_hash + +BINARY_STAGE_RETRIES = 50 +WEB_POST_RETRIES = 20 +WEB_POST_RETRY_DELAY_SECS = 15 + +try: + _monotonic = time.monotonic +except AttributeError: + _monotonic = time.time + + +def _stage_binary_chunk(card, chunk_data): + """Stage a binary chunk into the Notecard's binary buffer. + + Performs card.binary.put + raw byte transmit + verification, with + retries on failure. Mirrors the Go implementation's inner binary + transfer retry loop. + + Args: + card (Notecard): The Notecard object. + chunk_data (bytearray): The raw chunk data to stage. + + Raises: + Exception: If staging fails after all retries. + """ + encoded = cobs_encode(bytearray(chunk_data), ord('\n')) + req = { + 'req': 'card.binary.put', + 'cobs': len(encoded), + } + encoded.append(ord('\n')) + expected_len = len(chunk_data) + + tries_left = BINARY_STAGE_RETRIES + while tries_left > 0: + try: + card.lock() + rsp = card.Transaction(req, lock=False) + if 'err' in rsp: + raise Exception(rsp['err']) + card.transmit(encoded, delay=False) + except Exception: + tries_left -= 1 + if tries_left == 0: + raise + continue + finally: + card.unlock() + + try: + rsp = card.Transaction({'req': 'card.binary'}) + except Exception: + tries_left -= 1 + if tries_left == 0: + raise + continue + + if 'err' in rsp: + err_msg = rsp['err'] + if '{bad-bin}' in err_msg or '{io}' in err_msg: + tries_left -= 1 + if tries_left == 0: + raise Exception( + f'Failed to stage binary data: {err_msg}') + continue + raise Exception(f'Failed to stage binary data: {err_msg}') + + actual_len = rsp.get('length', 0) + if actual_len != expected_len: + tries_left -= 1 + if tries_left == 0: + raise Exception( + f'Binary length mismatch: expected {expected_len}, ' + f'got {actual_len}.') + continue + + return + + raise Exception('Failed to stage binary data after retries.') + + +def upload(card, data, route, target=None, label=None, + content_type='application/octet-stream', max_chunk_size=0, + progress_cb=None): + """Upload binary data to a Notehub proxy route via the Notecard. + + The data is chunked to fit in the Notecard's binary buffer, staged + via card.binary.put, and sent to Notehub via web.post with + binary:true. + + Args: + card (Notecard): The Notecard object. + data (bytes or bytearray): The binary data to upload. + route (str): The Notehub proxy route alias. + target (str, optional): URL path appended to the route (sent as + ``name`` in the web.post request). + label (str, optional): Filename label for the upload. + content_type (str): MIME type. Default ``application/octet-stream``. + max_chunk_size (int): Maximum chunk size in bytes. 0 means use the + Notecard's maximum buffer capacity. + progress_cb (callable, optional): Called after each chunk with a dict + containing progress information. + + Returns: + dict: Upload statistics with keys ``bytes_uploaded``, ``chunks``, + ``duration_secs``, and ``bytes_per_sec``. + + Raises: + ValueError: If ``route`` is empty or ``data`` is empty. + Exception: If the upload fails. + """ + if not route: + raise ValueError('route must not be empty.') + if not data: + raise ValueError('data must not be empty.') + + rsp = card.Transaction({'req': 'card.binary', 'reset': True}) + if 'err' in rsp and '{bad-bin}' not in rsp['err']: + raise Exception( + f'Error querying card.binary: {rsp["err"]}') + + buf_capacity = rsp.get('max', 0) + if buf_capacity == 0: + raise Exception( + 'Notecard binary buffer capacity is zero or not reported.') + + if max_chunk_size > 0: + chunk_size = min(max_chunk_size, buf_capacity) + else: + chunk_size = buf_capacity + + total_len = len(data) + total_chunks = (total_len + chunk_size - 1) // chunk_size + upload_start = _monotonic() + bytes_sent = 0 + + for chunk_idx in range(total_chunks): + offset = chunk_idx * chunk_size + end = min(offset + chunk_size, total_len) + chunk_data = data[offset:end] + chunk_len = len(chunk_data) + chunk_md5 = _md5_hash(chunk_data) + + _stage_binary_chunk(card, chunk_data) + + web_req = { + 'req': 'web.post', + 'route': route, + 'binary': True, + 'content': content_type, + 'offset': offset, + 'status': chunk_md5, + } + if target: + web_req['name'] = target + if label: + web_req['label'] = label + # Only set total for multi-chunk (segmented) uploads, matching + # the Go implementation. This tells Notehub to expect multiple + # segments and reassemble them. + if total_chunks > 1: + web_req['total'] = total_len + + web_tries = WEB_POST_RETRIES + while web_tries > 0: + rsp = card.Transaction(web_req) + result_code = rsp.get('result', 0) + if result_code >= 300 or 'err' in rsp: + web_tries -= 1 + if web_tries == 0: + err_detail = rsp.get('err', f'HTTP {result_code}') + raise Exception( + f'web.post failed after retries: {err_detail}') + time.sleep(WEB_POST_RETRY_DELAY_SECS) + _stage_binary_chunk(card, chunk_data) + continue + break + + bytes_sent += chunk_len + elapsed = _monotonic() - upload_start + current_bps = chunk_len / elapsed if elapsed > 0 else 0 + avg_bps = bytes_sent / elapsed if elapsed > 0 else 0 + remaining = total_len - bytes_sent + eta = remaining / avg_bps if avg_bps > 0 else 0 + + if progress_cb: + progress_cb({ + 'chunk': chunk_idx + 1, + 'total_chunks': total_chunks, + 'bytes_sent': bytes_sent, + 'total_bytes': total_len, + 'percent_complete': (bytes_sent / total_len) * 100, + 'bytes_per_sec': current_bps, + 'avg_bytes_per_sec': avg_bps, + 'eta_secs': eta, + }) + + duration = _monotonic() - upload_start + return { + 'bytes_uploaded': bytes_sent, + 'chunks': total_chunks, + 'duration_secs': duration, + 'bytes_per_sec': bytes_sent / duration if duration > 0 else 0, + } diff --git a/notecard/web.py b/notecard/web.py index 461c61d..22a02f9 100644 --- a/notecard/web.py +++ b/notecard/web.py @@ -95,7 +95,7 @@ def get(card, async_=None, binary=None, body=None, content=None, file=None, max= @validate_card_object -def post(card, async_=None, binary=None, body=None, content=None, file=None, max=None, name=None, note=None, offset=None, payload=None, route=None, seconds=None, status=None, total=None, verify=None): +def post(card, async_=None, binary=None, body=None, content=None, file=None, label=None, max=None, name=None, note=None, offset=None, payload=None, route=None, seconds=None, status=None, total=None, verify=None): """Perform a simple HTTP or HTTPS `POST` request against an external endpoint, and returns the response to the Notecard. Args: @@ -105,6 +105,7 @@ def post(card, async_=None, binary=None, body=None, content=None, file=None, max body (dict): The JSON body to send with the request. content (str): The MIME type of the body or payload of the response. Default is `application/json`. file (str): The name of the local-only Database Notefile (`.dbx`) to be used if the web request is issued asynchronously and you wish to store the response. + label (str): A label for the upload, typically a filename. max (int): The maximum size of the response from the remote server, in bytes. Useful if a memory-constrained host wants to limit the response size. name (str): A web URL endpoint relative to the host configured in the Proxy Route. URL parameters may be added to this argument as well (e.g. `/addReading?id=1`). note (str): The unique Note ID for the local-only Database Notefile (`.dbx`). Only used with asynchronous web requests (see `file` argument above). @@ -130,6 +131,8 @@ def post(card, async_=None, binary=None, body=None, content=None, file=None, max req["content"] = content if file: req["file"] = file + if label: + req["label"] = label if max is not None: req["max"] = max if name: @@ -154,7 +157,7 @@ def post(card, async_=None, binary=None, body=None, content=None, file=None, max @validate_card_object -def put(card, async_=None, binary=None, body=None, content=None, file=None, max=None, name=None, note=None, offset=None, payload=None, route=None, seconds=None, status=None, total=None, verify=None): +def put(card, async_=None, binary=None, body=None, content=None, file=None, label=None, max=None, name=None, note=None, offset=None, payload=None, route=None, seconds=None, status=None, total=None, verify=None): """Perform a simple HTTP or HTTPS `PUT` request against an external endpoint, and returns the response to the Notecard. Args: @@ -164,6 +167,7 @@ def put(card, async_=None, binary=None, body=None, content=None, file=None, max= body (dict): The JSON body to send with the request. content (str): The MIME type of the body or payload of the response. Default is `application/json`. file (str): The name of the local-only Database Notefile (`.dbx`) to be used if the web request is issued asynchronously and you wish to store the response. + label (str): A label for the upload, typically a filename. max (int): The maximum size of the response from the remote server, in bytes. Useful if a memory-constrained host wants to limit the response size. Default (and maximum value) is 8192. name (str): A web URL endpoint relative to the host configured in the Proxy Route. URL parameters may be added to this argument as well (e.g. `/updateReading?id=1`). note (str): The unique Note ID for the local-only Database Notefile (`.dbx`). Only used with asynchronous web requests (see `file` argument above). @@ -189,6 +193,8 @@ def put(card, async_=None, binary=None, body=None, content=None, file=None, max= req["content"] = content if file: req["file"] = file + if label: + req["label"] = label if max is not None: req["max"] = max if name: diff --git a/test/test_upload.py b/test/test_upload.py new file mode 100644 index 0000000..d065419 --- /dev/null +++ b/test/test_upload.py @@ -0,0 +1,521 @@ +import os +import sys +import pytest +from unittest.mock import MagicMock, patch, call + +sys.path.insert(0, + os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +import notecard # noqa: E402 +from notecard.upload import ( # noqa: E402 + upload, + _stage_binary_chunk, + _md5_hash, + BINARY_STAGE_RETRIES, + WEB_POST_RETRIES, +) + + +@pytest.fixture +def card(): + """Create a mock Notecard with the methods used by upload.""" + c = notecard.Notecard() + c.Transaction = MagicMock() + c.lock = MagicMock() + c.unlock = MagicMock() + c.transmit = MagicMock() + return c + + +@pytest.fixture +def sample_data(): + """A small sample payload for testing.""" + return bytearray(range(64)) + + +class TestUploadValidation: + def test_raises_on_empty_route(self, card, sample_data): + with pytest.raises(ValueError, match='route must not be empty'): + upload(card, sample_data, route='') + + def test_raises_on_none_route(self, card, sample_data): + with pytest.raises(ValueError, match='route must not be empty'): + upload(card, sample_data, route=None) + + def test_raises_on_empty_data(self, card): + with pytest.raises(ValueError, match='data must not be empty'): + upload(card, b'', route='my-route') + + def test_raises_on_none_data(self, card): + with pytest.raises(ValueError, match='data must not be empty'): + upload(card, None, route='my-route') + + def test_raises_on_zero_buffer_capacity(self, card, sample_data): + card.Transaction.return_value = {'max': 0} + with pytest.raises(Exception, match='capacity is zero'): + upload(card, sample_data, route='my-route') + + +class TestSingleChunkUpload: + def test_single_chunk_upload(self, card, sample_data): + """Data fits in one chunk -- one stage + one web.post.""" + buf_max = len(sample_data) + 100 + + call_count = [0] + + def transaction_side_effect(req, **kwargs): + call_count[0] += 1 + r = req.get('req', req.get('cmd', '')) + + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + result = upload(card, sample_data, route='my-route') + + assert result['bytes_uploaded'] == len(sample_data) + assert result['chunks'] == 1 + assert result['duration_secs'] >= 0 + assert result['bytes_per_sec'] >= 0 + + def test_single_chunk_sets_web_post_fields(self, card, sample_data): + """Verify the web.post request has the correct fields.""" + buf_max = len(sample_data) + 100 + captured_web_req = {} + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + captured_web_req.update(req) + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + upload(card, sample_data, route='my-route', target='/path', + label='file.bin', content_type='image/png') + + assert captured_web_req['route'] == 'my-route' + assert captured_web_req['binary'] is True + assert captured_web_req['name'] == '/path' + assert captured_web_req['label'] == 'file.bin' + assert captured_web_req['content'] == 'image/png' + assert captured_web_req['offset'] == 0 + # total should NOT be set for single-chunk uploads + assert 'total' not in captured_web_req + assert captured_web_req['status'] == _md5_hash(sample_data) + + def test_omits_name_and_label_when_not_provided(self, card, sample_data): + """target and label should be omitted from web.post when None.""" + buf_max = len(sample_data) + 100 + captured_web_req = {} + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + captured_web_req.update(req) + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + upload(card, sample_data, route='my-route') + + assert 'name' not in captured_web_req + assert 'label' not in captured_web_req + + +class TestMultiChunkUpload: + def test_multi_chunk_upload(self, card): + """Data requires multiple chunks.""" + data = bytearray(range(256)) * 4 # 1024 bytes + buf_max = 300 # forces ~4 chunks + chunk_idx = [0] + expected_chunks = (len(data) + buf_max - 1) // buf_max + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + # Return length matching the current chunk size + offset = chunk_idx[0] * buf_max + end = min(offset + buf_max, len(data)) + return {'length': end - offset} + if r == 'web.post': + chunk_idx[0] += 1 + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + result = upload(card, data, route='my-route') + + assert result['bytes_uploaded'] == len(data) + assert result['chunks'] == expected_chunks + + def test_sets_total_for_multi_chunk(self, card): + """total field should be set in web.post for multi-chunk uploads.""" + data = bytearray(range(256)) * 4 # 1024 bytes + buf_max = 300 + captured_web_reqs = [] + + chunk_idx = [0] + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + offset = chunk_idx[0] * buf_max + end = min(offset + buf_max, len(data)) + return {'length': end - offset} + if r == 'web.post': + captured_web_reqs.append(dict(req)) + chunk_idx[0] += 1 + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + upload(card, data, route='my-route') + + assert len(captured_web_reqs) > 1 + for web_req in captured_web_reqs: + assert web_req['total'] == len(data) + + def test_respects_max_chunk_size(self, card): + """max_chunk_size limits chunk size even when buffer is larger.""" + data = bytearray(100) + buf_max = 1000 + max_chunk = 30 + expected_chunks = (len(data) + max_chunk - 1) // max_chunk + web_post_offsets = [] + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + # Track the chunk size from the COBS-encoded length hint + # is not directly the raw size, so we track via web.post + # offset math instead. Just return success. + return {} + if r == 'card.binary': + # The verification call: we need to return the length of + # the chunk that was just staged. Compute from the last + # web.post offset we haven't sent yet. + chunk_idx = len(web_post_offsets) + offset = chunk_idx * max_chunk + end = min(offset + max_chunk, len(data)) + return {'length': end - offset} + if r == 'web.post': + web_post_offsets.append(req['offset']) + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + result = upload(card, data, route='r', max_chunk_size=max_chunk) + + assert result['chunks'] == expected_chunks + assert web_post_offsets == [i * max_chunk + for i in range(expected_chunks)] + + +class TestStageBinaryRetry: + def test_retries_on_transmit_exception(self, card): + """_stage_binary_chunk retries when transmit raises.""" + chunk = bytearray(b'\x01\x02\x03') + + card.Transaction.side_effect = [ + {}, # first card.binary.put + {}, # second card.binary.put (retry) + {'length': len(chunk)}, # verification after retry + ] + card.transmit.side_effect = [ + Exception('transmit error'), + None, + ] + + _stage_binary_chunk(card, chunk) + + assert card.transmit.call_count == 2 + + def test_retries_on_verification_error(self, card): + """_stage_binary_chunk retries when verification has an error.""" + chunk = bytearray(b'\x01\x02\x03') + + card.Transaction.side_effect = [ + {}, # first card.binary.put + {'err': '{bad-bin}'}, # first verification fails + {}, # second card.binary.put (retry) + {'length': len(chunk)}, # second verification ok + ] + + _stage_binary_chunk(card, chunk) + + assert card.transmit.call_count == 2 + + def test_retries_on_length_mismatch(self, card): + """_stage_binary_chunk retries when verified length doesn't match.""" + chunk = bytearray(b'\x01\x02\x03') + + card.Transaction.side_effect = [ + {}, # first card.binary.put + {'length': 999}, # first verification: wrong length + {}, # second card.binary.put (retry) + {'length': len(chunk)}, # second verification ok + ] + + _stage_binary_chunk(card, chunk) + + assert card.transmit.call_count == 2 + + def test_fails_after_all_retries_exhausted(self, card): + """_stage_binary_chunk raises after BINARY_STAGE_RETRIES failures.""" + chunk = bytearray(b'\x01\x02\x03') + + # Every verification fails + side_effects = [] + for _ in range(BINARY_STAGE_RETRIES): + side_effects.append({}) # card.binary.put + side_effects.append({'err': '{bad-bin}'}) # verification + card.Transaction.side_effect = side_effects + + with pytest.raises(Exception, match='Failed to stage binary data'): + _stage_binary_chunk(card, chunk) + + def test_locks_and_unlocks_on_each_attempt(self, card): + """lock/unlock called for each staging attempt.""" + chunk = bytearray(b'\x01\x02\x03') + + card.Transaction.side_effect = [ + {}, # card.binary.put + {'length': len(chunk)}, # verification + ] + + _stage_binary_chunk(card, chunk) + + card.lock.assert_called_once() + card.unlock.assert_called_once() + + def test_unlocks_even_on_exception(self, card): + """unlock is called even when transmit raises.""" + chunk = bytearray(b'\x01\x02\x03') + + card.Transaction.return_value = {} + card.transmit.side_effect = Exception('fail') + + with pytest.raises(Exception): + # Set retries to 1 via patching to avoid long test + with patch('notecard.upload.BINARY_STAGE_RETRIES', 1): + _stage_binary_chunk(card, chunk) + + assert card.unlock.call_count >= 1 + + +class TestWebPostRetry: + @patch('notecard.upload.WEB_POST_RETRY_DELAY_SECS', 0) + def test_retries_on_http_error(self, card, sample_data): + """web.post is retried when result >= 300.""" + buf_max = len(sample_data) + 100 + web_post_count = [0] + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + web_post_count[0] += 1 + if web_post_count[0] == 1: + return {'result': 500} + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + result = upload(card, sample_data, route='my-route') + + assert web_post_count[0] == 2 + assert result['bytes_uploaded'] == len(sample_data) + + @patch('notecard.upload.WEB_POST_RETRY_DELAY_SECS', 0) + def test_retries_on_web_post_err(self, card, sample_data): + """web.post is retried when response has 'err' field.""" + buf_max = len(sample_data) + 100 + web_post_count = [0] + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + web_post_count[0] += 1 + if web_post_count[0] == 1: + return {'err': 'some network error'} + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + upload(card, sample_data, route='my-route') + + assert web_post_count[0] == 2 + + @patch('notecard.upload.WEB_POST_RETRY_DELAY_SECS', 0) + @patch('notecard.upload.WEB_POST_RETRIES', 2) + def test_fails_after_web_post_retries_exhausted(self, card, sample_data): + """upload raises after WEB_POST_RETRIES web.post failures.""" + buf_max = len(sample_data) + 100 + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + return {'result': 500} + return {} + + card.Transaction.side_effect = transaction_side_effect + + with pytest.raises(Exception, match='web.post failed after retries'): + upload(card, sample_data, route='my-route') + + @patch('notecard.upload.WEB_POST_RETRY_DELAY_SECS', 0) + def test_re_stages_binary_on_web_post_retry(self, card, sample_data): + """Binary data is re-staged before each web.post retry.""" + buf_max = len(sample_data) + 100 + web_post_count = [0] + binary_put_count = [0] + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + binary_put_count[0] += 1 + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + web_post_count[0] += 1 + if web_post_count[0] == 1: + return {'result': 500} + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + upload(card, sample_data, route='my-route') + + # Initial stage + re-stage for the retry + assert binary_put_count[0] == 2 + + +class TestProgressCallback: + def test_progress_callback_called_per_chunk(self, card): + """progress_cb is called once per chunk with correct fields.""" + data = bytearray(100) + buf_max = 40 + expected_chunks = (len(data) + buf_max - 1) // buf_max + progress_calls = [] + chunk_idx = [0] + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + offset = chunk_idx[0] * buf_max + end = min(offset + buf_max, len(data)) + return {'length': end - offset} + if r == 'web.post': + chunk_idx[0] += 1 + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + def progress_cb(info): + progress_calls.append(info) + + upload(card, data, route='my-route', progress_cb=progress_cb) + + assert len(progress_calls) == expected_chunks + + # Verify first callback + first = progress_calls[0] + assert first['chunk'] == 1 + assert first['total_chunks'] == expected_chunks + assert first['total_bytes'] == len(data) + assert 'bytes_sent' in first + assert 'percent_complete' in first + assert 'bytes_per_sec' in first + assert 'avg_bytes_per_sec' in first + assert 'eta_secs' in first + + # Verify last callback + last = progress_calls[-1] + assert last['chunk'] == expected_chunks + assert last['bytes_sent'] == len(data) + assert last['percent_complete'] == 100.0 + + def test_no_error_when_progress_callback_is_none(self, card, sample_data): + """Upload works fine with no progress callback.""" + buf_max = len(sample_data) + 100 + + def transaction_side_effect(req, **kwargs): + r = req.get('req', '') + if r == 'card.binary' and req.get('reset'): + return {'max': buf_max} + if r == 'card.binary.put': + return {} + if r == 'card.binary': + return {'length': len(sample_data)} + if r == 'web.post': + return {'result': 200} + return {} + + card.Transaction.side_effect = transaction_side_effect + + upload(card, sample_data, route='my-route', + progress_cb=None)