233
var invalidDialAndListenArgTests = []struct {
238
{"foo", "bar", &OpError{Op: "dial", Net: "foo", Addr: nil, Err: UnknownNetworkError("foo")}},
239
{"baz", "", &OpError{Op: "listen", Net: "baz", Addr: nil, Err: UnknownNetworkError("baz")}},
240
{"tcp", "", &OpError{Op: "dial", Net: "tcp", Addr: nil, Err: errMissingAddress}},
243
func TestInvalidDialAndListenArgs(t *testing.T) {
244
for _, tt := range invalidDialAndListenArgTests {
246
switch tt.err.(*OpError).Op {
248
_, err = Dial(tt.net, tt.addr)
250
_, err = Listen(tt.net, tt.addr)
252
if !reflect.DeepEqual(tt.err, err) {
253
t.Fatalf("got %#v; expected %#v", err, tt.err)
258
func TestDialTimeoutFDLeak(t *testing.T) {
259
if runtime.GOOS != "linux" {
260
// TODO(bradfitz): test on other platforms
261
t.Skipf("skipping test on %q", runtime.GOOS)
264
ln := newLocalListener(t)
267
type connErr struct {
271
dials := listenerBacklog + 100
272
// used to be listenerBacklog + 5, but was found to be unreliable, issue 4384.
273
maxGoodConnect := listenerBacklog + runtime.NumCPU()*10
274
resc := make(chan connErr)
275
for i := 0; i < dials; i++ {
277
conn, err := DialTimeout("tcp", ln.Addr().String(), 500*time.Millisecond)
278
resc <- connErr{conn, err}
284
var toClose []io.Closer
285
for i := 0; i < dials; i++ {
289
if ngood > maxGoodConnect {
290
t.Errorf("%d good connects; expected at most %d", ngood, maxGoodConnect)
292
toClose = append(toClose, ce.conn)
297
firstErr = err.Error()
298
} else if err.Error() != firstErr {
299
t.Fatalf("inconsistent error messages: first was %q, then later %q", firstErr, err)
302
for _, c := range toClose {
305
for i := 0; i < 100; i++ {
306
if got := numFD(); got < dials {
310
time.Sleep(10 * time.Millisecond)
312
if got := numFD(); got >= dials {
313
t.Errorf("num fds after %d timeouts = %d; want <%d", dials, got, dials)
318
if runtime.GOOS == "linux" {
319
f, err := os.Open("/proc/self/fd")
324
names, err := f.Readdirnames(0)
330
// All tests using this should be skipped anyway, but:
331
panic("numFDs not implemented on " + runtime.GOOS)
334
var testPoller = flag.Bool("poller", false, "platform supports runtime-integrated poller")
336
// Assert that a failed Dial attempt does not leak
337
// runtime.PollDesc structures
338
func TestDialFailPDLeak(t *testing.T) {
340
t.Skip("test disabled; use -poller to enable")
345
var old runtime.MemStats // used by sysdelta
346
runtime.ReadMemStats(&old)
347
sysdelta := func() uint64 {
348
var new runtime.MemStats
349
runtime.ReadMemStats(&new)
350
delta := old.Sys - new.Sys
354
d := &Dialer{Timeout: time.Nanosecond} // don't bother TCP with handshaking
356
for i := 0; i < loops; i++ {
357
for i := 0; i < count; i++ {
358
conn, err := d.Dial("tcp", "127.0.0.1:1")
360
t.Error("dial should not succeed")
365
if delta := sysdelta(); delta > 0 {
368
// there are always some allocations on the first loop
370
t.Error("detected possible memory leak in runtime")
376
func TestDialer(t *testing.T) {
377
ln, err := Listen("tcp4", "127.0.0.1:0")
379
t.Fatalf("Listen failed: %v", err)
382
ch := make(chan error, 1)
385
c, err := ln.Accept()
387
ch <- fmt.Errorf("Accept failed: %v", err)
394
laddr, err := ResolveTCPAddr("tcp4", "127.0.0.1:0")
396
t.Fatalf("ResolveTCPAddr failed: %v", err)
398
d := &Dialer{LocalAddr: laddr}
399
c, err := d.Dial("tcp4", ln.Addr().String())
401
t.Fatalf("Dial failed: %v", err)
404
c.Read(make([]byte, 1))