xref: /openbsd/regress/lib/libtls/gotls/tls_test.go (revision cecf84d4)
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