SignInWithGameCenterTests.swift 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // Copyright 2023 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. import Foundation
  15. import XCTest
  16. @testable import FirebaseAuth
  17. @available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
  18. class SignInWithGameCenterTests: RPCBaseTests {
  19. private let kEmailKey = "email"
  20. private let kTestEmail = "testgmail.com"
  21. private let kDisplayNameKey = "displayName"
  22. private let kTestDisplayName = "DisplayName"
  23. private let kPasswordKey = "password"
  24. private let kTestPassword = "Password"
  25. private let kReturnSecureTokenKey = "returnSecureToken"
  26. private let kExpectedAPIURL =
  27. "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signInWithGameCenter?key=APIKey"
  28. let kIDToken = "IDTOKEN"
  29. let kPlayerIDKey = "playerId"
  30. let kPlayerID = "PLAYERID"
  31. let kTeamPlayerIDKey = "teamPlayerId"
  32. let kTeamPlayerID = "TEAMPLAYERID"
  33. let kGamePlayerIDKey = "gamePlayerId"
  34. let kGamePlayerID = "GAMEPLAYERID"
  35. let kApproximateExpirationDate = "3600"
  36. let kPublicKeyURLKey = "publicKeyUrl"
  37. let kPublicKeyURL = "PUBLICKEYURL"
  38. let kSignatureKey = "signature"
  39. let kSignature = "AAAABBBBCCCC"
  40. let kSaltKey = "salt"
  41. let kSalt = "AAAA"
  42. let kTimestampKey = "timestamp"
  43. let kTimestamp = UInt64(12_345_678)
  44. let kAccessTokenKey = "idToken"
  45. let kAccessToken = "ACCESSTOKEN"
  46. /** @fn testSignInWithGameCenterRequestAnonymous
  47. @brief Tests the encoding of a sign up new user request when user is signed in anonymously.
  48. */
  49. func testRequestResponseEncoding() throws {
  50. let kRefreshToken = "PUBLICKEYURL"
  51. let kLocalID = "LOCALID"
  52. let kDisplayNameKey = "displayName"
  53. let kDisplayName = "DISPLAYNAME"
  54. var callbackInvoked = false
  55. var rpcResponse: SignInWithGameCenterResponse?
  56. var rpcError: NSError?
  57. let signature = try XCTUnwrap(Data(base64Encoded: kSignature))
  58. let salt = try XCTUnwrap(Data(base64URLEncoded: kSalt))
  59. let request = try SignInWithGameCenterRequest(playerID: kPlayerID,
  60. teamPlayerID: kTeamPlayerID,
  61. gamePlayerID: kGamePlayerID,
  62. publicKeyURL: XCTUnwrap(
  63. URL(string: kPublicKeyURL)
  64. ),
  65. signature: signature,
  66. salt: salt,
  67. timestamp: kTimestamp,
  68. displayName: kDisplayName,
  69. requestConfiguration: makeRequestConfiguration())
  70. request.accessToken = kAccessToken
  71. let issuer = try checkRequest(
  72. request: request,
  73. expected: kExpectedAPIURL,
  74. key: kPlayerIDKey,
  75. value: kPlayerID
  76. )
  77. let requestDictionary = try XCTUnwrap(issuer.decodedRequest as? [String: AnyHashable])
  78. XCTAssertEqual(requestDictionary[kTeamPlayerIDKey], kTeamPlayerID)
  79. XCTAssertEqual(requestDictionary[kGamePlayerIDKey], kGamePlayerID)
  80. XCTAssertEqual(requestDictionary[kPublicKeyURLKey], kPublicKeyURL)
  81. XCTAssertEqual(requestDictionary[kSignatureKey], kSignature)
  82. XCTAssertEqual(requestDictionary[kSaltKey], kSalt)
  83. XCTAssertEqual(requestDictionary[kTimestampKey], kTimestamp)
  84. XCTAssertEqual(requestDictionary[kAccessTokenKey], kAccessToken)
  85. XCTAssertEqual(requestDictionary[kDisplayNameKey], kDisplayName)
  86. AuthBackend.post(with: request) { response, error in
  87. callbackInvoked = true
  88. rpcResponse = response
  89. rpcError = error as? NSError
  90. }
  91. _ = try rpcIssuer?.respond(withJSON: [
  92. "idToken": kIDToken,
  93. "refreshToken": kRefreshToken,
  94. "localId": kLocalID,
  95. "playerId": kPlayerID,
  96. "teamPlayerId": kTeamPlayerID,
  97. "gamePlayerId": kGamePlayerID,
  98. "expiresIn": kApproximateExpirationDate,
  99. "isNewUser": true,
  100. "displayName": kDisplayName,
  101. ])
  102. XCTAssert(callbackInvoked)
  103. XCTAssertNil(rpcError)
  104. XCTAssertEqual(rpcResponse?.idToken, kIDToken)
  105. XCTAssertEqual(rpcResponse?.refreshToken, kRefreshToken)
  106. XCTAssertEqual(rpcResponse?.localID, kLocalID)
  107. XCTAssertEqual(rpcResponse?.playerID, kPlayerID)
  108. XCTAssertEqual(rpcResponse?.teamPlayerID, kTeamPlayerID)
  109. XCTAssertEqual(rpcResponse?.gamePlayerID, kGamePlayerID)
  110. XCTAssertEqual(rpcResponse?.displayName, kDisplayName)
  111. XCTAssertTrue(try XCTUnwrap(rpcResponse?.isNewUser))
  112. }
  113. #if !os(watchOS)
  114. /** @fn testGameCenterAuthCredentialCoding
  115. @brief Tests successful archiving and unarchiving of @c GameCenterAuthCredential.
  116. */
  117. func testGameCenterAuthCredentialCoding() throws {
  118. let credential = try makeGameCenterCredential()
  119. XCTAssertTrue(GameCenterAuthCredential.supportsSecureCoding)
  120. let data = try NSKeyedArchiver.archivedData(
  121. withRootObject: credential,
  122. requiringSecureCoding: true
  123. )
  124. let unarchivedCredential = try XCTUnwrap(NSKeyedUnarchiver.unarchivedObject(
  125. ofClasses: [NSURL.self, GameCenterAuthCredential.self], from: data
  126. ) as? GameCenterAuthCredential)
  127. XCTAssertEqual(unarchivedCredential.playerID, kPlayerID)
  128. XCTAssertEqual(unarchivedCredential.teamPlayerID, kTeamPlayerID)
  129. XCTAssertEqual(unarchivedCredential.gamePlayerID, kGamePlayerID)
  130. XCTAssertEqual(unarchivedCredential.publicKeyURL, URL(string: kPublicKeyURL))
  131. XCTAssertEqual(try String(data: XCTUnwrap(unarchivedCredential.signature),
  132. encoding: .utf8), kSignature)
  133. XCTAssertEqual(try String(data: XCTUnwrap(unarchivedCredential.salt), encoding: .utf8), kSalt)
  134. XCTAssertEqual(unarchivedCredential.timestamp, kTimestamp)
  135. XCTAssertEqual(unarchivedCredential.displayName, kDisplayName)
  136. }
  137. private func makeGameCenterCredential() throws -> GameCenterAuthCredential {
  138. let signature = try XCTUnwrap(kSignature.data(using: .utf8))
  139. let salt = try XCTUnwrap(kSalt.data(using: .utf8))
  140. return try GameCenterAuthCredential(withPlayerID: kPlayerID,
  141. teamPlayerID: kTeamPlayerID,
  142. gamePlayerID: kGamePlayerID,
  143. publicKeyURL: XCTUnwrap(
  144. URL(string: kPublicKeyURL)
  145. ),
  146. signature: signature,
  147. salt: salt,
  148. timestamp: kTimestamp,
  149. displayName: kDisplayName)
  150. }
  151. #endif
  152. }