core/mise/install_test.go
core/mise/install_test.goBrowse 1970 files
748 tokens
3,083 bytes
Token encoding: o200k_base
Snapshot 21a254f
← Back to SKILL.md
1package mise2 3import (4 "fmt"5 "net/http"6 "net/http/httptest"7 "os"8 "path/filepath"9 "sync/atomic"10 "testing"11 12 "github.com/stretchr/testify/require"13)14 15func TestDownloadArchiveClassifiesStatusCodes(t *testing.T) {16 tests := []struct {17 status int18 isTemporary bool19 }{20 {status: http.StatusOK},21 {status: http.StatusNotFound},22 {status: http.StatusForbidden},23 {status: http.StatusRequestTimeout, isTemporary: true},24 {status: http.StatusTooManyRequests, isTemporary: true},25 {status: http.StatusInternalServerError, isTemporary: true},26 {status: http.StatusServiceUnavailable, isTemporary: true},27 }28 29 for _, tt := range tests {30 t.Run(fmt.Sprintf("status-%d", tt.status), func(t *testing.T) {31 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {32 w.WriteHeader(tt.status)33 }))34 defer server.Close()35 36 err := downloadArchive(server.URL, filepath.Join(t.TempDir(), "mise.tar.gz"))37 38 if tt.status == http.StatusOK {39 require.NoError(t, err)40 return41 }42 43 require.Error(t, err)44 require.Equal(t, tt.isTemporary, IsTemporary(err))45 })46 }47}48 49func TestDownloadArchiveWritesTheResponseBody(t *testing.T) {50 var requests atomic.Int3251 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {52 requests.Add(1)53 _, _ = w.Write([]byte("archive contents"))54 }))55 defer server.Close()56 57 archivePath := filepath.Join(t.TempDir(), "mise.tar.gz")58 require.NoError(t, downloadArchive(server.URL, archivePath))59 60 // the download is attempted once; retries are the caller's decision61 require.EqualValues(t, 1, requests.Load())62 63 contents, err := os.ReadFile(archivePath)64 require.NoError(t, err)65 require.Equal(t, "archive contents", string(contents))66}67 68func TestDownloadArchiveTransportFailureIsTemporary(t *testing.T) {69 // closing the server up front guarantees a connection error rather than a response70 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))71 url := server.URL72 server.Close()73 74 err := downloadArchive(url, filepath.Join(t.TempDir(), "mise.tar.gz"))75 require.True(t, IsTemporary(err))76}77 78// the install path wraps the download error several times before a caller sees it79func TestEnsureInstalledKeepsTemporaryFailuresDetectable(t *testing.T) {80 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {81 w.WriteHeader(http.StatusServiceUnavailable)82 }))83 defer server.Close()84 85 originalBase := githubReleaseBase86 githubReleaseBase = server.URL87 t.Cleanup(func() { githubReleaseBase = originalBase })88 89 _, err := ensureInstalled(filepath.Join(t.TempDir(), "mise"))90 require.Error(t, err)91 require.True(t, IsTemporary(err))92}93 94func TestIsTemporaryUnwrapsWrappedErrors(t *testing.T) {95 temporary := &TemporaryError{URL: "https://example.com", Err: fmt.Errorf("i/o timeout")}96 97 require.True(t, IsTemporary(fmt.Errorf("failed to ensure mise is installed: %w", temporary)))98 require.False(t, IsTemporary(fmt.Errorf("binary not found in archive")))99 require.False(t, IsTemporary(nil))100}101