From ebde19e387e8b54369f411331557e184259f3682 Mon Sep 17 00:00:00 2001 From: Victor Andreasson Date: Wed, 20 Mar 2024 07:41:18 +0100 Subject: [PATCH] Un-parameterize three time-sensitive tests This means the argument to the RetryTestRule is no longer in use, so remove it. --- .../java/com/orgzly/android/RetryTestRule.kt | 4 +- .../com/orgzly/android/query/QueryTest.kt | 17 +--- .../android/query/TimeSensitiveQueryTest.kt | 90 +++++++++++++++++++ 3 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 app/src/androidTest/java/com/orgzly/android/query/TimeSensitiveQueryTest.kt diff --git a/app/src/androidTest/java/com/orgzly/android/RetryTestRule.kt b/app/src/androidTest/java/com/orgzly/android/RetryTestRule.kt index 49564f437..c36faf04c 100644 --- a/app/src/androidTest/java/com/orgzly/android/RetryTestRule.kt +++ b/app/src/androidTest/java/com/orgzly/android/RetryTestRule.kt @@ -8,7 +8,7 @@ import org.junit.runners.model.Statement /** * Retry test rule used to retry test that failed. Retry failed test 3 times */ -class RetryTestRule(val retryCount: Int = 3, val sleepBetweenAttemptsMs: Long = 1000) : TestRule { +class RetryTestRule(val retryCount: Int = 3) : TestRule { private val TAG = RetryTestRule::class.java.simpleName @@ -30,7 +30,7 @@ class RetryTestRule(val retryCount: Int = 3, val sleepBetweenAttemptsMs: Long = } catch (t: Throwable) { caughtThrowable = t Log.e(TAG, description.displayName + ": run " + (i + 1) + " failed") - Thread.sleep(sleepBetweenAttemptsMs) + Thread.sleep(1000) } } diff --git a/app/src/androidTest/java/com/orgzly/android/query/QueryTest.kt b/app/src/androidTest/java/com/orgzly/android/query/QueryTest.kt index 58a44370c..d64ae157c 100644 --- a/app/src/androidTest/java/com/orgzly/android/query/QueryTest.kt +++ b/app/src/androidTest/java/com/orgzly/android/query/QueryTest.kt @@ -30,7 +30,7 @@ class QueryTest(private val param: Parameter) : OrgzlyTest() { @JvmField // Avoid sleeping between test attempts, as parameter creation vs test run // timing is sensitive for many of these tests. - val mRetryTestRule: TestRule = RetryTestRule(3, 0) + val mRetryTestRule: TestRule = RetryTestRule(3) data class Parameter( val queryString: String, @@ -194,16 +194,6 @@ class QueryTest(private val param: Parameter) : OrgzlyTest() { expectedQueryString = "s.3d", expectedSqlSelection = "((scheduled_is_active = 1 AND scheduled_time_timestamp != 0 AND scheduled_time_timestamp < " + TimeUtils.timeFromNow(Calendar.DAY_OF_MONTH, 3+1) + "))" ), - Parameter( - queryString = "s.le.2h", - expectedQueryString = "s.2h", - expectedSqlSelection = "((scheduled_is_active = 1 AND scheduled_time_timestamp != 0 AND scheduled_time_timestamp < " + TimeUtils.timeFromNow(Calendar.HOUR_OF_DAY, 2+1) + "))" - ), - Parameter( - queryString = "s.le.+2h", - expectedQueryString = "s.2h", - expectedSqlSelection = "((scheduled_is_active = 1 AND scheduled_time_timestamp != 0 AND scheduled_time_timestamp < " + TimeUtils.timeFromNow(Calendar.HOUR_OF_DAY, 2+1) + "))" - ), Parameter( queryString = "d.tom", expectedQueryString = "d.tomorrow", @@ -219,11 +209,6 @@ class QueryTest(private val param: Parameter) : OrgzlyTest() { expectedQueryString = "c.ge.yesterday", expectedSqlSelection = "((closed_time_timestamp != 0 AND ${TimeUtils.timeFromNow(Calendar.DAY_OF_MONTH, -1)} <= closed_time_timestamp))" ), - Parameter( - queryString = "c.gt.-1h", - expectedQueryString = "c.gt.-1h", - expectedSqlSelection = "((closed_time_timestamp != 0 AND ${TimeUtils.timeFromNow(Calendar.HOUR_OF_DAY, 0)} <= closed_time_timestamp))" - ), Parameter( queryString = "p.a", expectedQueryString = "p.a", diff --git a/app/src/androidTest/java/com/orgzly/android/query/TimeSensitiveQueryTest.kt b/app/src/androidTest/java/com/orgzly/android/query/TimeSensitiveQueryTest.kt new file mode 100644 index 000000000..9cd583f7e --- /dev/null +++ b/app/src/androidTest/java/com/orgzly/android/query/TimeSensitiveQueryTest.kt @@ -0,0 +1,90 @@ +package com.orgzly.android.query + +import androidx.test.espresso.matcher.ViewMatchers +import com.orgzly.android.OrgzlyTest +import com.orgzly.android.query.sql.SqliteQueryBuilder +import com.orgzly.android.query.user.DottedQueryParser +import org.hamcrest.Matchers +import org.junit.Test +import java.util.Calendar + +/** + * Parameterization works poorly for these cases, because when there are many parameters, + * there may be a too long delay between parameter creation and test run, so that the + * timestamp is too old when the test is run. + */ +class TimeSensitiveQueryTest : OrgzlyTest() { + @Test + fun testScheduledWithinHours1() { + // Parse query + val queryString = "s.le.2h" + val expectedSqlSelection = "((scheduled_is_active = 1 AND scheduled_time_timestamp != 0 AND scheduled_time_timestamp < " + TimeUtils.timeFromNow( + Calendar.HOUR_OF_DAY, 2+1) + "))" + val parser = DottedQueryParser() + val query = parser.parse(queryString) + + // Build SQL + val sqlBuilder = SqliteQueryBuilder(context) + val sqlQuery = sqlBuilder.build(query) + + // Build query + val actualSqlSelection = sqlQuery.selection + + expectedSqlSelection.let { + ViewMatchers.assertThat( + queryString, + actualSqlSelection, + Matchers.`is`(expectedSqlSelection) + ) + } + } + + @Test + fun testScheduledWithinHours2() { + // Parse query + val queryString = "s.le.+2h" + val expectedSqlSelection = "((scheduled_is_active = 1 AND scheduled_time_timestamp != 0 AND scheduled_time_timestamp < " + TimeUtils.timeFromNow( + Calendar.HOUR_OF_DAY, 2+1) + "))" + val parser = DottedQueryParser() + val query = parser.parse(queryString) + + // Build SQL + val sqlBuilder = SqliteQueryBuilder(context) + val sqlQuery = sqlBuilder.build(query) + + // Build query + val actualSqlSelection = sqlQuery.selection + + expectedSqlSelection.let { + ViewMatchers.assertThat( + queryString, + actualSqlSelection, + Matchers.`is`(expectedSqlSelection) + ) + } + } + + @Test + fun testClosedRecently() { + // Parse query + val queryString = "c.gt.-1h" + val expectedSqlSelection = "((closed_time_timestamp != 0 AND ${TimeUtils.timeFromNow(Calendar.HOUR_OF_DAY, 0)} <= closed_time_timestamp))" + val parser = DottedQueryParser() + val query = parser.parse(queryString) + + // Build SQL + val sqlBuilder = SqliteQueryBuilder(context) + val sqlQuery = sqlBuilder.build(query) + + // Build query + val actualSqlSelection = sqlQuery.selection + + expectedSqlSelection.let { + ViewMatchers.assertThat( + queryString, + actualSqlSelection, + Matchers.`is`(expectedSqlSelection) + ) + } + } +} \ No newline at end of file