github.com/replicatedhq/ship@v0.55.0/pkg/state/state_url_test.go (about)

     1  package state
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"math/rand"
     8  	"net/http"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/go-kit/kit/log"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestURLSerializer(t *testing.T) {
    17  	req := require.New(t)
    18  
    19  	srv, err := startStateServer(t)
    20  	req.NoError(err)
    21  
    22  	defer srv.Shutdown(context.TODO()) // nolint: errcheck
    23  
    24  	s := newURLSerializer(
    25  		log.NewNopLogger(),
    26  		fmt.Sprintf("http://%s/testurlserializer/get-state", srv.Addr),
    27  		fmt.Sprintf("http://%s/testurlserializer/put-state", srv.Addr),
    28  	)
    29  
    30  	state1 := State{
    31  		V1: &V1{
    32  			Kustomize: &Kustomize{
    33  				Overlays: map[string]Overlay{
    34  					"ship": {
    35  						Patches: map[string]string{
    36  							"deployment.yaml": "foo/bar/baz",
    37  						},
    38  						Resources: map[string]string{
    39  							"resource.yaml": "hi",
    40  						},
    41  					},
    42  				},
    43  			},
    44  		},
    45  	}
    46  
    47  	err = s.Save(state1)
    48  	req.NoError(err)
    49  
    50  	state2, err := s.Load()
    51  	req.NoError(err)
    52  	req.Equal(state1, state2)
    53  }
    54  
    55  func startStateServer(t *testing.T) (*http.Server, error) {
    56  	req := require.New(t)
    57  
    58  	rand.Seed(time.Now().UnixNano())
    59  	port := rand.Intn(32000) + 32000 // random port between 32000 and 64000
    60  	srv := &http.Server{Addr: fmt.Sprintf("127.0.0.1:%d", port)}
    61  
    62  	http.HandleFunc("/testurlserializer/ping", func(w http.ResponseWriter, r *http.Request) {
    63  		w.WriteHeader(http.StatusOK)
    64  		_, _ = w.Write([]byte(""))
    65  	})
    66  
    67  	var stateData []byte
    68  
    69  	http.HandleFunc("/testurlserializer/put-state", func(w http.ResponseWriter, r *http.Request) {
    70  		req.Equal(r.Method, "PUT")
    71  		req.Equal(r.Header.Get("Content-Type"), "application/json")
    72  		body, err := ioutil.ReadAll(r.Body)
    73  		req.NoError(err)
    74  		stateData = body
    75  
    76  		w.WriteHeader(http.StatusOK)
    77  		_, _ = w.Write([]byte(""))
    78  	})
    79  
    80  	http.HandleFunc("/testurlserializer/get-state", func(w http.ResponseWriter, r *http.Request) {
    81  		w.WriteHeader(http.StatusOK)
    82  		_, _ = w.Write(stateData)
    83  	})
    84  
    85  	go func() {
    86  		if err := srv.ListenAndServe(); err != http.ErrServerClosed {
    87  			fmt.Printf("ListenAndServe(): %v", err)
    88  		}
    89  	}()
    90  
    91  	var pingErr error
    92  	for i := 0; i < 10; i++ {
    93  		time.Sleep(1 * time.Second)
    94  		resp, err := http.Get(fmt.Sprintf("http://%s/testurlserializer/ping", srv.Addr))
    95  		if err == nil && resp.StatusCode == http.StatusOK {
    96  			return srv, nil
    97  		}
    98  		pingErr = err // safe to assume err is not nil here...
    99  	}
   100  
   101  	return nil, pingErr
   102  }