1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package ordering
16
17 import (
18 "context"
19 gContext "context"
20 "sync"
21 "testing"
22
23 pb "go.etcd.io/etcd/api/v3/etcdserverpb"
24 "go.etcd.io/etcd/client/v3"
25 )
26
27 type mockKV struct {
28 clientv3.KV
29 response clientv3.OpResponse
30 }
31
32 func (kv *mockKV) Do(ctx gContext.Context, op clientv3.Op) (clientv3.OpResponse, error) {
33 return kv.response, nil
34 }
35
36 var rangeTests = []struct {
37 prevRev int64
38 response *clientv3.GetResponse
39 }{
40 {
41 5,
42 &clientv3.GetResponse{
43 Header: &pb.ResponseHeader{
44 Revision: 5,
45 },
46 },
47 },
48 {
49 5,
50 &clientv3.GetResponse{
51 Header: &pb.ResponseHeader{
52 Revision: 4,
53 },
54 },
55 },
56 {
57 5,
58 &clientv3.GetResponse{
59 Header: &pb.ResponseHeader{
60 Revision: 6,
61 },
62 },
63 },
64 }
65
66 func TestKvOrdering(t *testing.T) {
67 for i, tt := range rangeTests {
68 mKV := &mockKV{clientv3.NewKVFromKVClient(nil, nil), tt.response.OpResponse()}
69 kv := &kvOrdering{
70 mKV,
71 func(r *clientv3.GetResponse) OrderViolationFunc {
72 return func(op clientv3.Op, resp clientv3.OpResponse, prevRev int64) error {
73 r.Header.Revision++
74 return nil
75 }
76 }(tt.response),
77 tt.prevRev,
78 sync.RWMutex{},
79 }
80 res, err := kv.Get(context.TODO(), "mockKey")
81 if err != nil {
82 t.Errorf("#%d: expected response %+v, got error %+v", i, tt.response, err)
83 }
84 if rev := res.Header.Revision; rev < tt.prevRev {
85 t.Errorf("#%d: expected revision %d, got %d", i, tt.prevRev, rev)
86 }
87 }
88 }
89
90 var txnTests = []struct {
91 prevRev int64
92 response *clientv3.TxnResponse
93 }{
94 {
95 5,
96 &clientv3.TxnResponse{
97 Header: &pb.ResponseHeader{
98 Revision: 5,
99 },
100 },
101 },
102 {
103 5,
104 &clientv3.TxnResponse{
105 Header: &pb.ResponseHeader{
106 Revision: 8,
107 },
108 },
109 },
110 {
111 5,
112 &clientv3.TxnResponse{
113 Header: &pb.ResponseHeader{
114 Revision: 4,
115 },
116 },
117 },
118 }
119
120 func TestTxnOrdering(t *testing.T) {
121 for i, tt := range txnTests {
122 mKV := &mockKV{clientv3.NewKVFromKVClient(nil, nil), tt.response.OpResponse()}
123 kv := &kvOrdering{
124 mKV,
125 func(r *clientv3.TxnResponse) OrderViolationFunc {
126 return func(op clientv3.Op, resp clientv3.OpResponse, prevRev int64) error {
127 r.Header.Revision++
128 return nil
129 }
130 }(tt.response),
131 tt.prevRev,
132 sync.RWMutex{},
133 }
134 txn := &txnOrdering{
135 kv.Txn(context.Background()),
136 kv,
137 context.Background(),
138 sync.Mutex{},
139 []clientv3.Cmp{},
140 []clientv3.Op{},
141 []clientv3.Op{},
142 }
143 res, err := txn.Commit()
144 if err != nil {
145 t.Errorf("#%d: expected response %+v, got error %+v", i, tt.response, err)
146 }
147 if rev := res.Header.Revision; rev < tt.prevRev {
148 t.Errorf("#%d: expected revision %d, got %d", i, tt.prevRev, rev)
149 }
150 }
151 }
152
View as plain text