summaryrefslogtreecommitdiff
path: root/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolMessageAssemblerSpec.m
blob: d31a6e0613112979d285479af45abb78bc27178f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//
//  SDLProtocolMessageAssemblerSpec.m
//  SmartDeviceLink-iOS


#import <Foundation/Foundation.h>

#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
#import <OCMock/OCMock.h>

#import "SDLProtocolMessageAssembler.h"
#import "SDLV2ProtocolHeader.h"
#import "SDLV2ProtocolMessage.h"
#import "SDLNames.h"

QuickSpecBegin(SDLProtocolMessageAssemblerSpec)

describe(@"HandleMessage Tests", ^ {
    it(@"Should assemble the message properly", ^ {
        const NSUInteger dataLength = 2000;
        
        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];
        
        //First frame
        testHeader.frameType = SDLFrameType_First;
        testHeader.serviceType = SDLServiceType_BulkData;
        testHeader.frameData = 1;
        testHeader.sessionID = 0x16;
        testHeader.bytesInPayload = 8;
        
        testMessage.header = testHeader;
        
        const char firstPayload[8] = {(payloadData.length >> 24) & 0xFF, (payloadData.length >> 16) & 0xFF, (payloadData.length >> 8) & 0xFF, payloadData.length & 0xFF, 0x00, 0x00, 0x00, ceil(payloadData.length / 500.0)};
        testMessage.payload = [NSData dataWithBytes:firstPayload length:8];
        
        SDLProtocolMessageAssembler* assembler = [[SDLProtocolMessageAssembler alloc] initWithSessionID:0x16];
        
        __block BOOL verified = NO;
        
        SDLMessageAssemblyCompletionHandler incompleteHandler = ^void(BOOL done, SDLProtocolMessage* assembledMessage) {
            verified = YES;
            
            expect(@(done)).to(equal(@NO));
            expect(assembledMessage).to(beNil());
        };
        
        [assembler handleMessage:testMessage withCompletionHandler:incompleteHandler];
        
        expect(@(verified)).to(beTruthy());
        verified = NO;
        
        testMessage.header.frameType = SDLFrameType_Consecutive;
        testMessage.header.bytesInPayload = 500;
        
        NSUInteger frameNumber = 1;
        NSUInteger offset = 0;
        while ((offset + 500) < payloadData.length) {
            //Consecutive frames
            testMessage.header.frameData = frameNumber;
            testMessage.payload = [payloadData subdataWithRange:NSMakeRange(offset, 500)];
            [assembler handleMessage:testMessage withCompletionHandler:incompleteHandler];
            
            expect(@(verified)).to(beTruthy());
            verified = NO;
            
            frameNumber++;
            offset += 500;
        }
        
        //Final frame
        testMessage.header.frameData = 0;
        testMessage.payload = [payloadData subdataWithRange:NSMakeRange(offset, payloadData.length - offset)];
        [assembler handleMessage:testMessage withCompletionHandler: ^void(BOOL done, SDLProtocolMessage* assembledMessage) {
            verified = YES;
            
            // FIXME: At the moment, this test fails because the completion handler is accidentally called twice
            expect(@(done)).to(equal(@YES));
            
            expect(assembledMessage.payload).to(equal(payloadData));
            expect(@(assembledMessage.header.frameType)).to(equal(@(SDLFrameType_Single)));
            expect(@(assembledMessage.header.serviceType)).to(equal(@(SDLServiceType_BulkData)));
            expect(@(assembledMessage.header.frameData)).to(equal(@(SDLFrameData_SingleFrame)));
            expect(@(assembledMessage.header.sessionID)).to(equal(@0x16));
            expect(@(assembledMessage.header.bytesInPayload)).to(equal(@(payloadData.length)));
        }];
        
        expect(@(verified)).to(beTruthy());
    });
});

QuickSpecEnd