package installer
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestParseHDIUtilAttachPlistBindsDeviceAndMount(t *testing.T) {
plist := []byte(`
system-entities
dev-entry/dev/disk7potentially-mountable
dev-entry/dev/disk7s1mount-point/private/tmp/owned/IINA 1
dev-entry/dev/disk8s1mount-point/private/tmp/owned/Extras
`)
mounts, err := parseHDIUtilAttachPlist(plist)
require.NoError(t, err)
assert.Equal(t, []dmgMount{
{Device: "/dev/disk7s1", MountPoint: "/private/tmp/owned/IINA 1"},
{Device: "/dev/disk8s1", MountPoint: "/private/tmp/owned/Extras"},
}, mounts)
}
func TestParseHDIUtilAttachPlistRejectsMissingMount(t *testing.T) {
_, err := parseHDIUtilAttachPlist([]byte(`system-entitiesdev-entry/dev/disk7`))
require.Error(t, err)
assert.Contains(t, err.Error(), "no mounted filesystem")
}
func TestParseHDIUtilAttachPlistFindsNestedInfoEntities(t *testing.T) {
plist := []byte(`imagessystem-entitiesdev-entry/dev/disk9s1mount-point/tmp/owned/IINA`)
mounts, err := parseHDIUtilAttachPlist(plist)
require.NoError(t, err)
assert.Equal(t, []dmgMount{{Device: "/dev/disk9s1", MountPoint: "/tmp/owned/IINA"}}, mounts)
}
func TestParseHDIUtilAttachPlistRejectsMalformedInput(t *testing.T) {
_, err := parseHDIUtilAttachPlist([]byte(`system-entities`))
require.Error(t, err)
}
func TestSelectIINAMountUsesOnlyOwnedReturnedMount(t *testing.T) {
root := t.TempDir()
other := filepath.Join(root, "Docs")
iina := filepath.Join(root, "IINA 1")
require.NoError(t, os.MkdirAll(other, 0755))
require.NoError(t, os.MkdirAll(filepath.Join(iina, "IINA.app"), 0755))
selected, err := selectIINAMount(root, []dmgMount{
{Device: "/dev/disk7s1", MountPoint: other},
{Device: "/dev/disk8s1", MountPoint: iina},
})
require.NoError(t, err)
assert.Equal(t, dmgMount{Device: "/dev/disk8s1", MountPoint: iina}, selected)
}
func TestSelectIINAMountRejectsOutsideAndAmbiguousMounts(t *testing.T) {
root := t.TempDir()
outside := t.TempDir()
require.NoError(t, os.Mkdir(filepath.Join(outside, "IINA.app"), 0755))
_, err := selectIINAMount(root, []dmgMount{{Device: "/dev/disk7s1", MountPoint: outside}})
require.Error(t, err)
assert.Contains(t, err.Error(), "outside the owned root")
first := filepath.Join(root, "IINA")
second := filepath.Join(root, "IINA 1")
require.NoError(t, os.MkdirAll(filepath.Join(first, "IINA.app"), 0755))
require.NoError(t, os.MkdirAll(filepath.Join(second, "IINA.app"), 0755))
_, err = selectIINAMount(root, []dmgMount{
{Device: "/dev/disk7s1", MountPoint: first},
{Device: "/dev/disk8s1", MountPoint: second},
})
require.Error(t, err)
assert.Contains(t, err.Error(), "multiple IINA.app")
}
func TestSelectIINAMountRejectsSymlinkedApp(t *testing.T) {
root := t.TempDir()
mount := filepath.Join(root, "IINA")
require.NoError(t, os.MkdirAll(mount, 0755))
require.NoError(t, os.Symlink(t.TempDir(), filepath.Join(mount, "IINA.app")))
_, err := selectIINAMount(root, []dmgMount{{Device: "/dev/disk7s1", MountPoint: mount}})
require.Error(t, err)
assert.Contains(t, err.Error(), "not a real directory")
}