2022-12-08 13:05:19 -03:00

119 lines
2.5 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package session
import (
"context"
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
"github.com/google/go-cmp/cmp"
)
func TestDoHousekeeping(t *testing.T) {
type File struct {
Name string
IsDir bool
Age time.Duration
}
type Expectation struct {
Error string
Files []string
}
tests := []struct {
Name string
Files []File
Expectation Expectation
}{
{
Name: "empty store",
},
{
Name: "with state file",
Files: []File{
{Name: "foo.workspace.json", IsDir: false},
{Name: "foo", IsDir: true},
},
Expectation: Expectation{
Files: []string{"foo", "foo.workspace.json"},
},
},
{
Name: "no state file",
Files: []File{
{Name: "foo", IsDir: true, Age: 4 * time.Hour},
{Name: "foo-daemon", IsDir: true, Age: 4 * time.Hour},
},
},
{
Name: "daemon dir with state file",
Files: []File{
{Name: "foo.workspace.json", IsDir: false},
{Name: "foo-daemon", IsDir: true},
},
Expectation: Expectation{
Files: []string{"foo-daemon", "foo.workspace.json"},
},
},
{
Name: "daemon dir no state file",
Files: []File{
{Name: "foo-daemon", IsDir: true, Age: 4 * time.Hour},
},
},
}
for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
store, err := getTestStore()
if err != nil {
t.Fatal(err)
}
for _, f := range test.Files {
loc := filepath.Join(store.Location, f.Name)
var err error
if f.IsDir {
err = os.MkdirAll(loc, 0644)
} else {
err = ioutil.WriteFile(loc, nil, 0644)
}
if err != nil {
t.Fatalf("cannot prepare file %s: %v", f.Name, err)
}
if f.Age > 0 {
modtime := time.Now().Add(-f.Age)
err = os.Chtimes(loc, modtime, modtime)
}
if err != nil {
t.Fatalf("cannot prepare file %s: %v", f.Name, err)
}
}
errs := store.doHousekeeping(context.Background())
var act Expectation
for _, err := range errs {
if act.Error != "" {
act.Error += "; "
}
act.Error = err.Error()
}
res, err := ioutil.ReadDir(store.Location)
if err != nil {
t.Fatal(err)
}
for _, f := range res {
act.Files = append(act.Files, f.Name())
}
if diff := cmp.Diff(test.Expectation, act); diff != "" {
t.Errorf("unexpected doHousekeeping result (-want +got):\n%s", diff)
}
})
}
}