diff options
author | NicoleYarroch <nicole@livio.io> | 2019-02-28 15:32:38 -0500 |
---|---|---|
committer | NicoleYarroch <nicole@livio.io> | 2019-02-28 15:32:38 -0500 |
commit | ad0e2081fe529c6b8976218c44349213d7b800dd (patch) | |
tree | c0416309dccd016da581bb0179cee17b54e4f978 | |
parent | 3567b5d237d27eb6a2f3ffb1300214cb2c721ebf (diff) | |
download | sdl_ios-ad0e2081fe529c6b8976218c44349213d7b800dd.tar.gz |
Can now get `authToken` from StartServiceACK header
* Added support for getting `authToken` from start service ACK header
* Added test cases to the `SDLLifecycleManagerSpec`, `SDLProtocolSpec`, `SDLControlFramePayloadRPCStartServiceAckSpec`.
-rw-r--r-- | SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.h | 9 | ||||
-rw-r--r-- | SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m | 27 | ||||
-rw-r--r-- | SmartDeviceLink/SDLGlobals.m | 2 | ||||
-rw-r--r-- | SmartDeviceLink/SDLLifecycleManager.h | 1 | ||||
-rw-r--r-- | SmartDeviceLink/SDLLifecycleManager.m | 9 | ||||
-rw-r--r-- | SmartDeviceLink/SDLManager.h | 7 | ||||
-rw-r--r-- | SmartDeviceLink/SDLManager.m | 4 | ||||
-rw-r--r-- | SmartDeviceLink/SDLProtocol.h | 7 | ||||
-rw-r--r-- | SmartDeviceLink/SDLProtocol.m | 7 | ||||
-rw-r--r-- | SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m | 1 | ||||
-rw-r--r-- | SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m | 150 | ||||
-rw-r--r-- | SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m | 26 | ||||
-rw-r--r-- | SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m | 12 |
13 files changed, 219 insertions, 43 deletions
diff --git a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.h b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.h index ba339bdc2..253cbeb97 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.h +++ b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.h @@ -20,6 +20,13 @@ NS_ASSUME_NONNULL_BEGIN /// Max transport unit to be used for this service @property (assign, nonatomic, readonly) int64_t mtu; +/** + * A token to be used to authenticate a websocket connection on app activation. + * + * @Since SDL 5.2 + */ +@property (copy, nonatomic, readonly, nullable) NSString *authToken; + /// The negotiated version of the protocol. Must be in the format "Major.Minor.Patch" @property (copy, nonatomic, readonly, nullable) NSString *protocolVersion; @@ -32,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN /** List of transports that are allowed to carry video service. The values can be either 1 (primary transport) or 2 (secondary transport) and are listed in preferred order. */ @property (copy, nonatomic, readonly, nullable) NSArray<NSNumber *> *videoServiceTransports; -- (instancetype)initWithHashId:(int32_t)hashId mtu:(int64_t)mtu protocolVersion:(nullable NSString *)protocolVersion secondaryTransports:(nullable NSArray<NSString *> *)secondaryTransports audioServiceTransports:(nullable NSArray<NSNumber *> *)audioServiceTransports videoServiceTransports:(nullable NSArray<NSNumber *> *)videoServiceTransports; +- (instancetype)initWithHashId:(int32_t)hashId mtu:(int64_t)mtu authToken:(nullable NSString *)authToken protocolVersion:(nullable NSString *)protocolVersion secondaryTransports:(nullable NSArray<NSString *> *)secondaryTransports audioServiceTransports:(nullable NSArray<NSNumber *> *)audioServiceTransports videoServiceTransports:(nullable NSArray<NSNumber *> *)videoServiceTransports; @end diff --git a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m index 536ecfc86..8d73c8876 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m +++ b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @property (assign, nonatomic, readwrite) int32_t hashId; @property (assign, nonatomic, readwrite) int64_t mtu; +@property (copy, nonatomic, readwrite, nullable) NSString *authToken; @property (copy, nonatomic, readwrite, nullable) NSString *protocolVersion; @property (copy, nonatomic, readwrite, nullable) NSArray<NSString *> *secondaryTransports; @property (copy, nonatomic, readwrite, nullable) NSArray<NSNumber *> *audioServiceTransports; @@ -30,6 +31,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithHashId:(int32_t)hashId mtu:(int64_t)mtu + authToken:(nullable NSString *)authToken protocolVersion:(nullable NSString *)protocolVersion secondaryTransports:(nullable NSArray<NSString *> *)secondaryTransports audioServiceTransports:(nullable NSArray<NSNumber *> *)audioServiceTransports @@ -39,6 +41,7 @@ NS_ASSUME_NONNULL_BEGIN _hashId = hashId; _mtu = mtu; + _authToken = authToken; _protocolVersion = protocolVersion; _secondaryTransports = secondaryTransports; _audioServiceTransports = audioServiceTransports; @@ -53,6 +56,7 @@ NS_ASSUME_NONNULL_BEGIN _hashId = SDLControlFrameInt32NotFound; _mtu = SDLControlFrameInt64NotFound; + _authToken = nil; if (data.length > 0) { [self sdl_parse:data]; @@ -79,6 +83,10 @@ NS_ASSUME_NONNULL_BEGIN bson_object_put_int64(&payloadObject, SDLControlFrameMTUKey, self.mtu); } + if (self.authToken != nil) { + bson_object_put_string(&payloadObject, SDLControlFrameAuthTokenKey, (char *)self.authToken.UTF8String); + } + if (self.protocolVersion != nil) { bson_object_put_string(&payloadObject, SDLControlFrameProtocolVersionKey, (char *)self.protocolVersion.UTF8String); } @@ -96,7 +104,6 @@ NS_ASSUME_NONNULL_BEGIN } [self sdl_addServiceTransports:&payloadObject fromArray:self.audioServiceTransports forKey:SDLControlFrameAudioServiceTransportsKey]; - [self sdl_addServiceTransports:&payloadObject fromArray:self.videoServiceTransports forKey:SDLControlFrameVideoServiceTransportsKey]; BytePtr bsonData = bson_object_to_bytes(&payloadObject); @@ -113,9 +120,14 @@ NS_ASSUME_NONNULL_BEGIN self.hashId = bson_object_get_int32(&payloadObject, SDLControlFrameHashIdKey); self.mtu = bson_object_get_int64(&payloadObject, SDLControlFrameMTUKey); - char *utf8String = bson_object_get_string(&payloadObject, SDLControlFrameProtocolVersionKey); - if (utf8String != NULL) { - self.protocolVersion = [NSString stringWithUTF8String:utf8String]; + char *protocolVersionUTF8String = bson_object_get_string(&payloadObject, SDLControlFrameProtocolVersionKey); + if (protocolVersionUTF8String != NULL) { + self.protocolVersion = [NSString stringWithUTF8String:protocolVersionUTF8String]; + } + + char *authTokenUTF8String = bson_object_get_string(&payloadObject, SDLControlFrameAuthTokenKey); + if (authTokenUTF8String != NULL) { + self.authToken = [NSString stringWithUTF8String:authTokenUTF8String]; } BsonArray *arrayObject = bson_object_get_array(&payloadObject, SDLControlFrameSecondaryTransportsKey); @@ -123,15 +135,14 @@ NS_ASSUME_NONNULL_BEGIN NSMutableArray<NSString *> *secondaryTransports = [NSMutableArray array]; size_t index = 0; - while ((utf8String = bson_array_get_string(arrayObject, index)) != NULL) { - [secondaryTransports addObject:[NSString stringWithUTF8String:utf8String]]; + while ((protocolVersionUTF8String = bson_array_get_string(arrayObject, index)) != NULL) { + [secondaryTransports addObject:[NSString stringWithUTF8String:protocolVersionUTF8String]]; index++; } self.secondaryTransports = [secondaryTransports copy]; } self.audioServiceTransports = [self sdl_getServiceTransports:&payloadObject forKey:SDLControlFrameAudioServiceTransportsKey]; - self.videoServiceTransports = [self sdl_getServiceTransports:&payloadObject forKey:SDLControlFrameVideoServiceTransportsKey]; bson_object_deinitialize(&payloadObject); @@ -179,7 +190,7 @@ NS_ASSUME_NONNULL_BEGIN } - (NSString *)description { - return [NSString stringWithFormat:@"<%@>: Protocol Version: %@, hash id: %d, MTU: %lld, secondary transports: %@, transports for audio service: %@, transports for video service: %@", NSStringFromClass(self.class), self.protocolVersion, self.hashId, self.mtu, self.secondaryTransports, self.audioServiceTransports, self.videoServiceTransports]; + return [NSString stringWithFormat:@"<%@>: Protocol Version: %@, hash id: %d, MTU: %lld, auth token: %@, secondary transports: %@, transports for audio service: %@, transports for video service: %@", NSStringFromClass(self.class), self.protocolVersion, self.hashId, self.mtu, self.authToken, self.secondaryTransports, self.audioServiceTransports, self.videoServiceTransports]; } @end diff --git a/SmartDeviceLink/SDLGlobals.m b/SmartDeviceLink/SDLGlobals.m index d5364a119..dfc96f165 100644 --- a/SmartDeviceLink/SDLGlobals.m +++ b/SmartDeviceLink/SDLGlobals.m @@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN // VERSION DEPENDENT CODE -NSString *const SDLMaxProxyProtocolVersion = @"5.1.0"; +NSString *const SDLMaxProxyProtocolVersion = @"5.2.0"; NSString *const SDLMaxProxyRPCVersion = @"5.0.0"; NSUInteger const SDLDefaultMTUSize = UINT32_MAX; diff --git a/SmartDeviceLink/SDLLifecycleManager.h b/SmartDeviceLink/SDLLifecycleManager.h index 594dccba3..ad42a62dc 100644 --- a/SmartDeviceLink/SDLLifecycleManager.h +++ b/SmartDeviceLink/SDLLifecycleManager.h @@ -62,6 +62,7 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error); @property (copy, nonatomic, readonly) SDLConfiguration *configuration; @property (weak, nonatomic, nullable) id<SDLManagerDelegate> delegate; +@property (strong, nonatomic, readonly, nullable) NSString *authToken; @property (strong, nonatomic) SDLFileManager *fileManager; @property (strong, nonatomic) SDLPermissionManager *permissionManager; diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m index 5436d8945..8c6ebfc31 100644 --- a/SmartDeviceLink/SDLLifecycleManager.m +++ b/SmartDeviceLink/SDLLifecycleManager.m @@ -76,6 +76,7 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready"; // Readonly public properties @property (copy, nonatomic, readwrite) SDLConfiguration *configuration; +@property (strong, nonatomic, readwrite, nullable) NSString *authToken; @property (strong, nonatomic, readwrite) SDLNotificationDispatcher *notificationDispatcher; @property (strong, nonatomic, readwrite) SDLResponseDispatcher *responseDispatcher; @property (strong, nonatomic, readwrite) SDLStateMachine *lifecycleStateMachine; @@ -630,6 +631,14 @@ SDLLifecycleState *const SDLLifecycleStateReady = @"Ready"; } } +/** + * Gets the authentication token returned by the `StartServiceACK` header + * + * @return An authentication token + */ +- (nullable NSString *)authToken { + return self.proxy.protocol.authToken; +} #pragma mark SDL notification observers diff --git a/SmartDeviceLink/SDLManager.h b/SmartDeviceLink/SDLManager.h index b984a58a5..06773aa33 100644 --- a/SmartDeviceLink/SDLManager.h +++ b/SmartDeviceLink/SDLManager.h @@ -84,6 +84,13 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error); @property (strong, nonatomic, readonly, nullable) SDLRegisterAppInterfaceResponse *registerResponse; /** + * The auth token, if received. This should be used to log into a user account. + * + * @since SDL 5.2 + */ +@property (strong, nonatomic, readonly, nullable) NSString *authToken; + +/** * The manager's delegate. */ @property (weak, nonatomic, nullable) id<SDLManagerDelegate> delegate; diff --git a/SmartDeviceLink/SDLManager.m b/SmartDeviceLink/SDLManager.m index fa7c9e8e0..249def3ad 100644 --- a/SmartDeviceLink/SDLManager.m +++ b/SmartDeviceLink/SDLManager.m @@ -97,6 +97,10 @@ NS_ASSUME_NONNULL_BEGIN return self.lifecycleManager.registerResponse; } +-(nullable NSString *)authToken { + return self.lifecycleManager.authToken; +} + - (nullable id<SDLManagerDelegate>)delegate { return self.lifecycleManager.delegate; } diff --git a/SmartDeviceLink/SDLProtocol.h b/SmartDeviceLink/SDLProtocol.h index e4d0e44fc..d42f5bc9a 100644 --- a/SmartDeviceLink/SDLProtocol.h +++ b/SmartDeviceLink/SDLProtocol.h @@ -56,6 +56,13 @@ extern NSString *const SDLProtocolSecurityErrorDomain; */ @property (nonatomic, copy) NSString *appId; +/** + * The auth token, if any, returned with the `StartServiceACK` for the RPC service from the module. + * + * @since SDL 5.2 + */ +@property (strong, nonatomic, readonly, nullable) NSString *authToken; + #pragma mark - Sending /** diff --git a/SmartDeviceLink/SDLProtocol.m b/SmartDeviceLink/SDLProtocol.m index ab6eb647e..44b7737e9 100644 --- a/SmartDeviceLink/SDLProtocol.m +++ b/SmartDeviceLink/SDLProtocol.m @@ -48,6 +48,9 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic) NSMutableDictionary<SDLServiceTypeBox *, SDLProtocolHeader *> *serviceHeaders; @property (assign, nonatomic) int32_t hashId; +// Readonly public properties +@property (strong, nonatomic, readwrite, nullable) NSString *authToken; + @end @@ -482,6 +485,10 @@ NS_ASSUME_NONNULL_BEGIN self.hashId = startServiceACKPayload.hashId; } [SDLGlobals sharedGlobals].maxHeadUnitVersion = (startServiceACKPayload.protocolVersion != nil) ? startServiceACKPayload.protocolVersion : [NSString stringWithFormat:@"%u.0.0", startServiceACK.header.version]; + + // FIXME: Add check for protocol version 5.2 or greater + self.authToken = startServiceACKPayload.authToken; + // TODO: Hash id? } break; default: diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m index 49892f366..e05f56dc3 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m @@ -129,6 +129,7 @@ describe(@"a lifecycle manager", ^{ expect(testManager.streamManager).toNot(beNil()); expect(testManager.systemCapabilityManager).toNot(beNil()); expect(@([testManager conformsToProtocol:@protocol(SDLConnectionManagerType)])).to(equal(@YES)); + expect(testManager.authToken).to(beNil()); }); itBehavesLike(@"unable to send an RPC", ^{ return @{ @"manager": testManager }; }); diff --git a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m index 6ff840374..0fc3ed3db 100644 --- a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m +++ b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m @@ -11,6 +11,7 @@ #import "SDLTransportType.h" #import "SDLControlFramePayloadRegisterSecondaryTransportNak.h" +#import "SDLControlFramePayloadRPCStartServiceAck.h" #import "SDLGlobals.h" #import "SDLProtocolHeader.h" #import "SDLProtocol.h" @@ -23,7 +24,6 @@ #import "SDLV1ProtocolHeader.h" #import "SDLV2ProtocolHeader.h" - QuickSpecBegin(SDLProtocolSpec) //Test dictionaries @@ -404,23 +404,137 @@ describe(@"HandleBytesFromTransport Tests", ^ { }); }); -xdescribe(@"HandleProtocolSessionStarted Tests", ^ { - it(@"Should pass information along to delegate", ^ { - SDLProtocol* testProtocol = [[SDLProtocol alloc] init]; - - id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener)); - - SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init]; - testHeader.frameType = SDLFrameTypeControl; - testHeader.serviceType = SDLServiceTypeRPC; - testHeader.frameData = SDLFrameInfoStartServiceACK; - testHeader.sessionID = 0x93; - testHeader.bytesInPayload = 0; - - [testProtocol.protocolDelegateTable addObject:delegateMock]; - [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]; - - OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]); +describe(@"HandleProtocolSessionStarted tests", ^ { + __block SDLProtocol *testProtocol = nil; + __block id delegateMock = nil; + + beforeEach(^{ + testProtocol = [[SDLProtocol alloc] init]; + delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener)); + [[SDLGlobals sharedGlobals] init]; // Make sure to reset between tests + }); + + context(@"For protocol versions 5.0.0 and greater", ^{ + __block NSString *testAuthToken = nil; + + beforeEach(^{ + testAuthToken = @"testAuthToken"; + }); + + context(@"If the service type is RPC", ^{ + it(@"Should store the auth token and the protocol version and pass the start service along to the delegate", ^{ + SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:1545784 mtu:989786483 authToken:testAuthToken protocolVersion:@"5.2.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + NSData *testData = testPayload.data; + + SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5]; + testHeader.frameType = SDLFrameTypeControl; + testHeader.serviceType = SDLServiceTypeRPC; + testHeader.frameData = SDLFrameInfoStartServiceACK; + testHeader.sessionID = 0x93; + testHeader.bytesInPayload = (UInt32)testData.length; + + [testProtocol.protocolDelegateTable addObject:delegateMock]; + [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]]; + + OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]); + + expect(testProtocol.authToken).to(equal(testAuthToken)); + expect([SDLGlobals sharedGlobals].protocolVersion).to(equal(@"5.2.0")); + expect([SDLGlobals sharedGlobals].maxHeadUnitVersion).to(equal(@"5.2.0")); + }); + + it(@"Should set the max head unit version using the header version if the protocol version is missing from the payload", ^{ + SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:1545784 mtu:989786483 authToken:nil protocolVersion:nil secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + NSData *testData = testPayload.data; + + SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5]; + testHeader.frameType = SDLFrameTypeControl; + testHeader.serviceType = SDLServiceTypeRPC; + testHeader.frameData = SDLFrameInfoStartServiceACK; + testHeader.sessionID = 0x93; + testHeader.bytesInPayload = (UInt32)testData.length; + + [testProtocol.protocolDelegateTable addObject:delegateMock]; + [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]]; + + OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]); + + expect(testProtocol.authToken).to(beNil()); + expect([SDLGlobals sharedGlobals].protocolVersion).to(equal(@"5.0.0")); + expect([SDLGlobals sharedGlobals].maxHeadUnitVersion).to(equal(@"5.0.0")); + }); + }); + + context(@"If the service type is not RPC", ^{ + it(@"Should just pass the start service along to the delegate", ^{ + SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:1545784 mtu:989786483 authToken:testAuthToken protocolVersion:@"5.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + NSData *testData = testPayload.data; + + SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5]; + testHeader.frameType = SDLFrameTypeControl; + testHeader.serviceType = SDLServiceTypeControl; + testHeader.frameData = SDLFrameInfoStartServiceACK; + testHeader.sessionID = 0x93; + testHeader.bytesInPayload = (UInt32)testData.length; + + [testProtocol.protocolDelegateTable addObject:delegateMock]; + [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]]; + + OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]); + + // Should keep their default values + expect(testProtocol.authToken).to(beNil()); + expect([SDLGlobals sharedGlobals].protocolVersion).to(equal(@"1.0.0")); + expect([SDLGlobals sharedGlobals].maxHeadUnitVersion).to(equal(@"0.0.0")); + }); + }); + }); + + context(@"For protocol versions below 5.0.0", ^{ + context(@"If the service type is RPC", ^{ + it(@"Should store the protocol version and pass the start service along to the delegate", ^{ + SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:1545784 mtu:989786483 authToken:nil protocolVersion:@"3.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + NSData *testData = testPayload.data; + + SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5]; + testHeader.frameType = SDLFrameTypeControl; + testHeader.serviceType = SDLServiceTypeRPC; + testHeader.frameData = SDLFrameInfoStartServiceACK; + testHeader.sessionID = 0x93; + testHeader.bytesInPayload = (UInt32)testData.length; + + [testProtocol.protocolDelegateTable addObject:delegateMock]; + [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]]; + + OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]); + + expect([SDLGlobals sharedGlobals].protocolVersion).to(equal(@"3.1.0")); + expect([SDLGlobals sharedGlobals].maxHeadUnitVersion).to(equal(@"3.1.0")); + }); + }); + + context(@"If the service type is not RPC", ^{ + it(@"Should just pass the start service along to the delegate", ^{ + SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:1545784 mtu:989786483 authToken:nil protocolVersion:@"4.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + NSData *testData = testPayload.data; + + SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:4]; + testHeader.frameType = SDLFrameTypeControl; + testHeader.serviceType = SDLServiceTypeControl; + testHeader.frameData = SDLFrameInfoStartServiceACK; + testHeader.sessionID = 0x93; + testHeader.bytesInPayload = (UInt32)testData.length; + + [testProtocol.protocolDelegateTable addObject:delegateMock]; + [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]]; + + OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]); + + // Should keep their default values + expect([SDLGlobals sharedGlobals].protocolVersion).to(equal(@"1.0.0")); + expect([SDLGlobals sharedGlobals].maxHeadUnitVersion).to(equal(@"0.0.0")); + }); + }); }); }); diff --git a/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m index 8a198c63e..682d53678 100644 --- a/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m +++ b/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m @@ -18,13 +18,13 @@ describe(@"Test encoding data", ^{ __block NSArray<NSNumber *> *testAudioServiceTransports = nil; __block NSArray<NSNumber *> *testVideoServiceTransports = nil; - context(@"with paramaters", ^{ + context(@"with parameters", ^{ beforeEach(^{ testHashId = 1457689; testMTU = 5984649; testProtocolVersion = @"1.32.32"; - testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU protocolVersion:testProtocolVersion secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:nil protocolVersion:testProtocolVersion secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; }); it(@"should create the correct data", ^{ @@ -32,7 +32,7 @@ describe(@"Test encoding data", ^{ }); }); - context(@"with secondary transport paramaters", ^{ + context(@"with secondary transport parameters", ^{ beforeEach(^{ testHashId = 987654; testMTU = 4096; @@ -41,7 +41,7 @@ describe(@"Test encoding data", ^{ testAudioServiceTransports = @[@(2)]; testVideoServiceTransports = @[(@2), @(1)]; - testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; }); it(@"should create the correct data", ^{ @@ -54,7 +54,7 @@ describe(@"Test encoding data", ^{ testHashId = SDLControlFrameInt32NotFound; testMTU = SDLControlFrameInt64NotFound; - testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU protocolVersion:nil secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:nil protocolVersion:nil secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; }); it(@"should create no data", ^{ @@ -68,18 +68,20 @@ describe(@"Test decoding data", ^{ __block NSData *testData = nil; __block int32_t testHashId = 0; __block int64_t testMTU = 0; + __block NSString *testAuthToken = nil; __block NSString *testProtocolVersion = nil; __block NSArray<NSString *> *testSecondaryTransports = nil; __block NSArray<NSNumber *> *testAudioServiceTransports = nil; __block NSArray<NSNumber *> *testVideoServiceTransports = nil; - context(@"with paramaters", ^{ + context(@"with parameters", ^{ beforeEach(^{ testHashId = 1545784; testMTU = 989786483; + testAuthToken = @"testAuthToken"; testProtocolVersion = @"3.89.5"; - SDLControlFramePayloadRPCStartServiceAck *firstPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU protocolVersion:testProtocolVersion secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; + SDLControlFramePayloadRPCStartServiceAck *firstPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:testAuthToken protocolVersion:testProtocolVersion secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil]; testData = firstPayload.data; testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:testData]; @@ -88,20 +90,25 @@ describe(@"Test decoding data", ^{ it(@"should output the correct params", ^{ expect(testPayload.hashId).to(equal(testHashId)); expect(testPayload.mtu).to(equal(testMTU)); + expect(testPayload.authToken).to(equal(testAuthToken)); expect(testPayload.protocolVersion).to(equal(testProtocolVersion)); + expect(testPayload.secondaryTransports).to(beNil()); + expect(testPayload.audioServiceTransports).to(beNil()); + expect(testPayload.videoServiceTransports).to(beNil()); }); }); - context(@"with secondary transportparamaters", ^{ + context(@"with secondary transport parameters", ^{ beforeEach(^{ testHashId = 17999024; testMTU = 1798250; + testAuthToken = @"testAuthToken"; testProtocolVersion = @"6.01.00"; testSecondaryTransports = @[@"TCP_WIFI"]; testAudioServiceTransports = @[@(2), @(1)]; testVideoServiceTransports = @[@(1)]; - SDLControlFramePayloadRPCStartServiceAck *firstPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + SDLControlFramePayloadRPCStartServiceAck *firstPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:testAuthToken protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; testData = firstPayload.data; testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:testData]; @@ -110,6 +117,7 @@ describe(@"Test decoding data", ^{ it(@"should output the correct params", ^{ expect(testPayload.hashId).to(equal(testHashId)); expect(testPayload.mtu).to(equal(testMTU)); + expect(testPayload.authToken).to(equal(testAuthToken)); expect(testPayload.protocolVersion).to(equal(testProtocolVersion)); expect(testPayload.secondaryTransports).to(equal(testSecondaryTransports)); expect(testPayload.audioServiceTransports).to(equal(testAudioServiceTransports)); diff --git a/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m b/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m index 81b4196c7..acc14b3c5 100644 --- a/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m +++ b/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m @@ -230,7 +230,7 @@ describe(@"the secondary transport manager ", ^{ testAudioServiceTransports = @[@(2), @(1)]; testVideoServiceTransports = @[@(2)]; - testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data]; }); @@ -259,7 +259,7 @@ describe(@"the secondary transport manager ", ^{ // Note: this is not allowed for now. It should contain only one element. testSecondaryTransports = @[@"TCP_WIFI", @"IAP_USB_HOST_MODE"]; - testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data]; }); @@ -287,7 +287,7 @@ describe(@"the secondary transport manager ", ^{ testAudioServiceTransports = @[@(2)]; testVideoServiceTransports = @[@(2)]; - testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data]; }); @@ -313,7 +313,7 @@ describe(@"the secondary transport manager ", ^{ context(@"without secondary transport related parameter", ^{ beforeEach(^{ - testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data]; }); @@ -407,7 +407,7 @@ describe(@"the secondary transport manager ", ^{ testTransportEventUpdatePayload = [[SDLControlFramePayloadTransportEventUpdate alloc] initWithTcpIpAddress:testTcpIpAddress tcpPort:testTcpPort]; testTransportEventUpdateMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testTransportEventUpdateHeader andPayload:testTransportEventUpdatePayload.data]; - testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data]; }); @@ -444,7 +444,7 @@ describe(@"the secondary transport manager ", ^{ testTransportEventUpdatePayload = [[SDLControlFramePayloadTransportEventUpdate alloc] initWithTcpIpAddress:testTcpIpAddress tcpPort:testTcpPort]; testTransportEventUpdateMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testTransportEventUpdateHeader andPayload:testTransportEventUpdatePayload.data]; - testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; + testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports]; testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data]; }); |