// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package websocket import ( "context" "crypto/tls" "errors" "fmt" "log" "net" "net/http" "net/http/httptest" "testing" "time" ) // This test depend on Go 1.3+ because in earlier versions the Dialer won't be // used in TLS connections and a timeout won't be triggered. func TestDialConfigTLSWithDialer(t *testing.T) { tlsServer := httptest.NewTLSServer(nil) tlsServerAddr := tlsServer.Listener.Addr().String() log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) defer tlsServer.Close() config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") config.Dialer = &net.Dialer{ Deadline: time.Now().Add(-time.Minute), } config.TlsConfig = &tls.Config{ InsecureSkipVerify: true, } _, err := DialConfig(config) dialerr, ok := err.(*DialError) if !ok { t.Fatalf("DialError expected, got %#v", err) } neterr, ok := dialerr.Err.(*net.OpError) if !ok { t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) } if !neterr.Timeout() { t.Fatalf("expected timeout error, got %#v", neterr) } } func TestDialConfigTLSWithTimeouts(t *testing.T) { t.Parallel() finishedRequest := make(chan bool) // Context for cancellation ctx, cancel := context.WithCancel(context.Background()) // This is a TLS server that blocks each request indefinitely (and cancels the context) tlsServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { cancel() <-finishedRequest })) tlsServerAddr := tlsServer.Listener.Addr().String() log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) defer tlsServer.Close() defer close(finishedRequest) config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") config.TlsConfig = &tls.Config{ InsecureSkipVerify: true, } _, err := config.DialContext(ctx) dialerr, ok := err.(*DialError) if !ok { t.Fatalf("DialError expected, got %#v", err) } if !errors.Is(dialerr.Err, context.Canceled) { t.Fatalf("context.Canceled error expected, got %#v", dialerr.Err) } }