// This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #import #import #import "OCTTox+Private.h" #import "OCTToxOptions.h" #import "OCTCAsserts.h" static void *refToSelf; void mocked_tox_self_get_public_key(const Tox *tox, uint8_t *public_key); @interface OCTToxTests : XCTestCase @property (strong, nonatomic) OCTTox *tox; @end @implementation OCTToxTests - (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. refToSelf = (__bridge void *)(self); self.tox = [[OCTTox alloc] initWithOptions:[OCTToxOptions new] savedData:nil error:nil]; } - (void)tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. refToSelf = NULL; self.tox = nil; [super tearDown]; } - (void)testInit { XCTAssertNotNil(self.tox); } - (void)testSavingAndLoading { NSData *data = [self.tox save]; XCTAssertNotNil(data); OCTTox *tox = [[OCTTox alloc] initWithOptions:[OCTToxOptions new] savedData:data error:nil]; XCTAssertNotNil(tox); NSData *data2 = [tox save]; XCTAssertTrue(data.length == data2.length); } - (void)testPublicKey { _tox_self_get_public_key = mocked_tox_self_get_public_key; NSString *publicKey = [self.tox publicKey]; XCTAssertEqualObjects(publicKey, @"000102030405060708090A0B0C0D0E0F" @"000102030405060708090A0B0C0D0E0F"); } #pragma mark - Private methods - (void)testUserStatusFromCUserStatus { XCTAssertTrue(OCTToxUserStatusNone == [self.tox userStatusFromCUserStatus:TOX_USER_STATUS_NONE]); XCTAssertTrue(OCTToxUserStatusAway == [self.tox userStatusFromCUserStatus:TOX_USER_STATUS_AWAY]); XCTAssertTrue(OCTToxUserStatusBusy == [self.tox userStatusFromCUserStatus:TOX_USER_STATUS_BUSY]); } - (void)testUserConnectionStatusFromCUserStatus { XCTAssertTrue(OCTToxConnectionStatusNone == [self.tox userConnectionStatusFromCUserStatus:TOX_CONNECTION_NONE]); XCTAssertTrue(OCTToxConnectionStatusTCP == [self.tox userConnectionStatusFromCUserStatus:TOX_CONNECTION_TCP]); XCTAssertTrue(OCTToxConnectionStatusUDP == [self.tox userConnectionStatusFromCUserStatus:TOX_CONNECTION_UDP]); } - (void)testMessageTypeFromCMessageType { XCTAssertTrue(OCTToxMessageTypeNormal == [self.tox messageTypeFromCMessageType:TOX_MESSAGE_TYPE_NORMAL]); XCTAssertTrue(OCTToxMessageTypeAction == [self.tox messageTypeFromCMessageType:TOX_MESSAGE_TYPE_ACTION]); } - (void)testFileControlFromCFileControl { XCTAssertTrue(OCTToxFileControlResume == [self.tox fileControlFromCFileControl:TOX_FILE_CONTROL_RESUME]); XCTAssertTrue(OCTToxFileControlPause == [self.tox fileControlFromCFileControl:TOX_FILE_CONTROL_PAUSE]); XCTAssertTrue(OCTToxFileControlCancel == [self.tox fileControlFromCFileControl:TOX_FILE_CONTROL_CANCEL]); } - (void)testFillErrorInit { // test nil error [self.tox fillError:nil withCErrorInit:TOX_ERR_NEW_NULL]; NSError *error; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeUnknown); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_MALLOC]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeMemoryError); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_PORT_ALLOC]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodePortAlloc); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_PROXY_BAD_TYPE]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeProxyBadType); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_PROXY_BAD_HOST]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeProxyBadHost); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_PROXY_BAD_PORT]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeProxyBadPort); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_PROXY_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeProxyNotFound); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_LOAD_ENCRYPTED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeEncrypted); error = nil; [self.tox fillError:&error withCErrorInit:TOX_ERR_NEW_LOAD_BAD_FORMAT]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorInitCodeLoadBadFormat); } - (void)testFillErrorBootstrap { // test nil error [self.tox fillError:nil withCErrorBootstrap:TOX_ERR_BOOTSTRAP_NULL]; NSError *error; [self.tox fillError:&error withCErrorBootstrap:TOX_ERR_BOOTSTRAP_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorBootstrap:TOX_ERR_BOOTSTRAP_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorBootstrapCodeUnknown); error = nil; [self.tox fillError:&error withCErrorBootstrap:TOX_ERR_BOOTSTRAP_BAD_HOST]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorBootstrapCodeBadHost); error = nil; [self.tox fillError:&error withCErrorBootstrap:TOX_ERR_BOOTSTRAP_BAD_PORT]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorBootstrapCodeBadPort); } - (void)testFillErrorFriendAdd { // test nil error [self.tox fillError:nil withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_NULL]; NSError *error; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddUnknown); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_TOO_LONG]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddTooLong); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_NO_MESSAGE]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddNoMessage); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_OWN_KEY]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddOwnKey); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_ALREADY_SENT]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddAlreadySent); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_BAD_CHECKSUM]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddBadChecksum); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_SET_NEW_NOSPAM]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddSetNewNospam); error = nil; [self.tox fillError:&error withCErrorFriendAdd:TOX_ERR_FRIEND_ADD_MALLOC]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendAddMalloc); } - (void)testFillErrorFriendDelete { // test nil error [self.tox fillError:nil withCErrorFriendDelete:TOX_ERR_FRIEND_DELETE_FRIEND_NOT_FOUND]; NSError *error; [self.tox fillError:&error withCErrorFriendDelete:TOX_ERR_FRIEND_DELETE_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFriendDelete:TOX_ERR_FRIEND_DELETE_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendDeleteNotFound); } - (void)testFillErrorFriendByPublicKey { // test nil error [self.tox fillError:nil withCErrorFriendByPublicKey:TOX_ERR_FRIEND_BY_PUBLIC_KEY_NULL]; NSError *error; [self.tox fillError:&error withCErrorFriendByPublicKey:TOX_ERR_FRIEND_BY_PUBLIC_KEY_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFriendByPublicKey:TOX_ERR_FRIEND_BY_PUBLIC_KEY_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendByPublicKeyUnknown); error = nil; [self.tox fillError:&error withCErrorFriendByPublicKey:TOX_ERR_FRIEND_BY_PUBLIC_KEY_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendByPublicKeyNotFound); } - (void)testFillErrorFriendGetPublicKey { // test nil error [self.tox fillError:nil withCErrorFriendGetPublicKey:TOX_ERR_FRIEND_GET_PUBLIC_KEY_FRIEND_NOT_FOUND]; NSError *error; [self.tox fillError:&error withCErrorFriendGetPublicKey:TOX_ERR_FRIEND_GET_PUBLIC_KEY_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFriendGetPublicKey:TOX_ERR_FRIEND_GET_PUBLIC_KEY_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendGetPublicKeyFriendNotFound); } - (void)testFillErrorSetInfo { // test nil error [self.tox fillError:nil withCErrorSetInfo:TOX_ERR_SET_INFO_NULL]; NSError *error; [self.tox fillError:&error withCErrorSetInfo:TOX_ERR_SET_INFO_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorSetInfo:TOX_ERR_SET_INFO_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorSetInfoCodeUnknow); error = nil; [self.tox fillError:&error withCErrorSetInfo:TOX_ERR_SET_INFO_TOO_LONG]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorSetInfoCodeTooLong); } - (void)testFillErrorFriendGetLastOnline { // test nil error [self.tox fillError:nil withCErrorFriendGetLastOnline:TOX_ERR_FRIEND_GET_LAST_ONLINE_FRIEND_NOT_FOUND]; NSError *error; [self.tox fillError:&error withCErrorFriendGetLastOnline:TOX_ERR_FRIEND_GET_LAST_ONLINE_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFriendGetLastOnline:TOX_ERR_FRIEND_GET_LAST_ONLINE_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendGetLastOnlineFriendNotFound); } - (void)testFillErrorFriendQuery { // test nil error [self.tox fillError:nil withCErrorFriendQuery:TOX_ERR_FRIEND_QUERY_NULL]; NSError *error; [self.tox fillError:&error withCErrorFriendQuery:TOX_ERR_FRIEND_QUERY_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFriendQuery:TOX_ERR_FRIEND_QUERY_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendQueryUnknown); error = nil; [self.tox fillError:&error withCErrorFriendQuery:TOX_ERR_FRIEND_QUERY_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendQueryFriendNotFound); } - (void)testFillErrorSetTyping { // test nil error [self.tox fillError:nil withCErrorSetTyping:TOX_ERR_SET_TYPING_FRIEND_NOT_FOUND]; NSError *error; [self.tox fillError:&error withCErrorSetTyping:TOX_ERR_SET_TYPING_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorSetTyping:TOX_ERR_SET_TYPING_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorSetTypingFriendNotFound); } - (void)testFillErrorFriendSendMessage { // test nil error [self.tox fillError:nil withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_NULL]; NSError *error; [self.tox fillError:&error withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendSendMessageUnknown); error = nil; [self.tox fillError:&error withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendSendMessageFriendNotFound); error = nil; [self.tox fillError:&error withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_FRIEND_NOT_CONNECTED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendSendMessageFriendNotConnected); error = nil; [self.tox fillError:&error withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_SENDQ]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendSendMessageAlloc); error = nil; [self.tox fillError:&error withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_TOO_LONG]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendSendMessageTooLong); error = nil; [self.tox fillError:&error withCErrorFriendSendMessage:TOX_ERR_FRIEND_SEND_MESSAGE_EMPTY]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFriendSendMessageEmpty); } - (void)testFillErrorFileControl { // test nil error [self.tox fillError:nil withCErrorFileControl:TOX_ERR_FILE_CONTROL_FRIEND_NOT_FOUND]; NSError *error; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileControlFriendNotFound); error = nil; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_FRIEND_NOT_CONNECTED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileControlFriendNotConnected); error = nil; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileControlNotFound); error = nil; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_NOT_PAUSED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileControlNotPaused); error = nil; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_DENIED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileControlDenied); error = nil; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_ALREADY_PAUSED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileControlAlreadyPaused); error = nil; [self.tox fillError:&error withCErrorFileControl:TOX_ERR_FILE_CONTROL_SENDQ]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileControlSendq); } - (void)testFillErrorFileSeek { // test nil error [self.tox fillError:nil withCErrorFileSeek:TOX_ERR_FILE_SEEK_FRIEND_NOT_FOUND]; NSError *error; [self.tox fillError:&error withCErrorFileSeek:TOX_ERR_FILE_SEEK_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFileSeek:TOX_ERR_FILE_SEEK_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSeekFriendNotFound); error = nil; [self.tox fillError:&error withCErrorFileSeek:TOX_ERR_FILE_SEEK_FRIEND_NOT_CONNECTED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSeekFriendNotConnected); error = nil; [self.tox fillError:&error withCErrorFileSeek:TOX_ERR_FILE_SEEK_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSeekNotFound); error = nil; [self.tox fillError:&error withCErrorFileSeek:TOX_ERR_FILE_SEEK_DENIED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSeekDenied); error = nil; [self.tox fillError:&error withCErrorFileSeek:TOX_ERR_FILE_SEEK_INVALID_POSITION]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSeekInvalidPosition); error = nil; [self.tox fillError:&error withCErrorFileSeek:TOX_ERR_FILE_SEEK_SENDQ]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSeekSendq); } - (void)testFillErrorFileGet { // test nil error [self.tox fillError:nil withCErrorFileGet:TOX_ERR_FILE_GET_FRIEND_NOT_FOUND]; NSError *error; [self.tox fillError:&error withCErrorFileGet:TOX_ERR_FILE_GET_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFileGet:TOX_ERR_FILE_GET_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileGetInternal); error = nil; [self.tox fillError:&error withCErrorFileGet:TOX_ERR_FILE_GET_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileGetFriendNotFound); error = nil; [self.tox fillError:&error withCErrorFileGet:TOX_ERR_FILE_GET_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileGetNotFound); } - (void)testFillErrorFileSend { // test nil error [self.tox fillError:nil withCErrorFileSend:TOX_ERR_FILE_SEND_NULL]; NSError *error; [self.tox fillError:&error withCErrorFileSend:TOX_ERR_FILE_SEND_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFileSend:TOX_ERR_FILE_SEND_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendUnknown); error = nil; [self.tox fillError:&error withCErrorFileSend:TOX_ERR_FILE_SEND_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendFriendNotFound); error = nil; [self.tox fillError:&error withCErrorFileSend:TOX_ERR_FILE_SEND_FRIEND_NOT_CONNECTED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendFriendNotConnected); error = nil; [self.tox fillError:&error withCErrorFileSend:TOX_ERR_FILE_SEND_NAME_TOO_LONG]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendNameTooLong); error = nil; [self.tox fillError:&error withCErrorFileSend:TOX_ERR_FILE_SEND_TOO_MANY]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendTooMany); } - (void)testFillErrorFileSendChunk { // test nil error [self.tox fillError:nil withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_NULL]; NSError *error; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_OK]; XCTAssertNil(error); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_NULL]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkUnknown); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_FRIEND_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkFriendNotFound); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_FRIEND_NOT_CONNECTED]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkFriendNotConnected); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_NOT_FOUND]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkNotFound); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_NOT_TRANSFERRING]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkNotTransferring); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_INVALID_LENGTH]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkInvalidLength); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_SENDQ]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkSendq); error = nil; [self.tox fillError:&error withCErrorFileSendChunk:TOX_ERR_FILE_SEND_CHUNK_WRONG_POSITION]; XCTAssertNotNil(error); XCTAssertTrue(error.code == OCTToxErrorFileSendChunkWrongPosition); } - (void)testBinToHexString { uint8_t bin[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; NSString *string = [OCTTox binToHexString:bin length:16]; XCTAssertTrue([@"000102030405060708090A0B0C0D0E0F" isEqualToString:string]); } - (void)testHexStringToBin { uint8_t *bin = [OCTTox hexStringToBin:@"000102030405060708090A0B0C0D0E0F"]; for (NSUInteger i = 0; i < 16; i++) { XCTAssertTrue(bin[i] == i); } } #pragma mark - Callbacks - (void)testConnectionStatusCallback { [self makeTestCallbackWithCallBlock:^{ connectionStatusCallback(NULL, TOX_CONNECTION_UDP, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox connectionStatus:OCTToxConnectionStatusUDP]); }]; } - (void)testFriendNameCallback { [self makeTestCallbackWithCallBlock:^{ friendNameCallback(NULL, 5, (const uint8_t *)"name", 4, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox friendNameUpdate:[OCMArg isEqual:@"name"] friendNumber:5]); }]; } - (void)testFriendStatusMessageCallback { [self makeTestCallbackWithCallBlock:^{ friendStatusMessageCallback(NULL, 5, (const uint8_t *)"message", 7, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox friendStatusMessageUpdate:[OCMArg isEqual:@"message"] friendNumber:5]); }]; } - (void)testFriendStatusCallback { [self makeTestCallbackWithCallBlock:^{ friendStatusCallback(NULL, 5, TOX_USER_STATUS_BUSY, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox friendStatusUpdate:OCTToxUserStatusBusy friendNumber:5]); }]; } - (void)testFriendConnectionStatusCallback { [self makeTestCallbackWithCallBlock:^{ friendConnectionStatusCallback(NULL, 5, TOX_CONNECTION_UDP, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox friendConnectionStatusChanged:OCTToxConnectionStatusUDP friendNumber:5]); }]; } - (void)testFriendTypingCallback { [self makeTestCallbackWithCallBlock:^{ friendTypingCallback(NULL, 5, true, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox friendIsTypingUpdate:YES friendNumber:5]); }]; } - (void)testFriendReadReceiptCallback { [self makeTestCallbackWithCallBlock:^{ friendReadReceiptCallback(NULL, 5, 7, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox messageDelivered:7 friendNumber:5]); }]; } - (void)testFriendRequestCallback { [self makeTestCallbackWithCallBlock:^{ uint8_t bin[32] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; friendRequestCallback(NULL, bin, (const uint8_t *)"message", 7, (__bridge void *)self.tox); } expectBlock:^(id delegate) { NSString *publicKey = @"000102030405060708090A0B0C0D0E0F" @"000102030405060708090A0B0C0D0E0F"; OCMExpect([self.tox.delegate tox:self.tox friendRequestWithMessage:[OCMArg isEqual:@"message"] publicKey:publicKey]); }]; } - (void)testFriendMessageCallback { [self makeTestCallbackWithCallBlock:^{ friendMessageCallback(NULL, 5, TOX_MESSAGE_TYPE_ACTION, (const uint8_t *)"message", 7, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox friendMessage:[OCMArg isEqual:@"message"] type:OCTToxMessageTypeAction friendNumber:5]); }]; } - (void)testFileReceiveControlCallback { [self makeTestCallbackWithCallBlock:^{ fileReceiveControlCallback(NULL, 5, 4, TOX_FILE_CONTROL_PAUSE, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox fileReceiveControl:OCTToxFileControlPause friendNumber:5 fileNumber:4]); }]; } - (void)testFileChunkRequestCallback { [self makeTestCallbackWithCallBlock:^{ fileChunkRequestCallback(NULL, 5, 4, 300, 150, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox fileChunkRequestForFileNumber:4 friendNumber:5 position:300 length:150]); }]; } - (void)testFileReceiveCallback { [self makeTestCallbackWithCallBlock:^{ fileReceiveCallback(NULL, 5, 4, TOX_FILE_KIND_DATA, 500, (const uint8_t *)"filename", 8, (__bridge void *)self.tox); } expectBlock:^(id delegate) { OCMExpect([self.tox.delegate tox:self.tox fileReceiveForFileNumber:4 friendNumber:5 kind:OCTToxFileKindData fileSize:500 fileName:[OCMArg isEqual:@"filename"]]); }]; } - (void)testFileReceiveChunkCallback { [self makeTestCallbackWithCallBlock:^{ fileReceiveChunkCallback(NULL, 5, 4, 250, (const uint8_t *)"data", 4, (__bridge void *)self.tox); } expectBlock:^(id delegate) { NSData *data = [NSData dataWithBytes:"data" length:4]; OCMExpect([self.tox.delegate tox:self.tox fileReceiveChunk:[OCMArg isEqual:data] fileNumber:4 friendNumber:5 position:250]); }]; } - (void)makeTestCallbackWithCallBlock:(void (^)())callBlock expectBlock:(void (^)(id delegate))expectBlock { NSParameterAssert(callBlock); NSParameterAssert(expectBlock); self.tox.delegate = OCMProtocolMock(@protocol(OCTToxDelegate)); expectBlock(self.tox.delegate); callBlock(); XCTestExpectation *expectation = [self expectationWithDescription:@"callback"]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [expectation fulfill]; }); [self waitForExpectationsWithTimeout:1.0 handler:nil]; OCMVerifyAll((id)self.tox.delegate); } void mocked_tox_self_get_public_key(const Tox *cTox, uint8_t *public_key) { OCTTox *tox = [(__bridge OCTToxTests *)refToSelf tox]; CCCAssertTrue(cTox == tox.tox); uint8_t bin[32] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; memcpy(public_key, bin, TOX_PUBLIC_KEY_SIZE); } @end