summaryrefslogtreecommitdiff
path: root/deps/wslay/tests/wslay_event_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/wslay/tests/wslay_event_test.c')
-rw-r--r--deps/wslay/tests/wslay_event_test.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/deps/wslay/tests/wslay_event_test.c b/deps/wslay/tests/wslay_event_test.c
index 983b3bc2..b023b89b 100644
--- a/deps/wslay/tests/wslay_event_test.c
+++ b/deps/wslay/tests/wslay_event_test.c
@@ -214,6 +214,71 @@ void test_wslay_event_send_fragmented_msg_with_ctrl(void)
wslay_event_context_free(ctx);
}
+void test_wslay_event_send_fragmented_msg_with_rsv1(void)
+{
+ wslay_event_context_ptr ctx;
+ struct wslay_event_callbacks callbacks;
+ struct my_user_data ud;
+ struct accumulator acc;
+ const char msg[] = "Hello";
+ struct scripted_data_feed df;
+ struct wslay_event_fragmented_msg arg;
+ const uint8_t ans[] = {
+ 0x41, 0x03, 0x48, 0x65, 0x6c,
+ 0x80, 0x02, 0x6c, 0x6f
+ };
+ scripted_data_feed_init(&df, (const uint8_t*)msg, sizeof(msg)-1);
+ df.feedseq[0] = 3;
+ df.feedseq[1] = 2;
+ memset(&callbacks, 0, sizeof(callbacks));
+ callbacks.send_callback = accumulator_send_callback;
+ memset(&acc, 0, sizeof(acc));
+ ud.acc = &acc;
+ wslay_event_context_server_init(&ctx, &callbacks, &ud);
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+
+ memset(&arg, 0, sizeof(arg));
+ arg.opcode = WSLAY_TEXT_FRAME;
+ arg.source.data = &df;
+ arg.read_callback = scripted_read_callback;
+ CU_ASSERT(0 ==
+ wslay_event_queue_fragmented_msg_ex(ctx, &arg, WSLAY_RSV1_BIT));
+ CU_ASSERT(0 == wslay_event_send(ctx));
+ CU_ASSERT_EQUAL(9, acc.length);
+ CU_ASSERT(0 == memcmp(ans, acc.buf, acc.length));
+ wslay_event_context_free(ctx);
+}
+
+void test_wslay_event_send_msg_with_rsv1(void)
+{
+ wslay_event_context_ptr ctx;
+ struct wslay_event_callbacks callbacks;
+ struct my_user_data ud;
+ struct accumulator acc;
+ const char msg[] = "Hello";
+ struct wslay_event_msg arg;
+ const uint8_t ans[] = {
+ 0xc1, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f /* "Hello" */
+ };
+
+ memset(&callbacks, 0, sizeof(callbacks));
+ callbacks.send_callback = accumulator_send_callback;
+ memset(&acc, 0, sizeof(acc));
+ ud.acc = &acc;
+ wslay_event_context_server_init(&ctx, &callbacks, &ud);
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+
+ memset(&arg, 0, sizeof(arg));
+ arg.opcode = WSLAY_TEXT_FRAME;
+ arg.msg = (const uint8_t*)msg;
+ arg.msg_length = 5;
+ CU_ASSERT(0 == wslay_event_queue_msg_ex(ctx, &arg, WSLAY_RSV1_BIT));
+ CU_ASSERT(0 == wslay_event_send(ctx));
+ CU_ASSERT(7 == acc.length);
+ CU_ASSERT(0 == memcmp(ans, acc.buf, acc.length));
+ wslay_event_context_free(ctx);
+}
+
void test_wslay_event_send_ctrl_msg_first(void)
{
wslay_event_context_ptr ctx;
@@ -246,6 +311,26 @@ void test_wslay_event_send_ctrl_msg_first(void)
wslay_event_context_free(ctx);
}
+void test_wslay_event_send_ctrl_msg_with_rsv1(void)
+{
+ wslay_event_context_ptr ctx;
+ struct wslay_event_callbacks callbacks;
+ struct wslay_event_msg arg;
+
+ memset(&callbacks, 0, sizeof(callbacks));
+
+ wslay_event_context_server_init(&ctx, &callbacks, NULL);
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+
+ memset(&arg, 0, sizeof(arg));
+ arg.opcode = WSLAY_PING;
+ arg.msg_length = 0;
+ CU_ASSERT(WSLAY_ERR_INVALID_ARGUMENT ==
+ wslay_event_queue_msg_ex(ctx, &arg, WSLAY_RSV1_BIT));
+
+ wslay_event_context_free(ctx);
+}
+
void test_wslay_event_queue_close(void)
{
wslay_event_context_ptr ctx;
@@ -422,6 +507,89 @@ void test_wslay_event_no_buffering(void)
wslay_event_context_free(ctx);
}
+static void
+text_rsv1_on_msg_recv_callback(wslay_event_context_ptr ctx,
+ const struct wslay_event_on_msg_recv_arg *arg,
+ void *user_data)
+{
+ CU_ASSERT(WSLAY_TEXT_FRAME == arg->opcode);
+ CU_ASSERT(WSLAY_RSV1_BIT == arg->rsv);
+}
+
+void test_wslay_event_recv_text_frame_with_rsv1(void)
+{
+ wslay_event_context_ptr ctx;
+ struct wslay_event_callbacks callbacks;
+ struct my_user_data ud;
+ const uint8_t msg[] = {
+ 0xc1, 0x07, 0xf2, 0x48, 0xcd, 0xc9, 0xc9, 0x07, 0x00 // "Hello" pm-deflate
+ };
+ const uint8_t fragmented[] = {
+ 0x41, 0x03, 0xf2, 0x48, 0xcd, // First fragment
+ 0x80, 0x04, 0xc9, 0xc9, 0x07, 0x00 // Second fragment, RSV1 bit off
+ };
+ const uint8_t bad_fragment[] = {
+ 0x41, 0x03, 0xf2, 0x48, 0xcd,
+ 0xc0, 0x04, 0xc9, 0xc9, 0x07, 0x00 // RSV1 bit on
+ };
+ const uint8_t pingmsg[] = {
+ 0xc9, 0x03, 0x46, 0x6f, 0x6f /* ping with "Foo" */
+ };
+ struct scripted_data_feed df;
+
+ /* Message marked with RSV1 should skip UTF-8 validation */
+ scripted_data_feed_init(&df, (const uint8_t*)msg, sizeof(msg));
+ memset(&callbacks, 0, sizeof(callbacks));
+ ud.df = &df;
+ callbacks.recv_callback = scripted_recv_callback;
+ callbacks.on_msg_recv_callback = text_rsv1_on_msg_recv_callback;
+ wslay_event_context_client_init(&ctx, &callbacks, &ud);
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+ CU_ASSERT(0 == wslay_event_recv(ctx));
+ CU_ASSERT(0 == wslay_event_want_write(ctx));
+ wslay_event_context_free(ctx);
+
+ /* UTF-8 validation is skipped for continuation frames if the
+ * initial frame was marked with RSV1 bit */
+ scripted_data_feed_init(&df, (const uint8_t*)fragmented, sizeof(fragmented));
+ memset(&callbacks, 0, sizeof(callbacks));
+ ud.df = &df;
+ callbacks.recv_callback = scripted_recv_callback;
+ callbacks.on_msg_recv_callback = text_rsv1_on_msg_recv_callback;
+ wslay_event_context_client_init(&ctx, &callbacks, &ud);
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+ CU_ASSERT(0 == wslay_event_recv(ctx));
+ CU_ASSERT(0 == wslay_event_want_write(ctx));
+ wslay_event_context_free(ctx);
+
+ /* disallow RSV1 */
+ scripted_data_feed_init(&df, (const uint8_t*)msg, sizeof(msg));
+ wslay_event_context_client_init(&ctx, &callbacks, &ud);
+ CU_ASSERT(0 == wslay_event_recv(ctx));
+ /* Close frame must be queued */
+ CU_ASSERT(wslay_event_want_write(ctx));
+ wslay_event_context_free(ctx);
+
+ /* RSV1 is not allowed in continuation frame */
+ scripted_data_feed_init(&df, (const uint8_t*)bad_fragment,
+ sizeof(bad_fragment));
+ wslay_event_context_client_init(&ctx, &callbacks, &ud);
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+ CU_ASSERT(0 == wslay_event_recv(ctx));
+ /* Close frame must be queued */
+ CU_ASSERT(wslay_event_want_write(ctx));
+ wslay_event_context_free(ctx);
+
+ /* RSV1 is not allowed in ping frame */
+ scripted_data_feed_init(&df, (const uint8_t*)pingmsg, sizeof(pingmsg));
+ wslay_event_context_client_init(&ctx, &callbacks, &ud);
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+ CU_ASSERT(0 == wslay_event_recv(ctx));
+ /* Close frame must be queued */
+ CU_ASSERT(wslay_event_want_write(ctx));
+ wslay_event_context_free(ctx);
+}
+
void test_wslay_event_frame_too_big(void)
{
wslay_event_context_ptr ctx;
@@ -489,3 +657,29 @@ void test_wslay_event_message_too_big(void)
wslay_event_get_status_code_sent(ctx));
wslay_event_context_free(ctx);
}
+
+void test_wslay_event_config_set_allowed_rsv_bits(void)
+{
+ wslay_event_context_ptr ctx;
+ struct wslay_event_callbacks callbacks;
+
+ memset(&callbacks, 0, sizeof(callbacks));
+
+ CU_ASSERT(0 == wslay_event_context_server_init(&ctx, &callbacks, NULL));
+ CU_ASSERT(WSLAY_RSV_NONE == ctx->allowed_rsv_bits);
+
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT);
+
+ CU_ASSERT(WSLAY_RSV1_BIT == ctx->allowed_rsv_bits);
+
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV1_BIT | WSLAY_RSV2_BIT |
+ WSLAY_RSV3_BIT);
+
+ CU_ASSERT(WSLAY_RSV1_BIT == ctx->allowed_rsv_bits);
+
+ wslay_event_config_set_allowed_rsv_bits(ctx, WSLAY_RSV2_BIT | WSLAY_RSV3_BIT);
+
+ CU_ASSERT(WSLAY_RSV_NONE == ctx->allowed_rsv_bits);
+
+ wslay_event_context_free(ctx);
+}