golang.org/x/net@v0.25.1-0.20240516223405-c87a5b62e243/proxy/dial_test.go (about)

     1  // Copyright 2019 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package proxy
     6  
     7  import (
     8  	"context"
     9  	"fmt"
    10  	"os"
    11  	"testing"
    12  	"time"
    13  
    14  	"golang.org/x/net/internal/sockstest"
    15  	"golang.org/x/net/nettest"
    16  )
    17  
    18  func TestDial(t *testing.T) {
    19  	ResetProxyEnv()
    20  	t.Run("DirectWithCancel", func(t *testing.T) {
    21  		defer ResetProxyEnv()
    22  		l, err := nettest.NewLocalListener("tcp")
    23  		if err != nil {
    24  			t.Fatal(err)
    25  		}
    26  		defer l.Close()
    27  		ctx, cancel := context.WithCancel(context.Background())
    28  		defer cancel()
    29  		c, err := Dial(ctx, l.Addr().Network(), l.Addr().String())
    30  		if err != nil {
    31  			t.Fatal(err)
    32  		}
    33  		c.Close()
    34  	})
    35  	t.Run("DirectWithTimeout", func(t *testing.T) {
    36  		defer ResetProxyEnv()
    37  		l, err := nettest.NewLocalListener("tcp")
    38  		if err != nil {
    39  			t.Fatal(err)
    40  		}
    41  		defer l.Close()
    42  		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    43  		defer cancel()
    44  		c, err := Dial(ctx, l.Addr().Network(), l.Addr().String())
    45  		if err != nil {
    46  			t.Fatal(err)
    47  		}
    48  		c.Close()
    49  	})
    50  	t.Run("DirectWithTimeoutExceeded", func(t *testing.T) {
    51  		defer ResetProxyEnv()
    52  		l, err := nettest.NewLocalListener("tcp")
    53  		if err != nil {
    54  			t.Fatal(err)
    55  		}
    56  		defer l.Close()
    57  		ctx, cancel := context.WithTimeout(context.Background(), time.Nanosecond)
    58  		time.Sleep(time.Millisecond)
    59  		defer cancel()
    60  		c, err := Dial(ctx, l.Addr().Network(), l.Addr().String())
    61  		if err == nil {
    62  			defer c.Close()
    63  			t.Fatal("failed to timeout")
    64  		}
    65  	})
    66  	t.Run("SOCKS5", func(t *testing.T) {
    67  		defer ResetProxyEnv()
    68  		s, err := sockstest.NewServer(sockstest.NoAuthRequired, sockstest.NoProxyRequired)
    69  		if err != nil {
    70  			t.Fatal(err)
    71  		}
    72  		defer s.Close()
    73  		if err = os.Setenv("ALL_PROXY", fmt.Sprintf("socks5://%s", s.Addr().String())); err != nil {
    74  			t.Fatal(err)
    75  		}
    76  		c, err := Dial(context.Background(), s.TargetAddr().Network(), s.TargetAddr().String())
    77  		if err != nil {
    78  			t.Fatal(err)
    79  		}
    80  		c.Close()
    81  	})
    82  	t.Run("SOCKS5WithTimeout", func(t *testing.T) {
    83  		defer ResetProxyEnv()
    84  		s, err := sockstest.NewServer(sockstest.NoAuthRequired, sockstest.NoProxyRequired)
    85  		if err != nil {
    86  			t.Fatal(err)
    87  		}
    88  		defer s.Close()
    89  		if err = os.Setenv("ALL_PROXY", fmt.Sprintf("socks5://%s", s.Addr().String())); err != nil {
    90  			t.Fatal(err)
    91  		}
    92  		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    93  		defer cancel()
    94  		c, err := Dial(ctx, s.TargetAddr().Network(), s.TargetAddr().String())
    95  		if err != nil {
    96  			t.Fatal(err)
    97  		}
    98  		c.Close()
    99  	})
   100  	t.Run("SOCKS5WithTimeoutExceeded", func(t *testing.T) {
   101  		defer ResetProxyEnv()
   102  		s, err := sockstest.NewServer(sockstest.NoAuthRequired, sockstest.NoProxyRequired)
   103  		if err != nil {
   104  			t.Fatal(err)
   105  		}
   106  		defer s.Close()
   107  		if err = os.Setenv("ALL_PROXY", fmt.Sprintf("socks5://%s", s.Addr().String())); err != nil {
   108  			t.Fatal(err)
   109  		}
   110  		ctx, cancel := context.WithTimeout(context.Background(), time.Nanosecond)
   111  		time.Sleep(time.Millisecond)
   112  		defer cancel()
   113  		c, err := Dial(ctx, s.TargetAddr().Network(), s.TargetAddr().String())
   114  		if err == nil {
   115  			defer c.Close()
   116  			t.Fatal("failed to timeout")
   117  		}
   118  	})
   119  }