@@ -6,83 +6,156 @@ import (
6
6
"strconv"
7
7
"testing"
8
8
9
- "github.com/golang/mock/gomock"
9
+ "github.com/go-test/deep"
10
+ "github.com/stretchr/testify/assert"
10
11
"github.com/stretchr/testify/require"
11
12
"github.com/treeverse/lakefs/graveler/committed"
12
- "github.com/treeverse/lakefs/graveler/committed/mock"
13
13
)
14
14
15
+ // FakeRangeWriter is a RangeWriter that is safe to use in goroutines. (mock.RangeWriter is
16
+ // NOT safe, it uses gomock which calls t.Fatal and friends!)
17
+ type FakeRangeWriter struct {
18
+ err error
19
+
20
+ closed bool
21
+ closeResult closeResult
22
+ writeRecords []* committed.Record
23
+
24
+ storedType string
25
+ }
26
+
27
+ type closeResult struct {
28
+ result * committed.WriteResult
29
+ err error
30
+ }
31
+
32
+ var (
33
+ ErrNotImplemented = errors .New ("not implemented" )
34
+ ErrAlreadyClosed = errors .New ("closed more than once" )
35
+ ErrUnexpected = errors .New ("unexpected call" )
36
+ )
37
+
38
+ func (f * FakeRangeWriter ) Err () error {
39
+ return f .err
40
+ }
41
+
42
+ func (f * FakeRangeWriter ) setErr (err error ) error {
43
+ f .err = err
44
+ return err
45
+ }
46
+
47
+ func (f * FakeRangeWriter ) ExpectWriteRecord (r committed.Record ) {
48
+ f .writeRecords = append (f .writeRecords , & r )
49
+ }
50
+
51
+ func (f * FakeRangeWriter ) ExpectAnyRecord () {
52
+ f .writeRecords = append (f .writeRecords , nil )
53
+ }
54
+
55
+ func (f * FakeRangeWriter ) WriteRecord (r committed.Record ) error {
56
+ if len (f .writeRecords ) < 1 {
57
+ return f .setErr (fmt .Errorf ("try to write %+v when expected nothing: %w" , r , ErrUnexpected ))
58
+ }
59
+ var n * committed.Record
60
+ n , f .writeRecords = f .writeRecords [0 ], f .writeRecords [1 :]
61
+ if n == nil { // any
62
+ return nil
63
+ }
64
+ if diffs := deep .Equal (& r , n ); diffs != nil {
65
+ return f .setErr (fmt .Errorf ("try to write the wrong value %s: %w" , diffs , ErrUnexpected ))
66
+ }
67
+ return nil
68
+ }
69
+
70
+ func (f * FakeRangeWriter ) AddMetadata (key , value string ) {
71
+ if key == committed .MetadataTypeKey {
72
+ f .storedType = value
73
+ }
74
+ }
75
+
76
+ func (* FakeRangeWriter ) GetApproximateSize () uint64 { return 0 }
77
+
78
+ func (f * FakeRangeWriter ) Close () (* committed.WriteResult , error ) {
79
+ if f .closed {
80
+ f .err = ErrAlreadyClosed
81
+ return nil , ErrAlreadyClosed
82
+ }
83
+ return f .closeResult .result , f .closeResult .err
84
+ }
85
+
86
+ func (f * FakeRangeWriter ) Abort () error { return nil }
87
+
88
+ func NewFakeRangeWriter (result * committed.WriteResult , err error ) * FakeRangeWriter {
89
+ return & FakeRangeWriter {
90
+ closeResult : closeResult {result , err },
91
+ }
92
+ }
93
+
15
94
func TestBatchCloserSuccess (t * testing.T ) {
16
95
runSuccessScenario (t )
17
96
}
18
97
19
98
func TestBatchWriterFailed (t * testing.T ) {
20
- ctrl := gomock .NewController (t )
21
- defer ctrl .Finish ()
22
-
23
- writerSuccess := mock .NewMockRangeWriter (ctrl )
24
- writerSuccess .EXPECT ().Close ().Return (& committed.WriteResult {
25
- RangeID : committed .ID (strconv .Itoa (1 )),
26
- First : committed .Key ("row_1" ),
27
- Last : committed .Key ("row_2" ),
28
- Count : 4321 ,
29
- }, nil ).Times (1 )
30
- writerFailure := mock .NewMockRangeWriter (ctrl )
99
+ writerSuccess := NewFakeRangeWriter (
100
+ & committed.WriteResult {
101
+ RangeID : committed .ID (strconv .Itoa (1 )),
102
+ First : committed .Key ("row_1" ),
103
+ Last : committed .Key ("row_2" ),
104
+ Count : 4321 ,
105
+ }, nil )
31
106
expectedErr := errors .New ("failure" )
32
- writerFailure . EXPECT (). Close (). Return ( nil , expectedErr ). Times ( 1 )
107
+ writerFailure := NewFakeRangeWriter ( nil , expectedErr )
33
108
34
- sut := committed .NewBatchCloser ()
35
- require .NoError (t , sut .CloseWriterAsync (writerSuccess ))
36
- require .NoError (t , sut .CloseWriterAsync (writerFailure ))
109
+ sut := committed .NewBatchCloser (10 )
110
+ assert .NoError (t , sut .CloseWriterAsync (writerSuccess ))
111
+ assert .NoError (t , sut .CloseWriterAsync (writerFailure ))
37
112
38
113
res , err := sut .Wait ()
39
- require .Error (t , expectedErr , err )
40
- require .Nil (t , res )
114
+ assert .Error (t , expectedErr , err )
115
+ assert .Nil (t , res )
116
+
117
+ assert .NoError (t , writerSuccess .Err ())
118
+ assert .NoError (t , writerFailure .Err ())
41
119
}
42
120
43
121
func TestBatchCloserMultipleWaitCalls (t * testing.T ) {
44
- sut , ctrl := runSuccessScenario (t )
45
-
46
- writer := mock .NewMockRangeWriter (ctrl )
47
- writer .EXPECT ().Close ().Return (& committed.WriteResult {
122
+ writer := NewFakeRangeWriter (& committed.WriteResult {
48
123
RangeID : committed .ID ("last" ),
49
124
First : committed .Key ("row_1" ),
50
125
Last : committed .Key ("row_2" ),
51
126
Count : 4321 ,
52
- }, nil ). Times ( 1 )
127
+ }, nil )
53
128
54
- require .Error (t , sut .CloseWriterAsync (writer ), committed .ErrMultipleWaitCalls )
129
+ sut := runSuccessScenario (t )
130
+
131
+ assert .Error (t , sut .CloseWriterAsync (writer ), committed .ErrMultipleWaitCalls )
55
132
res , err := sut .Wait ()
56
133
require .Nil (t , res )
57
134
require .Error (t , err , committed .ErrMultipleWaitCalls )
58
135
}
59
136
60
- func runSuccessScenario (t * testing.T ) (* committed.BatchCloser , * gomock.Controller ) {
61
- ctrl := gomock .NewController (t )
62
- defer ctrl .Finish ()
63
-
137
+ func runSuccessScenario (t * testing.T ) * committed.BatchCloser {
64
138
const writersCount = 10
65
- writers := make ([]* mock. MockRangeWriter , writersCount )
139
+ writers := make ([]* FakeRangeWriter , writersCount )
66
140
for i := 0 ; i < writersCount ; i ++ {
67
- writers [i ] = mock .NewMockRangeWriter (ctrl )
68
- writers [i ].EXPECT ().Close ().Return (& committed.WriteResult {
141
+ writers [i ] = NewFakeRangeWriter (& committed.WriteResult {
69
142
RangeID : committed .ID (strconv .Itoa (i )),
70
143
First : committed .Key (fmt .Sprintf ("row_%d_1" , i )),
71
144
Last : committed .Key (fmt .Sprintf ("row_%d_2" , i )),
72
145
Count : i ,
73
- }, nil ). Times ( 1 )
146
+ }, nil )
74
147
}
75
148
76
- sut := committed .NewBatchCloser ()
149
+ sut := committed .NewBatchCloser (writersCount )
77
150
78
151
for i := 0 ; i < writersCount ; i ++ {
79
- require .NoError (t , sut .CloseWriterAsync (writers [i ]))
152
+ assert .NoError (t , sut .CloseWriterAsync (writers [i ]))
80
153
}
81
154
82
155
res , err := sut .Wait ()
83
- require .NoError (t , err )
84
- require .NotNil (t , res )
85
- require .Len (t , res , writersCount )
156
+ assert .NoError (t , err )
157
+ assert .NotNil (t , res )
158
+ assert .Len (t , res , writersCount )
86
159
87
- return sut , ctrl
160
+ return sut
88
161
}
0 commit comments