mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
tests: a test case for watch with auth token expiration
Signed-off-by: Hitoshi Mitake <h.mitake@gmail.com>
This commit is contained in:
parent
7b568f23ab
commit
528dd82be9
@ -136,7 +136,8 @@ type ClusterConfig struct {
|
|||||||
|
|
||||||
DiscoveryURL string
|
DiscoveryURL string
|
||||||
|
|
||||||
AuthToken string
|
AuthToken string
|
||||||
|
AuthTokenTTL uint
|
||||||
|
|
||||||
UseGRPC bool
|
UseGRPC bool
|
||||||
|
|
||||||
@ -314,6 +315,7 @@ func (c *cluster) mustNewMember(t testutil.TB, memberNumber int64) *member {
|
|||||||
name: c.generateMemberName(),
|
name: c.generateMemberName(),
|
||||||
memberNumber: memberNumber,
|
memberNumber: memberNumber,
|
||||||
authToken: c.cfg.AuthToken,
|
authToken: c.cfg.AuthToken,
|
||||||
|
authTokenTTL: c.cfg.AuthTokenTTL,
|
||||||
peerTLS: c.cfg.PeerTLS,
|
peerTLS: c.cfg.PeerTLS,
|
||||||
clientTLS: c.cfg.ClientTLS,
|
clientTLS: c.cfg.ClientTLS,
|
||||||
quotaBackendBytes: c.cfg.QuotaBackendBytes,
|
quotaBackendBytes: c.cfg.QuotaBackendBytes,
|
||||||
@ -624,6 +626,7 @@ type memberConfig struct {
|
|||||||
peerTLS *transport.TLSInfo
|
peerTLS *transport.TLSInfo
|
||||||
clientTLS *transport.TLSInfo
|
clientTLS *transport.TLSInfo
|
||||||
authToken string
|
authToken string
|
||||||
|
authTokenTTL uint
|
||||||
quotaBackendBytes int64
|
quotaBackendBytes int64
|
||||||
maxTxnOps uint
|
maxTxnOps uint
|
||||||
maxRequestBytes uint
|
maxRequestBytes uint
|
||||||
@ -715,6 +718,9 @@ func mustNewMember(t testutil.TB, mcfg memberConfig) *member {
|
|||||||
if mcfg.authToken != "" {
|
if mcfg.authToken != "" {
|
||||||
m.AuthToken = mcfg.authToken
|
m.AuthToken = mcfg.authToken
|
||||||
}
|
}
|
||||||
|
if mcfg.authTokenTTL != 0 {
|
||||||
|
m.TokenTTL = mcfg.authTokenTTL
|
||||||
|
}
|
||||||
|
|
||||||
m.BcryptCost = uint(bcrypt.MinCost) // use min bcrypt cost to speedy up integration testing
|
m.BcryptCost = uint(bcrypt.MinCost) // use min bcrypt cost to speedy up integration testing
|
||||||
|
|
||||||
|
@ -498,3 +498,36 @@ func TestV3AuthRestartMember(t *testing.T) {
|
|||||||
_, err = c2.Put(context.TODO(), "foo", "bar2")
|
_, err = c2.Put(context.TODO(), "foo", "bar2")
|
||||||
testutil.AssertNil(t, err)
|
testutil.AssertNil(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestV3AuthWatchAndTokenExpire(t *testing.T) {
|
||||||
|
BeforeTest(t)
|
||||||
|
clus := NewClusterV3(t, &ClusterConfig{Size: 1, AuthTokenTTL: 3})
|
||||||
|
defer clus.Terminate(t)
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.TODO(), 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
authSetupRoot(t, toGRPC(clus.Client(0)).Auth)
|
||||||
|
|
||||||
|
c, cerr := NewClient(t, clientv3.Config{Endpoints: clus.Client(0).Endpoints(), Username: "root", Password: "123"})
|
||||||
|
if cerr != nil {
|
||||||
|
t.Fatal(cerr)
|
||||||
|
}
|
||||||
|
defer c.Close()
|
||||||
|
|
||||||
|
_, err := c.Put(ctx, "key", "val")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error from Put: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The first watch gets a valid auth token through watcher.newWatcherGrpcStream()
|
||||||
|
// We should discard the first one by waiting TTL after the first watch.
|
||||||
|
wChan := c.Watch(ctx, "key", clientv3.WithRev(1))
|
||||||
|
watchResponse := <-wChan
|
||||||
|
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
|
||||||
|
wChan = c.Watch(ctx, "key", clientv3.WithRev(1))
|
||||||
|
watchResponse = <-wChan
|
||||||
|
testutil.AssertNil(t, watchResponse.Err())
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user