SignInWithGameCenterTests.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 kTeamPlayerIDKey = "teamPlayerId"
  30. let kTeamPlayerID = "TEAMPLAYERID"
  31. let kGamePlayerIDKey = "gamePlayerId"
  32. let kGamePlayerID = "GAMEPLAYERID"
  33. let kApproximateExpirationDate = "3600"
  34. let kPublicKeyURLKey = "publicKeyUrl"
  35. let kPublicKeyURL = "PUBLICKEYURL"
  36. let kSignatureKey = "signature"
  37. let kSignature = "AAAABBBBCCCC"
  38. let kSaltKey = "salt"
  39. let kSalt = "AAAA"
  40. let kTimestampKey = "timestamp"
  41. let kTimestamp = UInt64(12_345_678)
  42. let kAccessTokenKey = "idToken"
  43. let kAccessToken = "ACCESSTOKEN"
  44. /** @fn testSignInWithGameCenterRequestAnonymous
  45. @brief Tests the encoding of a sign up new user request when user is signed in anonymously.
  46. */
  47. func testRequestResponseEncoding() throws {
  48. let kRefreshToken = "PUBLICKEYURL"
  49. let kLocalID = "LOCALID"
  50. let kDisplayNameKey = "displayName"
  51. let kDisplayName = "DISPLAYNAME"
  52. var callbackInvoked = false
  53. var rpcResponse: SignInWithGameCenterResponse?
  54. var rpcError: NSError?
  55. let signature = try XCTUnwrap(Data(base64Encoded: kSignature))
  56. let salt = try XCTUnwrap(Data(base64URLEncoded: kSalt))
  57. let request = SignInWithGameCenterRequest(teamPlayerID: kTeamPlayerID,
  58. gamePlayerID: kGamePlayerID,
  59. publicKeyURL: try 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. let issuer = try checkRequest(
  69. request: request,
  70. expected: kExpectedAPIURL,
  71. key: kTeamPlayerIDKey,
  72. value: kTeamPlayerID
  73. )
  74. let requestDictionary = try XCTUnwrap(issuer.decodedRequest as? [String: AnyHashable])
  75. XCTAssertEqual(requestDictionary[kGamePlayerIDKey], kGamePlayerID)
  76. XCTAssertEqual(requestDictionary[kPublicKeyURLKey], kPublicKeyURL)
  77. XCTAssertEqual(requestDictionary[kSignatureKey], kSignature)
  78. XCTAssertEqual(requestDictionary[kSaltKey], kSalt)
  79. XCTAssertEqual(requestDictionary[kTimestampKey], kTimestamp)
  80. XCTAssertEqual(requestDictionary[kAccessTokenKey], kAccessToken)
  81. XCTAssertEqual(requestDictionary[kDisplayNameKey], kDisplayName)
  82. AuthBackend.post(withRequest: request) { response, error in
  83. callbackInvoked = true
  84. rpcResponse = response as? SignInWithGameCenterResponse
  85. rpcError = error as? NSError
  86. }
  87. _ = try rpcIssuer?.respond(withJSON: [
  88. "idToken": kIDToken,
  89. "refreshToken": kRefreshToken,
  90. "localId": kLocalID,
  91. "teamPlayerId": kTeamPlayerID,
  92. "gamePlayerId": kGamePlayerID,
  93. "expiresIn": kApproximateExpirationDate,
  94. "isNewUser": true,
  95. "displayName": kDisplayName,
  96. ])
  97. XCTAssert(callbackInvoked)
  98. XCTAssertNil(rpcError)
  99. XCTAssertEqual(rpcResponse?.idToken, kIDToken)
  100. XCTAssertEqual(rpcResponse?.refreshToken, kRefreshToken)
  101. XCTAssertEqual(rpcResponse?.localID, kLocalID)
  102. XCTAssertEqual(rpcResponse?.teamPlayerID, kTeamPlayerID)
  103. XCTAssertEqual(rpcResponse?.gamePlayerID, kGamePlayerID)
  104. XCTAssertEqual(rpcResponse?.displayName, kDisplayName)
  105. XCTAssertTrue(try XCTUnwrap(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.teamPlayerID, kTeamPlayerID)
  122. XCTAssertEqual(unarchivedCredential.gamePlayerID, kGamePlayerID)
  123. XCTAssertEqual(unarchivedCredential.publicKeyURL, URL(string: kPublicKeyURL))
  124. XCTAssertEqual(String(data: try XCTUnwrap(unarchivedCredential.signature),
  125. encoding: .utf8), kSignature)
  126. XCTAssertEqual(String(data: try XCTUnwrap(unarchivedCredential.salt), encoding: .utf8), kSalt)
  127. XCTAssertEqual(unarchivedCredential.timestamp, kTimestamp)
  128. XCTAssertEqual(unarchivedCredential.displayName, kDisplayName)
  129. }
  130. private func makeGameCenterCredential() throws -> GameCenterAuthCredential {
  131. let signature = try XCTUnwrap(kSignature.data(using: .utf8))
  132. let salt = try XCTUnwrap(kSalt.data(using: .utf8))
  133. return GameCenterAuthCredential(teamPlayerID: kTeamPlayerID,
  134. gamePlayerID: kGamePlayerID,
  135. publicKeyURL: try XCTUnwrap(
  136. URL(string: kPublicKeyURL)
  137. ),
  138. signature: signature,
  139. salt: salt,
  140. timestamp: kTimestamp,
  141. displayName: kDisplayName)
  142. }
  143. #endif
  144. }