// Copyright 2016 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // See the License for the specific language governing permissions and // limitations under the License. package etcdutil import ( "context" "fmt" "io/ioutil" "net/url" "os" "testing" "github.com/pingcap-incubator/tinykv/scheduler/pkg/tempurl" . "github.com/pingcap/check" "go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/embed" ) func Test(t *testing.T) { TestingT(t) } var _ = Suite(&testEtcdutilSuite{}) type testEtcdutilSuite struct { } func newTestSingleConfig() *embed.Config { cfg := embed.NewConfig() cfg.Name = "test_etcd" cfg.Dir, _ = ioutil.TempDir("/tmp", "test_etcd") cfg.WalDir = "" cfg.Logger = "zap" cfg.LogOutputs = []string{"stdout"} pu, _ := url.Parse(tempurl.Alloc()) cfg.LPUrls = []url.URL{*pu} cfg.APUrls = cfg.LPUrls cu, _ := url.Parse(tempurl.Alloc()) cfg.LCUrls = []url.URL{*cu} cfg.ACUrls = cfg.LCUrls cfg.StrictReconfigCheck = false cfg.InitialCluster = fmt.Sprintf("%s=%s", cfg.Name, &cfg.LPUrls[0]) cfg.ClusterState = embed.ClusterStateFlagNew return cfg } func cleanConfig(cfg *embed.Config) { // Clean data directory os.RemoveAll(cfg.Dir) } func (s *testEtcdutilSuite) TestEtcdKVGet(c *C) { cfg := newTestSingleConfig() etcd, err := embed.StartEtcd(cfg) c.Assert(err, IsNil) ep := cfg.LCUrls[0].String() client, err := clientv3.New(clientv3.Config{ Endpoints: []string{ep}, }) c.Assert(err, IsNil) <-etcd.Server.ReadyNotify() keys := []string{"test/key1", "test/key2", "test/key3", "test/key4", "test/key5"} vals := []string{"val1", "val2", "val3", "val4", "val5"} kv := clientv3.NewKV(client) for i := range keys { _, err = kv.Put(context.TODO(), keys[i], vals[i]) c.Assert(err, IsNil) } // Test simple point get resp, err := EtcdKVGet(client, "test/key1") c.Assert(err, IsNil) c.Assert(string(resp.Kvs[0].Value), Equals, "val1") // Test range get withRange := clientv3.WithRange("test/zzzz") withLimit := clientv3.WithLimit(3) resp, err = EtcdKVGet(client, "test/", withRange, withLimit, clientv3.WithSort(clientv3.SortByKey, clientv3.SortAscend)) c.Assert(err, IsNil) c.Assert(len(resp.Kvs), Equals, 3) for i := range resp.Kvs { c.Assert(string(resp.Kvs[i].Key), Equals, keys[i]) c.Assert(string(resp.Kvs[i].Value), Equals, vals[i]) } lastKey := string(resp.Kvs[len(resp.Kvs)-1].Key) next := clientv3.GetPrefixRangeEnd(lastKey) resp, err = EtcdKVGet(client, next, withRange, withLimit, clientv3.WithSort(clientv3.SortByKey, clientv3.SortAscend)) c.Assert(err, IsNil) c.Assert(len(resp.Kvs), Equals, 2) cleanConfig(cfg) }