Browse Source

Add default transport fallback

Muxi Yan 6 years ago
parent
commit
04b3b8e921

+ 12 - 5
src/objective-c/GRPCClient/GRPCTransport.m

@@ -86,8 +86,9 @@ NSUInteger TransportIdHash(GRPCTransportID transportId) {
 - (id<GRPCTransportFactory>)getTransportFactoryWithId:(GRPCTransportID)transportId {
   if (transportId == NULL) {
     if (_defaultFactory == nil) {
+      // fall back to default transport if no transport is provided
       [NSException raise:NSInvalidArgumentException
-                  format:@"Unable to get default transport factory"];
+                  format:@"Did not specify transport and unable to find a default transport."];
       return nil;
     }
     return _defaultFactory;
@@ -95,10 +96,16 @@ NSUInteger TransportIdHash(GRPCTransportID transportId) {
   NSString *nsTransportId = [NSString stringWithCString:transportId encoding:NSUTF8StringEncoding];
   id<GRPCTransportFactory> transportFactory = _registry[nsTransportId];
   if (transportFactory == nil) {
-    // User named a transport id that was not registered with the registry.
-    [NSException raise:NSInvalidArgumentException
-                format:@"Unable to get transport factory with id %s", transportId];
-    return nil;
+    if (_defaultFactory != nil) {
+      // fall back to default transport if no transport is found
+      NSLog(@"Unable to find transport with id %s; falling back to default transport.",
+            transportId);
+      return _defaultFactory;
+    } else {
+      [NSException raise:NSInvalidArgumentException
+                  format:@"Unable to find transport with id %s", transportId];
+      return nil;
+    }
   }
   return transportFactory;
 }

+ 41 - 0
src/objective-c/tests/CronetTests/TransportRegistryTests.m

@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright 2019 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#import <XCTest/XCTest.h>
+
+#import <GRPCClient/GRPCCall+Cronet.h>
+#import <GRPCClient/GRPCTransport.h>
+#import "src/objective-c/GRPCClient/private/GRPCTransport+Private.h"
+
+@interface TransportRegistryTests : XCTestCase
+
+@end
+
+@implementation TransportRegistryTests
+
+- (void)testCronetImplementationExist {
+  id<GRPCTransportFactory> secureTransportFactory = [[GRPCTransportRegistry sharedInstance]
+      getTransportFactoryWithId:GRPCDefaultTransportImplList.core_secure];
+  id<GRPCTransportFactory> cronetTransportFactory =
+      [[GRPCTransportRegistry sharedInstance] getTransportFactoryWithId:gGRPCCoreCronetId];
+  XCTAssertNotNil(secureTransportFactory);
+  XCTAssertNotNil(cronetTransportFactory);
+  XCTAssertNotEqual(secureTransportFactory, cronetTransportFactory);
+}
+
+@end

+ 8 - 0
src/objective-c/tests/Tests.xcodeproj/project.pbxproj

@@ -30,6 +30,8 @@
 		5E7F488E22778C87006656AD /* InteropTestsLocalCleartext.m in Sources */ = {isa = PBXBuildFile; fileRef = 63715F551B780C020029CB0B /* InteropTestsLocalCleartext.m */; };
 		5E7F488F22778C8C006656AD /* InteropTestsRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E7F488822778B04006656AD /* InteropTestsRemote.m */; };
 		5E7F489022778C95006656AD /* RxLibraryUnitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E7F488A22778B5D006656AD /* RxLibraryUnitTests.m */; };
+		5E9F1C332321AB1700837469 /* TransportRegistryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E9F1C322321AB1700837469 /* TransportRegistryTests.m */; };
+		5E9F1C352321C9B200837469 /* TransportRegistryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E9F1C342321C9B200837469 /* TransportRegistryTests.m */; };
 		5EA4770322736178000F72FC /* InteropTestsLocalSSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E240CD1B6C4E2B005F3B0E /* InteropTestsLocalSSL.m */; };
 		5EA477042273617B000F72FC /* InteropTestsLocalCleartext.m in Sources */ = {isa = PBXBuildFile; fileRef = 63715F551B780C020029CB0B /* InteropTestsLocalCleartext.m */; };
 		5EA4770522736AC4000F72FC /* TestCertificates.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 63E240CF1B6C63DC005F3B0E /* TestCertificates.bundle */; };
@@ -121,6 +123,8 @@
 		5E7F488622778AEA006656AD /* GRPCClientTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GRPCClientTests.m; sourceTree = "<group>"; };
 		5E7F488822778B04006656AD /* InteropTestsRemote.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InteropTestsRemote.m; sourceTree = "<group>"; };
 		5E7F488A22778B5D006656AD /* RxLibraryUnitTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RxLibraryUnitTests.m; sourceTree = "<group>"; };
+		5E9F1C322321AB1700837469 /* TransportRegistryTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TransportRegistryTests.m; sourceTree = "<group>"; };
+		5E9F1C342321C9B200837469 /* TransportRegistryTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TransportRegistryTests.m; sourceTree = "<group>"; };
 		5EA476F42272816A000F72FC /* InteropTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = InteropTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		5EA908CF4CDA4CE218352A06 /* Pods-InteropTestsLocalSSLCFStream.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InteropTestsLocalSSLCFStream.release.xcconfig"; path = "Pods/Target Support Files/Pods-InteropTestsLocalSSLCFStream/Pods-InteropTestsLocalSSLCFStream.release.xcconfig"; sourceTree = "<group>"; };
 		5EAD6D261E27047400002378 /* CronetUnitTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = CronetUnitTests.mm; path = CronetTests/CronetUnitTests.mm; sourceTree = SOURCE_ROOT; };
@@ -362,6 +366,7 @@
 		5E0282E7215AA697007AC99D /* UnitTests */ = {
 			isa = PBXGroup;
 			children = (
+				5E9F1C322321AB1700837469 /* TransportRegistryTests.m */,
 				5E7F488A22778B5D006656AD /* RxLibraryUnitTests.m */,
 				5E7F488622778AEA006656AD /* GRPCClientTests.m */,
 				5E7F487F227782C1006656AD /* APIv2Tests.m */,
@@ -375,6 +380,7 @@
 		5E7F485A22775B15006656AD /* CronetTests */ = {
 			isa = PBXGroup;
 			children = (
+				5E9F1C342321C9B200837469 /* TransportRegistryTests.m */,
 				5EE84BF31D4717E40050C6CC /* InteropTestsRemoteWithCronet.m */,
 				5E7F486D22778086006656AD /* CoreCronetEnd2EndTests.mm */,
 				5EAD6D261E27047400002378 /* CronetUnitTests.mm */,
@@ -868,6 +874,7 @@
 				5E0282E9215AA697007AC99D /* NSErrorUnitTests.m in Sources */,
 				5E7F4880227782C1006656AD /* APIv2Tests.m in Sources */,
 				5E7F487D22778256006656AD /* ChannelPoolTest.m in Sources */,
+				5E9F1C332321AB1700837469 /* TransportRegistryTests.m in Sources */,
 				5E7F488722778AEA006656AD /* GRPCClientTests.m in Sources */,
 				5E7F487E22778256006656AD /* ChannelTests.m in Sources */,
 				5E7F488B22778B5D006656AD /* RxLibraryUnitTests.m in Sources */,
@@ -882,6 +889,7 @@
 				5E3F148D22792856007C6D90 /* ConfigureCronet.m in Sources */,
 				5E08D07023021E3B006D76EA /* InteropTestsMultipleChannels.m in Sources */,
 				5E7F486E22778086006656AD /* CoreCronetEnd2EndTests.mm in Sources */,
+				5E9F1C352321C9B200837469 /* TransportRegistryTests.m in Sources */,
 				5E7F488522778A88006656AD /* InteropTests.m in Sources */,
 				5E7F486422775B37006656AD /* InteropTestsRemoteWithCronet.m in Sources */,
 				5E7F486522775B41006656AD /* CronetUnitTests.mm in Sources */,

+ 51 - 0
src/objective-c/tests/UnitTests/TransportRegistryTests.m

@@ -0,0 +1,51 @@
+/*
+ *
+ * Copyright 2019 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#import <XCTest/XCTest.h>
+
+#import <GRPCClient/GRPCCall+Cronet.h>
+#import <GRPCClient/GRPCTransport.h>
+#import "src/objective-c/GRPCClient/private/GRPCTransport+Private.h"
+
+@interface TransportRegistryTests : XCTestCase
+
+@end
+
+@implementation TransportRegistryTests
+
+- (void)testDefaultImplementationsExist {
+  id<GRPCTransportFactory> secureTransportFactory = [[GRPCTransportRegistry sharedInstance]
+      getTransportFactoryWithId:GRPCDefaultTransportImplList.core_secure];
+  id<GRPCTransportFactory> insecureTransportFactory = [[GRPCTransportRegistry sharedInstance]
+      getTransportFactoryWithId:GRPCDefaultTransportImplList.core_insecure];
+  XCTAssertNotNil(secureTransportFactory);
+  XCTAssertNotNil(insecureTransportFactory);
+  XCTAssertNotEqual(secureTransportFactory, insecureTransportFactory);
+}
+
+- (void)testCronetImplementationNotExistAndFallBack {
+  id<GRPCTransportFactory> secureTransportFactory = [[GRPCTransportRegistry sharedInstance]
+      getTransportFactoryWithId:GRPCDefaultTransportImplList.core_secure];
+  id<GRPCTransportFactory> cronetTransportFactory =
+      [[GRPCTransportRegistry sharedInstance] getTransportFactoryWithId:gGRPCCoreCronetId];
+  XCTAssertNotNil(secureTransportFactory);
+  XCTAssertNotNil(cronetTransportFactory);
+  XCTAssertEqual(secureTransportFactory, cronetTransportFactory);
+}
+
+@end