go.etcd.io/etcd@v3.3.27+incompatible/tests/e2e/ctl_v3_watch_no_cov_test.go (about)

     1  // Copyright 2018 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  // +build !cov
    16  
    17  package e2e
    18  
    19  import (
    20  	"os"
    21  	"testing"
    22  )
    23  
    24  func TestCtlV3Watch(t *testing.T)          { testCtl(t, watchTest) }
    25  func TestCtlV3WatchNoTLS(t *testing.T)     { testCtl(t, watchTest, withCfg(configNoTLS)) }
    26  func TestCtlV3WatchClientTLS(t *testing.T) { testCtl(t, watchTest, withCfg(configClientTLS)) }
    27  func TestCtlV3WatchPeerTLS(t *testing.T)   { testCtl(t, watchTest, withCfg(configPeerTLS)) }
    28  func TestCtlV3WatchTimeout(t *testing.T)   { testCtl(t, watchTest, withDialTimeout(0)) }
    29  
    30  func TestCtlV3WatchInteractive(t *testing.T) {
    31  	testCtl(t, watchTest, withInteractive())
    32  }
    33  func TestCtlV3WatchInteractiveNoTLS(t *testing.T) {
    34  	testCtl(t, watchTest, withInteractive(), withCfg(configNoTLS))
    35  }
    36  func TestCtlV3WatchInteractiveClientTLS(t *testing.T) {
    37  	testCtl(t, watchTest, withInteractive(), withCfg(configClientTLS))
    38  }
    39  func TestCtlV3WatchInteractivePeerTLS(t *testing.T) {
    40  	testCtl(t, watchTest, withInteractive(), withCfg(configPeerTLS))
    41  }
    42  
    43  func watchTest(cx ctlCtx) {
    44  	tests := []struct {
    45  		puts     []kv
    46  		envKey   string
    47  		envRange string
    48  		args     []string
    49  
    50  		wkv []kvExec
    51  	}{
    52  		{ // watch 1 key
    53  			puts: []kv{{"sample", "value"}},
    54  			args: []string{"sample", "--rev", "1"},
    55  			wkv:  []kvExec{{key: "sample", val: "value"}},
    56  		},
    57  		{ // watch 1 key with env
    58  			puts:   []kv{{"sample", "value"}},
    59  			envKey: "sample",
    60  			args:   []string{"--rev", "1"},
    61  			wkv:    []kvExec{{key: "sample", val: "value"}},
    62  		},
    63  		{ // watch 1 key with ${ETCD_WATCH_VALUE}
    64  			puts: []kv{{"sample", "value"}},
    65  			args: []string{"sample", "--rev", "1", "--", "env"},
    66  			wkv:  []kvExec{{key: "sample", val: "value", execOutput: `ETCD_WATCH_VALUE="value"`}},
    67  		},
    68  		{ // watch 1 key with "echo watch event received", with env
    69  			puts:   []kv{{"sample", "value"}},
    70  			envKey: "sample",
    71  			args:   []string{"--rev", "1", "--", "echo", "watch event received"},
    72  			wkv:    []kvExec{{key: "sample", val: "value", execOutput: "watch event received"}},
    73  		},
    74  		{ // watch 1 key with "echo watch event received"
    75  			puts: []kv{{"sample", "value"}},
    76  			args: []string{"--rev", "1", "sample", "--", "echo", "watch event received"},
    77  			wkv:  []kvExec{{key: "sample", val: "value", execOutput: "watch event received"}},
    78  		},
    79  		{ // watch 1 key with "echo \"Hello World!\""
    80  			puts: []kv{{"sample", "value"}},
    81  			args: []string{"--rev", "1", "sample", "--", "echo", "\"Hello World!\""},
    82  			wkv:  []kvExec{{key: "sample", val: "value", execOutput: "Hello World!"}},
    83  		},
    84  		{ // watch 1 key with "echo watch event received"
    85  			puts: []kv{{"sample", "value"}},
    86  			args: []string{"sample", "samplx", "--rev", "1", "--", "echo", "watch event received"},
    87  			wkv:  []kvExec{{key: "sample", val: "value", execOutput: "watch event received"}},
    88  		},
    89  		{ // watch 1 key with "echo watch event received"
    90  			puts:     []kv{{"sample", "value"}},
    91  			envKey:   "sample",
    92  			envRange: "samplx",
    93  			args:     []string{"--rev", "1", "--", "echo", "watch event received"},
    94  			wkv:      []kvExec{{key: "sample", val: "value", execOutput: "watch event received"}},
    95  		},
    96  		{ // watch 1 key with "echo watch event received"
    97  			puts: []kv{{"sample", "value"}},
    98  			args: []string{"sample", "--rev", "1", "samplx", "--", "echo", "watch event received"},
    99  			wkv:  []kvExec{{key: "sample", val: "value", execOutput: "watch event received"}},
   100  		},
   101  		{ // watch 3 keys by prefix
   102  			puts: []kv{{"key1", "val1"}, {"key2", "val2"}, {"key3", "val3"}},
   103  			args: []string{"key", "--rev", "1", "--prefix"},
   104  			wkv:  []kvExec{{key: "key1", val: "val1"}, {key: "key2", val: "val2"}, {key: "key3", val: "val3"}},
   105  		},
   106  		{ // watch 3 keys by prefix, with env
   107  			puts:   []kv{{"key1", "val1"}, {"key2", "val2"}, {"key3", "val3"}},
   108  			envKey: "key",
   109  			args:   []string{"--rev", "1", "--prefix"},
   110  			wkv:    []kvExec{{key: "key1", val: "val1"}, {key: "key2", val: "val2"}, {key: "key3", val: "val3"}},
   111  		},
   112  		{ // watch by revision
   113  			puts: []kv{{"etcd", "revision_1"}, {"etcd", "revision_2"}, {"etcd", "revision_3"}},
   114  			args: []string{"etcd", "--rev", "2"},
   115  			wkv:  []kvExec{{key: "etcd", val: "revision_2"}, {key: "etcd", val: "revision_3"}},
   116  		},
   117  		{ // watch 3 keys by range
   118  			puts: []kv{{"key1", "val1"}, {"key3", "val3"}, {"key2", "val2"}},
   119  			args: []string{"key", "key3", "--rev", "1"},
   120  			wkv:  []kvExec{{key: "key1", val: "val1"}, {key: "key2", val: "val2"}},
   121  		},
   122  		{ // watch 3 keys by range, with env
   123  			puts:     []kv{{"key1", "val1"}, {"key3", "val3"}, {"key2", "val2"}},
   124  			envKey:   "key",
   125  			envRange: "key3",
   126  			args:     []string{"--rev", "1"},
   127  			wkv:      []kvExec{{key: "key1", val: "val1"}, {key: "key2", val: "val2"}},
   128  		},
   129  	}
   130  
   131  	for i, tt := range tests {
   132  		donec := make(chan struct{})
   133  		go func(i int, puts []kv) {
   134  			for j := range puts {
   135  				if err := ctlV3Put(cx, puts[j].key, puts[j].val, ""); err != nil {
   136  					cx.t.Fatalf("watchTest #%d-%d: ctlV3Put error (%v)", i, j, err)
   137  				}
   138  			}
   139  			close(donec)
   140  		}(i, tt.puts)
   141  
   142  		unsetEnv := func() {}
   143  		if tt.envKey != "" || tt.envRange != "" {
   144  			if tt.envKey != "" {
   145  				os.Setenv("ETCDCTL_WATCH_KEY", tt.envKey)
   146  				unsetEnv = func() { os.Unsetenv("ETCDCTL_WATCH_KEY") }
   147  			}
   148  			if tt.envRange != "" {
   149  				os.Setenv("ETCDCTL_WATCH_RANGE_END", tt.envRange)
   150  				unsetEnv = func() { os.Unsetenv("ETCDCTL_WATCH_RANGE_END") }
   151  			}
   152  			if tt.envKey != "" && tt.envRange != "" {
   153  				unsetEnv = func() {
   154  					os.Unsetenv("ETCDCTL_WATCH_KEY")
   155  					os.Unsetenv("ETCDCTL_WATCH_RANGE_END")
   156  				}
   157  			}
   158  		}
   159  		if err := ctlV3Watch(cx, tt.args, tt.wkv...); err != nil {
   160  			if cx.dialTimeout > 0 && !isGRPCTimedout(err) {
   161  				cx.t.Errorf("watchTest #%d: ctlV3Watch error (%v)", i, err)
   162  			}
   163  		}
   164  		unsetEnv()
   165  		<-donec
   166  	}
   167  }