Skip to content

Commit 26900a2

Browse files
committed
Add IsShadowCopy test
1 parent 9ca3533 commit 26900a2

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

vss.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func Remove(name string) error {
9494
return err
9595
}
9696
if err = sc.Remove(); err == nil && symlink != "" {
97-
err = syscall.RemoveDirectory(utf16Ptr(symlink))
97+
err = rmdir(symlink)
9898
}
9999
return err
100100
}
@@ -346,6 +346,11 @@ func readlink(name string) (string, error) {
346346
}
347347
}
348348

349+
// rmdir removes the named directory, which may be a symlink.
350+
func rmdir(name string) error {
351+
return syscall.RemoveDirectory(utf16Ptr(name))
352+
}
353+
349354
// resolveDevice resolves any symbolic links in name and returns the full
350355
// canonical path using device volume name.
351356
func resolveDevice(name string) (string, error) {

vss_test.go

+45
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,51 @@ func TestMain(m *testing.M) {
8484
os.Exit(m.Run())
8585
}
8686

87+
func TestIsShadowCopy(t *testing.T) {
88+
if len(vssadminList) == 0 {
89+
t.Skip("no existing shadow copies")
90+
}
91+
sc := vssadminList[0]
92+
tmp, err := os.MkdirTemp("", "go-vss.")
93+
require.NoError(t, err)
94+
defer os.Remove(tmp)
95+
96+
link := filepath.Join(tmp, "link")
97+
require.NoError(t, sc.Link(link))
98+
defer func() {
99+
if _, err := os.Lstat(link); err == nil {
100+
_ = rmdir(link)
101+
}
102+
}()
103+
104+
if ok, err := IsShadowCopy(tmp); assert.NoError(t, err) {
105+
assert.False(t, ok)
106+
}
107+
if ok, err := IsShadowCopy(sc.DeviceObject); assert.NoError(t, err) {
108+
assert.True(t, ok)
109+
}
110+
if ok, err := IsShadowCopy(link); assert.NoError(t, err) {
111+
assert.True(t, ok)
112+
}
113+
if have, err := Get(link); assert.NoError(t, err) {
114+
if have.InstallDate.Sub(sc.InstallDate).Abs() < time.Second {
115+
have.InstallDate = sc.InstallDate
116+
}
117+
assert.Equal(t, sc, have)
118+
}
119+
if all, err := os.ReadDir(link); assert.NoError(t, err) && len(all) > 0 {
120+
file := filepath.Join(link, all[0].Name())
121+
if ok, err := IsShadowCopy(file); assert.NoError(t, err) {
122+
assert.True(t, ok)
123+
}
124+
file = filepath.Join(sc.DeviceObject, all[0].Name())
125+
if ok, err := IsShadowCopy(file); assert.NoError(t, err) {
126+
assert.True(t, ok)
127+
}
128+
}
129+
assert.NoError(t, rmdir(link))
130+
}
131+
87132
func TestSplitVol(t *testing.T) {
88133
_, _, err := SplitVolume(`.`)
89134
assert.Error(t, err)

0 commit comments

Comments
 (0)