...

Source file src/go.etcd.io/etcd/server/v3/etcdserver/apply_test.go

Documentation: go.etcd.io/etcd/server/v3/etcdserver

     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  	// setup minimal server to get access to applier
    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  	// setup cancelled context
    32  	ctx, cancel := context.WithCancel(context.TODO())
    33  	cancel()
    34  
    35  	// put some data to prevent early termination in rangeKeys
    36  	// we are expecting failure on cancelled context check
    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  	// setup minimal server to get access to applier
    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  	// setup cancelled context
    71  	ctx, cancel := context.WithCancel(context.TODO())
    72  	cancel()
    73  
    74  	// write txn that puts some data and then fails in range due to cancelled context
    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