@@ -72660,6 +72660,77 @@ static int test_tls_cert_store_unchanged(void)
7266072660 return EXPECT_RESULT();
7266172661}
7266272662
72663+ static int test_wolfSSL_SendUserCanceled(void)
72664+ {
72665+ EXPECT_DECLS;
72666+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES)
72667+ size_t i;
72668+ struct {
72669+ method_provider client_meth;
72670+ method_provider server_meth;
72671+ const char* tls_version;
72672+ } params[] = {
72673+ #if defined(WOLFSSL_TLS13)
72674+ /* With WOLFSSL_TLS13_MIDDLEBOX_COMPAT a short ID will result in an error */
72675+ { wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3" },
72676+ #ifdef WOLFSSL_DTLS13
72677+ { wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3" },
72678+ #endif
72679+ #endif
72680+ #ifndef WOLFSSL_NO_TLS12
72681+ { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLSv1_2" },
72682+ #ifdef WOLFSSL_DTLS
72683+ { wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, "DTLSv1_2" },
72684+ #endif
72685+ #endif
72686+ #if !defined(NO_OLD_TLS)
72687+ { wolfTLSv1_1_client_method, wolfTLSv1_1_server_method, "TLSv1_1" },
72688+ #ifdef WOLFSSL_DTLS
72689+ { wolfDTLSv1_client_method, wolfDTLSv1_server_method, "DTLSv1_0" },
72690+ #endif
72691+ #endif
72692+ };
72693+
72694+ for (i = 0; i < sizeof(params)/sizeof(*params) && !EXPECT_FAIL(); i++) {
72695+ WOLFSSL_CTX *ctx_c = NULL;
72696+ WOLFSSL_CTX *ctx_s = NULL;
72697+ WOLFSSL *ssl_c = NULL;
72698+ WOLFSSL *ssl_s = NULL;
72699+ struct test_memio_ctx test_ctx;
72700+ WOLFSSL_ALERT_HISTORY h;
72701+
72702+ printf("Testing %s\n", params[i].tls_version);
72703+
72704+ XMEMSET(&h, 0, sizeof(h));
72705+ XMEMSET(&test_ctx, 0, sizeof(test_ctx));
72706+ ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s,
72707+ params[i].client_meth, params[i].server_meth), 0);
72708+
72709+ /* CH1 */
72710+ ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1);
72711+ ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ);
72712+
72713+ ExpectIntEQ(wolfSSL_SendUserCanceled(ssl_s), WOLFSSL_SHUTDOWN_NOT_DONE);
72714+
72715+ /* Alert closed connection */
72716+ ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1);
72717+ ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_ZERO_RETURN);
72718+
72719+ /* Last alert will be close notify because user_canceled should be
72720+ * followed by a close_notify */
72721+ ExpectIntEQ(wolfSSL_get_alert_history(ssl_c, &h), WOLFSSL_SUCCESS);
72722+ ExpectIntEQ(h.last_rx.code, close_notify);
72723+ ExpectIntEQ(h.last_rx.level, alert_warning);
72724+
72725+ wolfSSL_free(ssl_c);
72726+ wolfSSL_free(ssl_s);
72727+ wolfSSL_CTX_free(ctx_c);
72728+ wolfSSL_CTX_free(ctx_s);
72729+ }
72730+ #endif
72731+ return EXPECT_RESULT();
72732+ }
72733+
7266372734/*----------------------------------------------------------------------------*
7266472735 | Main
7266572736 *----------------------------------------------------------------------------*/
@@ -73989,6 +74060,7 @@ TEST_CASE testCases[] = {
7398974060 TEST_DECL(test_read_write_hs),
7399074061 TEST_DECL(test_get_signature_nid),
7399174062 TEST_DECL(test_tls_cert_store_unchanged),
74063+ TEST_DECL(test_wolfSSL_SendUserCanceled),
7399274064 /* This test needs to stay at the end to clean up any caches allocated. */
7399374065 TEST_DECL(test_wolfSSL_Cleanup)
7399474066};
0 commit comments