| Index: webrtc/examples/objc/AppRTCMobile/tests/ARDAppClientTest.mm
 | 
| diff --git a/webrtc/examples/objc/AppRTCMobile/tests/ARDAppClientTest.mm b/webrtc/examples/objc/AppRTCMobile/tests/ARDAppClientTest.mm
 | 
| deleted file mode 100644
 | 
| index b206925420361ce800ebfbd02783d12646689109..0000000000000000000000000000000000000000
 | 
| --- a/webrtc/examples/objc/AppRTCMobile/tests/ARDAppClientTest.mm
 | 
| +++ /dev/null
 | 
| @@ -1,457 +0,0 @@
 | 
| -/*
 | 
| - *  Copyright 2014 The WebRTC Project Authors. All rights reserved.
 | 
| - *
 | 
| - *  Use of this source code is governed by a BSD-style license
 | 
| - *  that can be found in the LICENSE file in the root of the source
 | 
| - *  tree. An additional intellectual property rights grant can be found
 | 
| - *  in the file PATENTS.  All contributing project authors may
 | 
| - *  be found in the AUTHORS file in the root of the source tree.
 | 
| - */
 | 
| -
 | 
| -#import <Foundation/Foundation.h>
 | 
| -#import <OCMock/OCMock.h>
 | 
| -#import <QuartzCore/CoreAnimation.h>
 | 
| -
 | 
| -#include "webrtc/base/gunit.h"
 | 
| -#include "webrtc/base/ssladapter.h"
 | 
| -
 | 
| -#import "WebRTC/RTCMediaConstraints.h"
 | 
| -#import "WebRTC/RTCPeerConnectionFactory.h"
 | 
| -#import "WebRTC/RTCSessionDescription.h"
 | 
| -
 | 
| -#import "ARDAppClient+Internal.h"
 | 
| -#import "ARDJoinResponse+Internal.h"
 | 
| -#import "ARDMessageResponse+Internal.h"
 | 
| -#import "ARDSDPUtils.h"
 | 
| -
 | 
| -static NSString *kARDAppClientTestsDomain = @"org.webrtc.ARDAppClientTests";
 | 
| -static NSInteger kARDAppClientTestsExpectationTimeoutError = 100;
 | 
| -
 | 
| -// These classes mimic XCTest APIs, to make eventual conversion to XCTest
 | 
| -// easier. Conversion will happen once XCTest is supported well on build bots.
 | 
| -@interface ARDTestExpectation : NSObject
 | 
| -
 | 
| -@property(nonatomic, readonly) NSString *description;
 | 
| -@property(nonatomic, readonly) BOOL isFulfilled;
 | 
| -
 | 
| -- (instancetype)initWithDescription:(NSString *)description;
 | 
| -- (void)fulfill;
 | 
| -
 | 
| -@end
 | 
| -
 | 
| -@implementation ARDTestExpectation
 | 
| -
 | 
| -@synthesize description = _description;
 | 
| -@synthesize isFulfilled = _isFulfilled;
 | 
| -
 | 
| -- (instancetype)initWithDescription:(NSString *)description {
 | 
| -  if (self = [super init]) {
 | 
| -    _description = description;
 | 
| -  }
 | 
| -  return self;
 | 
| -}
 | 
| -
 | 
| -- (void)fulfill {
 | 
| -  _isFulfilled = YES;
 | 
| -}
 | 
| -
 | 
| -@end
 | 
| -
 | 
| -@interface ARDTestCase : NSObject
 | 
| -
 | 
| -- (ARDTestExpectation *)expectationWithDescription:(NSString *)description;
 | 
| -- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout
 | 
| -                               handler:(void (^)(NSError *error))handler;
 | 
| -
 | 
| -@end
 | 
| -
 | 
| -@implementation ARDTestCase {
 | 
| -  NSMutableArray *_expectations;
 | 
| -}
 | 
| -
 | 
| -- (instancetype)init {
 | 
| -  if (self = [super init]) {
 | 
| -   _expectations = [NSMutableArray array];
 | 
| -  }
 | 
| -  return self;
 | 
| -}
 | 
| -
 | 
| -- (ARDTestExpectation *)expectationWithDescription:(NSString *)description {
 | 
| -  ARDTestExpectation *expectation =
 | 
| -      [[ARDTestExpectation alloc] initWithDescription:description];
 | 
| -  [_expectations addObject:expectation];
 | 
| -  return expectation;
 | 
| -}
 | 
| -
 | 
| -- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout
 | 
| -                               handler:(void (^)(NSError *error))handler {
 | 
| -  CFTimeInterval startTime = CACurrentMediaTime();
 | 
| -  NSError *error = nil;
 | 
| -  while (![self areExpectationsFulfilled]) {
 | 
| -    CFTimeInterval duration = CACurrentMediaTime() - startTime;
 | 
| -    if (duration > timeout) {
 | 
| -      error = [NSError errorWithDomain:kARDAppClientTestsDomain
 | 
| -                                  code:kARDAppClientTestsExpectationTimeoutError
 | 
| -                              userInfo:@{}];
 | 
| -      break;
 | 
| -    }
 | 
| -    [[NSRunLoop currentRunLoop]
 | 
| -        runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
 | 
| -  }
 | 
| -  handler(error);
 | 
| -}
 | 
| -
 | 
| -- (BOOL)areExpectationsFulfilled {
 | 
| -  for (ARDTestExpectation *expectation in _expectations) {
 | 
| -    if (!expectation.isFulfilled) {
 | 
| -      return NO;
 | 
| -    }
 | 
| -  }
 | 
| -  return YES;
 | 
| -}
 | 
| -
 | 
| -@end
 | 
| -
 | 
| -@interface ARDAppClientTest : ARDTestCase
 | 
| -@end
 | 
| -
 | 
| -@implementation ARDAppClientTest
 | 
| -
 | 
| -#pragma mark - Mock helpers
 | 
| -
 | 
| -- (id)mockRoomServerClientForRoomId:(NSString *)roomId
 | 
| -                           clientId:(NSString *)clientId
 | 
| -                        isInitiator:(BOOL)isInitiator
 | 
| -                           messages:(NSArray *)messages
 | 
| -                     messageHandler:
 | 
| -    (void (^)(ARDSignalingMessage *))messageHandler {
 | 
| -  id mockRoomServerClient =
 | 
| -      [OCMockObject mockForProtocol:@protocol(ARDRoomServerClient)];
 | 
| -
 | 
| -  // Successful join response.
 | 
| -  ARDJoinResponse *joinResponse = [[ARDJoinResponse alloc] init];
 | 
| -  joinResponse.result = kARDJoinResultTypeSuccess;
 | 
| -  joinResponse.roomId = roomId;
 | 
| -  joinResponse.clientId = clientId;
 | 
| -  joinResponse.isInitiator = isInitiator;
 | 
| -  joinResponse.messages = messages;
 | 
| -
 | 
| -  // Successful message response.
 | 
| -  ARDMessageResponse *messageResponse = [[ARDMessageResponse alloc] init];
 | 
| -  messageResponse.result = kARDMessageResultTypeSuccess;
 | 
| -
 | 
| -  // Return join response from above on join.
 | 
| -  [[[mockRoomServerClient stub] andDo:^(NSInvocation *invocation) {
 | 
| -    __unsafe_unretained void (^completionHandler)(ARDJoinResponse *response,
 | 
| -                                                  NSError *error);
 | 
| -    [invocation getArgument:&completionHandler atIndex:4];
 | 
| -    completionHandler(joinResponse, nil);
 | 
| -  }] joinRoomWithRoomId:roomId isLoopback:NO completionHandler:[OCMArg any]];
 | 
| -
 | 
| -  // Return message response from above on join.
 | 
| -  [[[mockRoomServerClient stub] andDo:^(NSInvocation *invocation) {
 | 
| -    __unsafe_unretained ARDSignalingMessage *message;
 | 
| -    __unsafe_unretained void (^completionHandler)(ARDMessageResponse *response,
 | 
| -                                                  NSError *error);
 | 
| -    [invocation getArgument:&message atIndex:2];
 | 
| -    [invocation getArgument:&completionHandler atIndex:5];
 | 
| -    messageHandler(message);
 | 
| -    completionHandler(messageResponse, nil);
 | 
| -  }] sendMessage:[OCMArg any]
 | 
| -            forRoomId:roomId
 | 
| -             clientId:clientId
 | 
| -    completionHandler:[OCMArg any]];
 | 
| -
 | 
| -  // Do nothing on leave.
 | 
| -  [[[mockRoomServerClient stub] andDo:^(NSInvocation *invocation) {
 | 
| -    __unsafe_unretained void (^completionHandler)(NSError *error);
 | 
| -    [invocation getArgument:&completionHandler atIndex:4];
 | 
| -    if (completionHandler) {
 | 
| -      completionHandler(nil);
 | 
| -    }
 | 
| -  }] leaveRoomWithRoomId:roomId
 | 
| -                clientId:clientId
 | 
| -       completionHandler:[OCMArg any]];
 | 
| -
 | 
| -  return mockRoomServerClient;
 | 
| -}
 | 
| -
 | 
| -- (id)mockSignalingChannelForRoomId:(NSString *)roomId
 | 
| -                           clientId:(NSString *)clientId
 | 
| -                     messageHandler:
 | 
| -    (void (^)(ARDSignalingMessage *message))messageHandler {
 | 
| -  id mockSignalingChannel =
 | 
| -      [OCMockObject niceMockForProtocol:@protocol(ARDSignalingChannel)];
 | 
| -  [[mockSignalingChannel stub] registerForRoomId:roomId clientId:clientId];
 | 
| -  [[[mockSignalingChannel stub] andDo:^(NSInvocation *invocation) {
 | 
| -    __unsafe_unretained ARDSignalingMessage *message;
 | 
| -    [invocation getArgument:&message atIndex:2];
 | 
| -    messageHandler(message);
 | 
| -  }] sendMessage:[OCMArg any]];
 | 
| -  return mockSignalingChannel;
 | 
| -}
 | 
| -
 | 
| -- (id)mockTURNClient {
 | 
| -  id mockTURNClient =
 | 
| -      [OCMockObject mockForProtocol:@protocol(ARDTURNClient)];
 | 
| -  [[[mockTURNClient stub] andDo:^(NSInvocation *invocation) {
 | 
| -    // Don't return anything in TURN response.
 | 
| -    __unsafe_unretained void (^completionHandler)(NSArray *turnServers,
 | 
| -                                                  NSError *error);
 | 
| -    [invocation getArgument:&completionHandler atIndex:2];
 | 
| -    completionHandler([NSArray array], nil);
 | 
| -  }] requestServersWithCompletionHandler:[OCMArg any]];
 | 
| -  return mockTURNClient;
 | 
| -}
 | 
| -
 | 
| -- (ARDAppClient *)createAppClientForRoomId:(NSString *)roomId
 | 
| -                                  clientId:(NSString *)clientId
 | 
| -                               isInitiator:(BOOL)isInitiator
 | 
| -                                  messages:(NSArray *)messages
 | 
| -                            messageHandler:
 | 
| -    (void (^)(ARDSignalingMessage *message))messageHandler
 | 
| -                          connectedHandler:(void (^)(void))connectedHandler
 | 
| -                    localVideoTrackHandler:(void (^)(void))localVideoTrackHandler {
 | 
| -  id turnClient = [self mockTURNClient];
 | 
| -  id signalingChannel = [self mockSignalingChannelForRoomId:roomId
 | 
| -                                                   clientId:clientId
 | 
| -                                             messageHandler:messageHandler];
 | 
| -  id roomServerClient =
 | 
| -      [self mockRoomServerClientForRoomId:roomId
 | 
| -                                 clientId:clientId
 | 
| -                              isInitiator:isInitiator
 | 
| -                                 messages:messages
 | 
| -                           messageHandler:messageHandler];
 | 
| -  id delegate =
 | 
| -      [OCMockObject niceMockForProtocol:@protocol(ARDAppClientDelegate)];
 | 
| -  [[[delegate stub] andDo:^(NSInvocation *invocation) {
 | 
| -    connectedHandler();
 | 
| -  }] appClient:[OCMArg any]
 | 
| -      didChangeConnectionState:RTCIceConnectionStateConnected];
 | 
| -  [[[delegate stub] andDo:^(NSInvocation *invocation) {
 | 
| -    localVideoTrackHandler();
 | 
| -  }] appClient:[OCMArg any]
 | 
| -      didReceiveLocalVideoTrack:[OCMArg any]];
 | 
| -
 | 
| -  return [[ARDAppClient alloc] initWithRoomServerClient:roomServerClient
 | 
| -                                       signalingChannel:signalingChannel
 | 
| -                                             turnClient:turnClient
 | 
| -                                               delegate:delegate];
 | 
| -}
 | 
| -
 | 
| -// Tests that an ICE connection is established between two ARDAppClient objects
 | 
| -// where one is set up as a caller and the other the answerer. Network
 | 
| -// components are mocked out and messages are relayed directly from object to
 | 
| -// object. It's expected that both clients reach the
 | 
| -// RTCIceConnectionStateConnected state within a reasonable amount of time.
 | 
| -- (void)testSession {
 | 
| -  // Need block arguments here because we're setting up a callbacks before we
 | 
| -  // create the clients.
 | 
| -  ARDAppClient *caller = nil;
 | 
| -  ARDAppClient *answerer = nil;
 | 
| -  __block __weak ARDAppClient *weakCaller = nil;
 | 
| -  __block __weak ARDAppClient *weakAnswerer = nil;
 | 
| -  NSString *roomId = @"testRoom";
 | 
| -  NSString *callerId = @"testCallerId";
 | 
| -  NSString *answererId = @"testAnswererId";
 | 
| -
 | 
| -  ARDTestExpectation *callerConnectionExpectation =
 | 
| -      [self expectationWithDescription:@"Caller PC connected."];
 | 
| -  ARDTestExpectation *answererConnectionExpectation =
 | 
| -      [self expectationWithDescription:@"Answerer PC connected."];
 | 
| -
 | 
| -  caller = [self createAppClientForRoomId:roomId
 | 
| -                                 clientId:callerId
 | 
| -                              isInitiator:YES
 | 
| -                                 messages:[NSArray array]
 | 
| -                           messageHandler:^(ARDSignalingMessage *message) {
 | 
| -    ARDAppClient *strongAnswerer = weakAnswerer;
 | 
| -    [strongAnswerer channel:strongAnswerer.channel didReceiveMessage:message];
 | 
| -  }                      connectedHandler:^{
 | 
| -    [callerConnectionExpectation fulfill];
 | 
| -  }                localVideoTrackHandler:^{
 | 
| -  }];
 | 
| -  // TODO(tkchin): Figure out why DTLS-SRTP constraint causes thread assertion
 | 
| -  // crash in Debug.
 | 
| -  caller.defaultPeerConnectionConstraints =
 | 
| -      [[RTCMediaConstraints alloc] initWithMandatoryConstraints:nil
 | 
| -                                            optionalConstraints:nil];
 | 
| -  weakCaller = caller;
 | 
| -
 | 
| -  answerer = [self createAppClientForRoomId:roomId
 | 
| -                                   clientId:answererId
 | 
| -                                isInitiator:NO
 | 
| -                                   messages:[NSArray array]
 | 
| -                             messageHandler:^(ARDSignalingMessage *message) {
 | 
| -    ARDAppClient *strongCaller = weakCaller;
 | 
| -    [strongCaller channel:strongCaller.channel didReceiveMessage:message];
 | 
| -  }                        connectedHandler:^{
 | 
| -    [answererConnectionExpectation fulfill];
 | 
| -  }                  localVideoTrackHandler:^{
 | 
| -  }];
 | 
| -  // TODO(tkchin): Figure out why DTLS-SRTP constraint causes thread assertion
 | 
| -  // crash in Debug.
 | 
| -  answerer.defaultPeerConnectionConstraints =
 | 
| -      [[RTCMediaConstraints alloc] initWithMandatoryConstraints:nil
 | 
| -                                            optionalConstraints:nil];
 | 
| -  weakAnswerer = answerer;
 | 
| -
 | 
| -  // Kick off connection.
 | 
| -  [caller connectToRoomWithId:roomId
 | 
| -                   isLoopback:NO
 | 
| -                  isAudioOnly:NO
 | 
| -            shouldMakeAecDump:NO
 | 
| -        shouldUseLevelControl:NO];
 | 
| -  [answerer connectToRoomWithId:roomId
 | 
| -                     isLoopback:NO
 | 
| -                    isAudioOnly:NO
 | 
| -              shouldMakeAecDump:NO
 | 
| -          shouldUseLevelControl:NO];
 | 
| -  [self waitForExpectationsWithTimeout:20 handler:^(NSError *error) {
 | 
| -    if (error) {
 | 
| -      EXPECT_TRUE(0);
 | 
| -    }
 | 
| -  }];
 | 
| -}
 | 
| -
 | 
| -// Test to see that we get a local video connection
 | 
| -// Note this will currently pass even when no camera is connected as a local
 | 
| -// video track is created regardless (Perhaps there should be a test for that...)
 | 
| -- (void)testSessionShouldGetLocalVideoTrackCallback {
 | 
| -  ARDAppClient *caller = nil;
 | 
| -  NSString *roomId = @"testRoom";
 | 
| -  NSString *callerId = @"testCallerId";
 | 
| -
 | 
| -  ARDTestExpectation *localVideoTrackExpectation =
 | 
| -      [self expectationWithDescription:@"Caller got local video."];
 | 
| -
 | 
| -  caller = [self createAppClientForRoomId:roomId
 | 
| -                                 clientId:callerId
 | 
| -                              isInitiator:YES
 | 
| -                                 messages:[NSArray array]
 | 
| -                           messageHandler:^(ARDSignalingMessage *message) {
 | 
| -  }                      connectedHandler:^{
 | 
| -  }                localVideoTrackHandler:^{
 | 
| -    [localVideoTrackExpectation fulfill];
 | 
| -  }];
 | 
| -  caller.defaultPeerConnectionConstraints =
 | 
| -      [[RTCMediaConstraints alloc] initWithMandatoryConstraints:nil
 | 
| -                                          optionalConstraints:nil];
 | 
| -
 | 
| -  // Kick off connection.
 | 
| -  [caller connectToRoomWithId:roomId
 | 
| -                   isLoopback:NO
 | 
| -                  isAudioOnly:NO
 | 
| -            shouldMakeAecDump:NO
 | 
| -        shouldUseLevelControl:NO];
 | 
| -  [self waitForExpectationsWithTimeout:20 handler:^(NSError *error) {
 | 
| -    if (error) {
 | 
| -      EXPECT_TRUE(0);
 | 
| -    }
 | 
| -  }];
 | 
| -}
 | 
| -
 | 
| -@end
 | 
| -
 | 
| -@interface ARDSDPUtilsTest : ARDTestCase
 | 
| -- (void)testPreferVideoCodec:(NSString *)codec
 | 
| -                         sdp:(NSString *)sdp
 | 
| -                 expectedSdp:(NSString *)expectedSdp;
 | 
| -@end
 | 
| -
 | 
| -@implementation ARDSDPUtilsTest
 | 
| -
 | 
| -- (void)testPreferVideoCodec:(NSString *)codec
 | 
| -                         sdp:(NSString *)sdp
 | 
| -                 expectedSdp:(NSString *)expectedSdp {
 | 
| -  RTCSessionDescription* desc =
 | 
| -      [[RTCSessionDescription alloc] initWithType:RTCSdpTypeOffer sdp:sdp];
 | 
| -  RTCSessionDescription *outputDesc =
 | 
| -      [ARDSDPUtils descriptionForDescription:desc
 | 
| -                         preferredVideoCodec:codec];
 | 
| -  EXPECT_TRUE([outputDesc.description rangeOfString:expectedSdp].location !=
 | 
| -              NSNotFound);
 | 
| -}
 | 
| -
 | 
| -@end
 | 
| -
 | 
| -class SignalingTest : public ::testing::Test {
 | 
| - protected:
 | 
| -  static void SetUpTestCase() {
 | 
| -    rtc::InitializeSSL();
 | 
| -  }
 | 
| -  static void TearDownTestCase() {
 | 
| -    rtc::CleanupSSL();
 | 
| -  }
 | 
| -};
 | 
| -
 | 
| -TEST_F(SignalingTest, SessionTest) {
 | 
| -  @autoreleasepool {
 | 
| -    ARDAppClientTest *test = [[ARDAppClientTest alloc] init];
 | 
| -    [test testSession];
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -#if !TARGET_IPHONE_SIMULATOR
 | 
| -// Expected fail on iOS Simulator due to no camera support
 | 
| -TEST_F(SignalingTest, SessionLocalVideoCallbackTest) {
 | 
| -  @autoreleasepool {
 | 
| -    ARDAppClientTest *test = [[ARDAppClientTest alloc] init];
 | 
| -    [test testSessionShouldGetLocalVideoTrackCallback];
 | 
| -  }
 | 
| -}
 | 
| -#endif
 | 
| -
 | 
| -TEST_F(SignalingTest, SdpH264Test) {
 | 
| -  @autoreleasepool {
 | 
| -    ARDSDPUtilsTest *test = [[ARDSDPUtilsTest alloc] init];
 | 
| -    NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\n"
 | 
| -                      "a=rtpmap:120 H264/90000\n"
 | 
| -                      "a=rtpmap:97 H264/90000\n");
 | 
| -    NSString *expectedSdp = @("m=video 9 RTP/SAVPF 120 97 100 116 117 96\n"
 | 
| -                              "a=rtpmap:120 H264/90000\n"
 | 
| -                              "a=rtpmap:97 H264/90000\n");
 | 
| -    [test testPreferVideoCodec:@"H264"
 | 
| -                           sdp:sdp
 | 
| -                   expectedSdp:expectedSdp];
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -TEST_F(SignalingTest, SdpVp8Test) {
 | 
| -  @autoreleasepool {
 | 
| -    ARDSDPUtilsTest *test = [[ARDSDPUtilsTest alloc] init];
 | 
| -    NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\n"
 | 
| -                      "a=rtpmap:116 VP8/90000\n");
 | 
| -    NSString *expectedSdp = @("m=video 9 RTP/SAVPF 116 100 117 96 120 97\n"
 | 
| -                              "a=rtpmap:116 VP8/90000\n");
 | 
| -    [test testPreferVideoCodec:@"VP8"
 | 
| -                           sdp:sdp
 | 
| -                   expectedSdp:expectedSdp];
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -TEST_F(SignalingTest, SdpNoMLineTest) {
 | 
| -  @autoreleasepool {
 | 
| -    ARDSDPUtilsTest *test = [[ARDSDPUtilsTest alloc] init];
 | 
| -    NSString *sdp = @("a=rtpmap:116 VP8/90000\n");
 | 
| -    [test testPreferVideoCodec:@"VP8"
 | 
| -                           sdp:sdp
 | 
| -                   expectedSdp:sdp];
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -TEST_F(SignalingTest, SdpMissingCodecTest) {
 | 
| -  @autoreleasepool {
 | 
| -    ARDSDPUtilsTest *test = [[ARDSDPUtilsTest alloc] init];
 | 
| -    NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\n"
 | 
| -                      "a=rtpmap:116 VP8/90000\n");
 | 
| -    [test testPreferVideoCodec:@"foo"
 | 
| -                           sdp:sdp
 | 
| -                   expectedSdp:sdp];
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -int main(int argc, char **argv) {
 | 
| -  ::testing::InitGoogleTest(&argc, argv);
 | 
| -  return RUN_ALL_TESTS();
 | 
| -}
 | 
| 
 |