我目前正在学习围棋网络编程。
目前,我自己正在进行一个使用上下文截止时间的超时测试。
package socket
import (
"context"
"net"
"syscall"
"testing"
"time"
)
func TestDialContext(t *testing.T) {
deadline := time.Now().Add(time.Second * 5)
ctx, cancelFunc := context.WithDeadline(context.Background(), deadline)
defer cancelFunc()
var dialer net.Dialer
dialer.Control = func(_, _ string, _ syscall.RawConn) error {
time.Sleep(4 * time.Second)
return nil
}
conn, err := dialer.DialContext(ctx, "tcp", "10.0.0.0:http")
if err == nil {
conn.Close()
t.Fatal("expected no connection")
}
if nErr, ok := err.(net.Error); ok && nErr.Timeout() {
t.Logf("expected timeout error: %v", err)
} else {
t.Errorf("expected timeout error; actual: %v", err)
}
if ctx.Err() != context.DeadlineExceeded {
t.Errorf("expected deadline exceeded; actual: %v", ctx.Err())
}
}
从代码中可以看到,我尝试使用一个截止时间为5秒的上下文进行连接。
此外,通过在请求时使用拨号器的控制函数,控制函数在连接后立即被调用(实际上就在连接前),以便在4秒后返回零错误。
按照我的意图,这个测试应该失败。原因是控制函数在5秒的截止时间到达之前返回了一个零错误。
但测试成功如下。
=== RUN TestDialContext
dial_context_test.go:27: expected timeout error: dial tcp 10.0.0.0:80: i/o timeout
--- PASS: TestDialContext (5.01s)
PASS
控制函数的目的到底是什么?控制函数返回的错误与net.Dial()
函数返回的错误无关吗?像我写的代码那样使用控制函数进行测试是没有意义的吗?
感谢您阅读这个长问题!
1条答案
按热度按时间eufgjt7s1#
控制功能的确切目的是什么?
在创建套接字之后和建立连接之前,给予拨号代码一个机会调用套接字底层文件描述符上的函数-例如syscall.Setsockopt函数之一。
控制函数返回的错误是否与
net.Dial()
函数返回的错误无关?如果控制函数返回一个错误,则拨号失败并返回该错误。如果控制函数返回一个空错误,则拨号照常继续。
像我写的代码那样使用控制函数的测试是不是没有意义?
差不多吧。你的控制功能休眠4秒,但除此之外什么也不做。