github.com/lzy4123/fabric@v2.1.1+incompatible/integration/e2e/e2e_suite_test.go (about)

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