github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/integration/e2e/e2e_suite_test.go (about) 1 /* 2 Copyright hechain All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package e2e 8 9 import ( 10 "bufio" 11 "encoding/json" 12 "io" 13 "net" 14 "sync" 15 "testing" 16 17 "github.com/hechain20/hechain/integration" 18 "github.com/hechain20/hechain/integration/nwo" 19 . "github.com/onsi/ginkgo" 20 . "github.com/onsi/gomega" 21 "github.com/onsi/gomega/gbytes" 22 ) 23 24 func TestEndToEnd(t *testing.T) { 25 RegisterFailHandler(Fail) 26 RunSpecs(t, "EndToEnd Suite") 27 } 28 29 var ( 30 buildServer *nwo.BuildServer 31 components *nwo.Components 32 ) 33 34 var _ = SynchronizedBeforeSuite(func() []byte { 35 buildServer = nwo.NewBuildServer() 36 buildServer.Serve() 37 38 components = buildServer.Components() 39 payload, err := json.Marshal(components) 40 Expect(err).NotTo(HaveOccurred()) 41 42 return payload 43 }, func(payload []byte) { 44 err := json.Unmarshal(payload, &components) 45 Expect(err).NotTo(HaveOccurred()) 46 }) 47 48 var _ = SynchronizedAfterSuite(func() { 49 }, func() { 50 buildServer.Shutdown() 51 }) 52 53 func StartPort() int { 54 return integration.E2EBasePort.StartPortForNode() 55 } 56 57 type MetricsReader struct { 58 buffer *gbytes.Buffer 59 errCh chan error 60 listener net.Listener 61 doneCh chan struct{} 62 closeOnce sync.Once 63 err error 64 } 65 66 func NewMetricsReader() *MetricsReader { 67 listener, err := net.Listen("tcp", "127.0.0.1:0") 68 Expect(err).NotTo(HaveOccurred()) 69 70 return &MetricsReader{ 71 buffer: gbytes.NewBuffer(), 72 listener: listener, 73 errCh: make(chan error, 1), 74 doneCh: make(chan struct{}), 75 } 76 } 77 78 func (mr *MetricsReader) Buffer() *gbytes.Buffer { 79 return mr.buffer 80 } 81 82 func (mr *MetricsReader) Address() string { 83 return mr.listener.Addr().String() 84 } 85 86 func (mr *MetricsReader) String() string { 87 return string(mr.buffer.Contents()) 88 } 89 90 func (mr *MetricsReader) Start() { 91 for { 92 conn, err := mr.listener.Accept() 93 if err != nil { 94 mr.errCh <- err 95 return 96 } 97 go mr.handleConnection(conn) 98 } 99 } 100 101 func (mr *MetricsReader) handleConnection(c net.Conn) { 102 defer GinkgoRecover() 103 defer c.Close() 104 105 br := bufio.NewReader(c) 106 for { 107 select { 108 case <-mr.doneCh: 109 c.Close() 110 default: 111 data, err := br.ReadBytes('\n') 112 if err == io.EOF { 113 return 114 } 115 Expect(err).NotTo(HaveOccurred()) 116 117 _, err = mr.buffer.Write(data) 118 Expect(err).NotTo(HaveOccurred()) 119 } 120 } 121 } 122 123 func (mr *MetricsReader) Close() error { 124 mr.closeOnce.Do(func() { 125 close(mr.doneCh) 126 err := mr.listener.Close() 127 mr.err = <-mr.errCh 128 if mr.err == nil && err != nil && err != io.EOF { 129 mr.err = err 130 } 131 }) 132 return mr.err 133 }