{
  "part": 2,
  "title": "Folder-based transport + --servername",
  "reset": "standard",
  "steps": [
    { "id": "2.1", "title": "Confirm the config as shipped",
      "actions": [
        { "do": "config_get", "path": "transport.label", "store_as": "TLABEL" },
        { "do": "config_get", "path": "transport.mountPoint", "store_as": "TMOUNT" }
      ],
      "assertions": [
        { "type": "regex_present", "var": "TLABEL", "pattern": "^$", "message": "transport.label is empty" },
        { "type": "regex_present", "var": "TMOUNT", "pattern": "^/storage/testing/transport$", "message": "transport.mountPoint points at the folder" }
      ]
    },
    { "id": "2.2", "title": "Run source, then target, using --servername", "depends_on": ["2.1"],
      "actions": [
        { "do": "zfs_snapshot", "dataset": "{SRC}/ds1@part2" },
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 4, "log": "part2_source", "expect_exit": 0,
          "capture": { "name": "SRC_LOG" } },
        { "do": "run_sneakernet", "servername": "test-target", "verbosity": 4, "log": "part2_target", "expect_exit": 0,
          "capture": { "name": "TGT_LOG" } },
        { "do": "zfs_list_snapshots", "dataset": "{DST}/ds1", "capture": { "name": "DST1_SNAPS", "reduce": "join" } }
      ],
      "assertions": [
        { "type": "regex_present", "var": "SRC_LOG", "pattern": "Using folder-based transport at /storage/testing/transport", "message": "log shows folder-based transport in use" },
        { "type": "regex_absent",  "var": "SRC_LOG", "pattern": "Configuration file is empty or invalid", "message": "no empty-config error" },
        { "type": "regex_absent",  "var": "SRC_LOG", "pattern": "transport.label or transport.mountPoint must be set", "message": "no missing-transport error" },
        { "type": "regex_present", "var": "DST1_SNAPS", "pattern": "dst/ds1\\@part2", "message": "target received ds1's new snapshot" }
      ]
    },
    { "id": "2.3", "title": "Confirm the failure mode still works correctly", "depends_on": ["2.1"],
      "config": { "mutations": [ { "op": "set", "path": "transport.mountPoint", "value": "", "style": "single" } ] },
      "actions": [
        { "do": "run_sneakernet", "servername": "test-source", "verbosity": 1, "expect_exit": "any", "log": "part2_3",
          "capture": { "name": "OUT23" } }
      ],
      "assertions": [
        { "type": "regex_present", "var": "OUT23", "pattern": "Invalid config file: transport\\.label or transport\\.mountPoint must be set", "message": "the both-empty case fails with the expected message" }
      ]
    }
  ]
}
