Release test report
Before release, every feature of DicomKit 1.0.0 is tested with every license type: no key, a free Developer key, Pro, Enterprise, an expired license and a revoked license. Each cell shows what should happen and what did.
Tested on Microsoft Windows 11 Pro 10.0.26200 build 26200, .NET 3.1.32 / 8.0.3 / 8.0.29 / 9.0.18 / 10.0.12, Visual Studio Community 2026 18.10.3 (18.10.12224.181).
Run 2ce13edc-f525-4ffb-ae07-648e5221cef9, source commit b804fb7: 780 automated tests, 768 passed, 0 failed, 12 skipped. Open a test for its steps, the evidence it recorded and the exact packages tested.
Each cell names what should happen with that license; a green tick means it did, on .NET 8, 9 and 10. Hover a cell for details.
- Works works
- Refused refused, naming the required tier (basics keep working)
- Asks for key stops and asks for a license key
- – not applicable
Functional tests
Every feature, run with each license type on .NET 8, 9 and 10.
Licensing
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| LIC-01 Online activation with a key | –Not applicable | Works Pass | Works Pass | Works Pass | Refused Pass | Refused Pass |
| LIC-02 No key: clear error | Asks for key Pass | –Not applicable | –Not applicable | –Not applicable | –Not applicable | –Not applicable |
| LIC-03 Key from DICOMKIT_LICENSE_KEY | –Not applicable | Works Pass | Works Pass | Works Pass | –Not applicable | –Not applicable |
| LIC-05 AddDicomKit in a hosted app | –Not applicable | –Not applicable | Works Pass | Works Pass | –Not applicable | –Not applicable |
| LIC-06 License file from the Activator | –Not applicable | Works Pass | Works Pass | –Not applicable | –Not applicable | –Not applicable |
| LIC-07 DICOMKIT_LICENSE_FILE | –Not applicable | –Not applicable | Works Pass | –Not applicable | –Not applicable | –Not applicable |
| LIC-08 Offline activation | –Not applicable | –Not applicable | Works Pass | Works Pass | –Not applicable | –Not applicable |
| LIC-09 Works offline after activation | –Not applicable | Works Pass | Works Pass | Works Pass | –Not applicable | –Not applicable |
| LIC-10 Expired paid license falls back | –Not applicable | –Not applicable | –Not applicable | –Not applicable | Works Pass | –Not applicable |
| LIC-11 Revoked license falls back | –Not applicable | –Not applicable | –Not applicable | –Not applicable | –Not applicable | Works Pass |
| LIC-12 Developer key | –Not applicable | Works Pass | –Not applicable | –Not applicable | –Not applicable | –Not applicable |
Files and data sets
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| FILE-01 Read a DICOM file | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-02 Write and read back | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-03 Malformed file tolerance | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-04 Large file, bounded memory | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-05 Anonymize | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-06 Batch processing | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-07 Mapping and audit log | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-08 Convert PDF to DICOM and back | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| FILE-09 Convert JPEG and PNG to DICOM | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
Networking (DIMSE)
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| NET-01 C-ECHO SCU and SCP | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| NET-02 C-STORE SCU and SCP | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| NET-03 C-FIND SCU (Patient and Study Root) | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| NET-04 C-FIND SCP query handler | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| NET-05 Modality Worklist SCU | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| NET-06 Modality Worklist SCP | Asks for key Pass | Works Pass | Works Pass | Works Pass | Refused Pass | Refused Pass |
| NET-07 C-MOVE and C-GET SCU | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| NET-08 C-MOVE and C-GET SCP | Asks for key Pass | Works Pass | Works Pass | Works Pass | Refused Pass | Refused Pass |
| NET-09 More than 2 concurrent associations | Asks for key Pass | Works Pass | Works Pass | Works Pass | Refused Pass | Refused Pass |
Imaging and codecs
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| IMG-01 Render to PNG and JPEG | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| IMG-02 Decode RLE | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| IMG-03 Decode JPEG baseline and lossless | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| IMG-04 Decode JPEG-LS | Asks for key Pass | Works Pass | Works Pass | Works Pass | Refused Pass | Refused Pass |
| IMG-05 Decode JPEG 2000 | Asks for key Pass | Works Pass | Works Pass | Works Pass | Refused Pass | Refused Pass |
| IMG-06 Thumbnails and multi-frame | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
DICOMweb
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| WEB-01 DICOMweb client (QIDO, WADO, STOW) | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| WEB-02 DICOMweb server endpoints | Asks for key Pass | Works Pass | Refused Pass | Works Pass | Refused Pass | Refused Pass |
| WEB-03 Rendered images and thumbnails | Asks for key Pass | Works Pass | Refused Pass | Works Pass | Refused Pass | Refused Pass |
| WEB-04 Server decompression | Asks for key Pass | Works Pass | Refused Pass | Works Pass | Refused Pass | Refused Pass |
| WEB-05 QIDO sequence matching | Asks for key Pass | Works Pass | Refused Pass | Works Pass | Refused Pass | Refused Pass |
| WEB-06 STOW-RS with JSON metadata | Asks for key Pass | Works Pass | Refused Pass | Works Pass | Refused Pass | Refused Pass |
| WEB-07 UPS-RS worklist | Asks for key Pass | Works Pass | Refused Pass | Works Pass | Refused Pass | Refused Pass |
| WEB-08 Capabilities (OPTIONS) | Asks for key Pass | Works Pass | Refused Pass | Works Pass | Refused Pass | Refused Pass |
| WEB-09 Server without an Enterprise license | –Not applicable | –Not applicable | Works Pass | –Not applicable | Works Pass | Works Pass |
Command-line tool
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| CLI-01 dicomkit --version and --help | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| CLI-02 dicomkit echo, store, find | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| CLI-03 dicomkit move, worklist | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| CLI-04 dicomkit anonymize, dump | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
| CLI-05 No key: exit code 10 | Works Pass | –Not applicable | –Not applicable | –Not applicable | –Not applicable | –Not applicable |
License Activator
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| ACT-01 Window: machine id and activation | –Not applicable | Works Pass | Works Pass | Works Pass | –Not applicable | Refused Pass |
| ACT-02 Command line: status, print-env, remove | –Not applicable | –Not applicable | Works Pass | –Not applicable | –Not applicable | –Not applicable |
| ACT-03 Offline request and import | –Not applicable | –Not applicable | Works Pass | –Not applicable | –Not applicable | –Not applicable |
Samples
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| SMP-01 All seven samples build and run | Asks for key Pass | Works Pass | Works Pass | Works Pass | –Not applicable | –Not applicable |
Security testing
Hostile and crafted input: what DicomKit does with files built to attack the systems that handle them.
Security
| Test | No key | Developer | Pro | Enterprise | Expired | Revoked |
|---|---|---|---|---|---|---|
| SEC-01 Executable in the preamble is never passed on | Asks for key Pass | Works Pass | Works Pass | Works Pass | Works Pass | Works Pass |
Load testing
DicomKit 1.0.0 under sustained load: storage, query and retrieve, DICOMweb, 1 GB images, a one-hour soak and the cost of the license check. Client and server ran on one PC over the loopback network, so the numbers show what DicomKit sustains on that hardware, not network limits.
On one 24-core PC DicomKit 1.0.0 received 40,000 images of mixed modalities without a single error (every image accounted for, sampled pixel checksums equal), answered up to about 7,223 C-FIND queries per second, retrieved studies by C-MOVE and C-GET at up to 32 at a time without errors, and served DICOMweb requests at up to 64 clients without errors. 1 GiB images were sent, stored, uploaded by STOW-RS with default options and read back intact; in the 1 GiB C-STORE steps memory stayed below 264 MB per process. A 90-minute soak with 6,844,887 operations had no errors and no memory growth; the server's OS handle count moves with thread-pool worker turnover in the .NET runtime, not with DicomKit objects. License checks cost about 3.2 ns per call.
| Scenario | Best throughput | p95 latency | Errors | Result |
|---|---|---|---|---|
|
LOAD-01 C-STORE throughput
All 40,000 images arrived and passed the checks. Throughput rose from 156 MB/s on one association to about 673-702 MB/s at 16-64 associations; at 64 associations the PC's CPU averaged only 52 %, while the slowest images (17 MB DX, 32 MB XA) waited up to 2.1 s, so that step was not limited by CPU; the server was also writing about 8 GB of files per step (its share was not measured separately).
|
702 MB/s 64 associations
|
106 ms | 0 | Pass |
|
LOAD-02 C-FIND, C-MOVE and C-GET
No errors in any step, including C-MOVE at 16 and 32 studies at a time (about 2,894 new associations to the destination). C-FIND peaked at about 7,223 queries/s, C-MOVE at 1,145 MB/s and C-GET at 9,229 MB/s; the 32-study C-MOVE and C-GET steps were limited by the PC's CPU.
|
9,229 MB/s C-GET, 32 studies at a time
|
48.9 ms | 0 | Pass |
|
LOAD-03 DICOMweb (QIDO-RS, WADO-RS, STOW-RS)
No errors at any step; most steps at 32-64 clients were limited by the PC's CPU. The FileSystemDicomWebStore that ships as a reference store keeps every instance's metadata in memory: after 96,772 instances the server held 3,003 MB of managed memory (about 32 KB per instance), so a large archive needs its own IDicomWebStore.
|
266 MB/s STOW-RS, 32 clients
|
18.4 ms | 0 | Pass |
|
LOAD-04 Large files (1 GiB images)
All large images arrived intact and memory stayed bounded with default settings: at most 174 MB working set in the sender and 264 MB in the receiver while 8 GiB were in flight. One association moved a 1 GiB image in about 4.9 s (208 MB/s); STOW-RS stored it with default options in 2.7 s and WADO-RS read it back at 444 MB/s.
|
500 MB/s C-STORE 1 GiB, 4 in parallel
|
8,196 ms | 0 | Pass |
|
LOAD-05 Mixed load: 1 GiB images during normal traffic
Nothing failed, but the small images slowed down while 1 GiB images were moving: throughput fell from 2,440 to 1,231 images/s, p99 latency rose from 13.94 ms to 38.56 ms and the slowest image took 2.9 s.
|
762 MB/s small images alone
|
10.6 ms | 0 | Pass |
|
LOAD-06 Soak test (90 minutes)
No memory growth: over the last 30 minutes the server working set changed by 8.12 MB/h and the client by 9.41 MB/h, and there were no errors. The server's OS handle count kept rising slowly (807 at the start, 1,458 after 90 minutes, 151 per hour over the last 30 minutes) and a full garbage collection did not lower it; a handle census showed the growth is in Event handles (+471 in 12 minutes with the full mix, +102 with DicomServer alone and no web server). It is not caused by opening associations (6,000 short associations left the count flat), and it is not a DicomKit leak: two heap dumps of a 40-minute DICOM-only soak, 30 minutes apart, show every DicomKit and socket object count unchanged, while the extra Event and Thread handles match thread-pool worker threads that had exited and were waiting for the .NET runtime's periodic dead-thread cleanup (+17 dead workers, +19 thread handles, +46 event handles); by the end of that run the count had come back down.
|
371 ops/s C-FIND over 90 min
|
2.85 ms | 0 | Pass |
|
LOAD-07 License-check overhead
EnsureLicensed takes about 3.2 ns per call; even for the cheapest guarded operation (opening a 9 KB file in memory, about 5.0 us) that is under 0.1 %.
|
0 | Pass |
Soak: 90 minutes at 16 concurrent clients, 6,844,887 operations, 0 errors; memory 580 MB at the start, 786 MB at the end.
Test PC: Intel(R) Core(TM) i9-14900K, 24 cores / 32 threads, 64 GB RAM, NVMe SSD, Microsoft Windows 11 Pro build 26200.9711, .NET 10.0.12 (one PC, client and server on loopback). Enterprise license. Run a20bedea-bacd-468b-af8d-945829c4b81f, source commit b804fb7.
Resources
Found something that doesn't work as listed? Report an issue.