testcontainers / testcontainers-java

Testcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
https://testcontainers.org
MIT License
8.05k stars 1.66k forks source link

execInContainer hangs if executed more than once on Docker Desktop Windows #3221

Open slominskir opened 4 years ago

slominskir commented 4 years ago

Running Docker Desktop Windows 2.1.0.5 and using JUnit 4 with annotations BeforeClass and AfterClass to setup a container that multiple Test cases can be run against. Each test case does an execInContainer. Each test works if run separately. If entire Test class is run then whatever the second execInContainer that is run will hang. Using docker command line tools I can exec a shell to the container created by testcontainers and see that the command specified in execInContainer is not running. If I attach a debugger I see that the execInContainer is parked waiting for a response. Stack trace:

park:-1, Unsafe (sun.misc)
park:175, LockSupport (java.util.concurrent.locks)
parkAndCheckInterrupt:836, AbstractQueuedSynchronizer (java.util.concurrent.locks)
doAcquireSharedInterruptibly:997, AbstractQueuedSynchronizer (java.util.concurrent.locks)
acquireSharedInterruptibly:1304, AbstractQueuedSynchronizer (java.util.concurrent.locks)
await:231, CountDownLatch (java.util.concurrent)
awaitCompletion:90, ResultCallbackTemplate (com.github.dockerjava.api.async)
execInContainer:80, ExecInContainerPattern (org.testcontainers.containers)
execInContainer:232, ContainerState (org.testcontainers.containers)
execInContainer:223, ContainerState (org.testcontainers.containers)
testCAStatus24:137, IntegrationErrorTest (org.jlab.epics2web)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
runReflectiveCall:59, FrameworkMethod$1 (org.junit.runners.model)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
invokeExplosively:56, FrameworkMethod (org.junit.runners.model)
evaluate:17, InvokeMethod (org.junit.internal.runners.statements)
evaluate:306, ParentRunner$3 (org.junit.runners)
evaluate:100, BlockJUnit4ClassRunner$1 (org.junit.runners)
runLeaf:366, ParentRunner (org.junit.runners)
runChild:103, BlockJUnit4ClassRunner (org.junit.runners)
runChild:63, BlockJUnit4ClassRunner (org.junit.runners)
run:331, ParentRunner$4 (org.junit.runners)
schedule:79, ParentRunner$1 (org.junit.runners)
runChildren:329, ParentRunner (org.junit.runners)
access$100:66, ParentRunner (org.junit.runners)
evaluate:293, ParentRunner$2 (org.junit.runners)
evaluate:26, RunBefores (org.junit.internal.runners.statements)
evaluate:27, RunAfters (org.junit.internal.runners.statements)
evaluate:306, ParentRunner$3 (org.junit.runners)
run:413, ParentRunner (org.junit.runners)
run:137, JUnitCore (org.junit.runner)
startRunnerWithArgs:69, JUnit4IdeaTestRunner (com.intellij.junit4)
startRunnerWithArgs:33, IdeaTestRunner$Repeater (com.intellij.rt.junit)
prepareStreamsAndStart:220, JUnitStarter (com.intellij.rt.junit)
main:53, JUnitStarter (com.intellij.rt.junit)

Any tips to troubleshoot this? The project in question can be obtained from GitHub and uses Gradle to execute the tests: https://github.com/JeffersonLab/epics2web

vcvitaly commented 4 years ago

@slominskir Have you fixed that? I tried running the test and it failed on testUnresponsiveCode60().

slominskir commented 4 years ago

How did it fail? I worked around this issue by simply not having more than one execInContainer invocation between container restarts. Not a great fix though.

vcvitaly commented 4 years ago

I tried ./gradlew test and it failed with

  java.lang.AssertionError: expected:<60> but was:<0>
    at org.junit.Assert.fail(Assert.java:89)
    at org.junit.Assert.failNotEquals(Assert.java:835)
    at org.junit.Assert.assertEquals(Assert.java:647)
    at org.junit.Assert.assertEquals(Assert.java:633)
    at org.jlab.epics2web.IntegrationErrorTest.testUnresponsiveCode60(IntegrationErrorTest.java:278)

It didn't hang though, so I could't reproduce the issue. Other test methods were green.

slominskir commented 4 years ago

@vcvitaly Did you run git pull first? Are you at revision 89c4d08? All tests pass for me. I ran:

git pull
Already up-to-date.

gradlew clean
gradlew test
... 
BUILD SUCCESSFUL in 36s
4 actionable tasks: 4 executed

I'm on Windows 10 if that matters? The test in question disables the network interface in the test container in an attempt to trigger an "unresponsive" error code - maybe different OS stacks have an effect, though I wouldn't think so because I'm testing an application level timeout.

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. If you believe this is a mistake, please reply to this comment to keep it open. If there isn't one already, a PR to fix or at least reproduce the problem in a test case will always help us get back on track to tackle this.