package version import ( "encoding/hex" "os" "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "lukechampine.com/blake3" ) // blake3HashOf computes the "blake3:" hash used by the release JSON. func blake3HashOf(data []byte) string { sum := blake3.Sum256(data) return "blake3:" + hex.EncodeToString(sum[:]) } func TestVerifySelfUpdate(t *testing.T) { content := []byte("mpv-manager self-update test vector") writeBinary := func(t *testing.T) string { t.Helper() path := filepath.Join(t.TempDir(), "mpv-manager.new") require.NoError(t, os.WriteFile(path, content, 0755)) return path } t.Run("correct hash passes", func(t *testing.T) { path := writeBinary(t) assert.NoError(t, verifySelfUpdate(path, blake3HashOf(content))) }) t.Run("wrong hash fails", func(t *testing.T) { path := writeBinary(t) err := verifySelfUpdate(path, blake3HashOf([]byte("tampered"))) require.Error(t, err) assert.Contains(t, err.Error(), "BLAKE3 hash mismatch") }) t.Run("missing hash aborts the update (fail-closed)", func(t *testing.T) { path := writeBinary(t) err := verifySelfUpdate(path, "") require.Error(t, err) assert.Contains(t, err.Error(), "no BLAKE3 hash available") }) } func TestVerifyBLAKE3(t *testing.T) { content := []byte("mpv-manager verify test vector") t.Run("correct hash passes", func(t *testing.T) { path := filepath.Join(t.TempDir(), "artifact.bin") require.NoError(t, os.WriteFile(path, content, 0644)) assert.NoError(t, VerifyBLAKE3(path, blake3HashOf(content))) }) t.Run("wrong hash fails", func(t *testing.T) { path := filepath.Join(t.TempDir(), "artifact.bin") require.NoError(t, os.WriteFile(path, content, 0644)) err := VerifyBLAKE3(path, blake3HashOf([]byte("other content"))) require.Error(t, err) assert.Contains(t, err.Error(), "BLAKE3 hash mismatch") }) }