diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index 03fbd8079..8367565f8 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -392,6 +392,99 @@ std::ostream& operator<< (std::ostream& stream, const DTLSServerFlowCase& c) return stream; } +VOID TEST(KernelRTCTest, DTLSClientARQTest) +{ + srs_error_t err = srs_success; + + // No ARQ, check the number of packets. + if (true) { + MockDtlsCallback cio; SrsDtls client(&cio); + MockDtlsCallback sio; SrsDtls server(&sio); + cio.peer = &server; sio.peer = &client; + HELPER_EXPECT_SUCCESS(client.initialize("active", "dtls1.0")); + HELPER_EXPECT_SUCCESS(server.initialize("passive", "dtls1.0")); + + HELPER_EXPECT_SUCCESS(client.start_active_handshake()); + mock_wait_dtls_io_done(30, 1); + + EXPECT_TRUE(sio.r0 == srs_success); + EXPECT_TRUE(cio.r0 == srs_success); + + EXPECT_TRUE(cio.done); + EXPECT_TRUE(sio.done); + + EXPECT_EQ(1, cio.nn_client_hello); + EXPECT_EQ(1, sio.nn_server_hello); + EXPECT_EQ(1, cio.nn_certificate); + EXPECT_EQ(1, sio.nn_new_session); + EXPECT_EQ(0, sio.nn_change_cipher); + } + + // ClientHello lost, client retransmit the ClientHello. + if (true) { + MockDtlsCallback cio; SrsDtls client(&cio); + MockDtlsCallback sio; SrsDtls server(&sio); + MockBridgeDtlsIO b0(&cio, &server); MockBridgeDtlsIO b1(&sio, &client); + HELPER_EXPECT_SUCCESS(client.initialize("active", "dtls1.0")); + HELPER_EXPECT_SUCCESS(server.initialize("passive", "dtls1.0")); + + // Use very short interval for utest. + client.arq_first = 1 * SRS_UTIME_MILLISECONDS; + client.arq_interval = 1 * SRS_UTIME_MILLISECONDS; + + // Lost 2 packets, total packets should be 3. + // Note that only one server hello. + cio.nn_client_hello_lost = 2; + + HELPER_EXPECT_SUCCESS(client.start_active_handshake()); + mock_wait_dtls_io_done(10, 3); + + EXPECT_TRUE(sio.r0 == srs_success); + EXPECT_TRUE(cio.r0 == srs_success); + + EXPECT_TRUE(cio.done); + EXPECT_TRUE(sio.done); + + EXPECT_EQ(3, cio.nn_client_hello); + EXPECT_EQ(1, sio.nn_server_hello); + EXPECT_EQ(1, cio.nn_certificate); + EXPECT_EQ(1, sio.nn_new_session); + EXPECT_EQ(0, sio.nn_change_cipher); + } + + // Certificate lost, client retransmit the Certificate. + if (true) { + MockDtlsCallback cio; SrsDtls client(&cio); + MockDtlsCallback sio; SrsDtls server(&sio); + MockBridgeDtlsIO b0(&cio, &server); MockBridgeDtlsIO b1(&sio, &client); + HELPER_EXPECT_SUCCESS(client.initialize("active", "dtls1.0")); + HELPER_EXPECT_SUCCESS(server.initialize("passive", "dtls1.0")); + + // Use very short interval for utest. + client.arq_first = 1 * SRS_UTIME_MILLISECONDS; + client.arq_interval = 1 * SRS_UTIME_MILLISECONDS; + + // Lost 2 packets, total packets should be 3. + // Note that only one server NewSessionTicket. + cio.nn_certificate_lost = 2; + + HELPER_EXPECT_SUCCESS(client.start_active_handshake()); + mock_wait_dtls_io_done(10, 3); + + EXPECT_TRUE(sio.r0 == srs_success); + EXPECT_TRUE(cio.r0 == srs_success); + + EXPECT_TRUE(cio.done); + EXPECT_TRUE(sio.done); + + EXPECT_EQ(1, cio.nn_client_hello); + EXPECT_EQ(1, sio.nn_server_hello); + EXPECT_EQ(3, cio.nn_certificate); + EXPECT_EQ(1, sio.nn_new_session); + EXPECT_EQ(0, sio.nn_change_cipher); + } +} + VOID TEST(KernelRTCTest, DTLSServerARQTest) { srs_error_t err = srs_success;