github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/vent/service/server_test.go (about)

     1  // +build integration
     2  
     3  package service_test
     4  
     5  import (
     6  	"fmt"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"os"
    10  	"sync"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/hyperledger/burrow/integration"
    15  	"github.com/hyperledger/burrow/integration/rpctest"
    16  	"github.com/hyperledger/burrow/logging"
    17  	"github.com/hyperledger/burrow/vent/config"
    18  	"github.com/hyperledger/burrow/vent/service"
    19  	"github.com/hyperledger/burrow/vent/sqlsol"
    20  	"github.com/hyperledger/burrow/vent/test"
    21  	"github.com/hyperledger/burrow/vent/types"
    22  	"github.com/stretchr/testify/require"
    23  )
    24  
    25  func TestServer(t *testing.T) {
    26  	kern, shutdown := integration.RunNode(t, rpctest.GenesisDoc, rpctest.PrivateAccounts)
    27  	defer shutdown()
    28  	t.Parallel()
    29  
    30  	t.Run("Group", func(t *testing.T) {
    31  		t.Run("Run", func(t *testing.T) {
    32  			// run consumer to listen to events
    33  			cfg := config.DefaultVentConfig()
    34  
    35  			// create test db
    36  			_, closeDB := test.NewTestDB(t, cfg)
    37  			defer closeDB()
    38  
    39  			cfg.SpecFileOrDirs = []string{os.Getenv("GOPATH") + "/src/github.com/hyperledger/burrow/vent/test/sqlsol_view.json"}
    40  			cfg.AbiFileOrDirs = []string{os.Getenv("GOPATH") + "/src/github.com/hyperledger/burrow/vent/test/EventsTest.abi"}
    41  			cfg.ChainAddress = kern.GRPCListenAddress().String()
    42  
    43  			log := logging.NewNoopLogger()
    44  			consumer := service.NewConsumer(cfg, log, make(chan types.EventData))
    45  			projection, err := sqlsol.SpecLoader(cfg.SpecFileOrDirs, sqlsol.None)
    46  
    47  			var wg sync.WaitGroup
    48  
    49  			wg.Add(1)
    50  			go func() {
    51  				err := consumer.Run(projection, true)
    52  				require.NoError(t, err)
    53  
    54  				wg.Done()
    55  			}()
    56  
    57  			time.Sleep(2 * time.Second)
    58  
    59  			// setup test server
    60  			server := service.NewServer(cfg, log, consumer)
    61  
    62  			httpServer := httptest.NewServer(server)
    63  			defer httpServer.Close()
    64  
    65  			// call health endpoint should return OK
    66  			healthURL := fmt.Sprintf("%s/health", httpServer.URL)
    67  
    68  			resp, err := http.Get(healthURL)
    69  			require.NoError(t, err)
    70  			require.Equal(t, http.StatusOK, resp.StatusCode)
    71  
    72  			// shutdown consumer and wait for its end
    73  			consumer.Shutdown()
    74  			wg.Wait()
    75  
    76  			// call health endpoint again should return error
    77  			resp, err = http.Get(healthURL)
    78  			require.NoError(t, err)
    79  			require.Equal(t, http.StatusServiceUnavailable, resp.StatusCode)
    80  		})
    81  	})
    82  }