github.com/XiaoMi/Gaea@v1.2.5/models/etcdv3/etcdv3_test.go (about) 1 // Copyright 2016 CodisLabs. All Rights Reserved. 2 // Licensed under the MIT (MIT-LICENSE.txt) license. 3 4 // Copyright 2019 The Gaea Authors. All Rights Reserved. 5 // 6 // Licensed under the Apache License, Version 2.0 (the "License"); 7 // you may not use this file except in compliance with the License. 8 // You may obtain a copy of the License at 9 // 10 // http://www.apache.org/licenses/LICENSE-2.0 11 // 12 // Unless required by applicable law or agreed to in writing, software 13 // distributed under the License is distributed on an "AS IS" BASIS, 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 // See the License for the specific language governing permissions and 16 // limitations under the License. 17 18 package etcdclientv3 19 20 import ( 21 "fmt" 22 "github.com/stretchr/testify/require" 23 "testing" 24 "time" 25 ) 26 27 func Test_EtcdV3(t *testing.T) { 28 // 设定颜色输出 29 colorReset := "\033[0m" 30 colorRed := "\033[31m" 31 32 remote, err := New("http://127.0.0.1:2379", 3*time.Second, "", "", "") 33 if err != nil { 34 // 如果 etcd 连线失败 35 fmt.Println(colorRed, "目前找不到可实验的 Etcd 服务器", colorReset) 36 } 37 if err == nil { 38 // >>>>> >>>>> >>>>> 如果 etcd 连线成功,执行以下成功,执行以下工作 39 40 // >>>>> 先进行 (1) 新增测试 (新增 key1 和 key2) 41 42 err = remote.Update("key1", []byte("value1")) // 写入 key1 43 require.Equal(t, err, nil) 44 45 err = remote.Update("key2", []byte("value2")) // 写入 key2 46 require.Equal(t, err, nil) 47 48 keys, err := remote.List("key") // 先列出所有的 key 值 49 require.Equal(t, err, nil) 50 require.Equal(t, keys, []string{"key1", "key2"}) 51 52 byte1, err := remote.Read("key1") // 检查 key1 值 53 require.Equal(t, err, nil) 54 require.Equal(t, string(byte1), "value1") 55 56 byte2, err := remote.Read("key2") // 检查 key2 值 57 require.Equal(t, err, nil) 58 require.Equal(t, string(byte2), "value2") 59 60 // return // 先中断,截图 (1) 新增测试 61 62 // >>>>> 接着进行 (2) 删除测试 (删除 key1) 63 64 err = remote.Delete("key1") // 删除 key1 65 require.Equal(t, err, nil) 66 67 keys, err = remote.List("key") // 列出所有的 key 值 68 require.Equal(t, err, nil) 69 require.Equal(t, keys, []string{"key2"}) 70 71 // return // 先中断,截图 (2) 删除测试 72 73 // >>>>> 接着进行 (3) 到时删除测试 (测试到时删除 key 值) 74 75 err = remote.UpdateWithTTL("key3", []byte("value3"), 5*time.Second) // key3 只保留 5 秒 76 require.Equal(t, err, nil) 77 78 keys, err = remote.List("key") // 先列出所有的 key 值 79 require.Equal(t, err, nil) 80 require.Equal(t, keys, []string{"key2", "key3"}) // 列出所有的 key 值 81 82 byte3, err := remote.Read("key3") // 检查 key3 值 83 require.Equal(t, err, nil) 84 require.Equal(t, string(byte3), "value3") 85 86 time.Sleep(6 * time.Second) // 停留 6 秒 87 88 keys, err = remote.List("key") // 先列出所有的 key 值 89 require.Equal(t, err, nil) 90 require.Equal(t, keys, []string{"key2"}) // 列出所有的 key 值 91 92 // return // 先中断,截图 (3) 到时删除测试 93 94 // >>>>> 接着进行 (4) 追踪测试 95 96 channel := make(chan string, 2) 97 go func(ch chan string) error { 98 err := remote.Watch("key", ch) // 追踪 key 值,只要 key1 key2 等值增加时,就会经由通道去通知 99 return err 100 }(channel) 101 102 time.Sleep(1 * time.Second) 103 104 err = remote.Update("key5", []byte("value5-1")) // 目前为永久保存 key5,值为 value5-1 105 require.Equal(t, err, nil) 106 107 msg := <-channel 108 require.Equal(t, msg, "key5") // 将会收到新增 key5 的讯息 109 110 err = remote.UpdateWithTTL("key5", []byte("value5-2"), 1*time.Second) // 更新 key5 只保存 1 秒,值为 value5-2 111 require.Equal(t, err, nil) 112 113 msg = <-channel 114 require.Equal(t, msg, "key5") // 将会收到新增 key5 的讯息 115 116 time.Sleep(4 * time.Second) // 停留 4 秒 117 118 // return // 先中断,截图 (4) 追踪测试 119 120 // >>>>> 接着进行 (5) 租约测试 121 122 leaseID, err := remote.Lease(5 * time.Second) // 先产生 5 秒的租约 123 require.Equal(t, err, nil) 124 125 // 利用 5 秒租约产生 key6 和 key7 126 err = remote.UpdateWithLease("key6", []byte("value6"), leaseID) // key5 只保留 2 秒 127 require.Equal(t, err, nil) 128 err = remote.UpdateWithLease("key7", []byte("value7"), leaseID) // key5 只保留 2 秒 129 require.Equal(t, err, nil) 130 131 keys, err = remote.List("key") // 先列出所有的 key 值 132 require.Equal(t, err, nil) 133 require.Equal(t, keys, []string{"key2", "key6", "key7"}) // 列出所有的 key 值 134 135 time.Sleep(6 * time.Second) // 停留 6 秒 136 137 keys, err = remote.List("key") // 先列出所有的 key 值 138 require.Equal(t, err, nil) 139 require.Equal(t, keys, []string{"key2"}) // 列出所有的 key 值 140 141 // return // 先中断,截图 (5) 租约测试 142 143 // >>>>> 最后 (6) 复原测试环境 144 // (一共产生 key1 key2 key3 key 5 ,key3 和 key5 为定时删除,key1 之前用删除了,只剩 key2) 145 146 err = remote.Delete("key2") // 删除 key2 147 require.Equal(t, err, nil) 148 149 keys, err = remote.List("key") // 列出所有的 key 值 150 require.Equal(t, err, nil) 151 require.Equal(t, len(keys), 0) // 最后所有的 key 都被清空 152 153 // return // 先中断,截图 (6) 复原测试环境 154 } 155 }