+TEST(AsyncSSLSocketTest, NpnTestClientProtoFilterHit) {
+ EventBase eventBase;
+ auto clientCtx = std::make_shared<SSLContext>();
+ auto serverCtx = std::make_shared<SSLContext>();
+ int fds[2];
+ getfds(fds);
+ getctx(clientCtx, serverCtx);
+
+ clientCtx->setAdvertisedNextProtocols({"blub"});
+ clientCtx->setClientProtocolFilterCallback(clientProtoFilterPickPony);
+ serverCtx->setAdvertisedNextProtocols({"foo","bar","baz"});
+
+ AsyncSSLSocket::UniquePtr clientSock(
+ new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
+ AsyncSSLSocket::UniquePtr serverSock(
+ new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
+ NpnClient client(std::move(clientSock));
+ NpnServer server(std::move(serverSock));
+
+ eventBase.loop();
+
+ EXPECT_TRUE(client.nextProtoLength != 0);
+ EXPECT_EQ(client.nextProtoLength, server.nextProtoLength);
+ EXPECT_EQ(memcmp(client.nextProto, server.nextProto,
+ server.nextProtoLength), 0);
+ string selected((const char*)client.nextProto, client.nextProtoLength);
+ EXPECT_EQ(selected.compare("ponies"), 0);
+}
+
+TEST(AsyncSSLSocketTest, NpnTestClientProtoFilterMiss) {
+ EventBase eventBase;
+ auto clientCtx = std::make_shared<SSLContext>();
+ auto serverCtx = std::make_shared<SSLContext>();
+ int fds[2];
+ getfds(fds);
+ getctx(clientCtx, serverCtx);
+
+ clientCtx->setAdvertisedNextProtocols({"blub"});
+ clientCtx->setClientProtocolFilterCallback(clientProtoFilterPickNone);
+ serverCtx->setAdvertisedNextProtocols({"foo","bar","baz"});
+
+ AsyncSSLSocket::UniquePtr clientSock(
+ new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
+ AsyncSSLSocket::UniquePtr serverSock(
+ new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
+ NpnClient client(std::move(clientSock));
+ NpnServer server(std::move(serverSock));
+
+ eventBase.loop();
+
+ EXPECT_TRUE(client.nextProtoLength != 0);
+ EXPECT_EQ(client.nextProtoLength, server.nextProtoLength);
+ EXPECT_EQ(memcmp(client.nextProto, server.nextProto,
+ server.nextProtoLength), 0);
+ string selected((const char*)client.nextProto, client.nextProtoLength);
+ EXPECT_EQ(selected.compare("blub"), 0);
+}
+