summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicoleYarroch <nicole@livio.io>2019-02-28 15:32:38 -0500
committerNicoleYarroch <nicole@livio.io>2019-02-28 15:32:38 -0500
commitad0e2081fe529c6b8976218c44349213d7b800dd (patch)
treec0416309dccd016da581bb0179cee17b54e4f978
parent3567b5d237d27eb6a2f3ffb1300214cb2c721ebf (diff)
downloadsdl_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.h9
-rw-r--r--SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m27
-rw-r--r--SmartDeviceLink/SDLGlobals.m2
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.h1
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.m9
-rw-r--r--SmartDeviceLink/SDLManager.h7
-rw-r--r--SmartDeviceLink/SDLManager.m4
-rw-r--r--SmartDeviceLink/SDLProtocol.h7
-rw-r--r--SmartDeviceLink/SDLProtocol.m7
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m1
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m150
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m26
-rw-r--r--SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m12
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];
});