github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/syslog/syslog_suite_test.go (about)

     1  package syslog_test
     2  
     3  import (
     4  	"crypto/tls"
     5  	"io"
     6  	"net"
     7  	"sync"
     8  	"time"
     9  
    10  	. "github.com/onsi/ginkgo"
    11  	. "github.com/onsi/gomega"
    12  
    13  	"testing"
    14  )
    15  
    16  func TestSyslog(t *testing.T) {
    17  	RegisterFailHandler(Fail)
    18  	RunSpecs(t, "Syslog Suite")
    19  }
    20  
    21  type testServer struct {
    22  	Addr     string
    23  	Messages chan string
    24  
    25  	ln     net.Listener
    26  	closed bool
    27  	wg     *sync.WaitGroup
    28  	mu     sync.RWMutex
    29  }
    30  
    31  func newTestServer(cert *tls.Certificate) *testServer {
    32  	server := &testServer{
    33  		Messages: make(chan string, 20),
    34  
    35  		wg: new(sync.WaitGroup),
    36  	}
    37  
    38  	server.ListenTCP(cert)
    39  
    40  	server.wg.Add(1)
    41  	go server.ServeTCP()
    42  
    43  	return server
    44  }
    45  
    46  func (server *testServer) ListenTCP(cert *tls.Certificate) net.Listener {
    47  	var ln net.Listener
    48  
    49  	var err error
    50  	if cert != nil {
    51  		config := &tls.Config{
    52  			Certificates: []tls.Certificate{*cert},
    53  		}
    54  		server.ln, err = tls.Listen("tcp", "127.0.0.1:0", config)
    55  		Expect(err).NotTo(HaveOccurred())
    56  	} else {
    57  		server.ln, err = net.Listen("tcp", "[::]:0")
    58  		Expect(err).NotTo(HaveOccurred())
    59  	}
    60  
    61  	Expect(err).NotTo(HaveOccurred())
    62  
    63  	server.Addr = server.ln.Addr().String()
    64  
    65  	return ln
    66  }
    67  
    68  func (server *testServer) ServeTCP() {
    69  	defer server.wg.Done()
    70  	defer GinkgoRecover()
    71  
    72  	for {
    73  		conn, err := server.ln.Accept()
    74  
    75  		server.mu.RLock()
    76  		if server.closed {
    77  			server.mu.RUnlock()
    78  			return
    79  		}
    80  		server.mu.RUnlock()
    81  
    82  		Expect(err).NotTo(HaveOccurred())
    83  
    84  		time.Sleep(100 * time.Millisecond)
    85  
    86  		buf := make([]byte, 1024)
    87  		n, err := conn.Read(buf)
    88  
    89  		// expect bad certificate from 'bad cert' test
    90  		if err != nil && err.Error() == "remote error: tls: bad certificate" {
    91  			continue
    92  		}
    93  
    94  		// expect no message from 'open and close' tests
    95  		if err != nil && err == io.EOF {
    96  			continue
    97  		}
    98  
    99  		Expect(err).NotTo(HaveOccurred())
   100  
   101  		server.Messages <- string(buf[0:n])
   102  	}
   103  }
   104  
   105  func (server *testServer) Close() {
   106  	server.mu.Lock()
   107  	server.closed = true
   108  	server.mu.Unlock()
   109  
   110  	server.ln.Close()
   111  	server.wg.Wait()
   112  }