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

     1  package syslog_test
     2  
     3  import (
     4  	"crypto/tls"
     5  	"io/ioutil"
     6  	"net"
     7  	"os"
     8  	"time"
     9  
    10  	"github.com/pf-qiu/concourse/v6/atc/syslog"
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  	"github.com/square/certstrap/pkix"
    14  )
    15  
    16  var _ = Describe("Syslog", func() {
    17  	var server *testServer
    18  	const (
    19  		hostname = "hostname"
    20  		tag      = "tag"
    21  		message  = "build 123 log"
    22  	)
    23  
    24  	AfterEach(func() {
    25  		server.Close()
    26  	})
    27  
    28  	Context("when the address is valid tcp server", func() {
    29  		Context("when tls is enabled", func() {
    30  			var caFilePath string
    31  
    32  			BeforeEach(func() {
    33  				key, err := pkix.CreateRSAKey(1024)
    34  				Expect(err).NotTo(HaveOccurred())
    35  
    36  				ca, err := pkix.CreateCertificateAuthority(key, "", time.Now().Add(time.Hour), "Acme Co", "", "", "", "")
    37  				Expect(err).NotTo(HaveOccurred())
    38  
    39  				req, err := pkix.CreateCertificateSigningRequest(key, "", []net.IP{net.IPv4(127, 0, 0, 1)}, nil, "Acme Co", "", "", "", "")
    40  				Expect(err).NotTo(HaveOccurred())
    41  
    42  				cert, err := pkix.CreateCertificateHost(ca, key, req, time.Now().Add(time.Hour))
    43  				Expect(err).NotTo(HaveOccurred())
    44  
    45  				keyPEM, err := key.ExportPrivate()
    46  				Expect(err).NotTo(HaveOccurred())
    47  
    48  				caPEM, err := ca.Export()
    49  				Expect(err).NotTo(HaveOccurred())
    50  
    51  				certPEM, err := cert.Export()
    52  				Expect(err).NotTo(HaveOccurred())
    53  
    54  				tlsCert, err := tls.X509KeyPair(certPEM, keyPEM)
    55  				Expect(err).NotTo(HaveOccurred())
    56  
    57  				caFile, err := ioutil.TempFile("", "ca")
    58  				Expect(err).NotTo(HaveOccurred())
    59  
    60  				_, err = caFile.Write(caPEM)
    61  				Expect(err).NotTo(HaveOccurred())
    62  
    63  				err = caFile.Close()
    64  				Expect(err).NotTo(HaveOccurred())
    65  
    66  				caFilePath = caFile.Name()
    67  
    68  				server = newTestServer(&tlsCert)
    69  			})
    70  
    71  			AfterEach(func() {
    72  				err := os.RemoveAll(caFilePath)
    73  				Expect(err).ToNot(HaveOccurred())
    74  			})
    75  
    76  			It("connects and writes to server given correct cert", func() {
    77  				sl, err := syslog.Dial("tls", server.Addr, []string{caFilePath})
    78  				Expect(err).NotTo(HaveOccurred())
    79  
    80  				err = sl.Write(hostname, tag, time.Now(), message)
    81  				Expect(err).NotTo(HaveOccurred())
    82  
    83  				got := <-server.Messages
    84  				Expect(got).To(ContainSubstring(message))
    85  				Expect(got).NotTo(ContainSubstring("build 123 status"))
    86  
    87  				err = sl.Close()
    88  				Expect(err).NotTo(HaveOccurred())
    89  			}, 0.2)
    90  
    91  			It("fails connects to server given incorrect cert", func() {
    92  				_, err := syslog.Dial("tls", server.Addr, []string{"testdata/incorrect-cert.pem"})
    93  				Expect(err).To(HaveOccurred())
    94  				Expect(err.Error()).To(ContainSubstring("x509: certificate signed by unknown authority"))
    95  			}, 0.2)
    96  		})
    97  
    98  		Context("when tls is not set", func() {
    99  			BeforeEach(func() {
   100  				server = newTestServer(nil)
   101  			})
   102  
   103  			It("connects and writes to server", func() {
   104  				sl, err := syslog.Dial("tcp", server.Addr, []string{})
   105  				sl.Write(hostname, tag, time.Now(), message)
   106  				Expect(err).NotTo(HaveOccurred())
   107  
   108  				got := <-server.Messages
   109  				Expect(got).To(ContainSubstring(message))
   110  				Expect(got).NotTo(ContainSubstring("build 123 status"))
   111  
   112  				err = sl.Close()
   113  				Expect(err).NotTo(HaveOccurred())
   114  			}, 0.2)
   115  		})
   116  
   117  		Context("after the connection is closed", func() {
   118  			var (
   119  				sl  *syslog.Syslog
   120  				err error
   121  			)
   122  
   123  			BeforeEach(func() {
   124  				server = newTestServer(nil)
   125  				sl, err = syslog.Dial("tcp", server.Addr, []string{})
   126  				Expect(err).NotTo(HaveOccurred())
   127  
   128  				err = sl.Close()
   129  				Expect(err).ToNot(HaveOccurred())
   130  			})
   131  
   132  			It("subsequent ops will error", func() {
   133  				err = sl.Write(hostname, tag, time.Now(), message)
   134  				Expect(err.Error()).To(ContainSubstring("connection already closed"))
   135  
   136  				err = sl.Close()
   137  				Expect(err.Error()).To(ContainSubstring("connection already closed"))
   138  			})
   139  		})
   140  	})
   141  
   142  	Context("when the address is invalid", func() {
   143  		BeforeEach(func() {
   144  			server = newTestServer(nil)
   145  		})
   146  
   147  		It("errors", func() {
   148  			_, err := syslog.Dial("tcp", "bad.address", []string{})
   149  			Expect(err).To(HaveOccurred())
   150  		})
   151  	})
   152  
   153  })