AtlatestRepositorysigil-tls

sigil-tls / tree / test / fixturestls-client.c

1/* Exercise public native entry points and per-attempt result ownership. */
2#include "../../native/tls.c"
3static Value field(SigilVM *vm, Value result, const char *name) {
4 return sigil_dict_ref(vm, result, sigil_intern_keyword(vm, name, strlen(name)));
5}
6static const char *text_value(Value value) {
7 return sigil_is_string(value) ? ((SigilString *)sigil_as_ptr(value))->data : "none";
8}
9int main(int argc, char **argv)
11 if (argc < 3) return 64;
12 SigilVM *vm = sigil_vm_create();
13 if (!vm) return 70;
14 sigil__init_sigil_tls_module(vm);
15 if (argc > 3) {
16 ensure_tls_initialized();
17 mbedtls_x509_crt_free(&global_cacert);
18 mbedtls_x509_crt_init(&global_cacert);
19 if (mbedtls_x509_crt_parse_file(&global_cacert, argv[3]) != 0) return 65;
20 global_cacert_loaded = 1;
21 }
22 int repeat = getenv("PROBE_REPEAT") ? atoi(getenv("PROBE_REPEAT")) : 1;
23 int exit_code = 0;
24 for (int i = 0; i < repeat; i++) {
25 const char *host = i == 0 && getenv("PROBE_FIRST_BAD_HOST") ? "127.0.0.1" : argv[1];
26 Value args[] = {sigil_make_string(vm, host, strlen(host)),
27 sigil_fixnum(atoi(argv[2])), sigil_fixnum(3000), sigil_fixnum(1500)};
28 sigil__gc_push_temp_root(vm, args[0]);
29 long start = sigil_tls_now_ms();
30 Value result = native_tls_connect_details(vm, 4, args);
31 sigil__gc_push_temp_root(vm, result);
32 Value conn = field(vm, result, "connection");
33 printf("attempt=%d status=%s error=%ld state=%s protocol=%s verify=%ld elapsed=%ld\n",
34 i, text_value(field(vm, result, "status")), (long)sigil_as_fixnum(field(vm, result, "error-code")),
35 text_value(field(vm, result, "handshake-state")), text_value(field(vm, result, "protocol")),
36 (long)sigil_as_fixnum(field(vm, result, "verify-flags")), sigil_tls_now_ms() - start);
37 if (is_tls_connection(conn)) {
38 if (getenv("PROBE_ECHO")) {
39 const char *payload = "sigil-tls-roundtrip-0123456789";
40 Value write_args[] = {conn, sigil_make_string(vm, payload, strlen(payload))};
41 sigil__gc_push_temp_root(vm, write_args[1]);
42 Value n = native_tls_write(vm, 2, write_args);
43 if (!sigil_is_fixnum(n) || sigil_as_fixnum(n) != (int)strlen(payload)) return 71;
44 sigil__gc_pop_temp_root(vm);
45 Value read_args[] = {conn};
46 Value reply = native_tls_read(vm, 1, read_args);
47 if (!sigil_is_string(reply) || strcmp(text_value(reply), payload)) return 72;
48 puts("echo=ok");
49 }
50 Value close_args[] = {conn};
51 native_tls_close(vm, 1, close_args);
52 } else if (!(i == 0 && getenv("PROBE_FIRST_BAD_HOST"))) exit_code = 1;
53 sigil__gc_pop_temp_root(vm);
54 sigil__gc_pop_temp_root(vm);
55 }
56 sigil_vm_destroy(vm);
57 return exit_code;