Skip to content

Commit d37d2d3

Browse files
Fallback to the defaultSettings if cdn cannot be reached (#231)
* fallback to default settings, not null * fallback to default settings, not null * update tests * test: remove commented out code after confirming that the current test logic is correct. --------- Co-authored-by: Didier Garcia <digarcia@twilio.com>
1 parent 681920d commit d37d2d3

File tree

2 files changed

+43
-38
lines changed

2 files changed

+43
-38
lines changed

core/src/main/java/com/segment/analytics/kotlin/core/Settings.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,5 @@ internal fun Analytics.fetchSettings(
121121
it["writekey"] = writeKey
122122
it["message"] = "Error retrieving settings"
123123
}
124-
null
124+
configuration.defaultSettings
125125
}

core/src/test/kotlin/com/segment/analytics/kotlin/core/SettingsTests.kt

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,7 @@ class SettingsTests {
8888

8989
// no settings available, should not be called
9090
analytics.add(mockPlugin)
91-
verify (exactly = 0){
92-
mockPlugin.update(any(), any())
93-
}
91+
9492

9593
// load settings
9694
mockHTTPClient()
@@ -104,7 +102,7 @@ class SettingsTests {
104102
// load settings again
105103
mockHTTPClient()
106104
analytics.checkSettings()
107-
verify (exactly = 1) {
105+
verify (exactly = 2) {
108106
mockPlugin.update(any(), Plugin.UpdateType.Refresh)
109107
}
110108
}
@@ -232,95 +230,102 @@ class SettingsTests {
232230

233231
@Test
234232
fun `fetchSettings returns null when Settings string is invalid`() {
233+
val emptySettings = analytics.fetchSettings("emptySettingsObject", "cdn-settings.segment.com/v1")
235234
// Null on invalid JSON
236235
mockHTTPClient("")
237236
var settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
238-
assertNull(settings)
237+
assertEquals(emptySettings, settings)
239238

240239
// Null on invalid JSON
241240
mockHTTPClient("hello")
242241
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
243-
assertNull(settings)
242+
assertEquals(emptySettings, settings)
244243

245244
// Null on invalid JSON
246245
mockHTTPClient("#! /bin/sh")
247246
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
248-
assertNull(settings)
247+
assertEquals(emptySettings, settings)
249248

250249
// Null on invalid JSON
251250
mockHTTPClient("<!DOCTYPE html>")
252251
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
253-
assertNull(settings)
252+
assertEquals(emptySettings, settings)
254253

255254
// Null on invalid JSON
256255
mockHTTPClient("true")
257256
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
258-
assertNull(settings)
257+
assertEquals(emptySettings, settings)
259258

260259
// Null on invalid JSON
261260
mockHTTPClient("[]")
262261
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
263-
assertNull(settings)
262+
assertEquals(emptySettings, settings)
264263

265264
// Null on invalid JSON
266265
mockHTTPClient("}{")
267266
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
268-
assertNull(settings)
267+
assertEquals(emptySettings, settings)
269268

270269
// Null on invalid JSON
271270
mockHTTPClient("{{{{}}}}")
272271
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
273-
assertNull(settings)
272+
assertEquals(emptySettings, settings)
274273

275274
// Null on invalid JSON
276275
mockHTTPClient("{null:\"bar\"}")
277276
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
278-
assertNull(settings)
277+
assertEquals(emptySettings, settings)
279278
}
280279

281280
@Test
282281
fun `fetchSettings returns null when parameters are invalid`() {
282+
val emptySettings = analytics.fetchSettings("emptySettingsObject", "cdn-settings.segment.com/v1")
283283
mockHTTPClient("{\"integrations\":{}, \"plan\":{}, \"edgeFunction\": {}, \"middlewareSettings\": {}}")
284284

285285
// empty host
286286
var settings = analytics.fetchSettings("foo", "")
287-
assertNull(settings)
287+
assertEquals(emptySettings, settings)
288288

289289
// not a host name
290290
settings = analytics.fetchSettings("foo", "http://blah")
291-
assertNull(settings)
291+
assertEquals(emptySettings, settings)
292292

293293
// emoji
294294
settings = analytics.fetchSettings("foo", "😃")
295-
assertNull(settings)
295+
assertEquals(emptySettings, settings)
296296
}
297297

298298
@Test
299299
fun `fetchSettings returns null when Settings string is null for known properties`() {
300300
// Null if integrations is null
301301
mockHTTPClient("{\"integrations\":null}")
302302
var settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
303-
assertNull(settings)
304-
305-
// Null if plan is null
306-
mockHTTPClient("{\"plan\":null}")
307-
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
308-
assertNull(settings)
309-
310-
// Null if edgeFunction is null
311-
mockHTTPClient("{\"edgeFunction\":null}")
312-
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
313-
assertNull(settings)
314-
315-
// Null if middlewareSettings is null
316-
mockHTTPClient("{\"middlewareSettings\":null}")
317-
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
318-
assertNull(settings)
303+
assertTrue(settings?.integrations?.isEmpty() ?: true, "Integrations should be empty")
304+
assertTrue(settings?.plan?.isEmpty() ?: true, "Plan should be empty")
305+
assertTrue(settings?.edgeFunction?.isEmpty() ?: true, "EdgeFunction should be empty")
306+
assertTrue(settings?.middlewareSettings?.isEmpty() ?: true, "MiddlewareSettings should be empty")
307+
assertTrue(settings?.metrics?.isEmpty() ?: true, "Metrics should be empty")
308+
assertTrue(settings?.consentSettings?.isEmpty() ?: true, "ConsentSettings should be empty")
309+
310+
// // Null if plan is null
311+
// mockHTTPClient("{\"plan\":null}")
312+
// settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
313+
// assertNull(settings)
314+
//
315+
// // Null if edgeFunction is null
316+
// mockHTTPClient("{\"edgeFunction\":null}")
317+
// settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
318+
// assertNull(settings)
319+
//
320+
// // Null if middlewareSettings is null
321+
// mockHTTPClient("{\"middlewareSettings\":null}")
322+
// settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
323+
// assertNull(settings)
319324
}
320325

321326
@Test
322327
fun `known Settings property types must match json type`() {
323-
328+
val emptySettings = analytics.fetchSettings("emptySettingsObject", "cdn-settings.segment.com/v1")
324329
// integrations must be a JSON object
325330
mockHTTPClient("{\"integrations\":{}}")
326331
var settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
@@ -329,21 +334,21 @@ class SettingsTests {
329334
// Null if integrations is a number
330335
mockHTTPClient("{\"integrations\":123}")
331336
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
332-
assertNull(settings)
337+
assertEquals(emptySettings, settings)
333338

334339
// Null if integrations is a string
335340
mockHTTPClient("{\"integrations\":\"foo\"}")
336341
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
337-
assertNull(settings)
342+
assertEquals(emptySettings, settings)
338343

339344
// Null if integrations is an array
340345
mockHTTPClient("{\"integrations\":[\"foo\"]}")
341346
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
342-
assertNull(settings)
347+
assertEquals(emptySettings, settings)
343348

344349
// Null if integrations is an emoji (UTF-8 string)
345350
mockHTTPClient("{\"integrations\": 😃}")
346351
settings = analytics.fetchSettings("foo", "cdn-settings.segment.com/v1")
347-
assertNull(settings)
352+
assertEquals(emptySettings, settings)
348353
}
349354
}

0 commit comments

Comments
 (0)