api/internal/endpoint/handler/dns/mock/handler_bench_test.go
Peter Kurfer d70ba748f5 Introduce Lifecycle for every endpoint and manage listeners in the renamed Orchestrator
- merge packages to get a more concise layout because plugins are no more and therefore there's not a lot to be exported
- fix test logger
- rework config parsing to be easier and more transparent
- remove unnecessary APIs because dynamic endpoint handling is rather a won't implement
2021-02-10 20:26:45 +00:00

77 lines
1.8 KiB
Go

package mock
import (
"context"
"fmt"
"math/rand"
"net"
"strings"
"testing"
"time"
"github.com/docker/go-connections/nat"
"github.com/testcontainers/testcontainers-go"
"gitlab.com/inetmock/inetmock/internal/test/integration"
)
const (
charSet = "abcdedfghijklmnopqrstABCDEFGHIJKLMNOP"
)
func init() {
rand.Seed(time.Now().Unix())
}
func Benchmark_dnsHandler(b *testing.B) {
var err error
var endpoint string
if endpoint, err = setupContainer(b, "53/udp"); err != nil {
b.Errorf("setupContainer() error = %v", err)
}
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
resolv := resolver(endpoint)
for pb.Next() {
lookupCtx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
_, err := resolv.LookupHost(lookupCtx, fmt.Sprintf("www.%s.com", randomString(8)))
cancel()
if err != nil {
b.Errorf("LookupHost() error = %v", err)
}
}
})
}
func randomString(length int) (result string) {
buffer := strings.Builder{}
for i := 0; i < length; i++ {
buffer.WriteByte(charSet[rand.Intn(len(charSet))])
}
return buffer.String()
}
func setupContainer(b *testing.B, port string) (httpEndpoint string, err error) {
b.Helper()
startupCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
var inetMockContainer testcontainers.Container
if inetMockContainer, err = integration.SetupINetMockContainer(startupCtx, b, port); err != nil {
return
}
httpEndpoint, err = inetMockContainer.PortEndpoint(startupCtx, nat.Port(port), "")
return
}
func resolver(endpoint string) net.Resolver {
return net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (conn net.Conn, err error) {
dialer := net.Dialer{}
return dialer.DialContext(ctx, "udp", endpoint)
},
}
}