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 }