/*
 * libjingle
 * Copyright 2013, Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

#import "RTCPeerConnectionSyncObserver.h"

#import "RTCMediaStream.h"

@implementation RTCPeerConnectionSyncObserver {
  int _expectedErrors;
  NSMutableArray* _expectedSignalingChanges;
  NSMutableArray* _expectedAddStreamLabels;
  NSMutableArray* _expectedRemoveStreamLabels;
  int _expectedICECandidates;
  NSMutableArray* _receivedICECandidates;
  NSMutableArray* _expectedICEConnectionChanges;
  NSMutableArray* _expectedICEGatheringChanges;
  NSMutableArray* _expectedDataChannels;
  NSMutableArray* _expectedStateChanges;
  NSMutableArray* _expectedMessages;
}

- (id)init {
  self = [super init];
  if (self) {
    _expectedSignalingChanges = [NSMutableArray array];
    _expectedSignalingChanges = [NSMutableArray array];
    _expectedAddStreamLabels = [NSMutableArray array];
    _expectedRemoveStreamLabels = [NSMutableArray array];
    _receivedICECandidates = [NSMutableArray array];
    _expectedICEConnectionChanges = [NSMutableArray array];
    _expectedICEGatheringChanges = [NSMutableArray array];
    _expectedDataChannels = [NSMutableArray array];
    _expectedMessages = [NSMutableArray array];
    _expectedStateChanges = [NSMutableArray array];
  }
  return self;
}

- (int)popFirstElementAsInt:(NSMutableArray*)array {
  NSAssert([array count] > 0, @"Empty array");
  NSNumber* boxedState = [array objectAtIndex:0];
  [array removeObjectAtIndex:0];
  return [boxedState intValue];
}

- (NSString*)popFirstElementAsNSString:(NSMutableArray*)array {
  NSAssert([array count] > 0, @"Empty expectation array");
  NSString* string = [array objectAtIndex:0];
  [array removeObjectAtIndex:0];
  return string;
}

- (BOOL)areAllExpectationsSatisfied {
  return _expectedICECandidates <= 0 &&  // See comment in gotICECandidate.
         _expectedErrors == 0 && [_expectedSignalingChanges count] == 0 &&
         [_expectedICEConnectionChanges count] == 0 &&
         [_expectedICEGatheringChanges count] == 0 &&
         [_expectedAddStreamLabels count] == 0 &&
         [_expectedRemoveStreamLabels count] == 0 &&
         [_expectedDataChannels count] == 0 &&
         [_expectedStateChanges count] == 0 &&
         [_expectedMessages count] == 0;
  // TODO(hughv): Test video state here too.
}

- (NSArray*)releaseReceivedICECandidates {
  NSArray* ret = _receivedICECandidates;
  _receivedICECandidates = [NSMutableArray array];
  return ret;
}

- (void)expectError {
  ++_expectedErrors;
}

- (void)expectSignalingChange:(RTCSignalingState)state {
  [_expectedSignalingChanges addObject:@((int)state)];
}

- (void)expectAddStream:(NSString*)label {
  [_expectedAddStreamLabels addObject:label];
}

- (void)expectRemoveStream:(NSString*)label {
  [_expectedRemoveStreamLabels addObject:label];
}

- (void)expectICECandidates:(int)count {
  _expectedICECandidates += count;
}

- (void)expectICEConnectionChange:(RTCICEConnectionState)state {
  [_expectedICEConnectionChanges addObject:@((int)state)];
}

- (void)expectICEGatheringChange:(RTCICEGatheringState)state {
  [_expectedICEGatheringChanges addObject:@((int)state)];
}

- (void)expectDataChannel:(NSString*)label {
  [_expectedDataChannels addObject:label];
}

- (void)expectStateChange:(RTCDataChannelState)state {
  [_expectedStateChanges addObject:@(state)];
}

- (void)expectMessage:(NSData*)message isBinary:(BOOL)isBinary {
  RTCDataBuffer* buffer = [[RTCDataBuffer alloc] initWithData:message
                                                     isBinary:isBinary];
  [_expectedMessages addObject:buffer];
}

- (void)waitForAllExpectationsToBeSatisfied {
  // TODO (fischman):  Revisit.  Keeping in sync with the Java version, but
  // polling is not optimal.
  // https://code.google.com/p/libjingle/source/browse/trunk/talk/app/webrtc/javatests/src/org/webrtc/PeerConnectionTest.java?line=212#212
  while (![self areAllExpectationsSatisfied]) {
    [[NSRunLoop currentRunLoop]
        runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
  }
}

#pragma mark - RTCPeerConnectionDelegate methods

- (void)peerConnection:(RTCPeerConnection*)peerConnection
    signalingStateChanged:(RTCSignalingState)stateChanged {
  int expectedState = [self popFirstElementAsInt:_expectedSignalingChanges];
  NSString* message =
      [NSString stringWithFormat:@"RTCPeerConnectionDelegate::"
                                 @"onSignalingStateChange [%d] expected[%d]",
                                 stateChanged,
                                 expectedState];
  NSAssert(expectedState == (int)stateChanged, message);
}

- (void)peerConnection:(RTCPeerConnection*)peerConnection
           addedStream:(RTCMediaStream*)stream {
  NSString* expectedLabel =
      [self popFirstElementAsNSString:_expectedAddStreamLabels];
  NSAssert([expectedLabel isEqual:stream.label], @"Stream not expected");
}

- (void)peerConnection:(RTCPeerConnection*)peerConnection
         removedStream:(RTCMediaStream*)stream {
  NSString* expectedLabel =
      [self popFirstElementAsNSString:_expectedRemoveStreamLabels];
  NSAssert([expectedLabel isEqual:stream.label], @"Stream not expected");
}

- (void)peerConnectionOnRenegotiationNeeded:(RTCPeerConnection*)peerConnection {
}

- (void)peerConnection:(RTCPeerConnection*)peerConnection
       gotICECandidate:(RTCICECandidate*)candidate {
  --_expectedICECandidates;
  // We don't assert expectedICECandidates >= 0 because it's hard to know
  // how many to expect, in general.  We only use expectICECandidates to
  // assert a minimal count.
  [_receivedICECandidates addObject:candidate];
}

- (void)peerConnection:(RTCPeerConnection*)peerConnection
    iceGatheringChanged:(RTCICEGatheringState)newState {
  // It's fine to get a variable number of GATHERING messages before
  // COMPLETE fires (depending on how long the test runs) so we don't assert
  // any particular count.
  if (newState == RTCICEGatheringGathering) {
    return;
  }
  int expectedState = [self popFirstElementAsInt:_expectedICEGatheringChanges];
  NSAssert(expectedState == (int)newState, @"Empty expectation array");
}

- (void)peerConnection:(RTCPeerConnection*)peerConnection
  iceConnectionChanged:(RTCICEConnectionState)newState {
  // See TODO(fischman) in RTCPeerConnectionTest.mm about Completed.
  if (newState == RTCICEConnectionCompleted)
    return;
  int expectedState = [self popFirstElementAsInt:_expectedICEConnectionChanges];
  NSAssert(expectedState == (int)newState, @"Empty expectation array");
}

- (void)peerConnection:(RTCPeerConnection*)peerConnection
    didOpenDataChannel:(RTCDataChannel*)dataChannel {
  NSString* expectedLabel =
      [self popFirstElementAsNSString:_expectedDataChannels];
  NSAssert([expectedLabel isEqual:dataChannel.label],
           @"Data channel not expected");
  self.dataChannel = dataChannel;
  dataChannel.delegate = self;
  NSAssert(kRTCDataChannelStateConnecting == dataChannel.state,
           @"Unexpected state");
}

#pragma mark - RTCDataChannelDelegate

- (void)channelDidChangeState:(RTCDataChannel*)channel {
  NSAssert([_expectedStateChanges count] > 0,
           @"Unexpected state change");
  int expectedState = [self popFirstElementAsInt:_expectedStateChanges];
  NSAssert(expectedState == channel.state, @"Channel state should match");
}

- (void)channel:(RTCDataChannel*)channel
    didReceiveMessageWithBuffer:(RTCDataBuffer*)buffer {
  NSAssert([_expectedMessages count] > 0,
           @"Unexpected message received");
  RTCDataBuffer* expectedBuffer = [_expectedMessages objectAtIndex:0];
  NSAssert(expectedBuffer.isBinary == buffer.isBinary,
           @"Buffer isBinary should match");
  NSAssert([expectedBuffer.data isEqual:buffer.data],
           @"Buffer data should match");
  [_expectedMessages removeObjectAtIndex:0];
}

@end
