package com.github.dockerjava.netty.exec;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
import java.io.IOException;
import java.lang.reflect.Method;
import java.security.SecureRandom;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.model.Statistics;
import com.github.dockerjava.core.async.ResultCallbackTemplate;
import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
@Test(groups = "integration")
public class StatsCmdExecTest extends AbstractNettyDockerClientTest {
private static int NUM_STATS = 5;
@BeforeTest
public void beforeTest() throws Exception {
super.beforeTest();
}
@AfterTest
public void afterTest() {
super.afterTest();
}
@BeforeMethod
public void beforeMethod(Method method) {
super.beforeMethod(method);
}
@AfterMethod
public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
@Test(groups = "ignoreInCircleCi")
public void testStatsStreaming() throws InterruptedException, IOException {
TimeUnit.SECONDS.sleep(1);
CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS);
String containerName = "generated_" + new SecureRandom().nextInt();
CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top")
.withName(containerName).exec();
LOG.info("Created container {}", container.toString());
assertThat(container.getId(), not(isEmptyString()));
dockerClient.startContainerCmd(container.getId()).exec();
StatsCallbackTest statsCallback = dockerClient.statsCmd(container.getId())
.exec(new StatsCallbackTest(countDownLatch));
countDownLatch.await(3, TimeUnit.SECONDS);
Boolean gotStats = statsCallback.gotStats();
LOG.info("Stop stats collection");
statsCallback.close();
LOG.info("Stopping container");
dockerClient.stopContainerCmd(container.getId()).exec();
dockerClient.removeContainerCmd(container.getId()).exec();
LOG.info("Completed test");
assertTrue(gotStats, "Expected true");
}
private class StatsCallbackTest extends ResultCallbackTemplate<StatsCallbackTest, Statistics> {
private final CountDownLatch countDownLatch;
private Boolean gotStats = false;
public StatsCallbackTest(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void onNext(Statistics stats) {
LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats);
if (stats != null) {
gotStats = true;
}
countDownLatch.countDown();
}
public Boolean gotStats() {
return gotStats;
}
}
}