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  }