//
//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//

import Foundation
import XCTest
import Curve25519Kit

@testable import SignalServiceKit

class DeviceNamesTest: SSKBaseTestSwift {

    override func setUp() {
        super.setUp()
    }

    override func tearDown() {
        super.tearDown()
    }

    // MARK: 

    func testNotEncrypted1() {

        let identityKeyPair = Curve25519.generateKeyPair()

        let plaintext = "alice"
        guard let plaintextData = plaintext.data(using: .utf8) else {
            XCTFail("Could not convert text to UTF-8.")
            return
        }

        do {
            _ = try DeviceNames.decryptDeviceName(base64Data: plaintextData,
                                                  identityKeyPair: identityKeyPair)
            XCTFail("Unexpectedly did not throw error.")
        } catch DeviceNameError.invalidInput {
            // Expected error.
        } catch {
            owsFailDebug("Unexpected \(error)")
        }
    }

    func testNotEncrypted2() {

        let identityKeyPair = Curve25519.generateKeyPair()

        let plaintext = "alice"
        guard let plaintextData = plaintext.data(using: .utf8) else {
            XCTFail("Could not convert text to UTF-8.")
            return
        }
        let base64Data = plaintextData.base64EncodedData()

        do {
            _ = try DeviceNames.decryptDeviceName(base64Data: base64Data,
                                                  identityKeyPair: identityKeyPair)
            XCTFail("Unexpectedly did not throw error.")
        } catch DeviceNameError.invalidInput {
            // Expected error.
        } catch {
            owsFailDebug("Unexpected \(error)")
        }
    }

    func testSimple() {

        let identityKeyPair = Curve25519.generateKeyPair()

        let plaintext = "alice"
        let encrypted: Data
        do {
            encrypted = try DeviceNames.encryptDeviceName(plaintext: plaintext,
                                                          identityKeyPair: identityKeyPair)
        } catch {
            XCTFail("Failed with error: \(error)")
            return
        }

        let decrypted: String
        do {
            decrypted = try DeviceNames.decryptDeviceName(base64Data: encrypted,
                                                          identityKeyPair: identityKeyPair)
        } catch {
            XCTFail("Failed with error: \(error)")
            return
        }
        XCTAssertEqual(plaintext, decrypted)
    }
}