Merge pull request #869 from lucas-clemente/fix-868

fix race conditions in the session tests for accepting streams
This commit is contained in:
Marten Seemann
2017-10-03 11:07:10 -07:00
committed by GitHub

View File

@@ -755,18 +755,21 @@ var _ = Describe("Session", func() {
Context("accepting streams", func() { Context("accepting streams", func() {
It("waits for new streams", func() { It("waits for new streams", func() {
strChan := make(chan Stream) strChan := make(chan Stream)
// accept two streams
go func() { go func() {
defer GinkgoRecover() defer GinkgoRecover()
for { for i := 0; i < 2; i++ {
str, err := sess.AcceptStream() str, err := sess.AcceptStream()
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
strChan <- str strChan <- str
} }
}() }()
Consistently(strChan).ShouldNot(Receive()) Consistently(strChan).ShouldNot(Receive())
sess.handleStreamFrame(&wire.StreamFrame{ err := sess.handleStreamFrame(&wire.StreamFrame{
StreamID: 3, StreamID: 3,
Data: []byte("foobar"),
}) })
Expect(err).ToNot(HaveOccurred())
var str Stream var str Stream
Eventually(strChan).Should(Receive(&str)) Eventually(strChan).Should(Receive(&str))
Expect(str.StreamID()).To(Equal(protocol.StreamID(1))) Expect(str.StreamID()).To(Equal(protocol.StreamID(1)))
@@ -776,28 +779,32 @@ var _ = Describe("Session", func() {
It("stops accepting when the session is closed", func() { It("stops accepting when the session is closed", func() {
testErr := errors.New("testErr") testErr := errors.New("testErr")
var err error done := make(chan struct{})
go func() { go func() {
_, err = sess.AcceptStream() defer GinkgoRecover()
_, err := sess.AcceptStream()
Expect(err).To(MatchError(qerr.ToQuicError(testErr)))
close(done)
}() }()
go sess.run() go sess.run()
Consistently(func() error { return err }).ShouldNot(HaveOccurred()) Consistently(done).ShouldNot(BeClosed())
sess.Close(testErr) sess.Close(testErr)
Eventually(func() error { return err }).Should(HaveOccurred()) Eventually(done).Should(BeClosed())
Expect(err).To(MatchError(qerr.ToQuicError(testErr)))
}) })
It("stops accepting when the session is closed after version negotiation", func() { It("stops accepting when the session is closed after version negotiation", func() {
var err error done := make(chan struct{})
go func() { go func() {
_, err = sess.AcceptStream() defer GinkgoRecover()
_, err := sess.AcceptStream()
Expect(err).To(MatchError(qerr.Error(qerr.InternalError, errCloseSessionForNewVersion.Error())))
close(done)
}() }()
go sess.run() go sess.run()
Consistently(func() error { return err }).ShouldNot(HaveOccurred()) Consistently(done).ShouldNot(BeClosed())
Expect(sess.Context().Done()).ToNot(BeClosed()) Expect(sess.Context().Done()).ToNot(BeClosed())
sess.Close(errCloseSessionForNewVersion) sess.Close(errCloseSessionForNewVersion)
Eventually(func() error { return err }).Should(HaveOccurred()) Eventually(done).Should(BeClosed())
Expect(err).To(MatchError(qerr.Error(qerr.InternalError, errCloseSessionForNewVersion.Error())))
Eventually(sess.Context().Done()).Should(BeClosed()) Eventually(sess.Context().Done()).Should(BeClosed())
}) })
}) })