package installer import ( "context" "errors" "path/filepath" "testing" "github.com/stretchr/testify/require" ) func TestInterruptedDMGAttachCleansOwnedMountsWithIndependentLifetime(t *testing.T) { root := t.TempDir() for _, attachErr := range []error{context.Canceled, errors.New("attach failed after mounting"), errors.New("invalid plist")} { t.Run(attachErr.Error(), func(t *testing.T) { detached := []string{} err := withOwnedDMGMounts(root, func() ([]dmgMount, error) { return nil, attachErr }, func() ([]dmgMount, error) { return []dmgMount{{Device: "/dev/disk7s1", MountPoint: filepath.Join(root, "IINA")}, {Device: "/dev/disk9s1", MountPoint: "/Volumes/unrelated"}}, nil }, func(device string) error { detached = append(detached, device); return nil }, func([]dmgMount) error { t.Fatal("failed attach reached install"); return nil }) require.ErrorIs(t, err, attachErr) require.Equal(t, []string{"/dev/disk7s1"}, detached) var cleanupErr *dmgCleanupError require.False(t, errors.As(err, &cleanupErr)) }) } } func TestDMGCleanupFailureIsReportedAndNeverDetachedTwice(t *testing.T) { root := t.TempDir() mount := dmgMount{Device: "/dev/disk7s1", MountPoint: filepath.Join(root, "IINA")} cause := errors.New("device busy") calls := 0 err := withOwnedDMGMounts(root, func() ([]dmgMount, error) { return []dmgMount{mount}, nil }, func() ([]dmgMount, error) { return []dmgMount{mount}, nil }, func(string) error { calls++; return cause }, func([]dmgMount) error { return nil }) require.ErrorIs(t, err, cause) require.Equal(t, 1, calls) var cleanupErr *dmgCleanupError require.ErrorAs(t, err, &cleanupErr) require.Contains(t, err.Error(), "staging retained") mounts, err := parseHDIUtilMountPlist([]byte(`images`), false) require.NoError(t, err) require.Empty(t, mounts) }