forked from quic-go/quic-go
catch spurious UDP sendmsg errors in multiplex integration test (#4451)
* catch spurious UDP sendmsg errors in multiplex integration test * platform-dependent isPermissionError
This commit is contained in:
@@ -249,6 +249,7 @@ var _ = Describe("Multiplexing", func() {
|
|||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
ticker := time.NewTicker(time.Millisecond / 10)
|
ticker := time.NewTicker(time.Millisecond / 10)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
var wroteFirstPacket bool
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
@@ -258,11 +259,18 @@ var _ = Describe("Multiplexing", func() {
|
|||||||
b := make([]byte, packetLen)
|
b := make([]byte, packetLen)
|
||||||
rand.Read(b[1:]) // keep the first byte set to 0, so it's not classified as a QUIC packet
|
rand.Read(b[1:]) // keep the first byte set to 0, so it's not classified as a QUIC packet
|
||||||
_, err := tr1.WriteTo(b, tr2.Conn.LocalAddr())
|
_, err := tr1.WriteTo(b, tr2.Conn.LocalAddr())
|
||||||
|
// The first sendmsg call on a new UDP socket sometimes errors on Linux.
|
||||||
|
// It's not clear why this happens.
|
||||||
|
// See https://github.com/golang/go/issues/63322.
|
||||||
|
if err != nil && !wroteFirstPacket && isPermissionError(err) {
|
||||||
|
_, err = tr1.WriteTo(b, tr2.Conn.LocalAddr())
|
||||||
|
}
|
||||||
if ctx.Err() != nil { // ctx canceled while Read was executing
|
if ctx.Err() != nil { // ctx canceled while Read was executing
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
sentPackets.Add(1)
|
sentPackets.Add(1)
|
||||||
|
wroteFirstPacket = true
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|||||||
21
integrationtests/self/self_suite_linux_test.go
Normal file
21
integrationtests/self/self_suite_linux_test.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
//go:build linux
|
||||||
|
|
||||||
|
package self_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The first sendmsg call on a new UDP socket sometimes errors on Linux.
|
||||||
|
// It's not clear why this happens.
|
||||||
|
// See https://github.com/golang/go/issues/63322.
|
||||||
|
func isPermissionError(err error) bool {
|
||||||
|
var serr *os.SyscallError
|
||||||
|
if errors.As(err, &serr) {
|
||||||
|
return serr.Syscall == "sendmsg" && serr.Err == unix.EPERM
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
7
integrationtests/self/self_suite_others_test.go
Normal file
7
integrationtests/self/self_suite_others_test.go
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
//go:build !linux
|
||||||
|
|
||||||
|
package self_test
|
||||||
|
|
||||||
|
func isPermissionError(err error) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user