rproxy3/main_test.go

132 lines
2.8 KiB
Go
Executable File

package main
import (
"crypto/tls"
"flag"
"fmt"
"net/http"
"net/http/httptest"
"os"
"strings"
"testing"
"time"
)
func TestHTTPSMain(t *testing.T) {
was := os.Args[:]
os.Args = []string{"program"}
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
defer func() {
os.Args = was[:]
}()
addr, stop := echoServer()
defer stop()
ported := make(chan string)
go func() {
p := getPort()
ported <- p
os.Args = []string{
"foobar",
"-p",
p,
"-user",
"username",
"-pass",
"password",
"-proxy",
"hello," + addr,
"-crt",
"./testdata/rproxy3server.crt",
"-key",
"./testdata/rproxy3server.key",
}
main()
}()
port := <-ported
time.Sleep(time.Millisecond * 100)
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
}
r, _ := http.NewRequest("GET", "https://hello.localhost:"+port, nil)
if resp, err := client.Do(r); err != nil {
t.Fatalf("client failed: %v", err)
} else if resp.StatusCode != http.StatusUnauthorized {
t.Errorf("proxy failed: code %v != %v", resp.StatusCode, http.StatusUnauthorized)
}
r.SetBasicAuth("username", "password")
if resp, err := client.Do(r); err != nil {
t.Fatalf("client failed: %v", err)
} else if resp.StatusCode != http.StatusOK {
t.Errorf("proxy failed: code %v != %v", resp.StatusCode, http.StatusOK)
}
}
func TestHTTPMain(t *testing.T) {
was := os.Args[:]
os.Args = []string{"program"}
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
defer func() {
os.Args = was[:]
}()
addr, stop := echoServer()
defer stop()
ported := make(chan string)
go func() {
p := getPort()
ported <- p
os.Args = []string{
"foobar",
"-p",
p,
"-user",
"username",
"-pass",
"password",
"-proxy",
"hello," + addr,
}
main()
}()
port := <-ported
time.Sleep(time.Millisecond * 100)
client := &http.Client{}
r, _ := http.NewRequest("GET", "http://hello.localhost:"+port, nil)
if resp, err := client.Do(r); err != nil {
t.Fatalf("client failed: %v", err)
} else if resp.StatusCode != http.StatusUnauthorized {
t.Errorf("proxy failed: code %v != %v", resp.StatusCode, http.StatusUnauthorized)
}
r.SetBasicAuth("username", "password")
if resp, err := client.Do(r); err != nil {
t.Fatalf("client failed: %v", err)
} else if resp.StatusCode != http.StatusOK {
t.Errorf("proxy failed: code %v != %v", resp.StatusCode, http.StatusOK)
}
}
func echoServer() (string, func()) {
h := func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello")
}
portsrv := httptest.NewServer(http.HandlerFunc(h))
return portsrv.URL, func() {
portsrv.Close()
}
}
func getPort() string {
s := httptest.NewServer(nil)
s.Close()
return s.URL[strings.LastIndex(s.URL, ":")+1:]
}