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") }