-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathwastebasket_nix_bench_test.go
138 lines (114 loc) · 2.85 KB
/
wastebasket_nix_bench_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//go:build freebsd || openbsd || netbsd || linux
package wastebasket
import (
"errors"
"fmt"
"os"
"os/exec"
"testing"
"time"
)
func create_files(count int) []string {
// Prevent slowdowns of consecutive runs, since we have to check for file
// existence more often if we create the file multiple times.
timeNow := time.Now().Format(time.RFC3339)
files := make([]string, 0, count)
for i := 1; i <= count; i++ {
path := fmt.Sprintf("./%s-%d.txt", timeNow, i)
files = append(files, path)
err := os.WriteFile(path, []byte("test"), os.ModePerm)
if err != nil {
panic(err)
}
}
return files
}
const manyFilesCount = 20
func Benchmark_gio_trash_manyFiles(b *testing.B) {
for i := 0; i < b.N; i++ {
b.StopTimer()
files := create_files(manyFilesCount)
b.StartTimer()
if err := gioTrash(files...); err != nil {
b.Error(err)
}
}
}
func Benchmark_customImpl_trash_manyFiles(b *testing.B) {
for i := 0; i < b.N; i++ {
b.StopTimer()
files := create_files(manyFilesCount)
b.StartTimer()
if err := Trash(files...); err != nil {
b.Error(err)
}
}
}
func Benchmark_gio_trash_singleFile(b *testing.B) {
for i := 0; i < b.N; i++ {
b.StopTimer()
files := create_files(1)
b.StartTimer()
if err := gioTrash(files...); err != nil {
b.Error(err)
}
}
}
func Benchmark_customImpl_trash_singleFile(b *testing.B) {
for i := 0; i < b.N; i++ {
b.StopTimer()
files := create_files(1)
b.StartTimer()
if err := Trash(files...); err != nil {
b.Error(err)
}
}
}
var (
availabilityCache = make(map[string]bool)
errToolNotAvailable = errors.New("tool not available")
)
func isCommandAvailable(name string) bool {
avail, ok := availabilityCache[name]
if avail && ok {
return true
}
_, fileError := exec.LookPath(name)
availabilityCache[name] = fileError == nil
return fileError == nil
}
func gioTrash(paths ...string) error {
if isCommandAvailable("gio") {
// --force makes sure we don't get errors for non-existent files.
parameters := append([]string{"trash", "--force"}, paths...)
return exec.Command("gio", parameters...).Run()
}
return errToolNotAvailable
}
func trashCli(paths ...string) error {
if isCommandAvailable("trash") {
// trash-cli throws 74 in case the file doesn't exist
existingFiles := make([]string, 0, len(paths))
for _, path := range paths {
if _, err := os.Stat(path); os.IsNotExist(err) {
continue
}
existingFiles = append(existingFiles, path)
}
parameters := append([]string{"--"}, existingFiles...)
return exec.Command("trash", parameters...).Run()
}
return errToolNotAvailable
}
func gioEmpty() error {
if isCommandAvailable("gio") {
return exec.Command("gio", "trash", "--empty").Run()
}
return errToolNotAvailable
}
func trashCliEmpty() error {
if isCommandAvailable("trash-empty") {
return exec.Command("trash-empty").Run()
}
return errToolNotAvailable
}