Skip to content

Commit 3423143

Browse files
authored
Simplify InitCalendarProviderRule (#940)
Simplify InitCalendarProviderRule
1 parent d0358a9 commit 3423143

File tree

4 files changed

+64
-56
lines changed

4 files changed

+64
-56
lines changed

app/src/androidTest/AndroidManifest.xml

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
<uses-permission android:name="android.permission.GET_ACCOUNTS" android:maxSdkVersion="22"/>
88
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" android:maxSdkVersion="22"/>
99

10-
1110
<application>
1211

1312
<!-- test account type (without associated sync adapters) -->

app/src/androidTest/kotlin/at/bitfire/davdroid/InitCalendarProviderRule.kt

+51-45
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package at.bitfire.davdroid
66

77
import android.Manifest
88
import android.accounts.Account
9+
import android.content.ContentProviderClient
910
import android.content.ContentUris
1011
import android.content.ContentValues
1112
import android.os.Build
@@ -18,10 +19,9 @@ import at.bitfire.ical4android.AndroidCalendar
1819
import at.bitfire.ical4android.Event
1920
import net.fortuna.ical4j.model.property.DtStart
2021
import net.fortuna.ical4j.model.property.RRule
22+
import org.junit.Assert.assertNotNull
23+
import org.junit.rules.ExternalResource
2124
import org.junit.rules.RuleChain
22-
import org.junit.rules.TestRule
23-
import org.junit.runner.Description
24-
import org.junit.runners.model.Statement
2525
import java.util.logging.Logger
2626

2727
/**
@@ -36,63 +36,69 @@ import java.util.logging.Logger
3636
*
3737
* If you run tests manually, just make sure to ignore the first run after the calendar
3838
* provider has been accessed the first time.
39+
*
40+
* See [at.bitfire.davdroid.resource.LocalCalendarTest] for how to use this rule.
3941
*/
40-
class InitCalendarProviderRule private constructor(): TestRule {
41-
42-
private val logger = Logger.getLogger(InitCalendarProviderRule::javaClass.name)
42+
class InitCalendarProviderRule private constructor(): ExternalResource() {
4343

4444
companion object {
45-
fun getInstance() = RuleChain
45+
46+
private var isInitialized = false
47+
private val logger = Logger.getLogger(InitCalendarProviderRule::javaClass.name)
48+
49+
fun getInstance(): RuleChain = RuleChain
4650
.outerRule(GrantPermissionRule.grant(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR))
4751
.around(InitCalendarProviderRule())
48-
}
4952

50-
override fun apply(base: Statement, description: Description): Statement {
51-
logger.info("Initializing calendar provider before running ${description.displayName}")
52-
return InitCalendarProviderStatement(base)
5353
}
5454

55-
56-
class InitCalendarProviderStatement(val base: Statement): Statement() {
57-
58-
private val logger = Logger.getLogger(InitCalendarProviderRule::javaClass.name)
59-
60-
override fun evaluate() {
55+
override fun before() {
56+
if (!isInitialized) {
57+
logger.info("Initializing calendar provider")
6158
if (Build.VERSION.SDK_INT < 31)
6259
logger.warning("Calendar provider initialization may or may not work. See InitCalendarProviderRule")
63-
initCalendarProvider()
6460

65-
base.evaluate()
61+
val context = InstrumentationRegistry.getInstrumentation().targetContext
62+
val client = context.contentResolver.acquireContentProviderClient(CalendarContract.AUTHORITY)
63+
assertNotNull("Couldn't acquire calendar provider", client)
64+
65+
client!!.use {
66+
initCalendarProvider(client)
67+
isInitialized = true
68+
}
6669
}
70+
}
6771

68-
private fun initCalendarProvider() {
69-
val account = Account("LocalCalendarTest", CalendarContract.ACCOUNT_TYPE_LOCAL)
70-
val context = InstrumentationRegistry.getInstrumentation().targetContext
71-
val provider = context.contentResolver.acquireContentProviderClient(CalendarContract.AUTHORITY)!!
72-
val uri = AndroidCalendar.create(account, provider, ContentValues())
73-
val calendar = AndroidCalendar.findByID(account, provider, LocalCalendar.Factory, ContentUris.parseId(uri))
74-
try {
75-
// single event init
76-
val normalEvent = Event().apply {
77-
dtStart = DtStart("20220120T010203Z")
78-
summary = "Event with 1 instance"
79-
}
80-
val normalLocalEvent = LocalEvent(calendar, normalEvent, null, null, null, 0)
81-
normalLocalEvent.add()
82-
LocalEvent.numInstances(provider, account, normalLocalEvent.id!!)
72+
private fun initCalendarProvider(provider: ContentProviderClient) {
73+
val account = Account("LocalCalendarTest", CalendarContract.ACCOUNT_TYPE_LOCAL)
74+
val uri = AndroidCalendar.create(account, provider, ContentValues())
75+
val calendar = AndroidCalendar.findByID(
76+
account,
77+
provider,
78+
LocalCalendar.Factory,
79+
ContentUris.parseId(uri)
80+
)
81+
try {
82+
// single event init
83+
val normalEvent = Event().apply {
84+
dtStart = DtStart("20220120T010203Z")
85+
summary = "Event with 1 instance"
86+
}
87+
val normalLocalEvent = LocalEvent(calendar, normalEvent, null, null, null, 0)
88+
normalLocalEvent.add()
89+
LocalEvent.numInstances(provider, account, normalLocalEvent.id!!)
8390

84-
// recurring event init
85-
val recurringEvent = Event().apply {
86-
dtStart = DtStart("20220120T010203Z")
87-
summary = "Event over 22 years"
88-
rRules.add(RRule("FREQ=YEARLY;UNTIL=20740119T010203Z")) // year needs to be >2074 (not supported by Android <11 Calendar Storage)
89-
}
90-
val localRecurringEvent = LocalEvent(calendar, recurringEvent, null, null, null, 0)
91-
localRecurringEvent.add()
92-
LocalEvent.numInstances(provider, account, localRecurringEvent.id!!)
93-
} finally {
94-
calendar.delete()
91+
// recurring event init
92+
val recurringEvent = Event().apply {
93+
dtStart = DtStart("20220120T010203Z")
94+
summary = "Event over 22 years"
95+
rRules.add(RRule("FREQ=YEARLY;UNTIL=20740119T010203Z")) // year needs to be >2074 (not supported by Android <11 Calendar Storage)
9596
}
97+
val localRecurringEvent = LocalEvent(calendar, recurringEvent, null, null, null, 0)
98+
localRecurringEvent.add()
99+
LocalEvent.numInstances(provider, account, localRecurringEvent.id!!)
100+
} finally {
101+
calendar.delete()
96102
}
97103
}
98104

app/src/androidTest/kotlin/at/bitfire/davdroid/resource/LocalCalendarTest.kt

+6-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.content.ContentValues
1111
import android.provider.CalendarContract
1212
import android.provider.CalendarContract.ACCOUNT_TYPE_LOCAL
1313
import android.provider.CalendarContract.Events
14+
import android.util.Log
1415
import androidx.test.platform.app.InstrumentationRegistry
1516
import at.bitfire.davdroid.InitCalendarProviderRule
1617
import at.bitfire.ical4android.AndroidCalendar
@@ -33,6 +34,7 @@ import org.junit.rules.TestRule
3334
class LocalCalendarTest {
3435

3536
companion object {
37+
3638
@JvmField
3739
@ClassRule
3840
val initCalendarProviderRule: TestRule = InitCalendarProviderRule.getInstance()
@@ -41,14 +43,14 @@ class LocalCalendarTest {
4143

4244
@BeforeClass
4345
@JvmStatic
44-
fun setUpProvider() {
46+
fun setUpClass() {
4547
val context = InstrumentationRegistry.getInstrumentation().targetContext
4648
provider = context.contentResolver.acquireContentProviderClient(CalendarContract.AUTHORITY)!!
4749
}
4850

4951
@AfterClass
5052
@JvmStatic
51-
fun closeProvider() {
53+
fun tearDownClass() {
5254
provider.closeCompat()
5355
}
5456

@@ -58,13 +60,13 @@ class LocalCalendarTest {
5860
private lateinit var calendar: LocalCalendar
5961

6062
@Before
61-
fun prepare() {
63+
fun setUp() {
6264
val uri = AndroidCalendar.create(account, provider, ContentValues())
6365
calendar = AndroidCalendar.findByID(account, provider, LocalCalendar.Factory, ContentUris.parseId(uri))
6466
}
6567

6668
@After
67-
fun shutdown() {
69+
fun tearDown() {
6870
calendar.delete()
6971
}
7072

app/src/androidTest/kotlin/at/bitfire/davdroid/resource/LocalEventTest.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,28 @@ class LocalEventTest {
4646
@ClassRule
4747
val initCalendarProviderRule: TestRule = InitCalendarProviderRule.getInstance()
4848

49-
private val account = Account("LocalCalendarTest", ACCOUNT_TYPE_LOCAL)
50-
5149
private lateinit var provider: ContentProviderClient
52-
private lateinit var calendar: LocalCalendar
5350

5451
@BeforeClass
5552
@JvmStatic
56-
fun connect() {
53+
fun setUpClass() {
5754
val context = InstrumentationRegistry.getInstrumentation().targetContext
5855
provider = context.contentResolver.acquireContentProviderClient(CalendarContract.AUTHORITY)!!
5956
}
6057

6158
@AfterClass
6259
@JvmStatic
63-
fun disconnect() {
60+
fun tearDownClass() {
6461
provider.closeCompat()
6562
}
63+
6664
}
6765

66+
private val account = Account("LocalCalendarTest", ACCOUNT_TYPE_LOCAL)
67+
private lateinit var calendar: LocalCalendar
68+
6869
@Before
69-
fun createCalendar() {
70+
fun setUp() {
7071
val uri = AndroidCalendar.create(account, provider, ContentValues())
7172
calendar = AndroidCalendar.findByID(account, provider, LocalCalendar.Factory, ContentUris.parseId(uri))
7273
}

0 commit comments

Comments
 (0)