Skip to content

Commit b5083be

Browse files
CDRussellsubsymbolic
authored andcommitted
Periodic configuration downloading
1 parent a1c8650 commit b5083be

33 files changed

+686
-183
lines changed

app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/HTTPSUpgraderTest.kt renamed to app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/HttpsUpgraderTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,22 @@
1717
package com.duckduckgo.app.httpsupgrade
1818

1919
import android.net.Uri
20-
import com.duckduckgo.app.httpsupgrade.db.HTTPSUpgradeDomainDAO
20+
import com.duckduckgo.app.httpsupgrade.db.HttpsUpgradeDomainDao
2121
import com.nhaarman.mockito_kotlin.mock
2222
import com.nhaarman.mockito_kotlin.whenever
2323
import org.junit.Assert.*
2424
import org.junit.Before
2525
import org.junit.Test
2626

27-
class HTTPSUpgraderTest {
27+
class HttpsUpgraderTest {
2828

29-
lateinit var testee: HTTPSUpgrader
30-
lateinit var mockDao: HTTPSUpgradeDomainDAO
29+
lateinit var testee: HttpsUpgrader
30+
lateinit var mockDao: HttpsUpgradeDomainDao
3131

3232
@Before
3333
fun before() {
3434
mockDao = mock()
35-
testee = HTTPSUpgrader(mockDao)
35+
testee = HttpsUpgrader(mockDao)
3636
}
3737

3838
@Test

app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HTTPSUpgradeJsonTest.kt renamed to app/src/androidTest/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeJsonTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ import org.junit.Assert.assertEquals
2121
import org.junit.Test
2222

2323

24-
class HTTPSUpgradeJsonTest {
24+
class HttpsUpgradeJsonTest {
2525

2626
@Test
2727
fun whenGivenValidJsonThenParsesCorrectly() {
28-
val moshi = Moshi.Builder().add(HTTPSUpgradeDomainFromStringAdapter()).build()
29-
val adapter = moshi.adapter(HTTPSUpgradeJson::class.java)
28+
val moshi = Moshi.Builder().add(HttpsUpgradeDomainFromStringAdapter()).build()
29+
val adapter = moshi.adapter(HttpsUpgradeJson::class.java)
3030
val list = adapter.fromJson(json())
3131
assertEquals(5, list.simpleUpgrade.top500.count())
3232
}
Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ import android.arch.persistence.room.Room
2020
import android.support.test.InstrumentationRegistry
2121
import com.duckduckgo.app.global.db.AppDatabase
2222
import org.junit.After
23-
import org.junit.Assert.*
23+
import org.junit.Assert.assertFalse
24+
import org.junit.Assert.assertTrue
2425
import org.junit.Before
2526
import org.junit.Test
2627

27-
class HTTPSUpgradeDomainDAOTest {
28+
class HttpsUpgradeDomainDaoTest {
2829

2930
companion object {
3031
var exactMatchDomain = "bbc.co.uk"
@@ -36,12 +37,12 @@ class HTTPSUpgradeDomainDAOTest {
3637
}
3738

3839
private lateinit var db: AppDatabase
39-
private lateinit var dao: HTTPSUpgradeDomainDAO
40+
private lateinit var dao: HttpsUpgradeDomainDao
4041

4142
@Before
4243
fun before() {
4344
db = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getContext(), AppDatabase::class.java).build()
44-
dao = db.httpsUpgradeDomainDAO()
45+
dao = db.httpsUpgradeDomainDao()
4546
}
4647

4748
@After
@@ -51,44 +52,44 @@ class HTTPSUpgradeDomainDAOTest {
5152

5253
@Test
5354
fun whenExactMatchDomainAddedAndThenAllDeletedThenDoesNotContainExactMatchDomain() {
54-
dao.insertAll(HTTPSUpgradeDomain(exactMatchDomain))
55+
dao.insertAll(HttpsUpgradeDomain(exactMatchDomain))
5556
dao.deleteAll()
5657
assertFalse(dao.contains(exactMatchDomain))
5758
}
5859

5960
@Test
6061
fun whenWildcardDomainInsertedModelThenDoesNotContainParentOfWildcardDomain() {
61-
dao.insertAll(HTTPSUpgradeDomain(wildcardDomain))
62+
dao.insertAll(HttpsUpgradeDomain(wildcardDomain))
6263
assertFalse(dao.contains(parentOfWildcardDomain))
6364
}
6465

6566
@Test
6667
fun whenOtherWildcardDomainInsertedThenModelDoesNotContainExampleWildcardDomain() {
67-
dao.insertAll(HTTPSUpgradeDomain(otherWildcardDomain))
68+
dao.insertAll(HttpsUpgradeDomain(otherWildcardDomain))
6869
assertFalse(dao.contains(exampleWildcardDomain))
6970
}
7071

7172
@Test
7273
fun whenWildcardDomainInsertedThenModelDoesNotContainExactMatchDomain() {
73-
dao.insertAll(HTTPSUpgradeDomain(wildcardDomain))
74+
dao.insertAll(HttpsUpgradeDomain(wildcardDomain))
7475
assertFalse(dao.contains(exactMatchDomain))
7576
}
7677

7778
@Test
7879
fun whenWildcardDomainInsertedThenModelContainsExampleWildcardDomain() {
79-
dao.insertAll(HTTPSUpgradeDomain(wildcardDomain))
80+
dao.insertAll(HttpsUpgradeDomain(wildcardDomain))
8081
assertTrue(dao.contains(exampleWildcardDomain))
8182
}
8283

8384
@Test
8485
fun whenExactMatchDomainInsertedThenModelDoesNotContainOtherDomain() {
85-
dao.insertAll(HTTPSUpgradeDomain(exactMatchDomain))
86+
dao.insertAll(HttpsUpgradeDomain(exactMatchDomain))
8687
assertFalse(dao.contains(otherDomain))
8788
}
8889

8990
@Test
9091
fun whenExactMatchDomainIsInsertedThenModelContainsExactMatchDomain() {
91-
dao.insertAll(HTTPSUpgradeDomain(exactMatchDomain))
92+
dao.insertAll(HttpsUpgradeDomain(exactMatchDomain))
9293
assertTrue(dao.contains(exactMatchDomain))
9394
}
9495

app/src/androidTest/java/com/duckduckgo/app/trackerdetection/TrackerDetectorTest.kt

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
package com.duckduckgo.app.trackerdetection
1818

1919
import com.duckduckgo.app.privacymonitor.store.PrivacySettingsStore
20+
import com.duckduckgo.app.trackerdetection.Client.ClientName.EASYLIST
21+
import com.duckduckgo.app.trackerdetection.Client.ClientName.EASYPRIVACY
2022
import com.duckduckgo.app.trackerdetection.model.*
2123
import com.nhaarman.mockito_kotlin.any
2224
import com.nhaarman.mockito_kotlin.mock
2325
import com.nhaarman.mockito_kotlin.whenever
24-
import org.junit.Assert.assertEquals
25-
import org.junit.Assert.assertNull
26+
import org.junit.Assert.*
2627
import org.junit.Test
2728
import org.mockito.ArgumentMatchers.anyString
2829

@@ -38,23 +39,52 @@ class TrackerDetectorTest {
3839
private val network = "Network"
3940
}
4041

42+
@Test
43+
fun whenThereAreNoClientsThenClientCountIsZero() {
44+
assertEquals(0, trackerDetector.clientCount)
45+
}
46+
47+
@Test
48+
fun whenClientAddedThenClientCountIsOne() {
49+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
50+
assertEquals(1, trackerDetector.clientCount)
51+
}
52+
53+
@Test
54+
fun whenTwoClientsWithDifferentNamesAddedThenCountIsTwo() {
55+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
56+
trackerDetector.addClient(alwaysMatchingClient(EASYPRIVACY))
57+
assertEquals(2, trackerDetector.clientCount)
58+
}
59+
60+
@Test
61+
fun whenTwoClientsWithSameNameAddedThenClientIsReplacedAndCountIsStillOne() {
62+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
63+
assertEquals(1, trackerDetector.clientCount)
64+
assertNotNull(trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType))
65+
66+
trackerDetector.addClient(neverMatchingClient(EASYLIST))
67+
assertEquals(1, trackerDetector.clientCount)
68+
assertNull(trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType))
69+
}
70+
4171
@Test
4272
fun whenThereAreNoClientsThenEvaluateReturnsNull() {
4373
assertNull(trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType))
4474
}
4575

4676
@Test
4777
fun whenAllClientsFailToMatchThenEvaluateReturnsNull() {
48-
trackerDetector.addClient(neverMatchingClient())
49-
trackerDetector.addClient(neverMatchingClient())
78+
trackerDetector.addClient(neverMatchingClient(EASYLIST))
79+
trackerDetector.addClient(neverMatchingClient(EASYPRIVACY))
5080
assertNull(trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType))
5181
}
5282

5383
@Test
5484
fun whenPrivacyOnAndAllClientsMatchThenEvaluateReturnsBlockedTrackingEvent() {
5585
whenever(settingStore.privacyOn).thenReturn(true)
56-
trackerDetector.addClient(alwaysMatchingClient())
57-
trackerDetector.addClient(alwaysMatchingClient())
86+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
87+
trackerDetector.addClient(alwaysMatchingClient(EASYPRIVACY))
5888
val expected = TrackingEvent("http://example.com/index.com", "http://thirdparty.com/update.js", null, true)
5989
val actual = trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType)
6090
assertEquals(expected, actual)
@@ -63,8 +93,8 @@ class TrackerDetectorTest {
6393
@Test
6494
fun whenPrivacyOffAndAllClientsMatchThenEvaluateReturnsUnblockedTrackingEvent() {
6595
whenever(settingStore.privacyOn).thenReturn(false)
66-
trackerDetector.addClient(alwaysMatchingClient())
67-
trackerDetector.addClient(alwaysMatchingClient())
96+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
97+
trackerDetector.addClient(alwaysMatchingClient(EASYPRIVACY))
6898
val expected = TrackingEvent("http://example.com/index.com", "http://thirdparty.com/update.js", null, false)
6999
val actual = trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType)
70100
assertEquals(expected, actual)
@@ -73,8 +103,8 @@ class TrackerDetectorTest {
73103
@Test
74104
fun whenPrivacyOnAndSomeClientsMatchThenEvaluateReturnsBlockedTrackingEvent() {
75105
whenever(settingStore.privacyOn).thenReturn(true)
76-
trackerDetector.addClient(neverMatchingClient())
77-
trackerDetector.addClient(alwaysMatchingClient())
106+
trackerDetector.addClient(neverMatchingClient(EASYLIST))
107+
trackerDetector.addClient(alwaysMatchingClient(EASYPRIVACY))
78108
val expected = TrackingEvent("http://example.com/index.com", "http://thirdparty.com/update.js", null, true)
79109
val actual = trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType)
80110
assertEquals(expected, actual)
@@ -83,8 +113,8 @@ class TrackerDetectorTest {
83113
@Test
84114
fun whenPrivacyOffAndSomeClientsMatchThenEvaluateReturnsUnblockedTrackingEvent() {
85115
whenever(settingStore.privacyOn).thenReturn(false)
86-
trackerDetector.addClient(neverMatchingClient())
87-
trackerDetector.addClient(alwaysMatchingClient())
116+
trackerDetector.addClient(neverMatchingClient(EASYLIST))
117+
trackerDetector.addClient(alwaysMatchingClient(EASYPRIVACY))
88118
val expected = TrackingEvent("http://example.com/index.com", "http://thirdparty.com/update.js", null, false)
89119
val actual = trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType)
90120
assertEquals(expected, actual)
@@ -97,7 +127,7 @@ class TrackerDetectorTest {
97127
)
98128
whenever(settingStore.privacyOn).thenReturn(true)
99129
networkTrackers.updateData(networks)
100-
trackerDetector.addClient(alwaysMatchingClient())
130+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
101131

102132
val network = TrackerNetwork(network, "http://network.com", category = "category")
103133
val expected = TrackingEvent("http://example.com/index.com", "http://thirdparty.com/update.js", network, true)
@@ -107,19 +137,19 @@ class TrackerDetectorTest {
107137

108138
@Test
109139
fun whenUrlHasSameDomainAsDocumentThenEvaluateReturnsNull() {
110-
trackerDetector.addClient(alwaysMatchingClient())
140+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
111141
assertNull(trackerDetector.evaluate("http://example.com/update.js", "http://example.com/index.com", resourceType))
112142
}
113143

114144
@Test
115145
fun whenUrlIsSubdomainOfDocumentThenEvaluateReturnsNull() {
116-
trackerDetector.addClient(alwaysMatchingClient())
146+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
117147
assertNull(trackerDetector.evaluate("http://mobile.example.com/update.js", "http://example.com/index.com", resourceType))
118148
}
119149

120150
@Test
121151
fun whenUrlIsParentOfDocumentThenEvaluateReturnsNull() {
122-
trackerDetector.addClient(alwaysMatchingClient())
152+
trackerDetector.addClient(alwaysMatchingClient(EASYLIST))
123153
assertNull(trackerDetector.evaluate("http://example.com/update.js", "http://mobile.example.com/index.com", resourceType))
124154
}
125155

@@ -147,16 +177,17 @@ class TrackerDetectorTest {
147177
assertNull(trackerDetector.evaluate("http://thirdparty.com/update.js", "http://example.com/index.com", resourceType))
148178
}
149179

150-
private fun alwaysMatchingClient(): Client {
180+
private fun alwaysMatchingClient(name: Client.ClientName): Client {
151181
val client: Client = mock()
182+
whenever(client.name).thenReturn(name)
152183
whenever(client.matches(anyString(), anyString(), any())).thenReturn(true)
153184
return client
154185
}
155186

156-
private fun neverMatchingClient(): Client {
187+
private fun neverMatchingClient(name: Client.ClientName): Client {
157188
val client: Client = mock()
189+
whenever(client.name).thenReturn(name)
158190
whenever(client.matches(anyString(), anyString(), any())).thenReturn(false)
159191
return client
160192
}
161-
162193
}

app/src/main/AndroidManifest.xml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package="com.duckduckgo.app.browser">
55

66
<uses-permission android:name="android.permission.INTERNET" />
7+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
78

89
<application
910
android:name="com.duckduckgo.app.global.DuckDuckGoApplication"
@@ -36,7 +37,8 @@
3637
<activity
3738
android:name="com.duckduckgo.app.privacymonitor.ui.TrackerNetworksActivity"
3839
android:label="@string/networksActivityTitle"
39-
android:parentActivityName="com.duckduckgo.app.privacymonitor.ui.TrackerNetworksActivity" />
40+
android:parentActivityName="com.duckduckgo.app.privacymonitor.ui.TrackerNetworksActivity"
41+
android:screenOrientation="fullSensor" />
4042
<activity
4143
android:name="com.duckduckgo.app.privacymonitor.ui.PrivacyPracticesActivity"
4244
android:label="@string/privacyTermsActivityTitle"
@@ -51,9 +53,13 @@
5153
android:name="com.duckduckgo.app.about.AboutDuckDuckGoActivity"
5254
android:label="@string/aboutActivityTitle"
5355
android:parentActivityName="com.duckduckgo.app.settings.SettingsActivity"
54-
android:theme="@style/AppTheme"
55-
android:screenOrientation="fullSensor" >
56-
</activity>
56+
android:screenOrientation="fullSensor"
57+
android:theme="@style/AppTheme" />
58+
59+
<service
60+
android:name="com.duckduckgo.app.job.AppConfigurationJobService"
61+
android:permission="android.permission.BIND_JOB_SERVICE" />
62+
5763
</application>
5864

5965
</manifest>

app/src/main/java/com/duckduckgo/app/browser/BrowserWebViewClient.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import android.webkit.WebResourceResponse
2424
import android.webkit.WebView
2525
import android.webkit.WebViewClient
2626
import com.duckduckgo.app.global.isHttp
27-
import com.duckduckgo.app.httpsupgrade.HTTPSUpgrader
27+
import com.duckduckgo.app.httpsupgrade.HttpsUpgrader
2828
import com.duckduckgo.app.trackerdetection.TrackerDetector
2929
import com.duckduckgo.app.trackerdetection.model.ResourceType
3030
import timber.log.Timber
@@ -34,7 +34,7 @@ import javax.inject.Inject
3434
class BrowserWebViewClient @Inject constructor(
3535
private val requestRewriter: DuckDuckGoRequestRewriter,
3636
private var trackerDetector: TrackerDetector,
37-
private var httpsUpgrader: HTTPSUpgrader
37+
private var httpsUpgrader: HttpsUpgrader
3838
) : WebViewClient() {
3939

4040
var webViewClientListener: WebViewClientListener? = null

app/src/main/java/com/duckduckgo/app/di/ActivityBindingModule.kt renamed to app/src/main/java/com/duckduckgo/app/di/AndroidBindingModule.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@
1717
package com.duckduckgo.app.di
1818

1919
import com.duckduckgo.app.browser.BrowserActivity
20+
import com.duckduckgo.app.job.AppConfigurationJobService
2021
import com.duckduckgo.app.privacymonitor.ui.PrivacyDashboardActivity
2122
import com.duckduckgo.app.privacymonitor.ui.PrivacyPracticesActivity
22-
import com.duckduckgo.app.settings.SettingsActivity
2323
import com.duckduckgo.app.privacymonitor.ui.TrackerNetworksActivity
24-
24+
import com.duckduckgo.app.settings.SettingsActivity
2525
import dagger.Module
2626
import dagger.android.ContributesAndroidInjector
2727

28+
2829
@Module
29-
abstract class ActivityBindingModule {
30+
abstract class AndroidBindingModule {
31+
32+
/* Activities */
3033

3134
@ActivityScoped
3235
@ContributesAndroidInjector
@@ -47,4 +50,10 @@ abstract class ActivityBindingModule {
4750
@ActivityScoped
4851
@ContributesAndroidInjector
4952
abstract fun settingsActivity(): SettingsActivity
53+
54+
55+
/* Services */
56+
57+
@ContributesAndroidInjector
58+
abstract fun jobService(): AppConfigurationJobService
5059
}

app/src/main/java/com/duckduckgo/app/di/AppComponent.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import javax.inject.Singleton
2828
@Singleton
2929
@Component(modules = [
3030
(ApplicationModule::class),
31-
(ActivityBindingModule::class),
31+
(JobsModule::class),
32+
(AndroidBindingModule::class),
3233
(AndroidSupportInjectionModule::class),
3334
(NetworkModule::class),
3435
(PrivacyModule::class),

0 commit comments

Comments
 (0)