Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
firefox-merge-…
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
executable file 157 lines (129 sloc) 7.34 KB
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@testable import Account
@testable import Client
import Foundation
import FxA
import SwiftyJSON
import XCTest
class FxAPushMessageTest: XCTestCase {
func testMessage_subscriptionDecryption() {
var userInfo: [AnyHashable: Any] = [
"chid": "034f52789f7b44ecaf119cc59231cdc1",
"enc": "keyid=p256dh;salt=mYBHM3B_oXlEjV0HfgHZ1A",
"body": "_tZf65gKC23STnTNuhtSSbrg1LScGiLjO4GOIuHlCGIFFEzcwsB-J-s3pe3qu2d24A-sKwVyolmShlMBEvEX_34f6FgXMs3k35g4u5STKgJMQxZ8VFDjtQqQfxfSIEt35pdKaPwXKH2zbs0xHC3qEJ0YMc60Eq8uAuQF7FQZ7ts",
"cryptokey": "keyid=p256dh;dh=BNLZ2IWMNGioofzMBnSijySib0Pa-lwgBfLYIhqvvmKxprKgEh6JCDB2DBUmj9BuJCk6xJvBbPd-4x_8tb-qIPM;p256ecdsa=BP-OR33RzQSlrzD7_d1kYE9i9WjSIQAKTuhHxYNiPEF0i-wxeNIIwxthwU7zBTbumyxFUeydrmxcVKXugjBImRU",
"con": "aesgcm",
"ver": "gAAAAABY5hUl_Pi1bVI4ptqKzPWq_aulqXEO1eOx_ncUuwoz8zItWWLA4Ix1ZbDLTOkurqK1vE3N3y1ZXsp_MZ69QJYRuWg5V_3T_XUNVBxj8dnDcNAE-ep9_M5xeKiNdngdww-cqqMOxf-tI5ZoR2nQFqWSs51XGwMMIdsGNmUPqnR4w2Rzt6FYz-AsGCrHXJ3bmYbwpq4P",
]
let subscription = PushSubscription(channelID: "channel",
endpoint: URL(string: "https://example.ru")!,
p256dhPrivateKey: "UDnicgor_Il7cLNTqSt--SrEblNBbgPA2yXAQ_b31xI",
p256dhPublicKey: "BB4XdAhpVVU45NYSXHpRiubMYoaeb0A-y5aSGE437YKGHQihlvlZMv5D0ebK6WmFqzpIr217Kv9oCbZVDp1KGK4",
authKey: "0gH7RiYYMhfHDQ1L1X4RMw")
let body = userInfo["body"] as! String
let enc = userInfo["enc"] as! String
let cryptokey = userInfo["cryptokey"] as! String
guard let plaintext = subscription.aesgcm(payload: body, encryptionHeader: enc, cryptoHeader: cryptokey) else {
return XCTFail("Decryption failed")
}
let json = JSON(parseJSON: plaintext)
XCTAssertEqual(json["command"].stringValue, "fxaccounts:device_connected")
}
func testMessageHandler() {
let subscription = PushSubscription(channelID: "channel",
endpoint: URL(string: "https://example.ru")!,
p256dhPrivateKey: "t7dcZIN4w37UYjE6u3lBLB0WOShxqelkbJFKKzMDSsE",
p256dhPublicKey: "BIXFDlhppL2lc5GcIXbGPa1iVdJn5ULYaF1ltJY9Qm17-tIC_9eEZXtalPpMRXsFmEKhdn2ttg3KQ3t-ztQ3ShQ",
authKey: "a8E3EO5F6FFWdv4hAGyGyw")
let userInfo: [AnyHashable: Any] = [
AnyHashable("chid"): "f6defa012a6249e58bbfbf2995f8d425",
AnyHashable("enc"): "keyid=p256dh;salt=nslkEsUqUg5sQ7_sRZfOjg",
AnyHashable("body"): "Q1t-ttSwQMxUI64Ls3vOU-hE_qg1AIUzyLQSpEkx-8JITh5UJ7oq25faEc8XPoTYQoaHQ2d--QIK_yVorbt-0Yr7IO4BmtSSX-e4kSx76fWzqKjEpEt7Vr3Av5seEBeoAT2FZRzehkFjNVWoTw",
AnyHashable("cryptokey"): "keyid=p256dh;dh=BNfUPK_8eUTZGOyXq07lthBfHeIxC2B7L_gF3cMGK1jVfDe9tlgxpHD_mbKrt3p12d7_O__wizhne2a1Eb7pZgk;p256ecdsa=BFSuld8S4PbRcgGe3OQPN9NyIOXx-ccUIMb0q6nIpH7Qf894wz0TIQTXQ7I7pWjZiN9KCdYVjNhyPtr1--37ois",
AnyHashable("con"): "aesgcm",
AnyHashable("ver"): "gAAAAABZLbG-m7EHhcMdrqs51SkESIZHsZjvw2QIu8LOeXxcKEy6wDVCprOKFAfJU44cinfJcDtCnO9EEyzpFt5e0HBDCLybGyThoZzmiod6zTLhTfAKZe-SyElSVCL0UDpJ_-U3UTUUHUaJXeRf0z6NvFM-uL39Jy-dwr3cuJoSDIcTPdChRPFiIS1hwokqMlxOn36azxOi",
]
let profile = MockProfile()
let account = FirefoxAccount(
configuration: FirefoxAccountConfigurationLabel.production.toConfiguration(),
email: "testtest@test.com",
uid: "uid",
deviceRegistration: nil,
declinedEngines: nil,
stateKeyLabel: "xxx",
state: SeparatedState(),
deviceName: "My iPhone")
let registration = PushRegistration(uaid: "uaid", secret: "secret", subscription: subscription)
account.pushRegistration = registration
profile.setAccount(account)
let handler = FxAPushMessageHandler(with: profile)
let expectation = XCTestExpectation()
handler.handle(userInfo: userInfo).upon { maybe in
XCTAssertTrue(maybe.isSuccess)
XCTAssertEqual(maybe.successValue!, PushMessage.collectionChanged(collections: ["clients", "tabs"]))
expectation.fulfill()
}
wait(for: [expectation], timeout: 10)
}
func createHandler(_ profile: Profile = MockProfile()) -> FxAPushMessageHandler {
let account = FirefoxAccount(
configuration: FirefoxAccountConfigurationLabel.production.toConfiguration(),
email: "testtest@test.com",
uid: "uid",
deviceRegistration: nil,
declinedEngines: nil,
stateKeyLabel: "xxx",
state: SeparatedState(),
deviceName: "My iPhone")
profile.setAccount(account)
return FxAPushMessageHandler(with: profile)
}
func test_deviceConnected() {
let handler = createHandler()
let expectation = XCTestExpectation()
handler.handle(plaintext: "{\"command\":\"fxaccounts:device_connected\",\"data\":{\"deviceName\": \"Use Nightly on Desktop\"}}").upon { maybe in
XCTAssertTrue(maybe.isSuccess)
guard let message = maybe.successValue else {
return expectation.fulfill()
}
XCTAssertEqual(message, PushMessage.deviceConnected("Use Nightly on Desktop"))
expectation.fulfill()
}
wait(for: [expectation], timeout: 10)
}
func test_deviceDisconnected() {
let profile = MockProfile()
let handler = createHandler(profile)
let prefs = profile.prefs
let expectation = XCTestExpectation()
handler.handle(plaintext: "{\"command\":\"fxaccounts:device_disconnected\",\"data\":{\"id\": \"not_this_device\"}}").upon { maybe in
XCTAssertTrue(maybe.isSuccess)
guard let message = maybe.successValue else {
return expectation.fulfill()
}
XCTAssertEqual(message.messageType, .deviceDisconnected)
XCTAssertFalse(prefs.boolForKey(PendingAccountDisconnectedKey) ?? false)
expectation.fulfill()
}
wait(for: [expectation], timeout: 10)
}
func test_thisDeviceDisconnected() {
let profile = MockProfile()
let handler = createHandler(profile)
let deviceRegistration = FxADeviceRegistration(id: "this-device-id", version: 1, lastRegistered: 0)
profile.account?.deviceRegistration = deviceRegistration
let prefs = profile.prefs
let expectation = XCTestExpectation()
handler.handle(plaintext: "{\"command\":\"fxaccounts:device_disconnected\",\"data\":{\"id\": \"\(deviceRegistration.id)\"}}").upon { maybe in
guard let message = maybe.successValue else {
return expectation.fulfill()
}
XCTAssertEqual(message, PushMessage.thisDeviceDisconnected)
XCTAssertTrue(prefs.boolForKey(PendingAccountDisconnectedKey) ?? false)
expectation.fulfill()
}
wait(for: [expectation], timeout: 10)
}
}