Skip to content

Commit 765b14d

Browse files
Surya Ahujameta-codesync[bot]
authored andcommitted
smash tests for tls
Reviewed By: shringiarpit26 Differential Revision: D82873727 fbshipit-source-id: 4ad143707662bd8a1fc8279be06b467ac97728e3
1 parent ac8bf7d commit 765b14d

File tree

3 files changed

+631
-2
lines changed

3 files changed

+631
-2
lines changed
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
/*
2+
Copyright (c) Facebook, Inc. and its affiliates.
3+
4+
This source code is licensed under the MIT license found in the
5+
LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package test
9+
10+
import (
11+
"context"
12+
"crypto/rand"
13+
"crypto/rsa"
14+
"crypto/tls"
15+
"crypto/x509"
16+
"crypto/x509/pkix"
17+
"encoding/pem"
18+
"io"
19+
"math/big"
20+
"net"
21+
"os"
22+
"path/filepath"
23+
"testing"
24+
"time"
25+
26+
tq "github.com/facebookincubator/tacquito"
27+
"github.com/facebookincubator/tacquito/cmds/server/log"
28+
29+
"github.com/stretchr/testify/assert"
30+
)
31+
32+
// GenerateTLSCertificate is part of the public API for this package
33+
// can be overridden for other functions (such as the generateOptimizedTLSCertificate)
34+
var GenerateTLSCertificate = generateTLSCertificate
35+
36+
// GenerateTLSCertificate generates a temporary TLS certificate and key in the given directory
37+
// this can be utilized by the test to create TLS test specific config
38+
func generateTLSCertificate(testDir string) (certFile, keyFile string, tlsConfig *tls.Config, err error) {
39+
// Generate private key
40+
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
41+
if err != nil {
42+
return "", "", nil, err
43+
}
44+
45+
// Create certificate template
46+
template := x509.Certificate{
47+
SerialNumber: big.NewInt(1),
48+
Subject: pkix.Name{
49+
Organization: []string{"Test Corp"},
50+
Country: []string{"US"},
51+
Province: []string{""},
52+
Locality: []string{"Test City"},
53+
StreetAddress: []string{""},
54+
PostalCode: []string{""},
55+
},
56+
NotBefore: time.Now(),
57+
NotAfter: time.Now().Add(365 * 24 * time.Hour),
58+
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
59+
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
60+
BasicConstraintsValid: true,
61+
IPAddresses: []net.IP{net.IPv6loopback, net.ParseIP("::1")},
62+
DNSNames: []string{"localhost"},
63+
}
64+
65+
// Create certificate
66+
certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey)
67+
if err != nil {
68+
return "", "", nil, err
69+
}
70+
71+
// Write certificate to file
72+
certFile = filepath.Join(testDir, "cert.pem")
73+
certOut, err := os.Create(certFile)
74+
if err != nil {
75+
return "", "", nil, err
76+
}
77+
defer certOut.Close()
78+
79+
err = pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: certDER})
80+
if err != nil {
81+
return "", "", nil, err
82+
}
83+
84+
// Write private key to file
85+
keyFile = filepath.Join(testDir, "key.pem")
86+
keyOut, err := os.Create(keyFile)
87+
if err != nil {
88+
return "", "", nil, err
89+
}
90+
defer keyOut.Close()
91+
92+
privKeyBytes, err := x509.MarshalPKCS8PrivateKey(privateKey)
93+
if err != nil {
94+
return "", "", nil, err
95+
}
96+
97+
err = pem.Encode(keyOut, &pem.Block{Type: "PRIVATE KEY", Bytes: privKeyBytes})
98+
if err != nil {
99+
return "", "", nil, err
100+
}
101+
102+
// Load certificate and create TLS config
103+
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
104+
if err != nil {
105+
return "", "", nil, err
106+
}
107+
108+
tlsConfig = &tls.Config{
109+
Certificates: []tls.Certificate{cert},
110+
InsecureSkipVerify: true, // For test purposes
111+
}
112+
113+
return certFile, keyFile, tlsConfig, nil
114+
}
115+
116+
/* Base line results
117+
goos: linux
118+
goarch: amd64
119+
pkg: github.com/facebookincubator/tacquito/cmds/server/test
120+
cpu: Intel Core Processor (Broadwell)
121+
BenchmarkPacketExchangeAsciiLoginUsingSharedClientTLS-72 44 73866034 ns/op 35767 B/op 454 allocs/op
122+
BenchmarkPacketExchangeAsciiLoginUsingNewClientTLS-72 43 78560658 ns/op 139176 B/op 1230 allocs/op
123+
PASS
124+
*/
125+
126+
// BenchmarkPacketExchangeAsciiLoginUsingSharedClientTLS will test the full ascii login flow
127+
// using a single TLS client instance
128+
func BenchmarkPacketExchangeAsciiLoginUsingSharedClientTLS(b *testing.B) {
129+
testDir := b.TempDir()
130+
_, _, serverTLSConfig, err := GenerateTLSCertificate(testDir)
131+
assert.NoError(b, err)
132+
133+
logger := log.New(0, io.Discard) // no logs
134+
ctx := context.Background()
135+
sp, err := MockSecretProvider(ctx, logger, "testdata/test_config.yaml")
136+
assert.NoError(b, err)
137+
138+
// Create TLS listener
139+
listener, err := net.Listen("tcp6", "[::1]:0")
140+
assert.NoError(b, err)
141+
tlsListener, err := tq.NewTLSListener(listener, serverTLSConfig)
142+
assert.NoError(b, err)
143+
144+
s := tq.NewServer(logger, sp, tq.SetUseTLS(true))
145+
ctx, cancel := context.WithCancel(context.Background())
146+
defer cancel()
147+
go func() {
148+
if err := s.Serve(ctx, tlsListener); err != nil {
149+
assert.NoError(b, err)
150+
}
151+
}()
152+
153+
// Client TLS config (with insecure skip verify for test certificates)
154+
clientTLSConfig := &tls.Config{
155+
InsecureSkipVerify: true,
156+
}
157+
158+
c, err := tq.NewClient(tq.SetClientTLSDialer("tcp6", listener.Addr().String(), clientTLSConfig))
159+
assert.NoError(b, err)
160+
defer c.Close()
161+
162+
test := ASCIILoginFullFlow()
163+
b.ReportAllocs()
164+
for n := 0; n < b.N; n++ {
165+
for _, s := range test.Seq {
166+
c.Send(s.Packet)
167+
}
168+
}
169+
}
170+
171+
// BenchmarkPacketExchangeAsciiLoginUsingNewClientTLS will test the full ascii login flow
172+
// using a new TLS client instance each loop
173+
func BenchmarkPacketExchangeAsciiLoginUsingNewClientTLS(b *testing.B) {
174+
testDir := b.TempDir()
175+
_, _, serverTLSConfig, err := GenerateTLSCertificate(testDir)
176+
assert.NoError(b, err)
177+
178+
logger := log.New(0, io.Discard) // no logs
179+
ctx := context.Background()
180+
sp, err := MockSecretProvider(ctx, logger, "testdata/test_config.yaml")
181+
assert.NoError(b, err)
182+
183+
// Create TLS listener
184+
listener, err := net.Listen("tcp6", "[::1]:0")
185+
assert.NoError(b, err)
186+
tlsListener, err := tq.NewTLSListener(listener, serverTLSConfig)
187+
assert.NoError(b, err)
188+
189+
s := tq.NewServer(logger, sp, tq.SetUseTLS(true))
190+
ctx, cancel := context.WithCancel(context.Background())
191+
defer cancel()
192+
go func() {
193+
if err := s.Serve(ctx, tlsListener); err != nil {
194+
assert.NoError(b, err)
195+
}
196+
}()
197+
198+
// Client TLS config (with insecure skip verify for test certificates)
199+
clientTLSConfig := &tls.Config{
200+
InsecureSkipVerify: true,
201+
}
202+
203+
test := ASCIILoginFullFlow()
204+
for n := 0; n < b.N; n++ {
205+
c, err := tq.NewClient(tq.SetClientTLSDialer("tcp6", listener.Addr().String(), clientTLSConfig))
206+
assert.NoError(b, err)
207+
for _, s := range test.Seq {
208+
c.Send(s.Packet)
209+
}
210+
c.Close()
211+
}
212+
}

0 commit comments

Comments
 (0)