Commits:
4 changed files:
Changes:
mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepository.kt
... |
... |
@@ -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
|
|
mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/BaseSearchTelemetryTest.kt
... |
... |
@@ -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 = "">
|
|
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 = ""
|
|
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
|
} |
mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepositoryTest.kt
... |
... |
@@ -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
|
} |
mobile/android/android-components/components/support/remotesettings/src/main/java/mozilla/components/support/remotesettings/RemoteSettingsClient.kt
... |
... |
@@ -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
|
}
|
|