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  }