handle Version Negotiation packets in a separate Go routine

This commit is contained in:
Marten Seemann
2018-11-27 14:06:05 +07:00
parent a8db148dbf
commit 7fecf8e478
2 changed files with 29 additions and 33 deletions

View File

@@ -679,33 +679,36 @@ var _ = Describe("Client", func() {
sess.EXPECT().handlePacket(gomock.Any())
cl.session = sess
cl.config = &Config{}
err := cl.handlePacketImpl(&receivedPacket{
cl.handlePacket(&receivedPacket{
hdr: &wire.Header{
DestConnectionID: connID,
SrcConnectionID: connID,
Version: cl.version,
},
})
Expect(err).ToNot(HaveOccurred())
Expect(cl.versionNegotiated.Get()).To(BeTrue())
Eventually(cl.versionNegotiated.Get()).Should(BeTrue())
})
It("errors if no matching version is found", func() {
sess := NewMockQuicSession(mockCtrl)
sess.EXPECT().destroy(qerr.InvalidVersion)
done := make(chan struct{})
sess.EXPECT().destroy(qerr.InvalidVersion).Do(func(error) { close(done) })
cl.session = sess
cl.config = &Config{Versions: protocol.SupportedVersions}
cl.handlePacket(composeVersionNegotiationPacket(connID, []protocol.VersionNumber{1}))
Eventually(done).Should(BeClosed())
})
It("errors if the version is supported by quic-go, but disabled by the quic.Config", func() {
sess := NewMockQuicSession(mockCtrl)
sess.EXPECT().destroy(qerr.InvalidVersion)
done := make(chan struct{})
sess.EXPECT().destroy(qerr.InvalidVersion).Do(func(error) { close(done) })
cl.session = sess
v := protocol.VersionNumber(1234)
Expect(v).ToNot(Equal(cl.version))
cl.config = &Config{Versions: protocol.SupportedVersions}
cl.handlePacket(composeVersionNegotiationPacket(connID, []protocol.VersionNumber{v}))
Eventually(done).Should(BeClosed())
})
It("changes to the version preferred by the quic.Config", func() {
@@ -713,11 +716,15 @@ var _ = Describe("Client", func() {
cl.packetHandlers = phm
sess := NewMockQuicSession(mockCtrl)
sess.EXPECT().destroy(errCloseSessionForNewVersion)
destroyed := make(chan struct{})
sess.EXPECT().destroy(errCloseSessionForNewVersion).Do(func(error) {
close(destroyed)
})
cl.session = sess
versions := []protocol.VersionNumber{1234, 4321}
cl.config = &Config{Versions: versions}
cl.handlePacket(composeVersionNegotiationPacket(connID, versions))
Eventually(destroyed).Should(BeClosed())
Expect(cl.version).To(Equal(protocol.VersionNumber(1234)))
})