blob: 574fca29eee6ab99873ce6aee78b61472c550fc8 [file] [log] [blame]
Robin Thellend4523df62014-12-08 09:55:46 -08001package main
2
3import (
4 "bytes"
5 "fmt"
6 "io/ioutil"
7 "os"
8 "os/user"
9 "path/filepath"
10 "sort"
11 "strings"
12 "testing"
13 "time"
14)
15
16func setup(t *testing.T, workdir, username string) (tmpdir string) {
17 var err error
Robin Thellendcf140c02014-12-08 14:56:24 -080018 tmpdir, err = ioutil.TempDir(workdir, "gclogs-test-setup-")
Robin Thellend4523df62014-12-08 09:55:46 -080019 if err != nil {
20 t.Fatalf("ioutil.TempDir failed: %v", err)
21 }
22 logfiles := []struct {
23 name string
24 link string
25 age time.Duration
26 }{
27 {"prog1.host.%USER%.log.veyron.INFO.20141204-131502.12345", "", 4 * time.Hour},
28 {"prog1.host.%USER%.log.veyron.INFO.20141204-145040.23456", "prog1.INFO", 1 * time.Hour},
29 {"prog1.host.%USER%.log.veyron.ERROR.20141204-145040.23456", "prog1.ERROR", 1 * time.Hour},
30 {"prog2.host.%USER%.log.veyron.INFO.20141204-135040.23456", "prog2.INFO", 4 * time.Hour},
31 {"prog3.host.otheruser.log.veyron.INFO.20141204-135040.23456", "prog3.INFO", 1 * time.Hour},
32 {"foo.txt", "", 1 * time.Hour},
33 {"bar.txt", "", 1 * time.Hour},
34 }
35 for _, l := range logfiles {
36 l.name = strings.Replace(l.name, "%USER%", username, -1)
37 filename := filepath.Join(tmpdir, l.name)
38 if err := ioutil.WriteFile(filename, []byte{}, 0644); err != nil {
39 t.Fatalf("ioutil.WriteFile failed: %v", err)
40 }
41 mtime := time.Now().Add(-l.age)
42 if err := os.Chtimes(filename, mtime, mtime); err != nil {
43 t.Fatalf("os.Chtimes failed: %v", err)
44 }
45 if l.link != "" {
46 if err := os.Symlink(l.name, filepath.Join(tmpdir, l.link)); err != nil {
47 t.Fatalf("os.Symlink failed: %v", err)
48 }
49 }
50 }
51 if err := os.Mkdir(filepath.Join(tmpdir, "subdir"), 0700); err != nil {
52 t.Fatalf("os.Mkdir failed: %v", err)
53 }
54 return
55}
56
57func TestGCLogs(t *testing.T) {
58 workdir, err := ioutil.TempDir("", "parse-file-info-")
59 if err != nil {
60 t.Fatalf("ioutil.TempDir failed: %v", err)
61 }
62 defer os.RemoveAll(workdir)
63
64 u, err := user.Current()
65 if err != nil {
66 t.Fatalf("user.Current failed: %v", err)
67 }
68
69 cmd := cmdGCLogs
70 var stdout, stderr bytes.Buffer
71 cmd.Init(nil, &stdout, &stderr)
72
73 testcases := []struct {
74 cutoff time.Duration
75 verbose bool
76 dryrun bool
77 expected []string
78 }{
79 {
80 cutoff: 6 * time.Hour,
81 verbose: false,
82 dryrun: false,
83 expected: []string{
84 `Processing: "%TESTDIR%"`,
85 `Number of files deleted: 0`,
86 },
87 },
88 {
89 cutoff: 2 * time.Hour,
90 verbose: false,
91 dryrun: true,
92 expected: []string{
93 `Processing: "%TESTDIR%"`,
94 `Would delete "%TESTDIR%/prog1.host.%USER%.log.veyron.INFO.20141204-131502.12345"`,
95 `Would delete "%TESTDIR%/prog2.host.%USER%.log.veyron.INFO.20141204-135040.23456"`,
96 `Number of files deleted: 0`,
97 },
98 },
99 {
100 cutoff: 2 * time.Hour,
101 verbose: false,
102 dryrun: false,
103 expected: []string{
104 `Processing: "%TESTDIR%"`,
105 `Number of files deleted: 3`,
106 },
107 },
108 {
109 cutoff: 2 * time.Hour,
110 verbose: true,
111 dryrun: false,
112 expected: []string{
113 `Processing: "%TESTDIR%"`,
114 `Deleting "%TESTDIR%/prog1.host.%USER%.log.veyron.INFO.20141204-131502.12345"`,
115 `Deleting "%TESTDIR%/prog2.host.%USER%.log.veyron.INFO.20141204-135040.23456"`,
116 `Deleting symlink "%TESTDIR%/prog2.INFO"`,
117 `Not a log file: "%TESTDIR%/bar.txt"`,
118 `Not a log file: "%TESTDIR%/foo.txt"`,
119 `Skipped directory: "%TESTDIR%/subdir"`,
120 `Skipped log file created by other user: "%TESTDIR%/prog3.INFO"`,
121 `Skipped log file created by other user: "%TESTDIR%/prog3.host.otheruser.log.veyron.INFO.20141204-135040.23456"`,
122 `Number of files deleted: 3`,
123 },
124 },
125 {
126 cutoff: time.Minute,
127 verbose: true,
128 dryrun: false,
129 expected: []string{
130 `Processing: "%TESTDIR%"`,
131 `Deleting "%TESTDIR%/prog1.host.%USER%.log.veyron.ERROR.20141204-145040.23456"`,
132 `Deleting "%TESTDIR%/prog1.host.%USER%.log.veyron.INFO.20141204-131502.12345"`,
133 `Deleting "%TESTDIR%/prog1.host.%USER%.log.veyron.INFO.20141204-145040.23456"`,
134 `Deleting "%TESTDIR%/prog2.host.%USER%.log.veyron.INFO.20141204-135040.23456"`,
135 `Deleting symlink "%TESTDIR%/prog1.ERROR"`,
136 `Deleting symlink "%TESTDIR%/prog1.INFO"`,
137 `Deleting symlink "%TESTDIR%/prog2.INFO"`,
138 `Not a log file: "%TESTDIR%/bar.txt"`,
139 `Not a log file: "%TESTDIR%/foo.txt"`,
140 `Skipped directory: "%TESTDIR%/subdir"`,
141 `Skipped log file created by other user: "%TESTDIR%/prog3.INFO"`,
142 `Skipped log file created by other user: "%TESTDIR%/prog3.host.otheruser.log.veyron.INFO.20141204-135040.23456"`,
143 `Number of files deleted: 7`,
144 },
145 },
146 {
147 cutoff: time.Minute,
148 verbose: false,
149 dryrun: false,
150 expected: []string{
151 `Processing: "%TESTDIR%"`,
152 `Number of files deleted: 7`,
153 },
154 },
155 }
156 for _, tc := range testcases {
157 testdir := setup(t, workdir, u.Username)
158 cutoff := fmt.Sprintf("--cutoff=%s", tc.cutoff)
159 verbose := fmt.Sprintf("--verbose=%v", tc.verbose)
160 dryrun := fmt.Sprintf("--n=%v", tc.dryrun)
161 if err := cmd.Execute([]string{cutoff, verbose, dryrun, testdir}); err != nil {
162 t.Fatalf("%v: %v", stderr.String(), err)
163 }
164 gotsl := strings.Split(stdout.String(), "\n")
165 if len(gotsl) >= 2 {
166 sort.Strings(gotsl[1 : len(gotsl)-2])
167 }
168 got := strings.Join(gotsl, "\n")
169 expected := strings.Join(tc.expected, "\n") + "\n"
170 expected = strings.Replace(expected, "%TESTDIR%", testdir, -1)
171 expected = strings.Replace(expected, "%USER%", u.Username, -1)
172 if got != expected {
173 t.Errorf("Unexpected result for (%v, %v): got %q, expected %q", tc.cutoff, tc.verbose, got, expected)
174 }
175 stdout.Reset()
176 }
177}