summaryrefslogtreecommitdiff
path: root/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageDisassemblerSpec.m
diff options
context:
space:
mode:
Diffstat (limited to 'SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageDisassemblerSpec.m')
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageDisassemblerSpec.m166
1 files changed, 97 insertions, 69 deletions
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageDisassemblerSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageDisassemblerSpec.m
index 9c211ba05..a65652060 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageDisassemblerSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageDisassemblerSpec.m
@@ -18,78 +18,106 @@
QuickSpecBegin(SDLProtocolMessageDisassemblerSpec)
-describe(@"Disassemble Tests", ^ {
- it(@"Should assemble the message properly", ^ {
- //Allocate 2000 bytes, and use it as sample data
- const NSUInteger dataLength = 2000;
- char dummyBytes[dataLength];
-
- SDLGlobals *globals = [[SDLGlobals alloc] init];
- globals.maxHeadUnitProtocolVersion = [SDLVersion versionWithString:@"2.0.0"];
-
- const char testPayloadHeader[12] = {0x20, 0x55, 0x64, 0x73, 0x12, 0x34, 0x43, 0x21, (dataLength >> 24) & 0xFF, (dataLength >> 16) & 0xFF, (dataLength >> 8) & 0xFF, dataLength & 0xFF};
-
- NSMutableData* payloadData = [NSMutableData dataWithBytes:testPayloadHeader length:12];
- [payloadData appendBytes:dummyBytes length:dataLength];
-
- SDLV2ProtocolMessage* testMessage = [[SDLV2ProtocolMessage alloc] init];
- SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
-
- testHeader.frameType = SDLFrameTypeSingle;
- testHeader.serviceType = SDLServiceTypeBulkData;
- testHeader.frameData = SDLFrameInfoSingleFrame;
- testHeader.sessionID = 0x84;
- testHeader.bytesInPayload = (UInt32)payloadData.length;
-
- testMessage.header = testHeader;
- testMessage.payload = payloadData;
-
- NSArray<SDLProtocolMessage *> *messageList = [SDLProtocolMessageDisassembler disassemble:testMessage withLimit:[globals mtuSizeForServiceType:testHeader.serviceType]];
-
- //Payload length per message
- UInt32 payloadLength = 1012; // v1/2 MTU(1024) - header length(12)
-
- const char firstPayload[8] = {(payloadData.length >> 24) & 0xFF, (payloadData.length >> 16) & 0xFF, (payloadData.length >> 8) & 0xFF, payloadData.length & 0xFF, 0x00, 0x00, 0x00, ceil(1.0 * payloadData.length / payloadLength)};
-
- SDLProtocolMessage* message = messageList[0];
-
- //First frame
- expect(message.payload).to(equal([NSData dataWithBytes:firstPayload length:8]));
-
- expect(@(message.header.frameType)).to(equal(@(SDLFrameTypeFirst)));
- expect(@(message.header.serviceType)).to(equal(@(SDLServiceTypeBulkData)));
- expect(@(message.header.frameData)).to(equal(@(SDLFrameInfoFirstFrame)));
- expect(@(message.header.sessionID)).to(equal(@0x84));
- expect(@(message.header.bytesInPayload)).to(equal(@8));
-
- NSUInteger offset = 0;
- for (int i = 1; i < messageList.count - 1; i++) {
- message = messageList[i];
-
- //Consecutive frames
- expect(message.payload).to(equal([NSData dataWithData:[payloadData subdataWithRange:NSMakeRange(offset, payloadLength)]]));
-
+describe(@"SDLProtocolMessageDisassembler Tests", ^ {
+ context(@"when the MTU size is larger than the payload size", ^{
+ it(@"should disassemble the message properly", ^{
+ const NSUInteger dataLength = 400;
+ char dummyBytes[dataLength];
+
+ const char testPayloadHeader[12] = {0x20, 0x55, 0x64, 0x73, 0x12, 0x34, 0x43, 0x21, (dataLength >> 24) & 0xFF, (dataLength >> 16) & 0xFF, (dataLength >> 8) & 0xFF, dataLength & 0xFF};
+
+ NSMutableData* payloadData = [NSMutableData dataWithBytes:testPayloadHeader length:12];
+ [payloadData appendBytes:dummyBytes length:dataLength];
+
+ SDLV2ProtocolMessage *testMessage = [[SDLV2ProtocolMessage alloc] init];
+ SDLV2ProtocolHeader *testHeader = [[SDLV2ProtocolHeader alloc] init];
+
+ testHeader.frameType = SDLFrameTypeSingle;
+ testHeader.serviceType = SDLServiceTypeBulkData;
+ testHeader.frameData = SDLFrameInfoSingleFrame;
+ testHeader.sessionID = 0x84;
+ testHeader.bytesInPayload = (UInt32)payloadData.length;
+
+ testMessage.header = testHeader;
+ testMessage.payload = payloadData;
+
+ NSArray<SDLProtocolMessage *> *messageList = [SDLProtocolMessageDisassembler disassemble:testMessage withMTULimit:1024];
+ expect(messageList.count).to(equal(1));
+ expect(messageList[0]).to(equal(testMessage));
+ });
+ });
+
+ context(@"when the MTU size is smaller than the payload size", ^{
+ it(@"Should disassemble the message properly", ^ {
+ //Allocate 4000 bytes and use it as sample data
+ const NSUInteger dataLength = 4000;
+ char dummyBytes[dataLength];
+
+ const char testPayloadHeader[12] = {0x20, 0x55, 0x64, 0x73, 0x12, 0x34, 0x43, 0x21, (dataLength >> 24) & 0xFF, (dataLength >> 16) & 0xFF, (dataLength >> 8) & 0xFF, dataLength & 0xFF};
+
+ NSMutableData* payloadData = [NSMutableData dataWithBytes:testPayloadHeader length:12];
+ [payloadData appendBytes:dummyBytes length:dataLength];
+
+ SDLV2ProtocolMessage* testMessage = [[SDLV2ProtocolMessage alloc] init];
+ SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
+
+ testHeader.frameType = SDLFrameTypeSingle;
+ testHeader.serviceType = SDLServiceTypeBulkData;
+ testHeader.frameData = SDLFrameInfoSingleFrame;
+ testHeader.sessionID = 0x84;
+ testHeader.bytesInPayload = (UInt32)payloadData.length;
+
+ testMessage.header = testHeader;
+ testMessage.payload = payloadData;
+
+ NSArray<SDLProtocolMessage *> *messageList = [SDLProtocolMessageDisassembler disassemble:testMessage withMTULimit:1024];
+ expect(messageList.count).to(equal(5));
+
+ //Payload length per message
+ UInt32 payloadLength = 1012; // v1/2 MTU(1024) - header length(12)
+
+ const char firstPayload[8] = {(payloadData.length >> 24) & 0xFF, (payloadData.length >> 16) & 0xFF, (payloadData.length >> 8) & 0xFF, payloadData.length & 0xFF, 0x00, 0x00, 0x00, ceil(1.0 * payloadData.length / payloadLength)};
+
+ SDLProtocolMessage* message = messageList[0];
+
+ //First frame
+ expect(message.payload).to(equal([NSData dataWithBytes:firstPayload length:8]));
+
+ expect(@(message.header.frameType)).to(equal(@(SDLFrameTypeFirst)));
+ expect(@(message.header.serviceType)).to(equal(@(SDLServiceTypeBulkData)));
+ expect(@(message.header.frameData)).to(equal(@(SDLFrameInfoFirstFrame)));
+ expect(@(message.header.sessionID)).to(equal(@0x84));
+ expect(@(message.header.bytesInPayload)).to(equal(@8));
+
+ NSUInteger offset = 0;
+ for (int i = 1; i < messageList.count - 1; i++) {
+ message = messageList[i];
+
+ //Consecutive frames
+ expect(message.payload).to(equal([NSData dataWithData:[payloadData subdataWithRange:NSMakeRange(offset, payloadLength)]]));
+
+ expect(@(message.header.frameType)).to(equal(@(SDLFrameTypeConsecutive)));
+ expect(@(message.header.serviceType)).to(equal(@(SDLServiceTypeBulkData)));
+ expect(@(message.header.frameData)).to(equal(@(i)));
+ expect(@(message.header.sessionID)).to(equal(@0x84));
+ expect(@(message.header.bytesInPayload)).to(equal(@(payloadLength)));
+
+ offset += payloadLength;
+ }
+
+ message = [messageList lastObject];
+
+ NSUInteger remaining = payloadData.length - offset;
+
+ //Last frame
+ expect(message.payload).to(equal([NSData dataWithData:[payloadData subdataWithRange:NSMakeRange(offset, remaining)]]));
+
expect(@(message.header.frameType)).to(equal(@(SDLFrameTypeConsecutive)));
expect(@(message.header.serviceType)).to(equal(@(SDLServiceTypeBulkData)));
- expect(@(message.header.frameData)).to(equal(@(i)));
+ expect(@(message.header.frameData)).to(equal(@(SDLFrameInfoConsecutiveLastFrame)));
expect(@(message.header.sessionID)).to(equal(@0x84));
- expect(@(message.header.bytesInPayload)).to(equal(@(payloadLength)));
-
- offset += payloadLength;
- }
-
- message = [messageList lastObject];
-
- NSUInteger remaining = payloadData.length - offset;
-
- //Last frame
- expect(message.payload).to(equal([NSData dataWithData:[payloadData subdataWithRange:NSMakeRange(offset, remaining)]]));
-
- expect(@(message.header.frameType)).to(equal(@(SDLFrameTypeConsecutive)));
- expect(@(message.header.serviceType)).to(equal(@(SDLServiceTypeBulkData)));
- expect(@(message.header.frameData)).to(equal(@(SDLFrameInfoConsecutiveLastFrame)));
- expect(@(message.header.sessionID)).to(equal(@0x84));
- expect(@(message.header.bytesInPayload)).to(equal(@(remaining)));
+ expect(@(message.header.bytesInPayload)).to(equal(@(remaining)));
+ });
});
});