From 56d373033d3b4419443f246d6b0688a4a030dcc6 Mon Sep 17 00:00:00 2001 From: Stefan Eissing Date: Mon, 9 Oct 2023 10:18:20 +0200 Subject: test2302: improve reliability - make result print collected write data, unless change in meta flags is detected - will show same result even when data arrives via several writecb invocations Closes #12068 --- tests/libtest/lib2302.c | 130 +++++++++++++++++++----------------------------- 1 file changed, 50 insertions(+), 80 deletions(-) diff --git a/tests/libtest/lib2302.c b/tests/libtest/lib2302.c index b581659a4..9e2b80044 100644 --- a/tests/libtest/lib2302.c +++ b/tests/libtest/lib2302.c @@ -26,97 +26,66 @@ #ifdef USE_WEBSOCKETS -#if 0 - -static int ping(CURL *curl, const char *send_payload) +struct ws_data { + CURL *easy; + char buf[1024*1024]; + size_t blen; + size_t nwrites; + int has_meta; + int meta_flags; +}; + +static void flush_data(struct ws_data *wd) { - size_t sent; - CURLcode result = - curl_ws_send(curl, send_payload, strlen(send_payload), &sent, CURLWS_PING); - fprintf(stderr, - "ws: curl_ws_send returned %u, sent %u\n", (int)result, (int)sent); + size_t i; - return (int)result; -} + if(!wd->nwrites) + return; -static int recv_pong(CURL *curl, const char *expected_payload) -{ - size_t rlen; - unsigned int rflags; - char buffer[256]; - CURLcode result = - curl_ws_recv(curl, buffer, sizeof(buffer), &rlen, &rflags); - if(rflags & CURLWS_PONG) { - int same = 0; - fprintf(stderr, "ws: got PONG back\n"); - if(rlen == strlen(expected_payload)) { - if(!memcmp(expected_payload, buffer, rlen)) { - fprintf(stderr, "ws: got the same payload back\n"); - same = 1; - } - } - if(!same) - fprintf(stderr, "ws: did NOT get the same payload back\n"); - } - else { - fprintf(stderr, "recv_pong: got %u bytes rflags %x\n", (int)rlen, rflags); - } - fprintf(stderr, "ws: curl_ws_recv returned %u, received %u\n", (int)result, - rlen); - return (int)result; -} + for(i = 0; i < wd->blen; ++i) + printf("%02x ", (unsigned char)wd->buf[i]); -/* just close the connection */ -static void websocket_close(CURL *curl) -{ - size_t sent; - CURLcode result = - curl_ws_send(curl, "", 0, &sent, CURLWS_CLOSE); - fprintf(stderr, - "ws: curl_ws_send returned %u, sent %u\n", (int)result, (int)sent); + printf("\n"); + if(wd->has_meta) + printf("RECFLAGS: %x\n", wd->meta_flags); + else + fprintf(stderr, "RECFLAGS: NULL\n"); + wd->blen = 0; + wd->nwrites = 0; } -static void websocket(CURL *curl) +static size_t add_data(struct ws_data *wd, const char *buf, size_t blen, + const struct curl_ws_frame *meta) { - int i = 0; - fprintf(stderr, "ws: websocket() starts\n"); - do { - if(ping(curl, "foobar")) - return; - if(recv_pong(curl, "foobar")) - return; - sleep(2); - } while(i++ < 10); - websocket_close(curl); + if((wd->nwrites == 0) || + (!!meta != !!wd->has_meta) || + (meta && meta->flags != wd->meta_flags)) { + if(wd->nwrites > 0) + flush_data(wd); + wd->has_meta = (meta != NULL); + wd->meta_flags = meta? meta->flags : 0; + } + + if(wd->blen + blen > sizeof(wd->buf)) { + return 0; + } + memcpy(wd->buf + wd->blen, buf, blen); + wd->blen += blen; + wd->nwrites++; + return blen; } -#endif static size_t writecb(char *buffer, size_t size, size_t nitems, void *p) { - CURL *easy = p; - size_t i; + struct ws_data *ws_data = p; size_t incoming = nitems; const struct curl_ws_frame *meta; (void)size; - for(i = 0; i < nitems; i++) - printf("%02x ", (unsigned char)buffer[i]); - printf("\n"); - meta = curl_ws_meta(easy); - if(meta) - printf("RECFLAGS: %x\n", meta->flags); - else - fprintf(stderr, "RECFLAGS: NULL\n"); + meta = curl_ws_meta(ws_data->easy); + incoming = add_data(ws_data, buffer, incoming, meta); - /* this assumes we get a simple TEXT frame first */ - { - CURLcode result = CURLE_OK; - fprintf(stderr, "send back a TEXT\n"); - (void)easy; - if(result) - nitems = 0; - } if(nitems != incoming) fprintf(stderr, "returns error from callback\n"); return nitems; @@ -126,26 +95,27 @@ int test(char *URL) { CURL *curl; CURLcode res = CURLE_OK; + struct ws_data ws_data; + global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if(curl) { - curl_easy_setopt(curl, CURLOPT_URL, URL); + memset(&ws_data, 0, sizeof(ws_data)); + ws_data.easy = curl; + curl_easy_setopt(curl, CURLOPT_URL, URL); /* use the callback style */ curl_easy_setopt(curl, CURLOPT_USERAGENT, "webbie-sox/3"); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ws_data); res = curl_easy_perform(curl); fprintf(stderr, "curl_easy_perform() returned %u\n", (int)res); -#if 0 - if(res == CURLE_OK) - websocket(curl); -#endif /* always cleanup */ curl_easy_cleanup(curl); + flush_data(&ws_data); } curl_global_cleanup(); return (int)res; -- cgit v1.2.3