| // Copyright 2011 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package proxy |
| |
| import ( |
| "context" |
| "errors" |
| "net" |
| "reflect" |
| "testing" |
| ) |
| |
| type recordingProxy struct { |
| addrs []string |
| } |
| |
| func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) { |
| r.addrs = append(r.addrs, addr) |
| return nil, errors.New("recordingProxy") |
| } |
| |
| func TestPerHost(t *testing.T) { |
| expectedDef := []string{ |
| "example.com:123", |
| "1.2.3.4:123", |
| "[1001::]:123", |
| } |
| expectedBypass := []string{ |
| "localhost:123", |
| "zone:123", |
| "foo.zone:123", |
| "127.0.0.1:123", |
| "10.1.2.3:123", |
| "[1000::]:123", |
| } |
| |
| t.Run("Dial", func(t *testing.T) { |
| var def, bypass recordingProxy |
| perHost := NewPerHost(&def, &bypass) |
| perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") |
| for _, addr := range expectedDef { |
| perHost.Dial("tcp", addr) |
| } |
| for _, addr := range expectedBypass { |
| perHost.Dial("tcp", addr) |
| } |
| |
| if !reflect.DeepEqual(expectedDef, def.addrs) { |
| t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) |
| } |
| if !reflect.DeepEqual(expectedBypass, bypass.addrs) { |
| t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) |
| } |
| }) |
| |
| t.Run("DialContext", func(t *testing.T) { |
| var def, bypass recordingProxy |
| perHost := NewPerHost(&def, &bypass) |
| perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") |
| for _, addr := range expectedDef { |
| perHost.DialContext(context.Background(), "tcp", addr) |
| } |
| for _, addr := range expectedBypass { |
| perHost.DialContext(context.Background(), "tcp", addr) |
| } |
| |
| if !reflect.DeepEqual(expectedDef, def.addrs) { |
| t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) |
| } |
| if !reflect.DeepEqual(expectedBypass, bypass.addrs) { |
| t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) |
| } |
| }) |
| } |