/*
 *  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 "test/gtest.h"

#include <vector>

#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
