Skip to content

Commit a9ea565

Browse files
Copilotandyzhangx
andcommitted
Improve unit test coverage: blobplugin 28%→56%, server 67%→76%, overall 77.2%→78.5%
Co-authored-by: andyzhangx <[email protected]>
1 parent fbc66b7 commit a9ea565

File tree

5 files changed

+243
-8
lines changed

5 files changed

+243
-8
lines changed

blobplugin_profile.cov

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
mode: count
2+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:52.13,56.2 3 1
3+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:59.27,61.2 1 0
4+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:63.13,65.14 2 1
5+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:65.14,67.17 2 1
6+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:67.17,69.4 1 0
7+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:70.3,70.20 1 1
8+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:71.8,74.3 2 0
9+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:75.2,75.9 1 1
10+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:78.15,86.16 6 0
11+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:86.16,88.3 1 0
12+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:90.2,91.16 2 0
13+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:91.16,93.3 1 0
14+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:94.2,97.19 3 0
15+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:97.19,99.3 1 0
16+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:100.2,100.68 1 0
17+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:100.68,102.3 1 0
18+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:105.22,106.27 1 2
19+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:106.27,108.3 1 1
20+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:109.2,110.16 2 1
21+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:110.16,113.3 2 1
22+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:114.2,114.46 1 0
23+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:117.83,120.12 3 1
24+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:120.12,122.38 2 1
25+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:122.38,124.4 1 0
26+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:128.41,132.2 3 1
27+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:134.41,135.16 1 5
28+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:135.16,137.3 1 1
29+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:138.2,138.71 1 4
30+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:138.71,140.3 1 3
31+
sigs.k8s.io/blob-csi-driver/pkg/blobplugin/main.go:141.2,141.12 1 1

pkg/blob/controllerserver_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2133,3 +2133,42 @@ func TestGetAzcopyAuth(t *testing.T) {
21332133
t.Run(tc.name, tc.testFunc)
21342134
}
21352135
}
2136+
2137+
func TestControllerModifyVolume(t *testing.T) {
2138+
d := NewFakeDriver()
2139+
ctx := context.Background()
2140+
2141+
req := &csi.ControllerModifyVolumeRequest{}
2142+
2143+
_, err := d.ControllerModifyVolume(ctx, req)
2144+
2145+
// Should return Unimplemented error
2146+
expectedErr := status.Error(codes.Unimplemented, "")
2147+
if !reflect.DeepEqual(err, expectedErr) {
2148+
t.Errorf("Expected error %v, but got %v", expectedErr, err)
2149+
}
2150+
}
2151+
2152+
func TestExecAzcopyCopy(t *testing.T) {
2153+
d := NewFakeDriver()
2154+
2155+
// Test with invalid command (should fail)
2156+
srcPath := "/invalid/path"
2157+
dstPath := "/invalid/dest"
2158+
azcopyCopyOptions := []string{}
2159+
authAzcopyEnv := []string{}
2160+
2161+
output, err := d.execAzcopyCopy(srcPath, dstPath, azcopyCopyOptions, authAzcopyEnv)
2162+
2163+
// We expect an error since azcopy command won't work in test environment
2164+
assert.Error(t, err)
2165+
assert.NotNil(t, output)
2166+
2167+
// Test with auth environment variables
2168+
authAzcopyEnv = []string{"AZCOPY_AUTO_LOGIN_TYPE=MSI"}
2169+
output2, err2 := d.execAzcopyCopy(srcPath, dstPath, azcopyCopyOptions, authAzcopyEnv)
2170+
2171+
// We expect an error since azcopy command won't work in test environment
2172+
assert.Error(t, err2)
2173+
assert.NotNil(t, output2)
2174+
}

pkg/blobfuse-proxy/server/server_test.go

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,40 @@ package server
1818

1919
import (
2020
"context"
21+
"net"
2122
"testing"
2223

24+
"github.com/stretchr/testify/assert"
2325
"github.com/stretchr/testify/require"
2426

2527
"google.golang.org/grpc/codes"
2628
mount_azure_blob "sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/pb"
29+
"sigs.k8s.io/blob-csi-driver/pkg/blob"
2730
)
2831

2932
func TestServerMountAzureBlob(t *testing.T) {
3033
t.Parallel()
3134

3235
testCases := []struct {
33-
name string
34-
args string
35-
authEnv []string
36-
code codes.Code
36+
name string
37+
args string
38+
authEnv []string
39+
protocol string
40+
code codes.Code
3741
}{
3842
{
39-
name: "failed_mount",
40-
args: "--hello",
41-
authEnv: []string{"hello"},
42-
code: codes.InvalidArgument,
43+
name: "failed_mount",
44+
args: "--hello",
45+
authEnv: []string{"hello"},
46+
protocol: "",
47+
code: codes.InvalidArgument,
48+
},
49+
{
50+
name: "failed_mount_with_fuse2",
51+
args: "--hello",
52+
authEnv: []string{"hello"},
53+
protocol: blob.Fuse2,
54+
code: codes.InvalidArgument,
4355
},
4456
}
4557

@@ -52,6 +64,7 @@ func TestServerMountAzureBlob(t *testing.T) {
5264
req := mount_azure_blob.MountAzureBlobRequest{
5365
MountArgs: tc.args,
5466
AuthEnv: tc.authEnv,
67+
Protocol: tc.protocol,
5568
}
5669
res, err := mountServer.MountAzureBlob(context.Background(), &req)
5770
if tc.code == codes.OK {
@@ -64,3 +77,42 @@ func TestServerMountAzureBlob(t *testing.T) {
6477
})
6578
}
6679
}
80+
81+
func TestNewMountServiceServer(t *testing.T) {
82+
server := NewMountServiceServer()
83+
assert.NotNil(t, server)
84+
// blobfuseVersion should be set based on the OS
85+
assert.True(t, server.blobfuseVersion == BlobfuseV1 || server.blobfuseVersion == BlobfuseV2)
86+
}
87+
88+
func TestGetBlobfuseVersion(t *testing.T) {
89+
// This will test the function based on the actual OS
90+
version := getBlobfuseVersion()
91+
assert.True(t, version == BlobfuseV1 || version == BlobfuseV2)
92+
}
93+
94+
func TestRunGRPCServer(t *testing.T) {
95+
// Create a test listener
96+
listener, err := net.Listen("tcp", "127.0.0.1:0")
97+
require.NoError(t, err)
98+
defer listener.Close()
99+
100+
// Create a mock mount server
101+
mountServer := NewMountServiceServer()
102+
103+
// Test with TLS disabled
104+
errCh := make(chan error, 1)
105+
go func() {
106+
errCh <- RunGRPCServer(mountServer, false, listener)
107+
}()
108+
109+
// Close the listener to stop the server
110+
listener.Close()
111+
112+
// The server should stop when the listener is closed
113+
select {
114+
case err := <-errCh:
115+
// We expect an error when the listener is closed
116+
assert.Error(t, err)
117+
}
118+
}

pkg/blobplugin/main_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"context"
2021
"fmt"
2122
"net"
23+
"net/http"
2224
"os"
2325
"reflect"
26+
"strings"
2427
"testing"
28+
"time"
2529
)
2630

2731
func TestMain(t *testing.T) {
@@ -71,6 +75,10 @@ func TestTrapClosedConnErr(t *testing.T) {
7175
err: fmt.Errorf("some error"),
7276
expectedErr: fmt.Errorf("some error"),
7377
},
78+
{
79+
err: fmt.Errorf("use of closed network connection"),
80+
expectedErr: nil,
81+
},
7482
}
7583

7684
for _, test := range tests {
@@ -80,3 +88,83 @@ func TestTrapClosedConnErr(t *testing.T) {
8088
}
8189
}
8290
}
91+
92+
func TestExportMetrics(t *testing.T) {
93+
// Test with empty metrics address
94+
*metricsAddress = ""
95+
exportMetrics() // Should return without error
96+
97+
// Test with valid metrics address
98+
listener, err := net.Listen("tcp", "127.0.0.1:0")
99+
if err != nil {
100+
t.Fatalf("Failed to create listener: %v", err)
101+
}
102+
defer listener.Close()
103+
104+
*metricsAddress = listener.Addr().String()
105+
exportMetrics() // Should set up metrics server
106+
107+
// Give some time for the goroutine to start
108+
time.Sleep(100 * time.Millisecond)
109+
}
110+
111+
func TestServe(t *testing.T) {
112+
listener, err := net.Listen("tcp", "127.0.0.1:0")
113+
if err != nil {
114+
t.Fatalf("Failed to create listener: %v", err)
115+
}
116+
defer listener.Close()
117+
118+
testServeFunc := func(l net.Listener) error {
119+
return nil
120+
}
121+
122+
ctx := context.Background()
123+
serve(ctx, listener, testServeFunc)
124+
125+
// Give some time for the goroutine to start
126+
time.Sleep(100 * time.Millisecond)
127+
}
128+
129+
func TestServeMetrics(t *testing.T) {
130+
listener, err := net.Listen("tcp", "127.0.0.1:0")
131+
if err != nil {
132+
t.Fatalf("Failed to create listener: %v", err)
133+
}
134+
defer listener.Close()
135+
136+
// Start the server in a goroutine
137+
errCh := make(chan error, 1)
138+
go func() {
139+
errCh <- serveMetrics(listener)
140+
}()
141+
142+
// Give some time for the server to start
143+
time.Sleep(100 * time.Millisecond)
144+
145+
// Make a request to the metrics endpoint
146+
client := &http.Client{Timeout: 1 * time.Second}
147+
resp, err := client.Get(fmt.Sprintf("http://%s/metrics", listener.Addr().String()))
148+
if err != nil {
149+
t.Logf("Expected to make request to metrics endpoint, but got error: %v", err)
150+
} else {
151+
resp.Body.Close()
152+
if resp.StatusCode != http.StatusOK {
153+
t.Errorf("Expected status code 200, but got %d", resp.StatusCode)
154+
}
155+
}
156+
157+
// Close the listener to stop the server
158+
listener.Close()
159+
160+
// Wait for the server to stop
161+
select {
162+
case err := <-errCh:
163+
// The server should stop with a closed connection error, which is trapped
164+
if err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
165+
t.Errorf("Unexpected error from serveMetrics: %v", err)
166+
}
167+
case <-time.After(5 * time.Second):
168+
t.Error("Server did not stop within timeout")
169+
}
170+
}

server_profile.cov

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
mode: count
2+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:53.43,57.2 3 4
3+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:62.62,73.68 9 2
4+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:73.68,77.53 2 2
5+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:77.53,80.4 2 2
6+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:81.3,81.57 1 2
7+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:81.57,84.4 2 2
8+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:85.3,87.63 3 2
9+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:88.8,92.3 3 0
10+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:94.2,96.16 3 2
11+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:96.16,98.3 1 2
12+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:98.8,100.3 1 0
13+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:101.2,103.16 3 2
14+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:103.16,105.3 1 2
15+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:106.2,106.21 1 0
16+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:113.9,126.2 5 1
17+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:128.43,130.16 2 5
18+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:130.16,133.3 2 0
19+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:135.2,135.128 1 5
20+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:135.128,138.3 2 0
21+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:140.2,140.47 1 5
22+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:140.47,143.3 2 0
23+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:145.2,145.77 1 5
24+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:145.77,148.3 2 5
25+
sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/server/server.go:150.2,151.19 2 0

0 commit comments

Comments
 (0)