...
1 package etcdserver
2
3 import (
4 "context"
5 "strings"
6 "sync"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "go.uber.org/zap"
11
12 pb "go.etcd.io/etcd/api/v3/etcdserverpb"
13 "go.etcd.io/etcd/server/v3/lease"
14 "go.etcd.io/etcd/server/v3/mvcc"
15 betesting "go.etcd.io/etcd/server/v3/mvcc/backend/testing"
16 )
17
18 func TestReadonlyTxnError(t *testing.T) {
19 b, _ := betesting.NewDefaultTmpBackend(t)
20 defer betesting.Close(t, b)
21 s := mvcc.New(zap.NewExample(), b, &lease.FakeLessor{}, mvcc.StoreConfig{})
22 defer s.Close()
23
24
25 srv := &EtcdServer{lgMu: new(sync.RWMutex), lg: zap.NewExample(), r: *newRaftNode(raftNodeConfig{lg: zap.NewExample(), Node: newNodeRecorder()})}
26 srv.kv = s
27 srv.be = b
28
29 a := srv.newApplierV3Backend()
30
31
32 ctx, cancel := context.WithCancel(context.TODO())
33 cancel()
34
35
36
37 s.Put([]byte("foo"), []byte("bar"), lease.NoLease)
38
39 txn := &pb.TxnRequest{
40 Success: []*pb.RequestOp{
41 {
42 Request: &pb.RequestOp_RequestRange{
43 RequestRange: &pb.RangeRequest{
44 Key: []byte("foo"),
45 },
46 },
47 },
48 },
49 }
50
51 _, _, err := a.Txn(ctx, txn)
52 if err == nil || !strings.Contains(err.Error(), "applyTxn: failed Range: rangeKeys: context cancelled: context canceled") {
53 t.Fatalf("Expected context canceled error, got %v", err)
54 }
55 }
56
57 func TestWriteTxnPanic(t *testing.T) {
58 b, _ := betesting.NewDefaultTmpBackend(t)
59 defer betesting.Close(t, b)
60 s := mvcc.New(zap.NewExample(), b, &lease.FakeLessor{}, mvcc.StoreConfig{})
61 defer s.Close()
62
63
64 srv := &EtcdServer{lgMu: new(sync.RWMutex), lg: zap.NewExample(), r: *newRaftNode(raftNodeConfig{lg: zap.NewExample(), Node: newNodeRecorder()})}
65 srv.kv = s
66 srv.be = b
67
68 a := srv.newApplierV3Backend()
69
70
71 ctx, cancel := context.WithCancel(context.TODO())
72 cancel()
73
74
75 txn := &pb.TxnRequest{
76 Success: []*pb.RequestOp{
77 {
78 Request: &pb.RequestOp_RequestPut{
79 RequestPut: &pb.PutRequest{
80 Key: []byte("foo"),
81 Value: []byte("bar"),
82 },
83 },
84 },
85 {
86 Request: &pb.RequestOp_RequestRange{
87 RequestRange: &pb.RangeRequest{
88 Key: []byte("foo"),
89 },
90 },
91 },
92 },
93 }
94
95 assert.Panics(t, func() { a.Txn(ctx, txn) }, "Expected panic in Txn with writes")
96 }
97
View as plain text