From 40618b8c2b018ee61e299c7587334f5fd4278552 Mon Sep 17 00:00:00 2001 From: Sunik Kupfer Date: Wed, 22 Jun 2022 15:49:21 +0200 Subject: reduce number of rows in testLargeTransactionManyRows (closes bitfireAT/ical4android#42) (#44) * update emulator test apks * extract large transaction test to BatchOperationTest * leave testLargeTransactionSplitting flaky and use 2000 attendees in a smaller test --- .github/workflows/test-dev.yml | 6 +- .../at/bitfire/ical4android/AndroidEventTest.kt | 26 +---- .../at/bitfire/ical4android/BatchOperationTest.kt | 127 +++++++++++++++++++++ 3 files changed, 135 insertions(+), 24 deletions(-) create mode 100644 src/androidTest/java/at/bitfire/ical4android/BatchOperationTest.kt diff --git a/.github/workflows/test-dev.yml b/.github/workflows/test-dev.yml index 00dc614..952942d 100644 --- a/.github/workflows/test-dev.yml +++ b/.github/workflows/test-dev.yml @@ -54,11 +54,11 @@ jobs: run: | mkdir apk && cd apk wget -q -O org.dmfs.tasks.apk https://f-droid.org/archive/org.dmfs.tasks_80800.apk && adb install org.dmfs.tasks.apk - wget -q -O org.tasks.apk https://f-droid.org/archive/org.tasks_110701.apk && adb install org.tasks.apk - wget -q -O at.techbee.jtx.apk https://f-droid.org/repo/at.techbee.jtx_101010013.apk && adb install at.techbee.jtx.apk + wget -q -O org.tasks.apk https://f-droid.org/archive/org.tasks_120400.apk && adb install org.tasks.apk + wget -q -O at.techbee.jtx.apk https://f-droid.org/archive/at.techbee.jtx_100140002.apk && adb install at.techbee.jtx.apk cd .. - name: Run connected tests - run: ./gradlew connectedCheck + run: ./gradlew connectedCheck -Pandroid.testInstrumentationRunnerArguments.notAnnotation=androidx.test.filters.FlakyTest - name: Archive results uses: actions/upload-artifact@v2 with: diff --git a/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt b/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt index baaabb5..5eb0bdc 100644 --- a/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt @@ -2292,39 +2292,23 @@ class AndroidEventTest { - @LargeTest @Test - fun testLargeTransactionManyRows() { + fun testTransaction() { val event = Event() - event.uid = "sample1@testLargeTransaction" - event.summary = "Large event" + event.uid = "sample1@testTransaction" + event.summary = "an event" event.dtStart = DtStart("20150502T120000Z") event.dtEnd = DtEnd("20150502T130000Z") - for (i in 0 until 4000) + for (i in 0 until 20) event.attendees += Attendee(URI("mailto:att$i@example.com")) val uri = TestEvent(calendar, event).add() val testEvent = calendar.findById(ContentUris.parseId(uri)) try { - assertEquals(4000, testEvent.event!!.attendees.size) + assertEquals(20, testEvent.event!!.attendees.size) } finally { testEvent.delete() } } - @Test(expected = CalendarStorageException::class) - fun testLargeTransactionSingleRow() { - val event = Event() - event.uid = "sample1@testLargeTransaction" - event.dtStart = DtStart("20150502T120000Z") - event.dtEnd = DtEnd("20150502T130000Z") - - // 1 MB SUMMARY ... have fun - val data = CharArray(1024*1024) - Arrays.fill(data, 'x') - event.summary = String(data) - - TestEvent(calendar, event).add() - } - } diff --git a/src/androidTest/java/at/bitfire/ical4android/BatchOperationTest.kt b/src/androidTest/java/at/bitfire/ical4android/BatchOperationTest.kt new file mode 100644 index 0000000..27debf5 --- /dev/null +++ b/src/androidTest/java/at/bitfire/ical4android/BatchOperationTest.kt @@ -0,0 +1,127 @@ +/*************************************************************************************************** + * Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details. + **************************************************************************************************/ + +package at.bitfire.ical4android + +import android.Manifest +import android.accounts.Account +import android.content.ContentProviderClient +import android.content.ContentUris +import android.net.Uri +import android.provider.CalendarContract +import androidx.test.filters.FlakyTest +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.rule.GrantPermissionRule +import at.bitfire.ical4android.MiscUtils.ContentProviderClientHelper.closeCompat +import at.bitfire.ical4android.impl.TestCalendar +import at.bitfire.ical4android.impl.TestEvent +import net.fortuna.ical4j.model.property.Attendee +import net.fortuna.ical4j.model.property.DtEnd +import net.fortuna.ical4j.model.property.DtStart +import org.junit.* +import org.junit.Assert.* + +import java.net.URI +import java.util.* + +class BatchOperationTest { + + companion object { + + @JvmField + @ClassRule + val permissionRule = GrantPermissionRule.grant( + Manifest.permission.READ_CALENDAR, + Manifest.permission.WRITE_CALENDAR + ) + + lateinit var provider: ContentProviderClient + + @BeforeClass + @JvmStatic + fun connectProvider() { + provider = InstrumentationRegistry.getInstrumentation().targetContext.contentResolver.acquireContentProviderClient(CalendarContract.AUTHORITY)!! + } + + @AfterClass + @JvmStatic + fun closeProvider() { + provider.closeCompat() + } + + } + + private val testAccount = Account("ical4android@example.com", CalendarContract.ACCOUNT_TYPE_LOCAL) + + private lateinit var calendarUri: Uri + private lateinit var calendar: TestCalendar + + @Before + fun prepare() { + System.gc() + calendar = TestCalendar.findOrCreate(testAccount, provider) + assertNotNull(calendar) + calendarUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendar.id) + } + + @After + fun shutdown() { + calendar.delete() + System.gc() + } + + @Test + fun testTransactionSplitting() { + val event = Event() + event.uid = "sample1@testLargeTransaction" + event.summary = "Large event" + event.dtStart = DtStart("20150502T120000Z") + event.dtEnd = DtEnd("20150502T130000Z") + for (i in 0 until 2000) // 2000 attendees are enough for a transaction split to happen + event.attendees += Attendee(URI("mailto:att$i@example.com")) + val uri = TestEvent(calendar, event).add() + val testEvent = calendar.findById(ContentUris.parseId(uri)) + try { + assertEquals(2000, testEvent.event!!.attendees.size) + } finally { + testEvent.delete() + } + } + + @FlakyTest + @Test + fun testLargeTransactionSplitting() { + // with 4000 attendees, this test has been observed to fail on the CI server docker emulator. + // Too many Binders are sent to SYSTEM (see issue #42). Asking for GC in @Before/@After might help. + val event = Event() + event.uid = "sample1@testLargeTransaction" + event.summary = "Large event" + event.dtStart = DtStart("20150502T120000Z") + event.dtEnd = DtEnd("20150502T130000Z") + for (i in 0 until 4000) + event.attendees += Attendee(URI("mailto:att$i@example.com")) + val uri = TestEvent(calendar, event).add() + val testEvent = calendar.findById(ContentUris.parseId(uri)) + try { + assertEquals(4000, testEvent.event!!.attendees.size) + } finally { + testEvent.delete() + } + } + + @Test(expected = CalendarStorageException::class) + fun testLargeTransactionSingleRow() { + val event = Event() + event.uid = "sample1@testLargeTransaction" + event.dtStart = DtStart("20150502T120000Z") + event.dtEnd = DtEnd("20150502T130000Z") + + // 1 MB SUMMARY ... have fun + val data = CharArray(1024*1024) + Arrays.fill(data, 'x') + event.summary = String(data) + + TestEvent(calendar, event).add() + } +} \ No newline at end of file -- cgit v1.2.3