Skip to content
Snippets Groups Projects
Verified Commit 38e2055b authored by Mikolai Gütschow's avatar Mikolai Gütschow Committed by Sebastian
Browse files

separate automatedScreenshots from test in gradle tasks and directories

parent 26028259
No related branches found
No related tags found
1 merge request!256Automated screenshots via testing API
...@@ -139,6 +139,28 @@ tasks.test { ...@@ -139,6 +139,28 @@ tasks.test {
useJUnit() useJUnit()
} }
// see https://docs.gradle.org/current/userguide/java_testing.html#sec:configuring_java_integration_tests
sourceSets.create("automatedScreenshots") {
kotlin.srcDir("$projectDir/src/automatedScreenshots/kotlin")
resources.srcDir("$projectDir/src/automatedScreenshots/resources")
compileClasspath += sourceSets.main.get().output + sourceSets.test.get().output
runtimeClasspath += sourceSets.main.get().output + sourceSets.test.get().output
}
configurations["automatedScreenshotsImplementation"].extendsFrom(configurations.testImplementation.get())
configurations["automatedScreenshotsRuntimeOnly"].extendsFrom(configurations.testRuntimeOnly.get())
task<Test>("automatedScreenshots") {
testClassesDirs = sourceSets["automatedScreenshots"].output.classesDirs
classpath = sourceSets["automatedScreenshots"].runtimeClasspath
}
// makes `internal` visible in "automatedScreenshot"
// see https://kotlinlang.org/docs/gradle-configure-project.html#associate-compiler-tasks
kotlin.target.compilations.named("automatedScreenshots") {
associateWith(kotlin.target.compilations.getByName("test"))
}
tasks.withType<KotlinCompile> { tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11" kotlinOptions.jvmTarget = "11"
kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
......
...@@ -18,15 +18,27 @@ ...@@ -18,15 +18,27 @@
package org.briarproject.briar.desktop package org.briarproject.briar.desktop
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.awt.ComposeWindow
import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.runDesktopComposeUiTest import androidx.compose.ui.test.runDesktopComposeUiTest
import androidx.compose.ui.window.FrameWindowScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import org.briarproject.bramble.BrambleCoreEagerSingletons import org.briarproject.bramble.BrambleCoreEagerSingletons
import org.briarproject.bramble.api.contact.event.ContactAddedEvent
import org.briarproject.bramble.api.plugin.LanTcpConstants
import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT
import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_SOCKS_PORT import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_SOCKS_PORT
import org.briarproject.briar.BriarCoreEagerSingletons import org.briarproject.briar.BriarCoreEagerSingletons
import org.briarproject.briar.desktop.TestUtils.getDataDir import org.briarproject.briar.desktop.TestUtils.getDataDir
import org.briarproject.briar.desktop.contact.ContactListViewModel
import org.briarproject.briar.desktop.ui.LocalWindowFocusState
import org.briarproject.briar.desktop.ui.LocalWindowScope
import org.briarproject.briar.desktop.ui.WindowFocusState
import org.jetbrains.annotations.NonNls
import org.jetbrains.skia.Image import org.jetbrains.skia.Image
import org.junit.Test import org.junit.Test
import java.io.FileOutputStream import java.io.FileOutputStream
...@@ -34,7 +46,8 @@ import java.io.FileOutputStream ...@@ -34,7 +46,8 @@ import java.io.FileOutputStream
@OptIn(ExperimentalTestApi::class) @OptIn(ExperimentalTestApi::class)
class ScreenshotTest { class ScreenshotTest {
@Test @Test
fun makeScreenshot() = runDesktopComposeUiTest(700, 500) { fun makeScreenshot() = runDesktopComposeUiTest(700, 700) {
// TODO: unify with interactive tests
val dataDir = getDataDir() val dataDir = getDataDir()
val app = val app =
DaggerBriarDesktopTestApp.builder().desktopCoreModule( DaggerBriarDesktopTestApp.builder().desktopCoreModule(
...@@ -45,14 +58,62 @@ class ScreenshotTest { ...@@ -45,14 +58,62 @@ class ScreenshotTest {
BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app) BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
BriarCoreEagerSingletons.Helper.injectEagerSingletons(app) BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
val ui = app.getBriarUi() windowScope = object : FrameWindowScope {
override val window: ComposeWindow get() = TODO()
}
windowFocusState = WindowFocusState().apply { focused = true }
setContent { setContent {
ui.content() CompositionLocalProvider(
LocalWindowScope provides windowScope,
LocalWindowFocusState provides windowFocusState,
) {
app.getBriarUi().content()
}
} }
captureToImage().save("before-click.png") captureToImage().save("before-click.png")
onNodeWithTag("close_expiration").performClick() onNodeWithTag("close_expiration").performClick()
captureToImage().save("after-click.png") captureToImage().save("after-click.png")
// TODO: unify with interactive tests
val lifecycleManager = app.getLifecycleManager()
val accountManager = app.getAccountManager()
@NonNls
val password = "verySecret123!"
accountManager.createAccount("alice", password)
val dbKey = accountManager.databaseKey ?: throw AssertionError()
lifecycleManager.startServices(dbKey)
lifecycleManager.waitForStartup()
runBlocking {
delay(1000)
captureToImage().save("after-login.png")
app.getDeterministicTestDataCreator().createTestData(5, 20, 50, 10, 20)
app.getContactManager().addPendingContact("briar://aatkjq4seoualafpwh4cfckdzr4vpr4slk3bbvpxklf7y7lv4ajw6", "Faythe")
app.getEventBus().addListener { e ->
if (e is ContactAddedEvent) {
if (app.getContactManager().getContact(e.contactId).author.name in listOf("Bob", "Chuck")) // NON-NLS
app.getIoExecutor().execute {
app.getConnectionRegistry().registerIncomingConnection(e.contactId, LanTcpConstants.ID) {}
}
}
}
delay(1000)
val viewModel = app.getViewModelProvider().get(ContactListViewModel::class)
viewModel.selectContact(viewModel.contactList.value[1])
delay(1000)
captureToImage().save("after-contacts.png")
}
} }
} }
......
...@@ -142,12 +142,6 @@ constructor( ...@@ -142,12 +142,6 @@ constructor(
var lastNotificationPrivateMessage = 0L var lastNotificationPrivateMessage = 0L
var lastNotificationForum = 0L var lastNotificationForum = 0L
val eventListener = EventListener { e ->
when (e) {
is LifecycleEvent ->
if (e.lifecycleState == RUNNING) screenState = MAIN
}
}
val focusListener = object : WindowFocusListener { val focusListener = object : WindowFocusListener {
override fun windowGainedFocus(e: WindowEvent?) { override fun windowGainedFocus(e: WindowEvent?) {
focusState.focused = true focusState.focused = true
...@@ -194,13 +188,11 @@ constructor( ...@@ -194,13 +188,11 @@ constructor(
visualNotificationProvider.init() visualNotificationProvider.init()
soundNotificationProvider.init() soundNotificationProvider.init()
eventBus.addListener(eventListener)
window.addWindowFocusListener(focusListener) window.addWindowFocusListener(focusListener)
messageCounter.addListener(messageCounterListener) messageCounter.addListener(messageCounterListener)
onDispose { onDispose {
messageCounter.removeListener(messageCounterListener) messageCounter.removeListener(messageCounterListener)
eventBus.removeListener(eventListener)
window.removeWindowFocusListener(focusListener) window.removeWindowFocusListener(focusListener)
visualNotificationProvider.uninit() visualNotificationProvider.uninit()
soundNotificationProvider.uninit() soundNotificationProvider.uninit()
...@@ -228,6 +220,21 @@ constructor( ...@@ -228,6 +220,21 @@ constructor(
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
override fun content() { override fun content() {
DisposableEffect(Unit) {
val eventListener = EventListener { e ->
when (e) {
is LifecycleEvent -> {
if (e.lifecycleState == RUNNING) screenState = MAIN
}
}
}
eventBus.addListener(eventListener)
onDispose {
eventBus.removeListener(eventListener)
}
}
CompositionLocalProvider( CompositionLocalProvider(
LocalViewModelProvider provides viewModelProvider, LocalViewModelProvider provides viewModelProvider,
LocalConfiguration provides configuration, LocalConfiguration provides configuration,
......
...@@ -24,8 +24,10 @@ originally licensed under the Apache License, Version 2.0 ...@@ -24,8 +24,10 @@ originally licensed under the Apache License, Version 2.0
package org.briarproject.briar.desktop.viewmodel package org.briarproject.briar.desktop.viewmodel
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton
import kotlin.reflect.KClass import kotlin.reflect.KClass
@Singleton
class ViewModelProvider class ViewModelProvider
@Inject @Inject
constructor( constructor(
......
...@@ -40,6 +40,7 @@ import org.briarproject.briar.api.test.TestDataCreator ...@@ -40,6 +40,7 @@ import org.briarproject.briar.api.test.TestDataCreator
import org.briarproject.briar.desktop.testdata.DeterministicTestDataCreator import org.briarproject.briar.desktop.testdata.DeterministicTestDataCreator
import org.briarproject.briar.desktop.threading.BriarExecutors import org.briarproject.briar.desktop.threading.BriarExecutors
import org.briarproject.briar.desktop.ui.BriarUi import org.briarproject.briar.desktop.ui.BriarUi
import org.briarproject.briar.desktop.viewmodel.ViewModelProvider
import java.util.concurrent.Executor import java.util.concurrent.Executor
import javax.inject.Singleton import javax.inject.Singleton
...@@ -87,4 +88,6 @@ internal interface BriarDesktopTestApp : BrambleCoreEagerSingletons, BriarCoreEa ...@@ -87,4 +88,6 @@ internal interface BriarDesktopTestApp : BrambleCoreEagerSingletons, BriarCoreEa
fun getForumManager(): ForumManager fun getForumManager(): ForumManager
fun getForumSharingManager(): ForumSharingManager fun getForumSharingManager(): ForumSharingManager
fun getViewModelProvider(): ViewModelProvider
} }
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
package org.briarproject.briar.desktop package org.briarproject.briar.desktop
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.window.application import androidx.compose.ui.window.application
import mu.KotlinLogging import mu.KotlinLogging
import org.briarproject.bramble.BrambleCoreEagerSingletons import org.briarproject.bramble.BrambleCoreEagerSingletons
...@@ -48,7 +47,6 @@ internal class RunWithTemporaryAccount( ...@@ -48,7 +47,6 @@ internal class RunWithTemporaryAccount(
private val LOG = KotlinLogging.logger {} private val LOG = KotlinLogging.logger {}
} }
@OptIn(ExperimentalComposeUiApi::class)
fun run() { fun run() {
LogUtils.setupLogging(ALL) LogUtils.setupLogging(ALL)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment