summaryrefslogtreecommitdiff
path: root/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
blob: e081b3ac5f310a186035516271fd4061da7b8fa8 (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//
//  TestConnectionManager.m
//  SmartDeviceLink-iOS
//
//  Created by Joel Fischer on 11/6/15.
//  Copyright © 2015 smartdevicelink. All rights reserved.
//

#import "TestConnectionManager.h"

#import "SDLRPCRequest.h"
#import "SDLRPCResponse.h"

NS_ASSUME_NONNULL_BEGIN

@implementation TestConnectionManager

- (instancetype)init {
    self = [super init];
    if (!self) {
        return nil;
    }

    _receivedRequests = [NSMutableArray<__kindof SDLRPCMessage *> array];

    return self;
}

- (void)sendConnectionRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler {
    self.lastRequestBlock = handler;
    if ([request isKindOfClass:SDLRPCRequest.class]) {
        SDLRPCRequest *requestRPC = (SDLRPCRequest *)request;
        requestRPC.correlationID = [self test_nextCorrelationID];
        [self.receivedRequests addObject:requestRPC];
    } else {
        [self.receivedRequests addObject:request];
    }
}

- (void)sendConnectionManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
    [self sendConnectionRequest:request withResponseHandler:handler];
}

- (void)sendRequests:(nonnull NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
    [requests enumerateObjectsUsingBlock:^(SDLRPCRequest * _Nonnull request, NSUInteger idx, BOOL * _Nonnull stop) {
        [self sendConnectionRequest:request withResponseHandler:nil];

        if (progressHandler != nil) {
            progressHandler(request, nil, nil, (double)idx / (double)requests.count);
        }
    }];

    _lastMultipleCompletionBlock = completionHandler;
}

- (void)sendSequentialRequests:(nonnull NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleSequentialRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
    [requests enumerateObjectsUsingBlock:^(SDLRPCRequest * _Nonnull request, NSUInteger idx, BOOL * _Nonnull stop) {
        [self sendConnectionRequest:request withResponseHandler:nil];
        progressHandler(request, nil, nil, (double)idx / (double)requests.count);
    }];

    _lastMultipleCompletionBlock = completionHandler;
}

- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *)response {
    [self respondToLastRequestWithResponse:response error:nil];
}

- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *)response error:(nullable NSError *)error {
    NSError *thisError = nil;
    if (!response.success.boolValue && error == nil) {
        thisError = self.defaultError;
    } else if (error != nil) {
        thisError = error;
    }

    if (self.lastRequestBlock != nil) {
        self.lastRequestBlock(self.receivedRequests.lastObject, response, thisError);
    } else {
        @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to respond to last request, but there was no last request block" userInfo:nil];
    }
}

- (void)respondToRequestWithResponse:(__kindof SDLRPCResponse *)response requestNumber:(NSInteger)requestNumber error:(nullable NSError *)error {
    NSError *thisError = nil;
    if (!response.success.boolValue && error == nil) {
        thisError = self.defaultError;
    } else if (error != nil) {
        thisError = error;
    }

    if (self.lastRequestBlock != nil) {
        self.lastRequestBlock(self.receivedRequests[requestNumber], response, thisError);
    } else {
        @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to respond to last request, but there was no last request block" userInfo:nil];
    }
}

- (void)respondToLastMultipleRequestsWithSuccess:(BOOL)success {
    if (self.lastMultipleCompletionBlock != nil) {
        self.lastMultipleCompletionBlock(success);
    }
}

- (void)reset {
    _receivedRequests = [NSMutableArray<__kindof SDLRPCMessage *> array];
    _lastRequestBlock = nil;
}


#pragma mark - Getters

- (NSError *)defaultError {
    return [NSError errorWithDomain:@"com.sdl.testConnectionManager" code:-1 userInfo:nil];
}

#pragma mark Private helpers

- (NSNumber *)test_nextCorrelationID {
    static NSUInteger correlationID = 0;
    
    return @(correlationID++);
}

@end

NS_ASSUME_NONNULL_END