WebDAV TCK
A Python port of the litmus WebDAV server protocol compliance test suite.
Overview
webdav-tck is a WebDAV server protocol compliance test suite that validates server implementations against RFC 4918 (HTTP Extensions for Web Distributed Authoring and Versioning). This is a modern Python rewrite of the original C-based litmus test suite with async/await support and comprehensive test coverage.
Key Highlights:
- 🚀 Modern async Python implementation
- ✅ 68 tests covering WebDAV Class 1 & 2 operations
- 🎨 Rich colored terminal output
- 📊 Detailed test reporting and debug logging
- 🔒 Full locking support (exclusive/shared, conditional requests)
- 🌐 UTF-8 and Unicode support
- 📁 Large file handling (>2GB) support
Features
- ✅ Basic Operations: OPTIONS, PUT, GET, MKCOL, DELETE
- ✅ COPY/MOVE: Resource and collection operations with Depth and Overwrite headers
- ✅ Properties: PROPFIND, PROPPATCH with custom and live properties
- ✅ Locking: WebDAV Class 2 locking (exclusive/shared, conditional requests)
- ✅ HTTP Protocol: Expect: 100-continue header handling
- ✅ Large Files: 2GB+ file handling with streaming support
Installation
From source
# Clone the repository
git clone https://github.com/abilian/webdav-tck.git
cd webdav-tck
# Install dependencies
uv sync
From PyPI (coming soon)
pip install webdav-tck
Usage
Command Line
# Basic usage
dav-tck http://localhost/webdav/
# With authentication
dav-tck http://localhost/webdav/ username password
# With HTTPS (ignore certificate errors)
dav-tck --insecure https://localhost/webdav/
# Quiet mode
dav-tck --quiet http://localhost/webdav/
# Run specific test suites
dav-tck --suites=basic,copymove,props,locks,http,largefile http://localhost/webdav/
# Use proxy
dav-tck --proxy=http://proxy.example.com:8080 http://localhost/webdav/
Note: The command is available as both dav-tck and litmus after installation.
Options
--proxy, -p URL: Use specified HTTP proxy--system-proxy, -s: Use system proxy configuration--client-cert, -c FILE: Use PKCS#12 client certificate--insecure, -i: Ignore TLS certificate verification failures--quiet, -q: Use abbreviated output format--colour/--no-colour: Force color output on/off (default: auto-detect)--suites LIST: Comma-separated list of test suites to run
Test Suites
Basic (11 tests)
Tests fundamental HTTP and WebDAV operations:
- OPTIONS request and DAV header checking
- PUT/GET with byte-for-byte comparison
- UTF-8 characters in URIs
- MKCOL (create collection)
- DELETE (resources and collections)
- Error handling (409, 404, 415 status codes)
COPY/MOVE (7 tests)
Tests resource and collection operations:
- Simple COPY operations
- Overwrite behavior (Overwrite: T/F headers)
- Copying into non-existent collections (409 responses)
- Recursive collection copying (Depth: infinity)
- Shallow collection copying (Depth: 0)
- MOVE operations with lock handling
- Collection moves with members
Properties (11 tests)
Tests property manipulation:
- PROPFIND with various depths
- Invalid XML handling (400 responses)
- Setting custom properties via PROPPATCH
- Property persistence across MOVE
- Deleting and replacing properties
- Null namespace properties
- High Unicode character support (U+10000)
- Well-formed XML validation
- Live properties (getlastmodified)
Locks (36 tests)
Tests WebDAV Class 2 locking:
- Exclusive and shared locks
- Lock discovery via PROPFIND
- Lock refresh operations
- Owner vs non-owner access control
- Lock token management
- Conditional PUT with If: headers
- Complex conditional requests (lock token + ETag)
- Collection locking (Depth: infinity)
- Indirect lock refresh via collection members
- Lock-null resources (LOCK on unmapped URLs)
- Locks don't follow COPY operations
HTTP (1 test)
Tests HTTP protocol compliance:
- Expect: 100-continue header handling
- Raw socket communication for protocol testing
- Interim response validation
Large Files (2 tests)
Tests handling of files larger than 2GB:
- Streaming PUT for large files (2GB+)
- Streaming GET with content verification
- 64-bit offset support verification
- Memory-efficient chunked transfers
Development
Setup
# Install development dependencies
uv sync
# Run tests
uv run pytest
# Type checking
uv run mypy src/
uv run pyrefly src/
# Linting and formatting
uv run ruff check src/ tests/
uv run ruff format src/ tests/
Project Structure
webdav_tck/
├── src/webdav_tck/ # Main package
│ ├── framework/ # Test framework
│ │ ├── result.py # Result types
│ │ ├── runner.py # Test runner
│ │ └── suite.py # Suite management
│ ├── suites/ # Test suites
│ │ ├── basic.py # Basic operations (11 tests)
│ │ ├── copymove.py # COPY/MOVE (7 tests)
│ │ ├── props.py # Properties (11 tests)
│ │ ├── locks.py # Locking (36 tests)
│ │ ├── http.py # HTTP protocol (1 test)
│ │ └── largefile.py # Large files (2 tests)
│ ├── client.py # WebDAV HTTP client
│ ├── session.py # Session management
│ ├── xml_utils.py # XML builders/parsers
│ └── __main__.py # CLI entry point
├── tests/ # Unit tests
│ └── test_framework.py
└── pyproject.toml # Project configuration
Requirements
- Python 3.10+
- httpx (async HTTP client)
- lxml (XML processing)
- click (CLI interface)
- rich (colored output)
Implementation Status
Total: 68 tests implemented (100% complete!)
| Suite | Tests | Status |
|---|---|---|
| basic | 11 | ✅ Complete |
| copymove | 7 | ✅ Complete |
| props | 11 | ✅ Complete |
| locks | 36 | ✅ Complete |
| http | 1 | ✅ Complete |
| largefile | 2 | ✅ Complete |
Progress: 68/68 tests (100%)
License
GNU General Public License v2.0 or later (GPL-2.0-or-later)
This maintains compatibility with the original litmus project.
Credits
- Original litmus: Copyright (C) 1999-2025 Joe Orton
- Python port: Copyright (C) 2025 Abilian SAS and contributors
Contributing
Contributions are welcome!
References
Metadata
Release files for webdav-tck 2026.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| webdav_tck-2026.1.1.tar.gz | 27.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| webdav_tck-2026.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 63.1 kB
Release files / webdav_tck-2026.1.1.tar.gz
| Download URL | webdav_tck-2026.1.1.tar.gz |
|---|---|
| Size | 27.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f5b3d6b5db72d9fa568ed5500c51efcc642e4835a868ec8363158ef7a5ba2365
|
|
BLAKE2b-256 checksum How to use checksums |
0d9ea17c109813bf4c0396f16bd7e4f2c9709cc23befbca7ce2a926a91ec2871
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Release files / webdav_tck-2026.1.1-py3-none-any.whl
| Download URL | webdav_tck-2026.1.1-py3-none-any.whl |
|---|---|
| Size | 35.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b5a541c1e2ee02d6653e91b1e2892c4e6b27a37d88f1b7378213141346a2f817
|
|
BLAKE2b-256 checksum How to use checksums |
2e6a809b13a9cf9b03a272439401b2529d271a0a39cbc34061e695bc6e16dab6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|