@@ -17,11 +17,17 @@ limitations under the License.
17
17
package common
18
18
19
19
import (
20
+ "context"
21
+ "errors"
20
22
"fmt"
23
+ "net/http"
21
24
"reflect"
22
25
"testing"
23
26
24
27
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
28
+ "google.golang.org/api/googleapi"
29
+ "google.golang.org/grpc/codes"
30
+ "google.golang.org/grpc/status"
25
31
)
26
32
27
33
const (
@@ -841,3 +847,109 @@ func TestParseMachineType(t *testing.T) {
841
847
})
842
848
}
843
849
}
850
+
851
+ func TestCodeForError (t * testing.T ) {
852
+ internalErrorCode := codes .Internal
853
+ userErrorCode := codes .InvalidArgument
854
+ testCases := []struct {
855
+ name string
856
+ inputErr error
857
+ expCode * codes.Code
858
+ }{
859
+ {
860
+ name : "Not googleapi.Error" ,
861
+ inputErr : errors .New ("I am not a googleapi.Error" ),
862
+ expCode : & internalErrorCode ,
863
+ },
864
+ {
865
+ name : "User error" ,
866
+ inputErr : & googleapi.Error {Code : http .StatusBadRequest , Message : "User error with bad request" },
867
+ expCode : & userErrorCode ,
868
+ },
869
+ {
870
+ name : "googleapi.Error but not a user error" ,
871
+ inputErr : & googleapi.Error {Code : http .StatusInternalServerError , Message : "Internal error" },
872
+ expCode : & internalErrorCode ,
873
+ },
874
+ {
875
+ name : "context canceled error" ,
876
+ inputErr : context .Canceled ,
877
+ expCode : errCodePtr (codes .Canceled ),
878
+ },
879
+ {
880
+ name : "context deadline exceeded error" ,
881
+ inputErr : context .DeadlineExceeded ,
882
+ expCode : errCodePtr (codes .DeadlineExceeded ),
883
+ },
884
+ {
885
+ name : "status error with Aborted error code" ,
886
+ inputErr : status .Error (codes .Aborted , "aborted error" ),
887
+ expCode : errCodePtr (codes .Aborted ),
888
+ },
889
+ {
890
+ name : "nil error" ,
891
+ inputErr : nil ,
892
+ expCode : nil ,
893
+ },
894
+ }
895
+
896
+ for _ , tc := range testCases {
897
+ t .Logf ("Running test: %v" , tc .name )
898
+ errCode := CodeForError (tc .inputErr )
899
+ if (tc .expCode == nil ) != (errCode == nil ) {
900
+ t .Errorf ("test %v failed: got %v, expected %v" , tc .name , errCode , tc .expCode )
901
+ }
902
+ if tc .expCode != nil && * errCode != * tc .expCode {
903
+ t .Errorf ("test %v failed: got %v, expected %v" , tc .name , errCode , tc .expCode )
904
+ }
905
+ }
906
+ }
907
+
908
+ func TestIsContextError (t * testing.T ) {
909
+ cases := []struct {
910
+ name string
911
+ err error
912
+ expectedErrCode * codes.Code
913
+ }{
914
+ {
915
+ name : "deadline exceeded error" ,
916
+ err : context .DeadlineExceeded ,
917
+ expectedErrCode : errCodePtr (codes .DeadlineExceeded ),
918
+ },
919
+ {
920
+ name : "contains 'context deadline exceeded'" ,
921
+ err : fmt .Errorf ("got error: %w" , context .DeadlineExceeded ),
922
+ expectedErrCode : errCodePtr (codes .DeadlineExceeded ),
923
+ },
924
+ {
925
+ name : "context canceled error" ,
926
+ err : context .Canceled ,
927
+ expectedErrCode : errCodePtr (codes .Canceled ),
928
+ },
929
+ {
930
+ name : "contains 'context canceled'" ,
931
+ err : fmt .Errorf ("got error: %w" , context .Canceled ),
932
+ expectedErrCode : errCodePtr (codes .Canceled ),
933
+ },
934
+ {
935
+ name : "does not contain 'context canceled' or 'context deadline exceeded'" ,
936
+ err : fmt .Errorf ("unknown error" ),
937
+ expectedErrCode : nil ,
938
+ },
939
+ {
940
+ name : "nil error" ,
941
+ err : nil ,
942
+ expectedErrCode : nil ,
943
+ },
944
+ }
945
+
946
+ for _ , test := range cases {
947
+ errCode := isContextError (test .err )
948
+ if (test .expectedErrCode == nil ) != (errCode == nil ) {
949
+ t .Errorf ("test %v failed: got %v, expected %v" , test .name , errCode , test .expectedErrCode )
950
+ }
951
+ if test .expectedErrCode != nil && * errCode != * test .expectedErrCode {
952
+ t .Errorf ("test %v failed: got %v, expected %v" , test .name , errCode , test .expectedErrCode )
953
+ }
954
+ }
955
+ }
0 commit comments