...

Source file src/go.etcd.io/etcd/client/v3/ordering/kv_test.go

Documentation: go.etcd.io/etcd/client/v3/ordering

     1  // Copyright 2017 The etcd Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    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