///|
fn main raise {
  let (edge, service) = @support.pair(frame_bytes=1024)
  let (slow, _) = @support.sender(
    edge, service, "bulk-history", "sensors/history", 50U, 0U,
  )
  let (live, _) = @support.sender(
    edge, service, "live-samples", "sensors/live", 51U, 2U,
  )
  let (alerts, _) = @support.sender(
    edge, service, "alarm-events", "sensors/alarms", 52U, 1U,
  )
  let exact_id = 18446744073709551615UL
  let message = @amqp.Message::new([
    {
      descriptor: 0x73,
      body: List([
        ULong(exact_id),
        Null,
        Text("sensors/live"),
        Text("temperature"),
        Null,
        Null,
        Symbol("application/octet-stream"),
        Null,
        Null,
        Timestamp(1793232000123L),
      ]),
    },
    {
      descriptor: 0x74,
      body: MapValue([
        (Text("device"), ULong(exact_id)),
        (Text("unit"), Text("C")),
        (Text("quality"), UByte(100)),
      ]),
    },
    { descriptor: 0x75, body: Binary(b"\x00\x41\xa0\x00"), },
  ])
  assert_true(
    try {
      ignore(edge.send(slow, message, b"history"))
      false
    } catch {
      _ => true
    },
  )
  ignore(edge.send(live, message, b"sample-1"))
  ignore(edge.send(live, message, b"sample-2"))
  ignore(
    edge.send(
      alerts,
      @amqp.Message::data(b"threshold", properties=[("device", ULong(exact_id))]),
      b"alarm",
    ),
  )
  assert_eq(edge.link_credit(slow), 0U)
  assert_eq(edge.link_credit(live), 0U)
  service.receive(edge.drain())
  let events = service.events()
  assert_eq(events.length(), 3)
  let mut samples = 0
  for event in events {
    match event {
      Received(delivery) => {
        if delivery.tag != b"alarm" {
          samples += 1
          let properties = delivery.message.sections()[0]
          match properties.body {
            List(fields) => {
              assert_eq(
                @amqp.encode_value(fields[0]),
                b"\x80\xff\xff\xff\xff\xff\xff\xff\xff",
              )
              assert_true(fields[9] is Timestamp(1793232000123L))
            }
            _ => fail("typed properties required")
          }
        }
        service.acknowledge(delivery.id, Accepted)
      }
      _ => fail("only complete telemetry expected")
    }
  }
  edge.receive(service.drain())
  assert_eq(edge.events().length(), 3)
  assert_eq(samples, 2)
  assert_eq(edge.pending(), (0, 0))
  @support.close(edge, service)
  println(
    "telemetry: blocked history link, live samples and alarm link share a session; uint64 IDs and timestamps retained",
  )
}