Test Workflow: Plan and Run Protocol Campaigns
This chapter explains how ChargeLink turns a protocol test inventory into an executed campaign with verdicts and evidence, and how to use it without guessing. It covers the test surfaces and states clearly where a PASS comes from. Conformance test packages for testing your own device are not part of ChargeLink 0.5.0; contact DEVlink about availability.
The test surfaces
| Surface | Command family | Scope | Verdicts | License |
|---|---|---|---|---|
| Protocol-first campaigns | chargelink test | ISO 15118-2 (797 test-case identifiers from ISO 15118-4) and ISO 15118-20 (383 identifiers from ISO 15118-21 and ISO/PAS 15118-23); selection by SUT role, charging mode, test area, payment mode, security | pass / fail from a live-SUT or validated-replay evidence manifest; inconclusive in dry-run | planning free; test run licensed |
| Deterministic simulation | chargelink sim | Seeded paired EVSE/EVCC scenarios and TLS/PKI campaigns with transcript hashes | pass_internal_deterministic / expected_fault_path; replay verified by hash | simulation runs licensed; sim replay and the catalogues free |
Where a PASS comes from. ChargeLink never emits a PASS verdict for a protocol test case from the inventory alone. A case passes only when an evidence manifest states that the stimulus was applied, the expected behaviour was observed, the timing policy was satisfied, the state transition and transport were valid, and nothing unexpected was observed; and the manifest must identify either a live system-under-test session or a validated replay capture with its SHA-256. The campaign engine evaluates the manifest and binds it to the case. This is the product's claim boundary: the verdict is traceable engineering evidence, not certification.
The command groups scenario run, suite run and campaign report are not provided (exit 70, CL-UNSUPPORTED-001). Use the commands on this page.
Before running anything
The installation has a charger\ and a vehicle\ folder; the CLI is charger\bin\chargelink.exe.
$CL = 'C:\Program Files\DEVlink\ChargeLink\<VERSION>\charger\bin\chargelink.exe'
$Data = "$env:ProgramData\DEVlink\ChargeLink\data"
$Run = "$Data\tests\$(Get-Date -Format yyyyMMdd-HHmmss)"
New-Item -ItemType Directory -Force $Run | Out-Null
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json env doctor
chargelink --json license status
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test protocols list
Why: the doctor catches missing roots before a long run; the licence state decides whether licensed runs such as test run start (Licensing); the protocol list shows which inventories the installed release resolves (iso15118-2 → ISO 15118-4; iso15118-20 → ISO 15118-21 and ISO/PAS 15118-23). Standard selection is intentionally not exposed; you select the customer protocol.
Step 1 — discover areas and cases
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test areas list --protocol iso15118-20 --sut-role evse --charging-mode dc
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test cases list --protocol iso15118-20 --sut-role evse --charging-mode dc --test-area SessionSetup
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test cases list --protocol iso15118-2 --sut-role evcc --charging-mode ac --test-area ChargeParameterDiscovery
Each case carries case_id (for example TC21_SECC_SessionSetup_002), test_area, behavior_class, variant_class (positive/negative), execution_binding, execution_status (executable or blocked), the referenced requirement IDs, the timer IDs it depends on, and evidence_required: true. ISO 15118-20 EVSE DC resolves to 187 cases across 22 areas (Authorization 55, PowerDelivery 33, CertificateInstallation 30, SessionStop 20, ChargeLoop 19, V2GTP common and DC 16 each, ScheduleExchange 15, ServiceSelection 15, and so on).
Step 2 — create the plan
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test plan --protocol iso15118-20 --sut-role evse --charging-mode dc `
--test-area SessionSetup --evidence dry-run --output "$Run\plan"
Result: status: plan_ready, the selected and executable case counts, and campaign_plan.json under the output directory. Optional selectors: --payment-mode, --security, --case-id <SOURCE_CASE_ID> for one case, --pics FILE/--pixit FILE to narrow applicability, --max-cases N.
Step 3 — dry-run the campaign
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test run --protocol iso15118-20 --sut-role evse --charging-mode dc `
--test-area SessionSetup --evidence dry-run --max-cases 3 --output "$Run\dry"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test status --output "$Run\dry"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test report --output "$Run\dry"
A dry-run writes campaign_plan.json and campaign_status.json with campaign_status: planned. The status output lists, per case, the evidence_requirements (campaign.json, pics.json, pixit.json, stimulus_message.json, observed_message.json, timer_trace.json, protocol_state_trace.json, exi_trace.json, conformance_traceability.json, verdict.json), the PICS selector IDs and the PIXIT parameter IDs (PIXIT_NETWORK_INTERFACE, PIXIT_IPV6_LINK_LOCAL, PIXIT_V2G_TCP_PORT, PIXIT_SECURITY_MODE, PIXIT_RESPONSE_TIMEOUT_MS, ...). Use this to prepare the bench and the evidence collection.
Step 4 — capture evidence on the bench
Run the protocol session that exercises the case (for example the ISO 15118-20 EVSE listener with the vehicle under test) and keep the run directory. Then write an evidence manifest (a JSON file with the schema_version shown below) that maps each case to the checks and the trace files with their SHA-256:
{
"schema_version": "chargelink.protocol_test_evidence.v1",
"customer_protocol": "iso15118-20",
"sut_role": "evcc",
"charging_mode": "dc",
"test_area": "ChargeLoop",
"source_kind": "live_sut",
"capture_id": "capture-001",
"live_session": {
"session_id": "iso20-20260923-101500",
"sut_endpoint": "[fe80::d7d2:c8b6:1aa6:af7e%2]:50118",
"capture_started_at_utc": "2026-09-23T10:15:00Z",
"capture_completed_at_utc": "2026-09-23T10:16:30Z",
"transport": "ipv6-v2gtp-tcp-tls"
},
"cases": [
{
"case_id": "TC23_EVCC_ChargeLoop_003",
"execution_binding": "<execution_binding of the case from test cases list>",
"checks": {
"stimulus_applied": true,
"expected_behavior_observed": true,
"timing_policy_satisfied": true,
"state_transition_valid": true,
"transport_valid": true,
"unexpected_behavior_observed": false
},
"artifacts": [
{ "path": "traces/live-v2gtp-frames.jsonl", "kind": "protocol_trace", "sha256": "<64 hex>" }
]
}
]
}
Rules: source_kind is live_sut (then live_session is required) or validated_replay (then a validation block with validated: true, the validator, the time and the source_capture_sha256 is required). Every case needs at least one artifact with a SHA-256; obtain hashes from the run's manifest.json or Get-FileHash. Copy the execution_binding string unchanged from test cases list. Who fills in the checks: the engineer who reviewed the trace against the expected behaviour rule; ChargeLink records the decision with the evidence, it does not make it for you.
Step 5 — run with evidence and report
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test run --protocol iso15118-20 --sut-role evcc --charging-mode dc `
--test-area ChargeLoop --case-id TC23_EVCC_ChargeLoop_003 `
--evidence live --evidence-source "$Run\evidence_manifest.json" --output "$Run\live"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test status --output "$Run\live"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test report --output "$Run\live"
Outputs: campaign_plan.json, campaign_status.json (completed_pass, completed_fail or completed_inconclusive), verdicts.json, customer_report.json, evidence\source_manifest.json, evidence\evidence_index.json and artifact_manifest.json with SHA-256 per file. A case is pass only when all five positive checks are true and unexpected_behavior_observed is false. Use test stop --output DIR to mark an interrupted campaign as stopped.
Conformance test packages
Conformance test packages for testing your own device are not part of ChargeLink 0.5.0; contact DEVlink about availability. The test-case inventories are listed in the Test-Case Catalogue.
Interpreting results
| Outcome | Meaning | Operator action |
|---|---|---|
pass | Evidence manifest satisfied all checks for the case | Retain the run directory, manifest and traces together |
fail | A check was false or unexpected behaviour was observed | Inspect the trace and the SUT logs; do not edit the manifest to change the outcome |
inconclusive | Dry-run, or no evidence bound | Attach evidence and rerun |
blocked | Prerequisite absent (entitlement, hardware, applicability) | Correct the prerequisite; a blocked case is not a failure |
| not selected | PICS/PIXIT or selectors excluded the case | Confirm the exclusion reflects the SUT |
Practical regression workflow
- Save
env doctor, version andlicense statusoutputs with the run. test planthe area under test; review the PIXIT parameters it needs.- Run one bench session; verify artifact integrity.
- Write the evidence manifest with reviewed checks and hashes.
test run --evidence live; export the report.- Archive plan, manifest, traces, report and environment inventory together; compare with the last accepted baseline.

