{
 "ticket": "U88 #125",
 "startedAt": "2026-10-27T19:58:17.732606+08:00",
 "finishedAt": "2026-10-27T20:00:43.406857+08:00",
 "input": "python3 labs/iot-device/run.py",
 "exitCode": 0,
 "environment": {
  "jdk": "openjdk version \"21.0.11\" 2026-04-21 LTS\nOpenJDK Runtime Environment (build 21.0.11+11-LTS)\nOpenJDK 64-Bit Server VM (build 21.0.11+11-LTS, mixed mode, sharing)",
  "maven": "Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)\nMaven home: /Users/gaochao/develop/maven-3.9.9\nJava version: 21.0.11, vendor: BellSoft, runtime: /Library/Java/JavaVirtualMachines/liberica-jdk-21.jdk/Contents/Home\nDefault locale: zh_CN_#Hans, platform encoding: UTF-8\nOS name: \"mac os x\", version: \"27.2\", arch: \"aarch64\", family: \"mac\"",
  "os": "macOS-27.2-arm64-arm-64bit",
  "arch": "arm64",
  "python": "3.9.6",
  "broker": "HiveMQ Community Edition 2026.5（嵌入式，真实 Netty MQTT 监听器与文件持久化）",
  "client": "HiveMQ MQTT Client 1.4.1（MQTT 5）",
  "dependencies": {
   "hivemq-community-edition-embedded": "2026.5",
   "netty-handler": "4.1.134.Final",
   "hivemq-extension-sdk": "4.52.0",
   "hivemq-mqtt-client": "1.4.1"
  }
 },
 "reports": [
  {
   "name": "study.iot.DeviceIdentityTest",
   "tests": "6",
   "failures": "0",
   "errors": "0",
   "skipped": "0"
  },
  {
   "name": "study.iot.MqttSessionTest",
   "tests": "9",
   "failures": "0",
   "errors": "0",
   "skipped": "0"
  }
 ],
 "testCount": 15,
 "results": [
  {
   "name": "jdk",
   "command": [
    "/Library/Java/JavaVirtualMachines/liberica-jdk-21.jdk/Contents/Home/bin/java",
    "-version"
   ],
   "exitCode": 0,
   "runnerExitCode": 0,
   "timedOut": false,
   "failure": null,
   "cleanupError": null,
   "observed": []
  },
  {
   "name": "maven",
   "command": [
    "/Users/gaochao/develop/maven-3.9.9/bin/mvn",
    "-version"
   ],
   "exitCode": 0,
   "runnerExitCode": 0,
   "timedOut": false,
   "failure": null,
   "cleanupError": null,
   "observed": []
  },
  {
   "name": "test-iot-device",
   "command": [
    "/Users/gaochao/develop/maven-3.9.9/bin/mvn",
    "-B",
    "-ntp",
    "-q",
    "clean",
    "test"
   ],
   "exitCode": 0,
   "runnerExitCode": 0,
   "timedOut": false,
   "failure": null,
   "cleanupError": null,
   "observed": [
    "U88 takeover=PASS sessionPresent=true oldKicked=true deliveredToNew=to-new-connection",
    "U88 qos2=PASS deliveredOnce=true",
    "U88 retained=PASS before=online afterClear=none",
    "U88 qosOffline=PASS qos0=lost qos1=[kept]",
    "U88 cleanStart=PASS sessionPresent=false leak=false",
    "U88 dupRedelivery=PASS dup=true",
    "U88 qosDowngrade=PASS published=2 subscribed=0 delivered=0",
    "U88 retainedRestart=PASS value=persisted",
    "U88 session=PASS restored=true offline=[cmd-1, cmd-2, cmd-3]",
    "U88 identity=PASS ownSub=[GRANTED_QOS_1] foreignSub=[NOT_AUTHORIZED] sessionPresent=false",
    "U88 aclPublish=PASS pubackReason=0x87 disconnectReason=0x87",
    "U88 identityReject=PASS reason=NOT_AUTHORIZED",
    "U88 embeddedDefaultAllowAll=PASS anonymous=SUCCESS",
    "U88 will=PASS abruptWill=offline gracefulWill=false",
    "U88 anonymousReject=PASS reason=NOT_AUTHORIZED"
   ]
  },
  {
   "name": "dependency",
   "command": [
    "/Users/gaochao/develop/maven-3.9.9/bin/mvn",
    "-B",
    "-ntp",
    "-q",
    "dependency:list",
    "-DoutputFile=/dev/stdout"
   ],
   "exitCode": 0,
   "runnerExitCode": 0,
   "timedOut": false,
   "failure": null,
   "cleanupError": null,
   "observed": []
  }
 ],
 "artifacts": {
  "pom.xml": "b7bbc446d76bf9293ece92b590d26690d0788201bb3d85791fc111a469d5c063",
  "run.py": "f4481f9624a11b559e5061127cf12a682179706fc51bc9926709cebde2e75f75",
  "src/test/java/study/iot/DeviceIdentityTest.java": "3a904ac251dfd7e239aa3fdf58bc38448030315d5684760685cbf5c0b73bccc0",
  "src/test/java/study/iot/MqttSessionTest.java": "78010a37921051e2851fd84e913080ead79e9e00d91813b9876e0e9d383ab633",
  "src/test/java/study/iot/support/DeviceSecurityMain.java": "f394a96506e758dbc79a961f305e0078e9042141a2039c9c1e909f5bbf0d7056",
  "src/test/java/study/iot/support/EmbeddedBroker.java": "8d9e0164f989ec1f14a2039b1617fc538fbe50bc020da1e8ae70565b6d91f37a",
  "src/test/java/study/iot/support/RawMqttProbe.java": "a3c01a63bb1f9cdd903bee6e3aaa872c8c445efafe74aa7ce9e63abe05b264d4",
  "src/test/java/study/iot/support/SimulatedDevice.java": "5fe01b2365c6955514dc81b3efd1f08d727d3431870b164f868d96fba443b28a",
  "src/test/resources/config.xml": "6f18a1b5a3c473b192e980231dde20f728ccc07bed5952c620eded832b683a8c",
  "src/test/resources/logback.xml": "a8bb4449bd3808cf0ce97d43faf4c6a975ee3ed61d1d3d527a83d1884360299e"
 },
 "logs": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u88/run-j75bb7s2",
 "cleanup": {
  "processes": "本入口创建的进程组已回收；每个用例的 EmbeddedHiveMQ 在 finally 中 stop+close，临时数据目录删除",
  "externalServices": "无外部服务；broker 监听 127.0.0.1 随机端口，仅使用临时目录与合成数据"
 },
 "limits": [
  "单机嵌入式 CE broker；无集群、桥接、共享订阅跨节点与生产容量压测",
  "TLS/mTLS、WebSocket 监听器、客户端证书与外部凭据提供方（OAuth/JWT/数据库认证）未运行",
  "权限模型是教学扩展：用户名/密码与设备 clientId 绑定，不是生产设备证书或动态注册流程",
  "broker 重启是正常 stop 后重开，不是 kill -9、断电或文件系统损坏恢复",
  "QoS 2 已验证协议握手与单次投递，但未覆盖跨 broker 集群去重与业务副作用 exactly-once"
 ]
}
