/*
 *  Copyright 2018 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 <XCTest/XCTest.h>

#include <vector>

#include "rtc_base/gunit.h"

#import "api/peerconnection/RTCConfiguration+Private.h"
#import "api/peerconnection/RTCConfiguration.h"
#import "api/peerconnection/RTCIceServer.h"
#import "api/peerconnection/RTCMediaConstraints.h"
#import "api/peerconnection/RTCPeerConnection.h"
#import "api/peerconnection/RTCPeerConnectionFactory.h"
#import "helpers/NSString+StdString.h"

@interface RTCCertificateTest : XCTestCase
@end

@implementation RTCCertificateTest

- (void)testCertificateIsUsedInConfig {
  RTC_OBJC_TYPE(RTCConfiguration) *originalConfig =
      [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init];

  NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
  RTC_OBJC_TYPE(RTCIceServer) *server =
      [[RTC_OBJC_TYPE(RTCIceServer) alloc] initWithURLStrings:urlStrings];
  originalConfig.iceServers = @[ server ];

  // Generate a new certificate.
  RTC_OBJC_TYPE(RTCCertificate) *originalCertificate =
      [RTC_OBJC_TYPE(RTCCertificate) generateCertificateWithParams:@{
        @"expires" : @100000,
        @"name" : @"RSASSA-PKCS1-v1_5"
      }];

  // Store certificate in configuration.
  originalConfig.certificate = originalCertificate;

  RTC_OBJC_TYPE(RTCMediaConstraints) *contraints =
      [[RTC_OBJC_TYPE(RTCMediaConstraints) alloc]
          initWithMandatoryConstraints:@{}
                   optionalConstraints:nil];
  RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory =
      [[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init];

  // Create PeerConnection with this certificate.
  RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection =
      [factory peerConnectionWithConfiguration:originalConfig
                                   constraints:contraints
                                      delegate:nil];

  // Retrieve certificate from the configuration.
  RTC_OBJC_TYPE(RTCConfiguration) *retrievedConfig =
      peerConnection.configuration;

  // Extract PEM strings from original certificate.
  std::string originalPrivateKeyField =
      [[originalCertificate private_key] UTF8String];
  std::string originalCertificateField =
      [[originalCertificate certificate] UTF8String];

  // Extract PEM strings from certificate retrieved from configuration.
  RTC_OBJC_TYPE(RTCCertificate) *retrievedCertificate =
      retrievedConfig.certificate;
  std::string retrievedPrivateKeyField =
      [[retrievedCertificate private_key] UTF8String];
  std::string retrievedCertificateField =
      [[retrievedCertificate certificate] UTF8String];

  // Check that the original certificate and retrieved certificate match.
  EXPECT_EQ(originalPrivateKeyField, retrievedPrivateKeyField);
  EXPECT_EQ(retrievedCertificateField, retrievedCertificateField);
}

@end
