StorageTests.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright 2021 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 XCTest
  15. @testable import FirebaseCoreInternal
  16. private enum Constants {
  17. static let testData = "test_data".data(using: .utf8)!
  18. }
  19. // MARK: - FileStorageTests
  20. class FileStorageTests: XCTestCase {
  21. func testRead_WhenFileDoesNotExist_ThrowsError() throws {
  22. // Given
  23. let fileStorage = FileStorage(url: makeTemporaryFileURL())
  24. // Then
  25. XCTAssertThrowsError(try fileStorage.read())
  26. }
  27. func testRead_WhenFileExists_ReturnsFileContents() throws {
  28. // Given
  29. let fileStorage = FileStorage(url: makeTemporaryFileURL())
  30. XCTAssertNoThrow(try fileStorage.write(Constants.testData))
  31. // When
  32. let storedData = try fileStorage.read()
  33. // Then
  34. XCTAssertEqual(storedData, Constants.testData)
  35. }
  36. func testWriteData_WhenFileDoesNotExist_CreatesFile() throws {
  37. // Given
  38. let fileStorage = FileStorage(url: makeTemporaryFileURL())
  39. XCTAssertThrowsError(try fileStorage.read())
  40. // When
  41. XCTAssertNoThrow(try fileStorage.write(Constants.testData))
  42. // Then
  43. let storedData = try fileStorage.read()
  44. XCTAssertEqual(storedData, Constants.testData)
  45. }
  46. func testWriteData_WhenFileExists_ModifiesFile() throws {
  47. // Given
  48. let fileStorage = FileStorage(url: makeTemporaryFileURL())
  49. XCTAssertNoThrow(try fileStorage.write(Constants.testData))
  50. // When
  51. let modifiedData = "modified_data".data(using: .utf8)
  52. XCTAssertNoThrow(try fileStorage.write(modifiedData))
  53. // Then
  54. let storedData = try fileStorage.read()
  55. XCTAssertEqual(storedData, modifiedData)
  56. }
  57. func testWriteNil_WhenFileDoesNotExist_CreatesEmptyFile() throws {
  58. // Given
  59. let fileStorage = FileStorage(url: makeTemporaryFileURL())
  60. XCTAssertThrowsError(try fileStorage.read())
  61. // When
  62. XCTAssertNoThrow(try fileStorage.write(nil))
  63. // Then
  64. let emptyData = try fileStorage.read()
  65. XCTAssertTrue(emptyData.isEmpty)
  66. }
  67. func testWriteNil_WhenFileExists_EmptiesFile() throws {
  68. // Given
  69. let fileStorage = FileStorage(url: makeTemporaryFileURL())
  70. XCTAssertNoThrow(try fileStorage.write(Constants.testData))
  71. // When
  72. XCTAssertNoThrow(try fileStorage.write(nil))
  73. // Then
  74. let emptyData = try fileStorage.read()
  75. XCTAssertTrue(emptyData.isEmpty)
  76. }
  77. private func makeTemporaryFileURL(testName: String = #function) -> URL {
  78. let temporaryPath = NSTemporaryDirectory() + testName
  79. let temporaryURL = URL(fileURLWithPath: temporaryPath)
  80. try? FileManager.default.removeItem(at: temporaryURL)
  81. return temporaryURL
  82. }
  83. }
  84. // MARK: - UserDefaultsStorageTests
  85. class UserDefaultsStorageTests: XCTestCase {
  86. var defaults: UserDefaults!
  87. let suiteName = #file
  88. override func setUpWithError() throws {
  89. defaults = try XCTUnwrap(UserDefaultsFake(suiteName: suiteName))
  90. }
  91. func testRead_WhenDefaultDoesNotExist_ThrowsError() throws {
  92. // Given
  93. let defaultsStorage = UserDefaultsStorage(defaults: defaults, key: #function)
  94. // Then
  95. XCTAssertThrowsError(try defaultsStorage.read())
  96. }
  97. func testRead_WhenDefaultExists_ReturnsDefault() throws {
  98. // Given
  99. let defaultsStorage = UserDefaultsStorage(defaults: defaults, key: #function)
  100. XCTAssertNoThrow(try defaultsStorage.write(Constants.testData))
  101. // When
  102. let storedData = try defaultsStorage.read()
  103. // Then
  104. XCTAssertEqual(storedData, Constants.testData)
  105. }
  106. func testWriteData_WhenDefaultDoesNotExist_CreatesDefault() throws {
  107. // Given
  108. let defaultsStorage = UserDefaultsStorage(defaults: defaults, key: #function)
  109. XCTAssertThrowsError(try defaultsStorage.read())
  110. // When
  111. XCTAssertNoThrow(try defaultsStorage.write(Constants.testData))
  112. // Then
  113. let storedData = try defaultsStorage.read()
  114. XCTAssertEqual(storedData, Constants.testData)
  115. }
  116. func testWriteData_WhenDefaultExists_ModifiesDefault() throws {
  117. // Given
  118. let defaultsStorage = UserDefaultsStorage(defaults: defaults, key: #function)
  119. XCTAssertNoThrow(try defaultsStorage.write(Constants.testData))
  120. // When
  121. let modifiedData = #function.data(using: .utf8)
  122. XCTAssertNoThrow(try defaultsStorage.write(modifiedData))
  123. // Then
  124. let storedData = try defaultsStorage.read()
  125. XCTAssertEqual(storedData, modifiedData)
  126. }
  127. func testWriteNil_WhenDefaultDoesNotExist_RemovesDefault() throws {
  128. // Given
  129. let defaultsStorage = UserDefaultsStorage(defaults: defaults, key: #function)
  130. XCTAssertThrowsError(try defaultsStorage.read())
  131. // When
  132. XCTAssertNoThrow(try defaultsStorage.write(nil))
  133. // Then
  134. XCTAssertThrowsError(try defaultsStorage.read())
  135. }
  136. func testWriteNil_WhenDefaultExists_RemovesDefault() throws {
  137. // Given
  138. let defaultsStorage = UserDefaultsStorage(defaults: defaults, key: #function)
  139. XCTAssertNoThrow(try defaultsStorage.write(Constants.testData))
  140. // When
  141. XCTAssertNoThrow(try defaultsStorage.write(nil))
  142. // Then
  143. XCTAssertThrowsError(try defaultsStorage.read())
  144. }
  145. }
  146. // MARK: - Fakes
  147. private class UserDefaultsFake: UserDefaults {
  148. private var defaults = [String: Any]()
  149. override func object(forKey defaultName: String) -> Any? {
  150. defaults[defaultName]
  151. }
  152. override func set(_ value: Any?, forKey defaultName: String) {
  153. defaults[defaultName] = value
  154. }
  155. }