@@ -17,15 +17,17 @@ limitations under the License.
1717package main
1818
1919import (
20+ "flag"
21+ "fmt"
22+ "io/ioutil"
2023 "net/http"
2124 "net/http/httptest"
25+ "os"
2226 "testing"
2327
2428 csi "github.com/container-storage-interface/spec/lib/go/csi"
2529 "github.com/golang/mock/gomock"
26- connlib "github.com/kubernetes-csi/csi-lib-utils/connection"
2730 "github.com/kubernetes-csi/csi-test/driver"
28- "google.golang.org/grpc"
2931)
3032
3133const (
@@ -38,8 +40,7 @@ func createMockServer(t *testing.T) (
3840 * driver.MockIdentityServer ,
3941 * driver.MockControllerServer ,
4042 * driver.MockNodeServer ,
41- * grpc.ClientConn ,
42- error ) {
43+ func ()) {
4344 // Start the mock server
4445 mockController := gomock .NewController (t )
4546 identityServer := driver .NewMockIdentityServer (mockController )
@@ -50,37 +51,77 @@ func createMockServer(t *testing.T) (
5051 Controller : controllerServer ,
5152 Node : nodeServer ,
5253 })
53- drv .Start ()
5454
55- // Create a client connection to it
56- addr := drv .Address ()
57- csiConn , err := connlib .Connect (addr )
55+ tmpDir , err := ioutil .TempDir ("" , "livenessprobe_test.*" )
5856 if err != nil {
59- return nil , nil , nil , nil , nil , nil , err
57+ t . Errorf ( "failed to create a temporary socket file name: %v" , err )
6058 }
6159
62- return mockController , drv , identityServer , controllerServer , nodeServer , csiConn , nil
60+ csiEndpoint := fmt .Sprintf ("%s/csi.sock" , tmpDir )
61+ err = drv .StartOnAddress ("unix" , csiEndpoint )
62+ if err != nil {
63+ t .Errorf ("failed to start the csi driver at %s: %v" , csiEndpoint , err )
64+ }
65+
66+ return mockController , drv , identityServer , controllerServer , nodeServer , func () {
67+ mockController .Finish ()
68+ drv .Stop ()
69+ os .RemoveAll (csiEndpoint )
70+ }
6371}
6472
6573func TestProbe (t * testing.T ) {
66- mockController , driver , idServer , _ , _ , csiConn , err := createMockServer (t )
74+ _ , driver , idServer , _ , _ , cleanUpFunc := createMockServer (t )
75+ defer cleanUpFunc ()
76+
77+ flag .Set ("csi-address" , driver .Address ())
78+ flag .Parse ()
79+
80+ var injectedErr error
81+
82+ inProbe := & csi.ProbeRequest {}
83+ outProbe := & csi.ProbeResponse {}
84+ idServer .EXPECT ().Probe (gomock .Any (), inProbe ).Return (outProbe , injectedErr ).Times (1 )
85+
86+ hp := & healthProbe {driverName : driverName }
87+
88+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
89+ if req .URL .String () == "/healthz" {
90+ hp .checkProbe (rw , req )
91+ }
92+ }))
93+ defer server .Close ()
94+
95+ httpreq , err := http .NewRequest ("GET" , fmt .Sprintf ("%s/healthz" , server .URL ), nil )
6796 if err != nil {
68- t .Fatal ( err )
97+ t .Fatalf ( "failed to build test request for health check: %v" , err )
6998 }
70- defer mockController .Finish ()
71- defer driver .Stop ()
72- defer csiConn .Close ()
99+
100+ httpresp , err := http .DefaultClient .Do (httpreq )
101+ if err != nil {
102+ t .Errorf ("failed to check probe: %v" , err )
103+ }
104+
105+ expectedStatusCode := http .StatusOK
106+ if httpresp .StatusCode != expectedStatusCode {
107+ t .Errorf ("expected status code %d but got %d" , expectedStatusCode , httpresp .StatusCode )
108+ }
109+ }
110+
111+ func TestProbe_issue68 (t * testing.T ) {
112+ _ , driver , idServer , _ , _ , cleanUpFunc := createMockServer (t )
113+ defer cleanUpFunc ()
114+
115+ flag .Set ("csi-address" , driver .Address ())
116+ flag .Parse ()
73117
74118 var injectedErr error
75119
76120 inProbe := & csi.ProbeRequest {}
77121 outProbe := & csi.ProbeResponse {}
78122 idServer .EXPECT ().Probe (gomock .Any (), inProbe ).Return (outProbe , injectedErr ).Times (1 )
79123
80- hp := & healthProbe {
81- conn : csiConn ,
82- driverName : driverName ,
83- }
124+ hp := & healthProbe {driverName : driverName }
84125
85126 server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
86127 if req .URL .String () == "/healthz" {
@@ -89,12 +130,38 @@ func TestProbe(t *testing.T) {
89130 }))
90131 defer server .Close ()
91132
92- httpreq , err := http .NewRequest ("GET" , server . URL + " /healthz" , nil )
133+ httpreq , err := http .NewRequest ("GET" , fmt . Sprintf ( "%s /healthz", server . URL ) , nil )
93134 if err != nil {
94135 t .Fatalf ("failed to build test request for health check: %v" , err )
95136 }
96- _ , err = http .DefaultClient .Do (httpreq )
137+
138+ httpresp , err := http .DefaultClient .Do (httpreq )
97139 if err != nil {
98140 t .Errorf ("failed to check probe: %v" , err )
99141 }
142+
143+ expectedStatusCode := http .StatusOK
144+ if httpresp .StatusCode != expectedStatusCode {
145+ t .Errorf ("expected status code %d but got %d" , expectedStatusCode , httpresp .StatusCode )
146+ }
147+
148+ err = os .Remove (driver .Address ())
149+ if err != nil {
150+ t .Errorf ("failed to remove the csi driver socket file: %v" , err )
151+ }
152+
153+ httpreq , err = http .NewRequest ("GET" , fmt .Sprintf ("%s/healthz" , server .URL ), nil )
154+ if err != nil {
155+ t .Fatalf ("failed to build test request for health check: %v" , err )
156+ }
157+
158+ httpresp , err = http .DefaultClient .Do (httpreq )
159+ if err != nil {
160+ t .Errorf ("failed to check probe: %v" , err )
161+ }
162+
163+ expectedStatusCode = http .StatusInternalServerError
164+ if httpresp .StatusCode != expectedStatusCode {
165+ t .Errorf ("expected status code %d but got %d" , expectedStatusCode , httpresp .StatusCode )
166+ }
100167}
0 commit comments