Skip to content

Commit

Permalink
Add tests to cover this new behavior.
Browse files Browse the repository at this point in the history
  • Loading branch information
anrossi committed Aug 30, 2024
1 parent 9624d80 commit d82f2c7
Showing 1 changed file with 163 additions and 0 deletions.
163 changes: 163 additions & 0 deletions src/test/lib/ApiTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4484,6 +4484,39 @@ void QuicTestConnectionParam()
QuicTest_QUIC_PARAM_CONN_ORIG_DEST_CID(Registration, ClientConfiguration);
}

struct TestTlsParamServerContext {
MsQuicConnection** Server;
CXPLAT_EVENT Event;
QUIC_STATUS GetParamStatus;
};

bool
TestTlsParamListenerCallback(
_In_ TestListener* Listener,
_In_ HQUIC ConnectionHandle)
{
TestTlsParamServerContext* Context = (TestTlsParamServerContext*)Listener->Context;
*Context->Server = new(std::nothrow) MsQuicConnection(
ConnectionHandle,
CleanUpManual,
[](MsQuicConnection* Connection, void* Context, QUIC_CONNECTION_EVENT* Event) {
if (Event->Type == QUIC_CONNECTION_EVENT_CONNECTED) {
QUIC_HANDSHAKE_INFO Info = {};
uint32_t Length = sizeof(Info);
((TestTlsParamServerContext*)Context)->GetParamStatus =
MsQuic->GetParam(
*Connection,
QUIC_PARAM_TLS_HANDSHAKE_INFO,
&Length,
&Info);
CxPlatEventSet(((TestTlsParamServerContext*)Context)->Event);
}
return QUIC_STATUS_SUCCESS;
},
Context);
return true;
}

//
// This test uses TEST_NOT_EQUAL(XXX, QUIC_STATUS_SUCCESS) to cover both
// OpenSSL and Schannel which return different error code.
Expand Down Expand Up @@ -4557,6 +4590,136 @@ void QuicTestTlsParam()
), QUIC_STATUS_SUCCESS);
}

//
// After handshake, no resumption
//
{
TestScopeLogger LogScope2("After handshake - no resumption");
MsQuicConfiguration ServerConfiguration(Registration, Alpn, ServerSelfSignedCredConfig);
TEST_TRUE(ServerConfiguration.IsValid());
TestListener Listener(
Registration,
TestTlsParamListenerCallback,
ServerConfiguration);
TEST_QUIC_SUCCEEDED(Listener.IsValid());
UniquePtr<MsQuicConnection> Server;
TestTlsParamServerContext ServerContext = { (MsQuicConnection**)&Server, {}, QUIC_STATUS_SUCCESS };
CxPlatEventInitialize(&ServerContext.Event, FALSE, FALSE);
Listener.Context = &ServerContext;

QuicAddr ServerLocalAddr;
TEST_QUIC_SUCCEEDED(Listener.Start(Alpn));
TEST_QUIC_SUCCEEDED(Listener.GetLocalAddr(ServerLocalAddr));

TestConnection Client(Registration);
TEST_TRUE(Client.IsValid());
TEST_QUIC_SUCCEEDED(
Client.Start(
ClientConfiguration,
QUIC_ADDRESS_FAMILY_INET,
"localhost",
ServerLocalAddr.GetPort()));

TEST_TRUE(Client.WaitForConnectionComplete());
TEST_TRUE(Server);
CxPlatEventWaitForever(ServerContext.Event);

//
// Validate the GetParam succeeded in the CONNECTED callback.
//
TEST_QUIC_SUCCEEDED(ServerContext.GetParamStatus);

QUIC_HANDSHAKE_INFO Info = {};
Length = sizeof(Info);
TEST_QUIC_SUCCEEDED(
MsQuic->GetParam(
Client.GetConnection(),
QUIC_PARAM_TLS_HANDSHAKE_INFO,
&Length,
&Info
));

//
// The server should have freed the TLS state by now, so this
// should fail.
//
Length = sizeof(Info);
TEST_EQUAL(
MsQuic->GetParam(
*Server,
QUIC_PARAM_TLS_HANDSHAKE_INFO,
&Length,
&Info),
QUIC_STATUS_INVALID_STATE);
}

//
// After handshake, with resumption
//
{
TestScopeLogger LogScope2("After handshake - with resumption");
MsQuicSettings Settings;
Settings.SetServerResumptionLevel(QUIC_SERVER_RESUME_ONLY);
MsQuicConfiguration ServerConfiguration(Registration, Alpn, Settings, ServerSelfSignedCredConfig);
TEST_TRUE(ServerConfiguration.IsValid());
TestListener Listener(
Registration,
TestTlsParamListenerCallback,
ServerConfiguration);
TEST_QUIC_SUCCEEDED(Listener.IsValid());
UniquePtr<MsQuicConnection> Server;
TestTlsParamServerContext ServerContext = { (MsQuicConnection**)&Server, {}, QUIC_STATUS_SUCCESS };
CxPlatEventInitialize(&ServerContext.Event, FALSE, FALSE);
Listener.Context = &ServerContext;

QuicAddr ServerLocalAddr;
TEST_QUIC_SUCCEEDED(Listener.Start(Alpn));
TEST_QUIC_SUCCEEDED(Listener.GetLocalAddr(ServerLocalAddr));

TestConnection Client(Registration);
TEST_TRUE(Client.IsValid());
TEST_QUIC_SUCCEEDED(
Client.Start(
ClientConfiguration,
QUIC_ADDRESS_FAMILY_INET,
"localhost",
ServerLocalAddr.GetPort()));

TEST_TRUE(Client.WaitForConnectionComplete());
TEST_TRUE(Server);
CxPlatEventWaitForever(ServerContext.Event);

//
// Validate the GetParam succeeded in the CONNECTED callback.
//
TEST_QUIC_SUCCEEDED(ServerContext.GetParamStatus);

//
// Validate the client always can call GetParam after handshake.
//
QUIC_HANDSHAKE_INFO Info = {};
Length = sizeof(Info);
TEST_QUIC_SUCCEEDED(
MsQuic->GetParam(
Client.GetConnection(),
QUIC_PARAM_TLS_HANDSHAKE_INFO,
&Length,
&Info
));

//
// The server should NOT have freed the TLS state, so this
// should succeed.
//
TEST_EQUAL(
MsQuic->GetParam(
*Server,
QUIC_PARAM_TLS_HANDSHAKE_INFO,
&Length,
&Info),
QUIC_STATUS_SUCCESS);
}

{
TestScopeLogger LogScope2("Successful case is covered by TlsTest.HandshakeParamInfo*");
}
Expand Down

0 comments on commit d82f2c7

Please sign in to comment.