@@ -20,6 +20,7 @@ import (
20
20
"context"
21
21
"errors"
22
22
"fmt"
23
+ "net"
23
24
"os"
24
25
"path/filepath"
25
26
"reflect"
@@ -43,6 +44,7 @@ import (
43
44
mount "k8s.io/mount-utils"
44
45
utilexec "k8s.io/utils/exec"
45
46
testingexec "k8s.io/utils/exec/testing"
47
+ mount_azure_blob "sigs.k8s.io/blob-csi-driver/pkg/blobfuse-proxy/pb"
46
48
)
47
49
48
50
const (
@@ -935,13 +937,157 @@ func TestNodeExpandVolume(t *testing.T) {
935
937
}
936
938
}
937
939
940
+ // fakeMountServiceServer implements mount_azure_blob.MountServiceServer for testing
941
+ type fakeMountServiceServer struct {
942
+ mount_azure_blob.MountServiceServer
943
+ mockOutput string
944
+ mockError error
945
+ }
946
+
947
+ // MountAzureBlob implements the mount service method
948
+ func (s * fakeMountServiceServer ) MountAzureBlob (_ context.Context , _ * mount_azure_blob.MountAzureBlobRequest ) (* mount_azure_blob.MountAzureBlobResponse , error ) {
949
+ return & mount_azure_blob.MountAzureBlobResponse {
950
+ Output : s .mockOutput ,
951
+ }, s .mockError
952
+ }
953
+
938
954
func TestMountBlobfuseWithProxy (t * testing.T ) {
939
- args := "--tmp-path /tmp"
940
- authEnv := []string {"username=blob" , "authkey=blob" }
941
- d := NewFakeDriver ()
942
- _ , err := d .mountBlobfuseWithProxy (args , "fuse" , authEnv )
943
- // should be context.deadlineExceededError{} error
944
- assert .NotNil (t , err )
955
+ tests := []struct {
956
+ desc string
957
+ setup func (* testing.T ) (* Driver , * grpc.Server , net.Listener )
958
+ args string
959
+ protocol string
960
+ authEnv []string
961
+ expectedOut string
962
+ expectedErr error
963
+ cleanupCheck func (* testing.T , string , error )
964
+ }{
965
+ {
966
+ desc : "Success case with mock server" ,
967
+ setup : func (t * testing.T ) (* Driver , * grpc.Server , net.Listener ) {
968
+ // Create a mock server for the success test
969
+ mockServer := & fakeMountServiceServer {
970
+ mockOutput : "mock mount successful" ,
971
+ mockError : nil ,
972
+ }
973
+
974
+ // Start a local gRPC server for testing
975
+ lis , err := net .Listen ("tcp" , "127.0.0.1:0" ) // Use random available port
976
+ if err != nil {
977
+ t .Fatalf ("Failed to listen: %v" , err )
978
+ }
979
+ s := grpc .NewServer ()
980
+ mount_azure_blob .RegisterMountServiceServer (s , mockServer )
981
+
982
+ // Start the server in a goroutine
983
+ go func () {
984
+ if err := s .Serve (lis ); err != nil && ! strings .Contains (err .Error (), "use of closed network connection" ) {
985
+ t .Logf ("Server exited with error: %v" , err )
986
+ }
987
+ }()
988
+
989
+ // Create the driver with the configured proxy
990
+ d := NewFakeDriver ()
991
+ d .blobfuseProxyEndpoint = lis .Addr ().String ()
992
+ d .blobfuseProxyConnTimout = 5 // 5 second timeout
993
+
994
+ return d , s , lis
995
+ },
996
+ args : "--tmp-path /tmp" ,
997
+ protocol : "fuse" ,
998
+ authEnv : []string {"username=blob" , "authkey=blob" },
999
+ expectedOut : "mock mount successful" ,
1000
+ expectedErr : nil ,
1001
+ cleanupCheck : func (t * testing.T , output string , err error ) {
1002
+ assert .NoError (t , err )
1003
+ assert .Equal (t , "mock mount successful" , output )
1004
+ },
1005
+ },
1006
+ {
1007
+ desc : "Error from MountAzureBlob" ,
1008
+ setup : func (t * testing.T ) (* Driver , * grpc.Server , net.Listener ) {
1009
+ // Create a mock server for the error test
1010
+ mockServer := & fakeMountServiceServer {
1011
+ mockOutput : "" ,
1012
+ mockError : fmt .Errorf ("mock mount error" ),
1013
+ }
1014
+
1015
+ // Start a local gRPC server for testing
1016
+ lis , err := net .Listen ("tcp" , "127.0.0.1:0" ) // Use random available port
1017
+ if err != nil {
1018
+ t .Fatalf ("Failed to listen: %v" , err )
1019
+ }
1020
+ s := grpc .NewServer ()
1021
+ mount_azure_blob .RegisterMountServiceServer (s , mockServer )
1022
+
1023
+ // Start the server in a goroutine
1024
+ go func () {
1025
+ if err := s .Serve (lis ); err != nil && ! strings .Contains (err .Error (), "use of closed network connection" ) {
1026
+ t .Logf ("Server exited with error: %v" , err )
1027
+ }
1028
+ }()
1029
+
1030
+ // Create the driver with the configured proxy
1031
+ d := NewFakeDriver ()
1032
+ d .blobfuseProxyEndpoint = lis .Addr ().String ()
1033
+ d .blobfuseProxyConnTimout = 5 // 5 second timeout
1034
+
1035
+ return d , s , lis
1036
+ },
1037
+ args : "--tmp-path /tmp" ,
1038
+ protocol : "fuse" ,
1039
+ authEnv : []string {"username=blob" , "authkey=blob" },
1040
+ expectedOut : "" ,
1041
+ expectedErr : fmt .Errorf ("mock mount error" ),
1042
+ cleanupCheck : func (t * testing.T , _ string , err error ) {
1043
+ assert .Error (t , err )
1044
+ assert .Contains (t , err .Error (), "mock mount error" )
1045
+ },
1046
+ },
1047
+ {
1048
+ desc : "Connection error case" ,
1049
+ setup : func (_ * testing.T ) (* Driver , * grpc.Server , net.Listener ) {
1050
+ // Create the driver with a non-existent endpoint
1051
+ d := NewFakeDriver ()
1052
+ d .blobfuseProxyEndpoint = "unix://non-existent-socket.sock"
1053
+ d .blobfuseProxyConnTimout = 1 // 1 second timeout for quick failure
1054
+
1055
+ // No server or listener for this test
1056
+ return d , nil , nil
1057
+ },
1058
+ args : "--tmp-path /tmp" ,
1059
+ protocol : "fuse" ,
1060
+ authEnv : []string {"username=blob" , "authkey=blob" },
1061
+ expectedOut : "" ,
1062
+ expectedErr : fmt .Errorf ("failed to exit idle mode: invalid (non-empty) authority: non-existent-socket.sock" ),
1063
+ cleanupCheck : func (t * testing.T , output string , err error ) {
1064
+ assert .Error (t , err )
1065
+ assert .Empty (t , output )
1066
+ assert .Contains (t , err .Error (), "invalid (non-empty) authority: non-existent-socket.sock" )
1067
+ },
1068
+ },
1069
+ }
1070
+
1071
+ for _ , test := range tests {
1072
+ t .Run (test .desc , func (t * testing.T ) {
1073
+ // Setup the test
1074
+ d , s , lis := test .setup (t )
1075
+
1076
+ // Cleanup resources if needed
1077
+ if s != nil && lis != nil {
1078
+ defer s .Stop ()
1079
+ defer lis .Close ()
1080
+ }
1081
+
1082
+ // Run the test - call mountBlobfuseWithProxy directly
1083
+ output , err := d .mountBlobfuseWithProxy (test .args , test .protocol , test .authEnv )
1084
+
1085
+ // Verify results
1086
+ if test .cleanupCheck != nil {
1087
+ test .cleanupCheck (t , output , err )
1088
+ }
1089
+ })
1090
+ }
945
1091
}
946
1092
947
1093
func TestMountBlobfuseInsideDriver (t * testing.T ) {
0 commit comments