Convert class 'Clock' to an interface

This commit is contained in:
cketti 2021-10-23 03:53:19 +02:00
parent bbe015eea8
commit 20dfc9a75b
9 changed files with 27 additions and 45 deletions

View file

@ -1,32 +1,13 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fsck.k9;
package com.fsck.k9
/**
* A class provide the current time (like {@link System#currentTimeMillis()}).
* It's intended to be mocked out for unit tests.
* An interface to provide the current time.
*/
public class Clock {
public static final Clock INSTANCE = new Clock();
protected Clock() {
interface Clock {
val time: Long
}
public long getTime() {
return System.currentTimeMillis();
}
internal class RealClock : Clock {
override val time: Long
get() = System.currentTimeMillis()
}

View file

@ -268,7 +268,8 @@ object K9 : EarlyInit {
return false
}
val quietTimeChecker = QuietTimeChecker(Clock.INSTANCE, quietTimeStarts, quietTimeEnds)
val clock = DI.get<Clock>()
val quietTimeChecker = QuietTimeChecker(clock, quietTimeStarts, quietTimeEnds)
return quietTimeChecker.isQuietTime
}

View file

@ -30,7 +30,7 @@ val mainModule = module {
single { TrustManagerFactory.createInstance(get()) }
single { LocalKeyStoreManager(get()) }
single<TrustedSocketFactory> { DefaultTrustedSocketFactory(get(), get()) }
single { Clock.INSTANCE }
single<Clock> { RealClock() }
factory { ServerNameSuggester() }
factory { EmailAddressValidator() }
factory { ServerSettingsSerializer() }

View file

@ -1,7 +1,6 @@
package com.fsck.k9.job
import androidx.work.WorkerFactory
import com.fsck.k9.Clock
import org.koin.dsl.module
val jobModule = module {
@ -9,5 +8,5 @@ val jobModule = module {
single<WorkerFactory> { K9WorkerFactory(get(), get()) }
single { get<WorkManagerProvider>().getWorkManager() }
single { K9JobManager(get(), get(), get()) }
factory { MailSyncWorkerManager(get(), Clock.INSTANCE) }
factory { MailSyncWorkerManager(workManager = get(), clock = get()) }
}

View file

@ -4,11 +4,9 @@ import java.util.Calendar
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import org.mockito.Mockito.mock
import org.mockito.kotlin.whenever
class QuietTimeCheckerTest {
private val clock = mock(Clock::class.java)
private val clock = TestClock()
@Test
fun endTimeBeforeStartTime_timeIsBeforeEndOfQuietTime() {
@ -113,7 +111,6 @@ class QuietTimeCheckerTest {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay)
calendar.set(Calendar.MINUTE, minute)
val timeInMillis = calendar.timeInMillis
whenever(clock.time).thenReturn(timeInMillis)
clock.time = calendar.timeInMillis
}
}

View file

@ -0,0 +1,5 @@
package com.fsck.k9
class TestClock(initialTime: Long = 0L) : Clock {
override var time: Long = initialTime
}

View file

@ -70,6 +70,7 @@ class MessageListFragment :
private val folderNameFormatter: FolderNameFormatter by lazy { folderNameFormatterFactory.create(requireContext()) }
private val messagingController: MessagingController by inject()
private val preferences: Preferences by inject()
private val clock: Clock by inject()
private val handler = MessageListHandler(this)
private val activityListener = MessageListActivityListener()
@ -252,7 +253,7 @@ class MessageListFragment :
contactsPictureLoader = ContactPicture.getContactPictureLoader(),
listItemListener = this,
appearance = messageListAppearance,
relativeDateTimeFormatter = RelativeDateTimeFormatter(requireContext(), Clock.INSTANCE)
relativeDateTimeFormatter = RelativeDateTimeFormatter(requireContext(), clock)
)
adapter.activeMessage = activeMessage

View file

@ -13,11 +13,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isGone
import androidx.core.view.isVisible
import com.fsck.k9.Account
import com.fsck.k9.Clock
import com.fsck.k9.FontSizes
import com.fsck.k9.FontSizes.FONT_DEFAULT
import com.fsck.k9.FontSizes.LARGE
import com.fsck.k9.RobolectricTest
import com.fsck.k9.TestClock
import com.fsck.k9.contacts.ContactPictureLoader
import com.fsck.k9.mail.Address
import com.fsck.k9.textString
@ -464,7 +464,7 @@ class MessageListAdapterTest : RobolectricTest() {
contactsPictureLoader = contactsPictureLoader,
listItemListener = listItemListener,
appearance = appearance,
relativeDateTimeFormatter = RelativeDateTimeFormatter(context, Clock.INSTANCE)
relativeDateTimeFormatter = RelativeDateTimeFormatter(context, TestClock())
)
}

View file

@ -1,8 +1,8 @@
package com.fsck.k9.ui.helper
import android.os.SystemClock
import com.fsck.k9.Clock
import com.fsck.k9.RobolectricTest
import com.fsck.k9.TestClock
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZoneId
@ -10,8 +10,6 @@ import java.util.TimeZone
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.mockito.Mockito
import org.mockito.kotlin.whenever
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
@ -19,7 +17,7 @@ import org.robolectric.annotation.Config
class RelativeDateTimeFormatterTest : RobolectricTest() {
private val context = RuntimeEnvironment.application.applicationContext
private val clock = Mockito.mock(Clock::class.java)
private val clock = TestClock()
private val dateTimeFormatter = RelativeDateTimeFormatter(context, clock)
private val zoneId = "Europe/Berlin"
@ -123,7 +121,7 @@ class RelativeDateTimeFormatterTest : RobolectricTest() {
val dateTime = LocalDateTime.parse(time)
val timeInMillis = dateTime.toEpochMillis()
SystemClock.setCurrentTimeMillis(timeInMillis) // Is handled by ShadowSystemClock
whenever(clock.time).thenReturn(timeInMillis)
clock.time = timeInMillis
}
private fun String.toEpochMillis() = LocalDateTime.parse(this).toEpochMillis()