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 }