SignInWithGameCenterTests.swift 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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() async throws {
  50. let kRefreshToken = "PUBLICKEYURL"
  51. let kLocalID = "LOCALID"
  52. let kDisplayNameKey = "displayName"
  53. let kDisplayName = "DISPLAYNAME"
  54. let signature = try XCTUnwrap(Data(base64Encoded: kSignature))
  55. let salt = try XCTUnwrap(Data(base64Encoded: kSalt))
  56. let request = try SignInWithGameCenterRequest(playerID: kPlayerID,
  57. teamPlayerID: kTeamPlayerID,
  58. gamePlayerID: kGamePlayerID,
  59. publicKeyURL: XCTUnwrap(
  60. URL(string: kPublicKeyURL)
  61. ),
  62. signature: signature,
  63. salt: salt,
  64. timestamp: kTimestamp,
  65. displayName: kDisplayName,
  66. requestConfiguration: makeRequestConfiguration())
  67. request.accessToken = kAccessToken
  68. try await checkRequest(
  69. request: request,
  70. expected: kExpectedAPIURL,
  71. key: kPlayerIDKey,
  72. value: kPlayerID
  73. )
  74. let requestDictionary = try XCTUnwrap(rpcIssuer.decodedRequest as? [String: AnyHashable])
  75. XCTAssertEqual(requestDictionary[kTeamPlayerIDKey], kTeamPlayerID)
  76. XCTAssertEqual(requestDictionary[kGamePlayerIDKey], kGamePlayerID)
  77. XCTAssertEqual(requestDictionary[kPublicKeyURLKey], kPublicKeyURL)
  78. XCTAssertEqual(requestDictionary[kSignatureKey], kSignature)
  79. XCTAssertEqual(requestDictionary[kSaltKey], kSalt)
  80. XCTAssertEqual(requestDictionary[kTimestampKey], kTimestamp)
  81. XCTAssertEqual(requestDictionary[kAccessTokenKey], kAccessToken)
  82. XCTAssertEqual(requestDictionary[kDisplayNameKey], kDisplayName)
  83. rpcIssuer.respondBlock = {
  84. try self.rpcIssuer.respond(withJSON: [
  85. "idToken": self.kIDToken,
  86. "refreshToken": kRefreshToken,
  87. "localId": kLocalID,
  88. "playerId": self.kPlayerID,
  89. "teamPlayerId": self.kTeamPlayerID,
  90. "gamePlayerId": self.kGamePlayerID,
  91. "expiresIn": self.kApproximateExpirationDate,
  92. "isNewUser": true,
  93. "displayName": kDisplayName,
  94. ])
  95. }
  96. let rpcResponse = try await authBackend.call(with: request)
  97. XCTAssertNotNil(rpcResponse)
  98. XCTAssertEqual(rpcResponse.idToken, kIDToken)
  99. XCTAssertEqual(rpcResponse.refreshToken, kRefreshToken)
  100. XCTAssertEqual(rpcResponse.localID, kLocalID)
  101. XCTAssertEqual(rpcResponse.playerID, kPlayerID)
  102. XCTAssertEqual(rpcResponse.teamPlayerID, kTeamPlayerID)
  103. XCTAssertEqual(rpcResponse.gamePlayerID, kGamePlayerID)
  104. XCTAssertEqual(rpcResponse.displayName, kDisplayName)
  105. XCTAssertTrue(rpcResponse.isNewUser)
  106. }
  107. #if !os(watchOS)
  108. /** @fn testGameCenterAuthCredentialCoding
  109. @brief Tests successful archiving and unarchiving of @c GameCenterAuthCredential.
  110. */
  111. func testGameCenterAuthCredentialCoding() throws {
  112. let credential = try makeGameCenterCredential()
  113. XCTAssertTrue(GameCenterAuthCredential.supportsSecureCoding)
  114. let data = try NSKeyedArchiver.archivedData(
  115. withRootObject: credential,
  116. requiringSecureCoding: true
  117. )
  118. let unarchivedCredential = try XCTUnwrap(NSKeyedUnarchiver.unarchivedObject(
  119. ofClasses: [NSURL.self, GameCenterAuthCredential.self], from: data
  120. ) as? GameCenterAuthCredential)
  121. XCTAssertEqual(unarchivedCredential.playerID, kPlayerID)
  122. XCTAssertEqual(unarchivedCredential.teamPlayerID, kTeamPlayerID)
  123. XCTAssertEqual(unarchivedCredential.gamePlayerID, kGamePlayerID)
  124. XCTAssertEqual(unarchivedCredential.publicKeyURL, URL(string: kPublicKeyURL))
  125. XCTAssertEqual(try String(data: XCTUnwrap(unarchivedCredential.signature),
  126. encoding: .utf8), kSignature)
  127. XCTAssertEqual(try String(data: XCTUnwrap(unarchivedCredential.salt), encoding: .utf8), kSalt)
  128. XCTAssertEqual(unarchivedCredential.timestamp, kTimestamp)
  129. XCTAssertEqual(unarchivedCredential.displayName, kDisplayName)
  130. }
  131. private func makeGameCenterCredential() throws -> GameCenterAuthCredential {
  132. let signature = try XCTUnwrap(kSignature.data(using: .utf8))
  133. let salt = try XCTUnwrap(kSalt.data(using: .utf8))
  134. return try GameCenterAuthCredential(withPlayerID: kPlayerID,
  135. teamPlayerID: kTeamPlayerID,
  136. gamePlayerID: kGamePlayerID,
  137. publicKeyURL: XCTUnwrap(
  138. URL(string: kPublicKeyURL)
  139. ),
  140. signature: signature,
  141. salt: salt,
  142. timestamp: kTimestamp,
  143. displayName: kDisplayName)
  144. }
  145. #endif
  146. }