lean4-htt/tests/lean/run/async_select_socket.lean
Leonardo de Moura ef1dc21f1c
feat: use new grind? infrastructure to implement try? (#11197)
This PR implements `try?` using the new `finish?` infrastructure. It
also removes the old tracing infrastructure, which is now obsolete.
Example:

```lean
/--
info: Try these:
  [apply] grind
  [apply] grind only [findIdx, insert, = mem_indices_of_mem, = getElem?_neg, = getElem?_pos, = HashMap.mem_insert,
    = HashMap.getElem_insert, #1bba]
  [apply] grind only [findIdx, insert, = mem_indices_of_mem, = getElem?_neg, = getElem?_pos, = HashMap.mem_insert,
    = HashMap.getElem_insert]
  [apply] grind =>
    instantiate only [findIdx, insert, = mem_indices_of_mem]
    instantiate only [= getElem?_neg, = getElem?_pos]
    cases #1bba
    · instantiate only [findIdx]
    · instantiate only
      instantiate only [= HashMap.mem_insert, = HashMap.getElem_insert]
-/
#guard_msgs in
example (m : IndexMap α β) (a : α) (b : β) :
    (m.insert a b).findIdx a = if h : a ∈ m then m.findIdx a else m.size := by
  try?
```
2025-11-16 05:26:17 +00:00

105 lines
2.9 KiB
Text

import Std.Internal.Async.Timer
import Std.Internal.Async.TCP
import Std.Internal.Async.UDP
#exit -- TODO: remove `#exit` after nondet issue is resolved.
open Std Internal IO Async
namespace TCP
def testClient (addr : Net.SocketAddress) : Async String := do
let client ← TCP.Socket.Client.mk
client.connect addr
Selectable.one #[
.case (← Selector.sleep 1000) fun _ => return "Timeout",
.case (client.recvSelector 4096) fun data? => do
if let some data := data? then
return String.fromUTF8! data
else
return "Closed"
]
def test (serverFn : TCP.Socket.Server → Async Unit) (addr : Net.SocketAddress) : Async String := do
let server ← TCP.Socket.Server.mk
server.bind addr
server.listen 1
let serverTask ← async (serverFn server)
let clientTask ← async (testClient addr)
await serverTask
await clientTask
def testServerSend (server : TCP.Socket.Server) : Async Unit := do
let client ← server.accept
client.send (String.toUTF8 "Success")
def testServerTimeout (server : TCP.Socket.Server) : Async Unit := do
let client ← server.accept
Async.sleep 1500
client.shutdown
def testServerClose (server : TCP.Socket.Server) : Async Unit := do
let client ← server.accept
client.shutdown
/-- info: "Success" -/
#guard_msgs in
#eval test testServerSend (Net.SocketAddressV4.mk (.ofParts 127 0 0 1) 7070) |>.block
/-- info: "Closed" -/
#guard_msgs in
#eval test testServerClose (Net.SocketAddressV4.mk (.ofParts 127 0 0 1) 7071) |>.block
/-- info: "Timeout" -/
#guard_msgs in
#eval test testServerTimeout (Net.SocketAddressV4.mk (.ofParts 127 0 0 1) 7072) |>.block
end TCP
namespace UDP
def testClient (addr : Net.SocketAddress) : Async String := do
IO.println "sending client"
let client ← UDP.Socket.mk
client.connect addr
client.send "ping".toUTF8
Selectable.one #[
.case (← Selector.sleep 1000) fun _ => return "Timeout",
.case (client.recvSelector 4096) fun (data, _) => do
return String.fromUTF8! data
]
def test (serverFn : UDP.Socket → Async Unit) (addr : Net.SocketAddress) : Async String := do
let server ← UDP.Socket.mk
server.bind addr
let serverTask ← async (serverFn server)
let clientTask ← async (testClient addr)
await serverTask
await clientTask
def testServerSend (server : UDP.Socket) : Async Unit := do
let (_, client?) ← server.recv 4096
let client := client?.get!
server.send (String.toUTF8 "Success") client
def testServerTimeout (server : UDP.Socket) : Async Unit := do
let (_, client?) ← server.recv 4096
let client := client?.get!
Async.sleep 1500
server.send (String.toUTF8 "Success") client
/--
info: "Success"
-/
#guard_msgs in
#eval test testServerSend (Net.SocketAddressV4.mk (.ofParts 127 0 0 1) 7075) |>.block
/--
info: "Timeout"
-/
#guard_msgs in
#eval test testServerTimeout (Net.SocketAddressV4.mk (.ofParts 127 0 0 1) 7075) |>.block
end UDP