package proto_socket_test import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/tls" "crypto/x509" "crypto/x509/pkix" "encoding/pem" "math/big" "net" "testing" "time" toki "git.toki-labs.com/toki/proto-socket/go" "git.toki-labs.com/toki/proto-socket/go/packets" ) func TestTypeNameMatchesDartConvention(t *testing.T) { if got := toki.TypeNameOf(&packets.TestData{}); got != "TestData" { t.Fatalf("type name = %q, want TestData", got) } } func freePort(t *testing.T) int { t.Helper() ln, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatal(err) } defer ln.Close() return ln.Addr().(*net.TCPAddr).Port } func waitForCondition(t *testing.T, timeout time.Duration, condition func() bool, message string) { t.Helper() deadline := time.Now().Add(timeout) for time.Now().Before(deadline) { if condition() { return } time.Sleep(time.Millisecond) } t.Fatal(message) } // generateSelfSignedCert creates an in-memory self-signed certificate valid // for 127.0.0.1. Returns the server tls.Config and a client tls.Config that // trusts the generated certificate. func generateSelfSignedCert(t *testing.T) (serverCfg, clientCfg *tls.Config) { t.Helper() priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { t.Fatal(err) } tmpl := &x509.Certificate{ SerialNumber: big.NewInt(1), Subject: pkix.Name{CommonName: "proto-socket-test"}, NotBefore: time.Now().Add(-time.Hour), NotAfter: time.Now().Add(time.Hour), IPAddresses: []net.IP{net.ParseIP("127.0.0.1")}, } certDER, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, &priv.PublicKey, priv) if err != nil { t.Fatal(err) } privDER, err := x509.MarshalECPrivateKey(priv) if err != nil { t.Fatal(err) } certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}) keyPEM := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: privDER}) cert, err := tls.X509KeyPair(certPEM, keyPEM) if err != nil { t.Fatal(err) } serverCfg = &tls.Config{Certificates: []tls.Certificate{cert}} pool := x509.NewCertPool() parsed, err := x509.ParseCertificate(certDER) if err != nil { t.Fatal(err) } pool.AddCert(parsed) clientCfg = &tls.Config{RootCAs: pool, ServerName: "127.0.0.1"} return serverCfg, clientCfg }