This repository has been archived by the owner on Nov 8, 2017. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
snapshot_test.go
152 lines (124 loc) · 3.61 KB
/
snapshot_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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package bake_test
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
"github.com/flynn/bake"
)
// Ensures that a target is marked as dirty if its dependencies change.
func TestSnapshot_IsTargetDirty_Dependencies(t *testing.T) {
ss := NewSnapshot()
defer ss.Close()
target := &bake.Target{
Name: "T",
Dependencies: []string{"X", "Y"},
}
// Add target.
if err := ss.AddTarget(target, nil); err != nil {
t.Fatal(err)
}
// Update dependencies and verify it's dirty.
target.Dependencies = []string{"X"}
if dirty, err := ss.IsTargetDirty(target); err != nil {
t.Fatal(err)
} else if !dirty {
t.Fatal("expected dirty")
}
}
// Ensures that a target is marked as dirty if its commands change.
func TestSnapshot_IsTargetDirty_Commands(t *testing.T) {
ss := NewSnapshot()
defer ss.Close()
target := &bake.Target{
Name: "T",
Commands: []bake.Command{
&bake.ExecCommand{Args: []string{"run.sh"}},
},
}
// Add target.
if err := ss.AddTarget(target, nil); err != nil {
t.Fatal(err)
}
// Update command and verify it's dirty.
target.Commands[0].(*bake.ExecCommand).Args[0] = "build.sh"
if dirty, err := ss.IsTargetDirty(target); err != nil {
t.Fatal(err)
} else if !dirty {
t.Fatal("expected dirty")
}
}
// Ensures that a target is marked as dirty if its files change.
func TestSnapshot_IsTargetDirty_Files(t *testing.T) {
t.Parallel()
ss := NewSnapshot()
defer ss.Close()
// Initialize input files to a value.
MustWriteFile(filepath.Join(ss.Root(), "a"), []byte("0"))
MustWriteFile(filepath.Join(ss.Root(), "b"), []byte("1"))
// Add target with input files.
if err := ss.AddTarget(&bake.Target{Name: "T"}, []string{"a", "b"}); err != nil {
t.Fatal(err)
}
// Verify target is not dirty immediately after adding.
if dirty, err := ss.IsTargetDirty(&bake.Target{Name: "T"}); err != nil {
t.Fatal(err)
} else if dirty {
t.Fatal("expected not dirty")
}
// Wait for a second because of mtime resolution.
time.Sleep(1 * time.Second)
// Update one of the input files.
MustWriteFile(filepath.Join(ss.Root(), "b"), []byte("2"))
// Update command and verify it's dirty.
if dirty, err := ss.IsTargetDirty(&bake.Target{Name: "T"}); err != nil {
t.Fatal(err)
} else if !dirty {
t.Fatal("expected dirty")
}
}
// Ensures that a target is marked as dirty if files are added to input directories.
func TestSnapshot_IsTargetDirty_Dirs(t *testing.T) {
t.Parallel()
ss := NewSnapshot()
defer ss.Close()
// Initialize input files to a value.
MustWriteFile(filepath.Join(ss.Root(), "a/b"), []byte("0"))
// Add target with input files.
if err := ss.AddTarget(&bake.Target{Name: "T"}, []string{"a"}); err != nil {
t.Fatal(err)
}
// Wait for a second because of mtime resolution.
time.Sleep(1 * time.Second)
// Update one of the input files.
MustWriteFile(filepath.Join(ss.Root(), "a/c"), []byte("0"))
// Update command and verify it's dirty.
if dirty, err := ss.IsTargetDirty(&bake.Target{Name: "T"}); err != nil {
t.Fatal(err)
} else if !dirty {
t.Fatal("expected dirty")
}
}
// Snapshot represents a test wrapper for bake.Snapshot.
type Snapshot struct {
*bake.Snapshot
}
// NewSnapshot returns a new instance of Snapshot backed by a temporary path.
func NewSnapshot() *Snapshot {
path, err := ioutil.TempDir("", "bake-snapshot-path-")
if err != nil {
panic(err)
}
root, err := ioutil.TempDir("", "bake-snapshot-root-")
if err != nil {
panic(err)
}
return &Snapshot{Snapshot: bake.NewSnapshot(path, root)}
}
// Close removes underlying temporary path for the snapshot.
func (ss *Snapshot) Close() error {
os.RemoveAll(ss.Path())
os.RemoveAll(ss.Root())
return nil
}