1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package leasehttp
16
17 import (
18 "context"
19 "net/http"
20 "net/http/httptest"
21 "testing"
22 "time"
23
24 "go.etcd.io/etcd/server/v3/lease"
25 betesting "go.etcd.io/etcd/server/v3/mvcc/backend/testing"
26 "go.uber.org/zap/zaptest"
27 )
28
29 func TestRenewHTTP(t *testing.T) {
30 lg := zaptest.NewLogger(t)
31 be, _ := betesting.NewTmpBackend(t, time.Hour, 10000)
32 defer betesting.Close(t, be)
33
34 le := lease.NewLessor(lg, be, nil, lease.LessorConfig{MinLeaseTTL: int64(5)})
35 le.Promote(time.Second)
36 l, err := le.Grant(1, int64(5))
37 if err != nil {
38 t.Fatalf("failed to create lease: %v", err)
39 }
40
41 ts := httptest.NewServer(NewHandler(le, waitReady))
42 defer ts.Close()
43
44 ttl, err := RenewHTTP(context.TODO(), l.ID, ts.URL+LeasePrefix, http.DefaultTransport)
45 if err != nil {
46 t.Fatal(err)
47 }
48 if ttl != 5 {
49 t.Fatalf("ttl expected 5, got %d", ttl)
50 }
51 }
52
53 func TestTimeToLiveHTTP(t *testing.T) {
54 lg := zaptest.NewLogger(t)
55 be, _ := betesting.NewTmpBackend(t, time.Hour, 10000)
56 defer betesting.Close(t, be)
57
58 le := lease.NewLessor(lg, be, nil, lease.LessorConfig{MinLeaseTTL: int64(5)})
59 le.Promote(time.Second)
60 l, err := le.Grant(1, int64(5))
61 if err != nil {
62 t.Fatalf("failed to create lease: %v", err)
63 }
64
65 ts := httptest.NewServer(NewHandler(le, waitReady))
66 defer ts.Close()
67
68 resp, err := TimeToLiveHTTP(context.TODO(), l.ID, true, ts.URL+LeaseInternalPrefix, http.DefaultTransport)
69 if err != nil {
70 t.Fatal(err)
71 }
72 if resp.LeaseTimeToLiveResponse.ID != 1 {
73 t.Fatalf("lease id expected 1, got %d", resp.LeaseTimeToLiveResponse.ID)
74 }
75 if resp.LeaseTimeToLiveResponse.GrantedTTL != 5 {
76 t.Fatalf("granted TTL expected 5, got %d", resp.LeaseTimeToLiveResponse.GrantedTTL)
77 }
78 }
79
80 func TestRenewHTTPTimeout(t *testing.T) {
81 testApplyTimeout(t, func(l *lease.Lease, serverURL string) error {
82 _, err := RenewHTTP(context.TODO(), l.ID, serverURL+LeasePrefix, http.DefaultTransport)
83 return err
84 })
85 }
86
87 func TestTimeToLiveHTTPTimeout(t *testing.T) {
88 testApplyTimeout(t, func(l *lease.Lease, serverURL string) error {
89 _, err := TimeToLiveHTTP(context.TODO(), l.ID, true, serverURL+LeaseInternalPrefix, http.DefaultTransport)
90 return err
91 })
92 }
93
94 func testApplyTimeout(t *testing.T, f func(*lease.Lease, string) error) {
95 lg := zaptest.NewLogger(t)
96 be, _ := betesting.NewTmpBackend(t, time.Hour, 10000)
97 defer betesting.Close(t, be)
98
99 le := lease.NewLessor(lg, be, nil, lease.LessorConfig{MinLeaseTTL: int64(5)})
100 le.Promote(time.Second)
101 l, err := le.Grant(1, int64(5))
102 if err != nil {
103 t.Fatalf("failed to create lease: %v", err)
104 }
105
106 ts := httptest.NewServer(NewHandler(le, waitNotReady))
107 defer ts.Close()
108 err = f(l, ts.URL)
109 if err == nil {
110 t.Fatalf("expected timeout error, got nil")
111 }
112 if err.Error() != ErrLeaseHTTPTimeout.Error() {
113 t.Fatalf("expected (%v), got (%v)", ErrLeaseHTTPTimeout.Error(), err.Error())
114 }
115 }
116
117 func waitReady() <-chan struct{} {
118 ch := make(chan struct{})
119 close(ch)
120 return ch
121 }
122
123 func waitNotReady() <-chan struct{} {
124 return nil
125 }
126
View as plain text