-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathmockblobstore.go
90 lines (73 loc) · 1.84 KB
/
mockblobstore.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
package elasticthought
import (
"fmt"
"io"
"strings"
)
var (
DefaultMockBlobStore *MockBlobStore
)
func init() {
DefaultMockBlobStore = &MockBlobStore{
GetResponses: map[string]ResponseQueue{},
}
}
type MockBlobStore struct {
// Queued responses for blob Get requests. The key is a
// regex that should match the path in the Get request.
GetResponses map[string]ResponseQueue
}
type ResponseQueue []io.Reader
func NewMockBlobStore() *MockBlobStore {
if DefaultMockBlobStore == nil {
DefaultMockBlobStore = &MockBlobStore{
GetResponses: map[string]ResponseQueue{},
}
}
return DefaultMockBlobStore
}
func (m *MockBlobStore) Get(path string) (io.ReadCloser, error) {
matchingKey, queue := m.responseQueueForPath(path)
if len(queue) == 0 {
return nil, fmt.Errorf("No more items in mock blob store for %v", path)
}
firstItem := queue[0]
m.GetResponses[matchingKey] = queue[1:]
return nopCloser{firstItem}, nil
}
func (m *MockBlobStore) Put(srcname, dest string, r io.Reader, opts BlobPutOptions) error {
return nil
}
func (m *MockBlobStore) Rm(fn string) error {
return nil
}
func (m *MockBlobStore) OpenFile(path string) (BlobHandle, error) {
return nil, nil
}
type nopCloser struct {
io.Reader
}
func (nopCloser) Close() error {
return nil
}
func (m *MockBlobStore) responseQueueForPath(path string) (string, ResponseQueue) {
// loop over all keys in GetResponses map until we find a match
for k, v := range m.GetResponses {
if path == "*" {
return k, v
}
if strings.Contains(k, path) { // TODO: replace w/ regex
return k, v
}
}
return "", nil
}
// Queue up a response to a Get request
func (m *MockBlobStore) QueueGetResponse(pathRegex string, response io.Reader) {
queue, ok := m.GetResponses[pathRegex]
if !ok {
queue = ResponseQueue{}
}
queue = append(queue, response)
m.GetResponses[pathRegex] = queue
}