package main import ( "context" "fmt" "io" "mime/multipart" "net/http" "net/http/httptest" "os" "path/filepath" "strings" "testing" ) func TestValidSwapFlag(t *testing.T) { for _, ok := range []string{"", "hold"} { if err := validSwapFlag(ok); err != nil { t.Errorf("validSwapFlag(%q) = %v", ok, err) } } for _, bad := range []string{"overlap", "Hold", "fast"} { if err := validSwapFlag(bad); err == nil || err.Error() != fmt.Sprintf(shipBadSwap, bad) { t.Errorf("validSwapFlag(%q) = %v", bad, err) } } } func TestCheckSwapEcho(t *testing.T) { if err := checkSwapEcho("", []byte(`{}`)); err != nil { t.Errorf("no demand sent: %v", err) } if err := checkSwapEcho("hold", []byte(`{"swap":"hold"}`)); err != nil { t.Errorf("echoed: %v", err) } if err := checkSwapEcho("hold", []byte(`{"result":"shipped"}`)); err == nil || err.Error() != shipSwapNoEcho { t.Errorf("an old console's answer passed: %v", err) } } func TestAPISessionShipSendsTheDemand(t *testing.T) { var meta string echo := `,"swap":"hold"` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { mr, err := r.MultipartReader() if err != nil { t.Fatal(err) } var p *multipart.Part if p, err = mr.NextPart(); err != nil { t.Fatal(err) } b, _ := io.ReadAll(p) meta = string(b) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) io.WriteString(w, `{"result":"shipped","version":"1.2.3"`+echo+`}`) })) defer ts.Close() file := filepath.Join(t.TempDir(), "bin") if err := os.WriteFile(file, []byte("x"), 0o600); err != nil { t.Fatal(err) } ship := func(s *apiSession) error { _, err := s.ship(context.Background(), apiAcct{Seg: "acct"}, "app", "1.2.3", "binary", "", "", map[string]string{"linux-arm64": file}, nil, false) return err } s := newTestSession(ts.URL) s.shipSwap = "hold" if err := ship(s); err != nil { t.Fatalf("ship: %v", err) } if !strings.Contains(meta, `"swap":"hold"`) { t.Fatalf("meta = %s, want the demand", meta) } echo = "" if err := ship(s); err == nil || err.Error() != shipSwapNoEcho { t.Fatalf("an answer without the echo: %v", err) } s.shipSwap = "" if err := ship(s); err != nil { t.Fatalf("a ship with no demand needs no echo: %v", err) } if strings.Contains(meta, "swap") { t.Fatalf("a ship with no demand sent one: %s", meta) } }