1package tls 2 3import ( 4 "encoding/pem" 5 "fmt" 6 "io/ioutil" 7 "net/http" 8 "net/http/httptest" 9 "net/url" 10 "os" 11 "strings" 12 "testing" 13) 14 15// createCAFile writes a PEM encoded version of the certificate out to a 16// temporary file, for use by libtls. 17func createCAFile(cert []byte) (string, error) { 18 f, err := ioutil.TempFile("", "tls") 19 if err != nil { 20 return "", fmt.Errorf("failed to create file: %v", err) 21 } 22 defer f.Close() 23 block := &pem.Block{ 24 Type: "CERTIFICATE", 25 Bytes: cert, 26 } 27 if err := pem.Encode(f, block); err != nil { 28 return "", fmt.Errorf("failed to encode certificate: %v", err) 29 } 30 return f.Name(), nil 31} 32 33const httpContent = "Hello, TLS!" 34 35func TestTLSBasic(t *testing.T) { 36 ts := httptest.NewTLSServer( 37 http.HandlerFunc( 38 func(w http.ResponseWriter, r *http.Request) { 39 fmt.Fprintln(w, httpContent) 40 }, 41 ), 42 ) 43 defer ts.Close() 44 45 u, err := url.Parse(ts.URL) 46 if err != nil { 47 t.Fatalf("Failed to parse URL %q: %v", ts.URL, err) 48 } 49 50 caFile, err := createCAFile(ts.TLS.Certificates[0].Certificate[0]) 51 if err != nil { 52 t.Fatalf("Failed to create CA file: %v", err) 53 } 54 defer os.Remove(caFile) 55 56 if err := Init(); err != nil { 57 t.Fatal(err) 58 } 59 60 cfg, err := NewConfig() 61 if err != nil { 62 t.Fatal(err) 63 } 64 defer cfg.Free() 65 cfg.SetCAFile(caFile) 66 67 tls, err := NewClient(cfg) 68 if err != nil { 69 t.Fatal(err) 70 } 71 defer tls.Free() 72 73 t.Logf("Connecting to %s", u.Host) 74 75 if err := tls.Connect(u.Host, ""); err != nil { 76 t.Fatal(err) 77 } 78 defer func() { 79 if err := tls.Close(); err != nil { 80 t.Fatalf("Close failed: %v", err) 81 } 82 }() 83 84 n, err := tls.Write([]byte("GET / HTTP/1.0\n\n")) 85 if err != nil { 86 t.Fatal(err) 87 } 88 t.Logf("Wrote %d bytes...", n) 89 90 buf := make([]byte, 1024) 91 n, err = tls.Read(buf) 92 if err != nil { 93 t.Fatal(err) 94 } 95 t.Logf("Read %d bytes...", n) 96 97 if !strings.Contains(string(buf), httpContent) { 98 t.Errorf("Response does not contain %q", httpContent) 99 } 100} 101