// +build windows package ieproxy import ( "net/http" "reflect" "testing" ) var emptyMap, catchAllMap, multipleMap, multipleMapWithCatchAll map[string]string func init() { emptyMap = make(map[string]string) catchAllMap = make(map[string]string) catchAllMap[""] = "127.0.0.1" multipleMap = make(map[string]string) multipleMap["http"] = "127.0.0.1" multipleMap["ftp"] = "128" multipleMapWithCatchAll = make(map[string]string) multipleMapWithCatchAll["http"] = "127.0.0.1" multipleMapWithCatchAll["ftp"] = "128" multipleMapWithCatchAll[""] = "129" } func TestParseRegedit(t *testing.T) { parsingSet := []struct { in regeditValues out ProxyConf }{ { in: regeditValues{}, out: ProxyConf{ Static: StaticProxyConf{ Protocols: emptyMap, // to prevent it being }, }, }, { in: regeditValues{ ProxyServer: "127.0.0.1", }, out: ProxyConf{ Static: StaticProxyConf{ Protocols: catchAllMap, }, }, }, { in: regeditValues{ ProxyServer: "http=127.0.0.1;ftp=128", }, out: ProxyConf{ Static: StaticProxyConf{ Protocols: multipleMap, }, }, }, { in: regeditValues{ ProxyServer: "http=127.0.0.1;ftp=128;129", }, out: ProxyConf{ Static: StaticProxyConf{ Protocols: multipleMapWithCatchAll, }, }, }, { in: regeditValues{ ProxyOverride: "example.com;microsoft.com", }, out: ProxyConf{ Static: StaticProxyConf{ Protocols: emptyMap, NoProxy: "example.com,microsoft.com", }, }, }, { in: regeditValues{ ProxyEnable: 1, }, out: ProxyConf{ Static: StaticProxyConf{ Active: true, Protocols: emptyMap, }, }, }, { in: regeditValues{ AutoConfigURL: "localhost/proxy.pac", }, out: ProxyConf{ Static: StaticProxyConf{ Protocols: emptyMap, }, Automatic: ProxyScriptConf{ Active: true, PreConfiguredURL: "localhost/proxy.pac", }, }, }, } for _, p := range parsingSet { out := parseRegedit(p.in) if !reflect.DeepEqual(p.out, out) { t.Error("Got: ", out, "Expected: ", p.out) } } } func TestOverrideEnv(t *testing.T) { var callStack []string pseudoSetEnv := func(key, value string) error { if value != "" { callStack = append(callStack, key) callStack = append(callStack, value) } return nil } overrideSet := []struct { in ProxyConf callStack []string }{ { callStack: []string{}, }, { in: ProxyConf{ Static: StaticProxyConf{ Active: true, Protocols: catchAllMap, }, }, callStack: []string{"http_proxy", "127.0.0.1", "https_proxy", "127.0.0.1"}, }, { in: ProxyConf{ Static: StaticProxyConf{ Active: false, NoProxy: "example.com,microsoft.com", Protocols: catchAllMap, }, }, callStack: []string{}, }, { in: ProxyConf{ Static: StaticProxyConf{ Active: true, Protocols: multipleMap, }, }, callStack: []string{"http_proxy", "127.0.0.1"}, }, { in: ProxyConf{ Static: StaticProxyConf{ Active: true, Protocols: multipleMapWithCatchAll, }, }, callStack: []string{"http_proxy", "127.0.0.1", "https_proxy", "129"}, }, { in: ProxyConf{ Static: StaticProxyConf{ Active: true, NoProxy: "example.com,microsoft.com", }, }, callStack: []string{"no_proxy", "example.com,microsoft.com"}, }, } for _, o := range overrideSet { callStack = []string{} overrideEnvWithStaticProxy(o.in, pseudoSetEnv) if !reflect.DeepEqual(o.callStack, callStack) { t.Error("Got: ", callStack, "Expected: ", o.callStack) } } } func TestPacfile(t *testing.T) { listener, err := listenAndServeWithClose("127.0.0.1:0", http.FileServer(http.Dir("pacfile_examples"))) serverBase := "http://" + listener.Addr().String() + "/" if err != nil { t.Fatal(err) } // test inactive proxy proxy := ProxyScriptConf{ Active: false, PreConfiguredURL: serverBase + "simple.pac", } out := proxy.FindProxyForURL("http://google.com") if out != "" { t.Error("Got: ", out, "Expected: ", "") } proxy.Active = true pacSet := []struct { pacfile string url string expected string }{ { "direct.pac", "http://google.com", "", }, { "404.pac", "http://google.com", "", }, { "simple.pac", "http://google.com", "127.0.0.1:8", }, { "multiple.pac", "http://google.com", "127.0.0.1:8081", }, { "except.pac", "http://imgur.com", "localhost:9999", }, { "except.pac", "http://example.com", "", }, } for _, p := range pacSet { proxy.PreConfiguredURL = serverBase + p.pacfile out := proxy.FindProxyForURL(p.url) if out != p.expected { t.Error("Got: ", out, "Expected: ", p.expected) } } listener.Close() }