Pier Angelo Vendrame pushed to branch tor-browser-128.3.0esr-14.0-1 at The Tor Project / Applications / Tor Browser
Commits:
-
264c385b
by Dan Ballard at 2024-09-26T17:20:57+00:00
4 changed files:
- mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepository.kt
- mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/BaseSearchTelemetryTest.kt
- mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepositoryTest.kt
- mobile/android/android-components/components/support/remotesettings/src/main/java/mozilla/components/support/remotesettings/RemoteSettingsClient.kt
Changes:
| ... | ... | @@ -8,7 +8,7 @@ import mozilla.appservices.remotesettings.RemoteSettingsResponse |
| 8 | 8 | import mozilla.components.support.base.log.logger.Logger
|
| 9 | 9 | import mozilla.components.support.ktx.android.org.json.asSequence
|
| 10 | 10 | import mozilla.components.support.ktx.android.org.json.toList
|
| 11 | -import mozilla.components.support.remotesettings.RemoteSettingsClient
|
|
| 11 | +//import mozilla.components.support.remotesettings.RemoteSettingsClient
|
|
| 12 | 12 | import mozilla.components.support.remotesettings.RemoteSettingsResult
|
| 13 | 13 | import org.jetbrains.annotations.VisibleForTesting
|
| 14 | 14 | import org.json.JSONArray
|
| ... | ... | @@ -23,22 +23,22 @@ internal const val REMOTE_ENDPOINT_BUCKET_NAME = "main" |
| 23 | 23 | * Parse SERP Telemetry json from remote config.
|
| 24 | 24 | */
|
| 25 | 25 | class SerpTelemetryRepository(
|
| 26 | - rootStorageDirectory: File,
|
|
| 26 | +// rootStorageDirectory: File,
|
|
| 27 | 27 | private val readJson: () -> JSONObject,
|
| 28 | - collectionName: String,
|
|
| 29 | - serverUrl: String = REMOTE_PROD_ENDPOINT_URL,
|
|
| 30 | - bucketName: String = REMOTE_ENDPOINT_BUCKET_NAME,
|
|
| 28 | +// collectionName: String,
|
|
| 29 | +// serverUrl: String = REMOTE_PROD_ENDPOINT_URL,
|
|
| 30 | +// bucketName: String = REMOTE_ENDPOINT_BUCKET_NAME,
|
|
| 31 | 31 | ) {
|
| 32 | 32 | val logger = Logger("SerpTelemetryRepository")
|
| 33 | 33 | private var providerList: List<SearchProviderModel> = emptyList()
|
| 34 | 34 | |
| 35 | - @VisibleForTesting
|
|
| 36 | - internal var remoteSettingsClient = RemoteSettingsClient(
|
|
| 37 | - serverUrl = serverUrl,
|
|
| 38 | - bucketName = bucketName,
|
|
| 39 | - collectionName = collectionName,
|
|
| 40 | - storageRootDirectory = rootStorageDirectory,
|
|
| 41 | - )
|
|
| 35 | +// @VisibleForTesting
|
|
| 36 | +// internal var remoteSettingsClient = RemoteSettingsClient(
|
|
| 37 | +// serverUrl = serverUrl,
|
|
| 38 | +// bucketName = bucketName,
|
|
| 39 | +// collectionName = collectionName,
|
|
| 40 | +// storageRootDirectory = rootStorageDirectory,
|
|
| 41 | +// )
|
|
| 42 | 42 | |
| 43 | 43 | /**
|
| 44 | 44 | * Provides list of search providers from cache or dump and fetches from remotes server .
|
| ... | ... | @@ -65,7 +65,7 @@ class SerpTelemetryRepository( |
| 65 | 65 | val remoteResponse = fetchRemoteResponse()
|
| 66 | 66 | if (remoteResponse.lastModified > cacheLastModified) {
|
| 67 | 67 | providerList = parseRemoteResponse(remoteResponse)
|
| 68 | - writeToCache(remoteResponse)
|
|
| 68 | + //writeToCache(remoteResponse)
|
|
| 69 | 69 | }
|
| 70 | 70 | }
|
| 71 | 71 | |
| ... | ... | @@ -73,8 +73,9 @@ class SerpTelemetryRepository( |
| 73 | 73 | * Writes data to local cache.
|
| 74 | 74 | */
|
| 75 | 75 | @VisibleForTesting
|
| 76 | - internal suspend fun writeToCache(records: RemoteSettingsResponse): RemoteSettingsResult {
|
|
| 77 | - return remoteSettingsClient.write(records)
|
|
| 76 | + internal suspend fun writeToCache(/*records: RemoteSettingsResponse*/): RemoteSettingsResult {
|
|
| 77 | + return RemoteSettingsResult.NetworkFailure(Exception("Bug-43113: no remote fetching"))
|
|
| 78 | +// return remoteSettingsClient.write(records)
|
|
| 78 | 79 | }
|
| 79 | 80 | |
| 80 | 81 | /**
|
| ... | ... | @@ -104,12 +105,12 @@ class SerpTelemetryRepository( |
| 104 | 105 | */
|
| 105 | 106 | @VisibleForTesting
|
| 106 | 107 | internal suspend fun fetchRemoteResponse(): RemoteSettingsResponse {
|
| 107 | - val result = remoteSettingsClient.fetch()
|
|
| 108 | - return if (result is RemoteSettingsResult.Success) {
|
|
| 109 | - result.response
|
|
| 110 | - } else {
|
|
| 111 | - RemoteSettingsResponse(emptyList(), 0u)
|
|
| 112 | - }
|
|
| 108 | +// val result = remoteSettingsClient.fetch()
|
|
| 109 | +// return if (result is RemoteSettingsResult.Success) {
|
|
| 110 | +// result.response
|
|
| 111 | +// } else {
|
|
| 112 | + return RemoteSettingsResponse(emptyList(), 0u)
|
|
| 113 | +// }
|
|
| 113 | 114 | }
|
| 114 | 115 | |
| 115 | 116 | /**
|
| ... | ... | @@ -117,16 +118,16 @@ class SerpTelemetryRepository( |
| 117 | 118 | */
|
| 118 | 119 | @VisibleForTesting
|
| 119 | 120 | internal suspend fun loadProvidersFromCache(): Pair<ULong, List<SearchProviderModel>> {
|
| 120 | - val result = remoteSettingsClient.read()
|
|
| 121 | - return if (result is RemoteSettingsResult.Success) {
|
|
| 122 | - val response = result.response.records.mapNotNull {
|
|
| 123 | - it.fields.toSearchProviderModel()
|
|
| 124 | - }
|
|
| 125 | - val lastModified = result.response.lastModified
|
|
| 126 | - Pair(lastModified, response)
|
|
| 127 | - } else {
|
|
| 128 | - Pair(0u, emptyList())
|
|
| 129 | - }
|
|
| 121 | +// val result = remoteSettingsClient.read()
|
|
| 122 | +// return if (result is RemoteSettingsResult.Success) {
|
|
| 123 | +// val response = result.response.records.mapNotNull {
|
|
| 124 | +// it.fields.toSearchProviderModel()
|
|
| 125 | +// }
|
|
| 126 | +// val lastModified = result.response.lastModified
|
|
| 127 | +// Pair(lastModified, response)
|
|
| 128 | +// } else {
|
|
| 129 | + return Pair(0u, emptyList())
|
|
| 130 | +// }
|
|
| 130 | 131 | }
|
| 131 | 132 | }
|
| 132 | 133 |
| ... | ... | @@ -27,161 +27,161 @@ import java.io.File |
| 27 | 27 | @RunWith(AndroidJUnit4::class)
|
| 28 | 28 | class BaseSearchTelemetryTest {
|
| 29 | 29 | |
| 30 | - private lateinit var baseTelemetry: BaseSearchTelemetry
|
|
| 31 | - private lateinit var handler: BaseSearchTelemetry.SearchTelemetryMessageHandler
|
|
| 32 | - |
|
| 33 | - @Mock
|
|
| 34 | - private lateinit var mockRepo: SerpTelemetryRepository
|
|
| 35 | - |
|
| 36 | - private val mockReadJson: () -> JSONObject = mock()
|
|
| 37 | - private val mockRootStorageDirectory: File = mock()
|
|
| 38 | - |
|
| 39 | - private fun createMockProviderList(): List<SearchProviderModel> = listOf(
|
|
| 40 | - SearchProviderModel(
|
|
| 41 | - schema = 1698656464939,
|
|
| 42 | - taggedCodes = listOf("monline_7_dg"),
|
|
| 43 | - telemetryId = "baidu",
|
|
| 44 | - organicCodes = emptyList(),
|
|
| 45 | - codeParamName = "tn",
|
|
| 46 | - queryParamNames = listOf("wd"),
|
|
| 47 | - searchPageRegexp = "^https://(?:m|www)\\\\.baidu\\\\.com/(?:s|baidu)",
|
|
| 48 | - followOnParamNames = listOf("oq"),
|
|
| 49 | - extraAdServersRegexps = listOf("^https?://www\\\\.baidu\\\\.com/baidu\\\\.php?"),
|
|
| 50 | - expectedOrganicCodes = emptyList(),
|
|
| 51 | - ),
|
|
| 52 | - )
|
|
| 53 | - |
|
| 54 | - private val rawJson = """
|
|
| 55 | - {
|
|
| 56 | - "data": [
|
|
| 57 | - {
|
|
| 58 | - "schema": 1698656464939,
|
|
| 59 | - "taggedCodes": [
|
|
| 60 | - "monline_7_dg"
|
|
| 61 | - ],
|
|
| 62 | - "telemetryId": "baidu",
|
|
| 63 | - "organicCodes": [],
|
|
| 64 | - "codeParamName": "tn",
|
|
| 65 | - "queryParamNames": [
|
|
| 66 | - "wd"
|
|
| 67 | - ],
|
|
| 68 | - "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)",
|
|
| 69 | - "followOnParamNames": [
|
|
| 70 | - "oq"
|
|
| 71 | - ],
|
|
| 72 | - "extraAdServersRegexps": [
|
|
| 73 | - "^https?://www\\.baidu\\.com/baidu\\.php?"
|
|
| 74 | - ],
|
|
| 75 | - "id": "19c434a3-d173-4871-9743-290ac92a3f6a",
|
|
| 76 | - "last_modified": 1698666532326
|
|
| 77 | - }],
|
|
| 78 | - "timestamp": 16
|
|
| 79 | -}
|
|
| 80 | - """.trimIndent()
|
|
| 81 | - |
|
| 82 | - @Before
|
|
| 83 | - fun setup() {
|
|
| 84 | - baseTelemetry = spy(
|
|
| 85 | - object : BaseSearchTelemetry() {
|
|
| 86 | - override suspend fun install(
|
|
| 87 | - engine: Engine,
|
|
| 88 | - store: BrowserStore,
|
|
| 89 | - providerList: List<SearchProviderModel>,
|
|
| 90 | - ) {
|
|
| 91 | - // mock, do nothing
|
|
| 92 | - }
|
|
| 93 | - |
|
| 94 | - override fun processMessage(message: JSONObject) {
|
|
| 95 | - // mock, do nothing
|
|
| 96 | - }
|
|
| 97 | - },
|
|
| 98 | - )
|
|
| 99 | - handler = baseTelemetry.SearchTelemetryMessageHandler()
|
|
| 100 | - mockRepo = spy(SerpTelemetryRepository(mockRootStorageDirectory, mockReadJson, "test"))
|
|
| 101 | - }
|
|
| 102 | - |
|
| 103 | - @Test
|
|
| 104 | - fun `GIVEN an engine WHEN installWebExtension is called THEN the provided extension is installed in engine`() {
|
|
| 105 | - val engine: Engine = mock()
|
|
| 106 | - val store: BrowserStore = mock()
|
|
| 107 | - val id = "id"
|
|
| 108 | - val resourceUrl = "resourceUrl"
|
|
| 109 | - val messageId = "messageId"
|
|
| 110 | - val extensionInfo = ExtensionInfo(id, resourceUrl, messageId)
|
|
| 111 | - |
|
| 112 | - baseTelemetry.installWebExtension(engine, store, extensionInfo)
|
|
| 113 | - |
|
| 114 | - verify(engine).installBuiltInWebExtension(
|
|
| 115 | - id = eq(id),
|
|
| 116 | - url = eq(resourceUrl),
|
|
| 117 | - onSuccess = any(),
|
|
| 118 | - onError = any(),
|
|
| 119 | - )
|
|
| 120 | - }
|
|
| 121 | - |
|
| 122 | - @Test
|
|
| 123 | - fun `GIVEN a search provider does not exist for the url WHEN getProviderForUrl is called THEN return null`() {
|
|
| 124 | - val url = "https://www.mozilla.com/search?q=firefox"
|
|
| 125 | - baseTelemetry.providerList = createMockProviderList()
|
|
| 126 | - |
|
| 127 | - assertEquals(null, baseTelemetry.getProviderForUrl(url))
|
|
| 128 | - }
|
|
| 129 | - |
|
| 130 | - @Test(expected = IllegalStateException::class)
|
|
| 131 | - fun `GIVEN an extension message WHEN that cannot be processed THEN throw IllegalStateException`() {
|
|
| 132 | - val message = "message"
|
|
| 133 | - |
|
| 134 | - handler.onMessage(message, mock())
|
|
| 135 | - }
|
|
| 136 | - |
|
| 137 | - @Test
|
|
| 138 | - fun `GIVEN an extension message WHEN received THEN pass it to processMessage`() {
|
|
| 139 | - val message = JSONObject()
|
|
| 140 | - |
|
| 141 | - handler.onMessage(message, mock())
|
|
| 142 | - |
|
| 143 | - verify(baseTelemetry).processMessage(message)
|
|
| 144 | - }
|
|
| 145 | - |
|
| 146 | - @Test
|
|
| 147 | - fun `GIVEN empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit =
|
|
| 148 | - runBlocking {
|
|
| 149 | - val localResponse = JSONObject(rawJson)
|
|
| 150 | - val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(0u, emptyList())
|
|
| 151 | - |
|
| 152 | - `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse)
|
|
| 153 | - doAnswer {
|
|
| 154 | - localResponse
|
|
| 155 | - }.`when`(mockReadJson)()
|
|
| 156 | - |
|
| 157 | - `when`(mockRepo.parseLocalPreinstalledData(localResponse)).thenReturn(createMockProviderList())
|
|
| 158 | - doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any())
|
|
| 159 | - |
|
| 160 | - baseTelemetry.setProviderList(mockRepo.updateProviderList())
|
|
| 161 | - |
|
| 162 | - assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString())
|
|
| 163 | - }
|
|
| 164 | - |
|
| 165 | - @Test
|
|
| 166 | - fun `GIVEN non-empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit =
|
|
| 167 | - runBlocking {
|
|
| 168 | - val localResponse = JSONObject(rawJson)
|
|
| 169 | - val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(123u, createMockProviderList())
|
|
| 170 | - |
|
| 171 | - `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse)
|
|
| 172 | - doAnswer {
|
|
| 173 | - localResponse
|
|
| 174 | - }.`when`(mockReadJson)()
|
|
| 175 | - doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any())
|
|
| 176 | - |
|
| 177 | - baseTelemetry.setProviderList(mockRepo.updateProviderList())
|
|
| 178 | - |
|
| 179 | - assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString())
|
|
| 180 | - }
|
|
| 181 | - |
|
| 182 | - fun getProviderForUrl(url: String): SearchProviderModel? {
|
|
| 183 | - return createMockProviderList().find { provider ->
|
|
| 184 | - provider.searchPageRegexp.pattern.toRegex().containsMatchIn(url)
|
|
| 185 | - }
|
|
| 186 | - }
|
|
| 30 | +// private lateinit var baseTelemetry: BaseSearchTelemetry
|
|
| 31 | +// private lateinit var handler: BaseSearchTelemetry.SearchTelemetryMessageHandler
|
|
| 32 | +//
|
|
| 33 | +// @Mock
|
|
| 34 | +// private lateinit var mockRepo: SerpTelemetryRepository
|
|
| 35 | +//
|
|
| 36 | +// private val mockReadJson: () -> JSONObject = mock()
|
|
| 37 | +// private val mockRootStorageDirectory: File = mock()
|
|
| 38 | +//
|
|
| 39 | +// private fun createMockProviderList(): List<SearchProviderModel> = listOf(
|
|
| 40 | +// SearchProviderModel(
|
|
| 41 | +// schema = 1698656464939,
|
|
| 42 | +// taggedCodes = listOf("monline_7_dg"),
|
|
| 43 | +// telemetryId = "baidu",
|
|
| 44 | +// organicCodes = emptyList(),
|
|
| 45 | +// codeParamName = "tn",
|
|
| 46 | +// queryParamNames = listOf("wd"),
|
|
| 47 | +// searchPageRegexp = "^https://(?:m|www)\\\\.baidu\\\\.com/(?:s|baidu)",
|
|
| 48 | +// followOnParamNames = listOf("oq"),
|
|
| 49 | +// extraAdServersRegexps = listOf("^https?://www\\\\.baidu\\\\.com/baidu\\\\.php?"),
|
|
| 50 | +// expectedOrganicCodes = emptyList(),
|
|
| 51 | +// ),
|
|
| 52 | +// )
|
|
| 53 | +//
|
|
| 54 | +// private val rawJson = """
|
|
| 55 | +// {
|
|
| 56 | +// "data": [
|
|
| 57 | +// {
|
|
| 58 | +// "schema": 1698656464939,
|
|
| 59 | +// "taggedCodes": [
|
|
| 60 | +// "monline_7_dg"
|
|
| 61 | +// ],
|
|
| 62 | +// "telemetryId": "baidu",
|
|
| 63 | +// "organicCodes": [],
|
|
| 64 | +// "codeParamName": "tn",
|
|
| 65 | +// "queryParamNames": [
|
|
| 66 | +// "wd"
|
|
| 67 | +// ],
|
|
| 68 | +// "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)",
|
|
| 69 | +// "followOnParamNames": [
|
|
| 70 | +// "oq"
|
|
| 71 | +// ],
|
|
| 72 | +// "extraAdServersRegexps": [
|
|
| 73 | +// "^https?://www\\.baidu\\.com/baidu\\.php?"
|
|
| 74 | +// ],
|
|
| 75 | +// "id": "19c434a3-d173-4871-9743-290ac92a3f6a",
|
|
| 76 | +// "last_modified": 1698666532326
|
|
| 77 | +// }],
|
|
| 78 | +// "timestamp": 16
|
|
| 79 | +//}
|
|
| 80 | +// """.trimIndent()
|
|
| 81 | +//
|
|
| 82 | +// @Before
|
|
| 83 | +// fun setup() {
|
|
| 84 | +// baseTelemetry = spy(
|
|
| 85 | +// object : BaseSearchTelemetry() {
|
|
| 86 | +// override suspend fun install(
|
|
| 87 | +// engine: Engine,
|
|
| 88 | +// store: BrowserStore,
|
|
| 89 | +// providerList: List<SearchProviderModel>,
|
|
| 90 | +// ) {
|
|
| 91 | +// // mock, do nothing
|
|
| 92 | +// }
|
|
| 93 | +//
|
|
| 94 | +// override fun processMessage(message: JSONObject) {
|
|
| 95 | +// // mock, do nothing
|
|
| 96 | +// }
|
|
| 97 | +// },
|
|
| 98 | +// )
|
|
| 99 | +// handler = baseTelemetry.SearchTelemetryMessageHandler()
|
|
| 100 | +// mockRepo = spy(SerpTelemetryRepository(mockRootStorageDirectory, mockReadJson, "test"))
|
|
| 101 | +// }
|
|
| 102 | +//
|
|
| 103 | +// @Test
|
|
| 104 | +// fun `GIVEN an engine WHEN installWebExtension is called THEN the provided extension is installed in engine`() {
|
|
| 105 | +// val engine: Engine = mock()
|
|
| 106 | +// val store: BrowserStore = mock()
|
|
| 107 | +// val id = "id"
|
|
| 108 | +// val resourceUrl = "resourceUrl"
|
|
| 109 | +// val messageId = "messageId"
|
|
| 110 | +// val extensionInfo = ExtensionInfo(id, resourceUrl, messageId)
|
|
| 111 | +//
|
|
| 112 | +// baseTelemetry.installWebExtension(engine, store, extensionInfo)
|
|
| 113 | +//
|
|
| 114 | +// verify(engine).installBuiltInWebExtension(
|
|
| 115 | +// id = eq(id),
|
|
| 116 | +// url = eq(resourceUrl),
|
|
| 117 | +// onSuccess = any(),
|
|
| 118 | +// onError = any(),
|
|
| 119 | +// )
|
|
| 120 | +// }
|
|
| 121 | +//
|
|
| 122 | +// @Test
|
|
| 123 | +// fun `GIVEN a search provider does not exist for the url WHEN getProviderForUrl is called THEN return null`() {
|
|
| 124 | +// val url = "https://www.mozilla.com/search?q=firefox"
|
|
| 125 | +// baseTelemetry.providerList = createMockProviderList()
|
|
| 126 | +//
|
|
| 127 | +// assertEquals(null, baseTelemetry.getProviderForUrl(url))
|
|
| 128 | +// }
|
|
| 129 | +//
|
|
| 130 | +// @Test(expected = IllegalStateException::class)
|
|
| 131 | +// fun `GIVEN an extension message WHEN that cannot be processed THEN throw IllegalStateException`() {
|
|
| 132 | +// val message = "message"
|
|
| 133 | +//
|
|
| 134 | +// handler.onMessage(message, mock())
|
|
| 135 | +// }
|
|
| 136 | +//
|
|
| 137 | +// @Test
|
|
| 138 | +// fun `GIVEN an extension message WHEN received THEN pass it to processMessage`() {
|
|
| 139 | +// val message = JSONObject()
|
|
| 140 | +//
|
|
| 141 | +// handler.onMessage(message, mock())
|
|
| 142 | +//
|
|
| 143 | +// verify(baseTelemetry).processMessage(message)
|
|
| 144 | +// }
|
|
| 145 | +//
|
|
| 146 | +// @Test
|
|
| 147 | +// fun `GIVEN empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit =
|
|
| 148 | +// runBlocking {
|
|
| 149 | +// val localResponse = JSONObject(rawJson)
|
|
| 150 | +// val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(0u, emptyList())
|
|
| 151 | +//
|
|
| 152 | +// `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse)
|
|
| 153 | +// doAnswer {
|
|
| 154 | +// localResponse
|
|
| 155 | +// }.`when`(mockReadJson)()
|
|
| 156 | +//
|
|
| 157 | +// `when`(mockRepo.parseLocalPreinstalledData(localResponse)).thenReturn(createMockProviderList())
|
|
| 158 | +// doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any())
|
|
| 159 | +//
|
|
| 160 | +// baseTelemetry.setProviderList(mockRepo.updateProviderList())
|
|
| 161 | +//
|
|
| 162 | +// assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString())
|
|
| 163 | +// }
|
|
| 164 | +//
|
|
| 165 | +// @Test
|
|
| 166 | +// fun `GIVEN non-empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit =
|
|
| 167 | +// runBlocking {
|
|
| 168 | +// val localResponse = JSONObject(rawJson)
|
|
| 169 | +// val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(123u, createMockProviderList())
|
|
| 170 | +//
|
|
| 171 | +// `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse)
|
|
| 172 | +// doAnswer {
|
|
| 173 | +// localResponse
|
|
| 174 | +// }.`when`(mockReadJson)()
|
|
| 175 | +// doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any())
|
|
| 176 | +//
|
|
| 177 | +// baseTelemetry.setProviderList(mockRepo.updateProviderList())
|
|
| 178 | +//
|
|
| 179 | +// assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString())
|
|
| 180 | +// }
|
|
| 181 | +//
|
|
| 182 | +// fun getProviderForUrl(url: String): SearchProviderModel? {
|
|
| 183 | +// return createMockProviderList().find { provider ->
|
|
| 184 | +// provider.searchPageRegexp.pattern.toRegex().containsMatchIn(url)
|
|
| 185 | +// }
|
|
| 186 | +// }
|
|
| 187 | 187 | } |
| ... | ... | @@ -23,70 +23,70 @@ import org.robolectric.RobolectricTestRunner |
| 23 | 23 | |
| 24 | 24 | @RunWith(RobolectricTestRunner::class)
|
| 25 | 25 | class SerpTelemetryRepositoryTest {
|
| 26 | - @Mock
|
|
| 27 | - private lateinit var mockRemoteSettingsClient: RemoteSettingsClient
|
|
| 28 | - |
|
| 29 | - private lateinit var serpTelemetryRepository: SerpTelemetryRepository
|
|
| 30 | - |
|
| 31 | - @Before
|
|
| 32 | - fun setup() {
|
|
| 33 | - MockitoAnnotations.openMocks(this)
|
|
| 34 | - serpTelemetryRepository = SerpTelemetryRepository(
|
|
| 35 | - rootStorageDirectory = mock(),
|
|
| 36 | - readJson = mock(),
|
|
| 37 | - collectionName = "",
|
|
| 38 | - serverUrl = "https://test.server",
|
|
| 39 | - bucketName = "",
|
|
| 40 | - )
|
|
| 41 | - |
|
| 42 | - serpTelemetryRepository.remoteSettingsClient = mockRemoteSettingsClient
|
|
| 43 | - }
|
|
| 44 | - |
|
| 45 | - @Test
|
|
| 46 | - fun `GIVEN non-empty response WHEN writeToCache is called THEN the result is a success`() = runBlocking {
|
|
| 47 | - val records = listOf(
|
|
| 48 | - RemoteSettingsRecord("1", 123u, false, null, JSONObject()),
|
|
| 49 | - RemoteSettingsRecord("2", 456u, true, null, JSONObject()),
|
|
| 50 | - )
|
|
| 51 | - val response = RemoteSettingsResponse(records, 125614567U)
|
|
| 52 | - |
|
| 53 | - `when`(mockRemoteSettingsClient.write(response))
|
|
| 54 | - .thenReturn(RemoteSettingsResult.Success(response))
|
|
| 55 | - |
|
| 56 | - val result = serpTelemetryRepository.writeToCache(response)
|
|
| 57 | - |
|
| 58 | - assertTrue(result is RemoteSettingsResult.Success)
|
|
| 59 | - assertEquals(response, (result as RemoteSettingsResult.Success).response)
|
|
| 60 | - }
|
|
| 61 | - |
|
| 62 | - @Test
|
|
| 63 | - fun `GIVEN non-empty response WHEN fetchRemoteResponse is called THEN the result is equal to the response`() = runBlocking {
|
|
| 64 | - val records = listOf(
|
|
| 65 | - RemoteSettingsRecord("1", 123u, false, null, JSONObject()),
|
|
| 66 | - RemoteSettingsRecord("2", 456u, true, null, JSONObject()),
|
|
| 67 | - )
|
|
| 68 | - val response = RemoteSettingsResponse(records, 125614567U)
|
|
| 69 | - `when`(mockRemoteSettingsClient.fetch())
|
|
| 70 | - .thenReturn(RemoteSettingsResult.Success(response))
|
|
| 71 | - |
|
| 72 | - val result = serpTelemetryRepository.fetchRemoteResponse()
|
|
| 73 | - |
|
| 74 | - assertEquals(response, result)
|
|
| 75 | - }
|
|
| 76 | - |
|
| 77 | - @Test
|
|
| 78 | - fun `GIVEN non-empty response WHEN loadProvidersFromCache is called THEN the result is equal to the response`() = runBlocking {
|
|
| 79 | - val records = listOf(
|
|
| 80 | - RemoteSettingsRecord("1", 123u, false, null, JSONObject()),
|
|
| 81 | - RemoteSettingsRecord("2", 456u, true, null, JSONObject()),
|
|
| 82 | - )
|
|
| 83 | - val response = RemoteSettingsResponse(records, 125614567U)
|
|
| 84 | - `when`(mockRemoteSettingsClient.read())
|
|
| 85 | - .thenReturn(RemoteSettingsResult.Success(response))
|
|
| 86 | - |
|
| 87 | - val result = serpTelemetryRepository.loadProvidersFromCache()
|
|
| 88 | - |
|
| 89 | - assertEquals(response.lastModified, result.first)
|
|
| 90 | - assertEquals(response.records.mapNotNull { it.fields.toSearchProviderModel() }, result.second)
|
|
| 91 | - }
|
|
| 26 | +// @Mock
|
|
| 27 | +// private lateinit var mockRemoteSettingsClient: RemoteSettingsClient
|
|
| 28 | +//
|
|
| 29 | +// private lateinit var serpTelemetryRepository: SerpTelemetryRepository
|
|
| 30 | +//
|
|
| 31 | +// @Before
|
|
| 32 | +// fun setup() {
|
|
| 33 | +// MockitoAnnotations.openMocks(this)
|
|
| 34 | +// serpTelemetryRepository = SerpTelemetryRepository(
|
|
| 35 | +// rootStorageDirectory = mock(),
|
|
| 36 | +// readJson = mock(),
|
|
| 37 | +// collectionName = "",
|
|
| 38 | +// serverUrl = "https://test.server",
|
|
| 39 | +// bucketName = "",
|
|
| 40 | +// )
|
|
| 41 | +//
|
|
| 42 | +// serpTelemetryRepository.remoteSettingsClient = mockRemoteSettingsClient
|
|
| 43 | +// }
|
|
| 44 | +//
|
|
| 45 | +// @Test
|
|
| 46 | +// fun `GIVEN non-empty response WHEN writeToCache is called THEN the result is a success`() = runBlocking {
|
|
| 47 | +// val records = listOf(
|
|
| 48 | +// RemoteSettingsRecord("1", 123u, false, null, JSONObject()),
|
|
| 49 | +// RemoteSettingsRecord("2", 456u, true, null, JSONObject()),
|
|
| 50 | +// )
|
|
| 51 | +// val response = RemoteSettingsResponse(records, 125614567U)
|
|
| 52 | +//
|
|
| 53 | +// `when`(mockRemoteSettingsClient.write(response))
|
|
| 54 | +// .thenReturn(RemoteSettingsResult.Success(response))
|
|
| 55 | +//
|
|
| 56 | +// val result = serpTelemetryRepository.writeToCache(response)
|
|
| 57 | +//
|
|
| 58 | +// assertTrue(result is RemoteSettingsResult.Success)
|
|
| 59 | +// assertEquals(response, (result as RemoteSettingsResult.Success).response)
|
|
| 60 | +// }
|
|
| 61 | +//
|
|
| 62 | +// @Test
|
|
| 63 | +// fun `GIVEN non-empty response WHEN fetchRemoteResponse is called THEN the result is equal to the response`() = runBlocking {
|
|
| 64 | +// val records = listOf(
|
|
| 65 | +// RemoteSettingsRecord("1", 123u, false, null, JSONObject()),
|
|
| 66 | +// RemoteSettingsRecord("2", 456u, true, null, JSONObject()),
|
|
| 67 | +// )
|
|
| 68 | +// val response = RemoteSettingsResponse(records, 125614567U)
|
|
| 69 | +// `when`(mockRemoteSettingsClient.fetch())
|
|
| 70 | +// .thenReturn(RemoteSettingsResult.Success(response))
|
|
| 71 | +//
|
|
| 72 | +// val result = serpTelemetryRepository.fetchRemoteResponse()
|
|
| 73 | +//
|
|
| 74 | +// assertEquals(response, result)
|
|
| 75 | +// }
|
|
| 76 | +//
|
|
| 77 | +// @Test
|
|
| 78 | +// fun `GIVEN non-empty response WHEN loadProvidersFromCache is called THEN the result is equal to the response`() = runBlocking {
|
|
| 79 | +// val records = listOf(
|
|
| 80 | +// RemoteSettingsRecord("1", 123u, false, null, JSONObject()),
|
|
| 81 | +// RemoteSettingsRecord("2", 456u, true, null, JSONObject()),
|
|
| 82 | +// )
|
|
| 83 | +// val response = RemoteSettingsResponse(records, 125614567U)
|
|
| 84 | +// `when`(mockRemoteSettingsClient.read())
|
|
| 85 | +// .thenReturn(RemoteSettingsResult.Success(response))
|
|
| 86 | +//
|
|
| 87 | +// val result = serpTelemetryRepository.loadProvidersFromCache()
|
|
| 88 | +//
|
|
| 89 | +// assertEquals(response.lastModified, result.first)
|
|
| 90 | +// assertEquals(response.records.mapNotNull { it.fields.toSearchProviderModel() }, result.second)
|
|
| 91 | +// }
|
|
| 92 | 92 | } |
| ... | ... | @@ -64,18 +64,20 @@ class RemoteSettingsClient( |
| 64 | 64 | */
|
| 65 | 65 | @Suppress("TooGenericExceptionCaught")
|
| 66 | 66 | suspend fun fetch(): RemoteSettingsResult = withContext(Dispatchers.IO) {
|
| 67 | - try {
|
|
| 68 | - val serverRecords = RemoteSettings(config).use {
|
|
| 69 | - it.getRecords()
|
|
| 70 | - }
|
|
| 71 | - RemoteSettingsResult.Success(serverRecords)
|
|
| 72 | - } catch (e: RemoteSettingsException) {
|
|
| 73 | - Logger.error(e.message.toString())
|
|
| 74 | - RemoteSettingsResult.NetworkFailure(e)
|
|
| 75 | - } catch (e: NullPointerException) {
|
|
| 76 | - Logger.error(e.message.toString())
|
|
| 77 | - RemoteSettingsResult.NetworkFailure(e)
|
|
| 78 | - }
|
|
| 67 | +// try {
|
|
| 68 | +// val serverRecords = RemoteSettings(config).use {
|
|
| 69 | +// it.getRecords()
|
|
| 70 | +// }
|
|
| 71 | +// RemoteSettingsResult.Success(serverRecords)
|
|
| 72 | +// } catch (e: RemoteSettingsException) {
|
|
| 73 | +// Logger.error(e.message.toString())
|
|
| 74 | +// RemoteSettingsResult.NetworkFailure(e)
|
|
| 75 | +// } catch (e: NullPointerException) {
|
|
| 76 | +// Logger.error(e.message.toString())
|
|
| 77 | +// RemoteSettingsResult.NetworkFailure(e)
|
|
| 78 | +// }
|
|
| 79 | + RemoteSettingsResult.NetworkFailure(Exception("tb-43113: no remote fetching"))
|
|
| 80 | + |
|
| 79 | 81 | }
|
| 80 | 82 | |
| 81 | 83 | /**
|
| ... | ... | @@ -123,7 +125,8 @@ class RemoteSettingsClient( |
| 123 | 125 | suspend fun RemoteSettingsClient.readOrFetch(): RemoteSettingsResult {
|
| 124 | 126 | val readResult = read()
|
| 125 | 127 | return if (readResult is RemoteSettingsResult.DiskFailure) {
|
| 126 | - fetch()
|
|
| 128 | + //fetch()
|
|
| 129 | + RemoteSettingsResult.NetworkFailure(Exception("tb-43113: no remote fetching"))
|
|
| 127 | 130 | } else {
|
| 128 | 131 | readResult
|
| 129 | 132 | }
|