Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CentralDogmaExtension after test listener not waiting server to stop #854

Open
Dogacel opened this issue Jul 9, 2023 · 5 comments
Open

Comments

@Dogacel
Copy link

Dogacel commented Jul 9, 2023

@Override
public void after(ExtensionContext context) throws Exception {
stopAsync().whenComplete((unused1, unused2) -> {
try {
dataDir.delete();
} catch (IOException e) {
throw new CompletionException(e);
}
});
}

I don't see a join() here. I am seeing a flaky test, when I try to use CentralDogmaExtension in two tests back-to-back, I am seeing a connection error (around 1 in 5 runs).

flagma.server.app.InitializerTest > app should initialize FAILED
    java.util.concurrent.CompletionException at CoroutineDebugging.kt:46
        Caused by: java.util.concurrent.CompletionException at CompletableFuture.java:332
            Caused by: com.linecorp.armeria.client.UnprocessedRequestException at UnprocessedRequestException.java:45
                Caused by: com.linecorp.armeria.client.endpoint.EndpointSelectionTimeoutException at EndpointSelectionTimeoutException.java:48
10423 [Thread-5] [DEBUG] c.l.armeria.client.ClientFactory -- Closing the default client factories

I feel like the join is forgotten here and this error can happen rarely.

@minwoox
Copy link
Member

minwoox commented Jul 10, 2023

HI!
The after method is called after all tests are executed, which means we don't need this extension anymore, so we didn't use join() intentionally because it will make the whole build slower.
Could you provide your test code so that we can investigate what's going on?

@Dogacel
Copy link
Author

Dogacel commented Jul 10, 2023

HI! The after method is called after all tests are executed, which means we don't need this extension anymore, so we didn't use join() intentionally because it will make the whole build slower. Could you provide your test code so that we can investigate what's going on?

package flagma.server.app

import com.linecorp.centraldogma.client.CentralDogma
import com.linecorp.centraldogma.testing.junit.CentralDogmaExtension
import flagma.server.Config
import io.kotest.assertions.throwables.shouldNotThrowAny
import io.kotest.core.spec.style.FunSpec
import io.kotest.core.test.TestCaseOrder
import io.kotest.extensions.junit5.JUnitExtensionAdapter
import io.kotest.koin.KoinExtension
import io.kotest.matchers.collections.shouldBeEmpty
import io.kotest.matchers.collections.shouldContain
import io.kotest.matchers.collections.shouldExist
import org.koin.dsl.module
import org.koin.test.KoinTest

class InitializerTest : KoinTest, FunSpec({
    val centralDogmaExtension = CentralDogmaExtension()
    val koinTestExtension = KoinExtension(
        modules = listOf(
            module { single<CentralDogma> { centralDogmaExtension.client() } },
            Modules.repositoryModules,
        )
    )

    testOrder = TestCaseOrder.Sequential
    extensions(
        koinTestExtension,
        JUnitExtensionAdapter(centralDogmaExtension),
    )

    test("app should initialize") {
        // Dogma should be clean
        centralDogmaExtension.client()
            .listProjects().join()
            .shouldBeEmpty()

        Initializer.initializeProject(centralDogmaExtension.client())

        centralDogmaExtension.client()
            .listProjects().join()
            .shouldExist { it == Config.CentralDogma.PROJECT_NAME }
        centralDogmaExtension.client()
            .listRepositories(Config.CentralDogma.PROJECT_NAME).join()
            .keys.shouldContain(Config.CentralDogma.PROJECTS_REPOSITORY_NAME)
    }

    test("app should initialize if already initialized") {
        shouldNotThrowAny {
            Initializer.initializeProject(centralDogmaExtension.client())
        }
    }
})

Initializer.initializeProject basically calls listProjects, listRepositories and createProject with .join().

Maybe timeout for .join() is too slow? 3200ms for endpoint selection.

@minwoox
Copy link
Member

minwoox commented Jul 10, 2023

Maybe timeout for .join() is too slow? 3200ms for endpoint selection.

This is a local test so I think it is enough.
So the exception is raised in your test("app should initialize") {...} test when you call centralDogmaExtension.client() .listProjects()?
One more question is you are using the latest version, right?

@Dogacel
Copy link
Author

Dogacel commented Jul 10, 2023

Should be the latest:

    testImplementation("com.linecorp.centraldogma:centraldogma-testing-junit:0.61.4")

Not sure where exactly the exception is realized, stack trace is messy. I will do some debug logging.

@minwoox
Copy link
Member

minwoox commented Jul 11, 2023

Let us know if you find something. 👍
The exception can also be raised if we call Central Dogma API after closing the extension (by not closing the watcher or something else) but I'm not sure if it's the cause.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants