github.com/lfch/etcd-io/tests/v3@v3.0.0-20221004140520-eac99acd3e9d/framework/testutils/helpters.go (about) 1 // Copyright 2022 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 testutils 16 17 import ( 18 "errors" 19 "time" 20 21 clientv3 "github.com/lfch/etcd-io/client/v3" 22 ) 23 24 type KV struct { 25 Key, Val string 26 } 27 28 func KeysFromGetResponse(resp *clientv3.GetResponse) (kvs []string) { 29 for _, kv := range resp.Kvs { 30 kvs = append(kvs, string(kv.Key)) 31 } 32 return kvs 33 } 34 35 func KeyValuesFromGetResponse(resp *clientv3.GetResponse) (kvs []KV) { 36 for _, kv := range resp.Kvs { 37 kvs = append(kvs, KV{Key: string(kv.Key), Val: string(kv.Value)}) 38 } 39 return kvs 40 } 41 42 func KeyValuesFromWatchResponse(resp clientv3.WatchResponse) (kvs []KV) { 43 for _, event := range resp.Events { 44 kvs = append(kvs, KV{Key: string(event.Kv.Key), Val: string(event.Kv.Value)}) 45 } 46 return kvs 47 } 48 49 func KeyValuesFromWatchChan(wch clientv3.WatchChan, wantedLen int, timeout time.Duration) (kvs []KV, err error) { 50 for { 51 select { 52 case watchResp, ok := <-wch: 53 if ok { 54 kvs = append(kvs, KeyValuesFromWatchResponse(watchResp)...) 55 if len(kvs) == wantedLen { 56 return kvs, nil 57 } 58 } 59 case <-time.After(timeout): 60 return nil, errors.New("closed watcher channel should not block") 61 } 62 } 63 }