Edit

kc3-lang/kc3/test/kc3s/facts_connection.kc3

Branch :

  • test/kc3s/facts_connection.kc3
  • require Facts
    require File
    require Socket
    require TLS
    require TLS.Config
    
    (r = fork()) ; void
    if (r < 0) do
      exit(1)
    end
    if r == 0 do
      TLS.init()
      server_config = TLS.Config.new()
      TLS.Config.set_cert_file(server_config, "/etc/ssl/fullchain.pem")
      TLS.Config.set_key_file(server_config, "/etc/ssl/private/privkey.pem")
      server_tls = TLS.server()
      TLS.configure(server_tls, server_config)
      server_facts = Facts.database()
      puts("server: adding pre-existing fact")
      Facts.add_tags(server_facts, :pre, :existing, :fact)
      puts("server: listening on 15003")
      server = Socket.listen(hostname(), "15003")
      if server.fd < 0 do
        puts("server: listen failed")
        exit_subprocess(1)
      end
      puts("server: listen OK, waiting for connection")
      if ! Facts.accept(server_facts, server, server_tls) do
        puts("server: accept failed")
        exit_subprocess(1)
      end
      Socket.close(server)
      puts("server: accepted connection, waiting for facts")
      sleep(2)
      puts("server: adding server fact")
      Facts.add_tags(server_facts, :server, :says, :hello)
      sleep(6)
      Facts.with_tags(server_facts, ?, ?, ?, fn (fact) {
        puts("server: received #{inspect(fact)}")
      })
      puts("server: OK")
      sleep(2)
      Facts.close_all(server_facts)
      Facts.delete(server_facts)
      TLS.Config.free(server_config)
      TLS.free(server_tls)
      exit_subprocess(0)
    else
      sleep(2)
      TLS.init()
      client_config = TLS.Config.new()
      TLS.Config.set_ca_file(client_config, TLS.ca_cert_path())
      client_facts = Facts.database()
      Facts.set_priority(client_facts, (U8) 1)
      puts("client: connecting to 15003")
      if ! Facts.connect(client_facts, hostname(), "15003", client_config) do
        puts("client: connect failed")
        exit(1)
      end
      sleep(1)
      puts("client: adding fact")
      Facts.add_tags(client_facts, :a, :b, :c)
      sleep(4)
      puts("client: checking for server facts")
      Facts.with_tags(client_facts, ?, ?, ?, fn (fact) {
        puts("client: has #{inspect(fact)}")
      })
      sleep(4)
      Facts.close_all(client_facts)
      Facts.delete(client_facts)
      TLS.Config.free(client_config)
      puts("client: OK")
      wait()
    end
    0