forked from v2pro/koala
/
mock_file.go
66 lines (59 loc) · 1.49 KB
/
mock_file.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
package sut
import (
"crypto/sha1"
"encoding/base32"
"io/ioutil"
"github.com/v2pro/plz/countlog"
"os"
"github.com/v2pro/koala/envarg"
"sync"
)
var mockedFiles = map[string]bool{}
var mockedFilesMutex = &sync.Mutex{}
func init() {
if envarg.IsReplaying() {
if _, err := os.Stat("/tmp/koala-mocked-files"); err != nil {
// dir not created yet, create
err = os.Mkdir("/tmp/koala-mocked-files", 0777)
countlog.Error("event!sut.failed to create mocked dir", "err", err)
}
}
}
func mockFile(content []byte) string {
mockedFile := "/tmp/koala-mocked-files/" + hash(content)
if isMocked(mockedFile) {
return mockedFile
}
setMocked(mockedFile)
if _, err := os.Stat(mockedFile); err == nil {
return mockedFile
}
err := ioutil.WriteFile(mockedFile + ".tmp", content, 0666)
if err != nil {
countlog.Error("event!sut.failed to write mock file",
"mockedFile", mockedFile, "err", err)
return ""
}
err = os.Rename(mockedFile + ".tmp", mockedFile)
if err != nil {
countlog.Error("event!sut.failed to rename mock file tmp",
"mockedFile", mockedFile, "err", err)
return ""
}
return mockedFile
}
func hash(content []byte) string {
h := sha1.New()
h.Write(content)
return "g" + base32.StdEncoding.EncodeToString(h.Sum(nil))
}
func isMocked(mockedFile string) bool {
mockedFilesMutex.Lock()
defer mockedFilesMutex.Unlock()
return mockedFiles[mockedFile]
}
func setMocked(mockedFile string) {
mockedFilesMutex.Lock()
defer mockedFilesMutex.Unlock()
mockedFiles[mockedFile] = true
}