package org.zstack.test.core.rest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.zstack.core.Platform;
import org.zstack.core.componentloader.ComponentLoader;
import org.zstack.core.thread.AsyncThread;
import org.zstack.header.errorcode.ErrorCode;
import org.zstack.header.rest.JsonAsyncRESTCallback;
import org.zstack.header.rest.RESTFacade;
import org.zstack.test.WebBeanConstructor;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class TestRestAsyncCallback1 {
CLogger logger = Utils.getLogger(TestRestAsyncCallback1.class);
WebBeanConstructor wbean;
ComponentLoader loader;
RESTFacade restf;
String url;
int num = 200;
CountDownLatch latch = new CountDownLatch(num);
volatile List<Boolean> success = new ArrayList<Boolean>(num);
@Before
public void setUp() throws Exception {
wbean = new WebBeanConstructor();
wbean.addXml("PortalForUnitTest.xml").addXml("AccountManager.xml");
loader = wbean.build();
restf = loader.getComponent(RESTFacade.class);
url = wbean.getSiteUrl();
}
@AsyncThread
private void call() {
final String url = wbean.buildUrl(RESTBeanForTest.ROOT, RESTBeanForTest.CALLBACK_PATH);
final String hi = Platform.getUuid();
final TestRestAsyncCallback1 self = this;
restf.asyncJsonPost(url, hi, new JsonAsyncRESTCallback<String>(null) {
@Override
public void fail(ErrorCode err) {
synchronized (self) {
logger.error(String.format("fail: %s", err));
success.add(false);
latch.countDown();
}
}
@Override
public void success(String ret) {
synchronized (self) {
if (hi.equals(ret)) {
success.add(true);
} else {
logger.error(String.format("expected: %s, but got: %s", hi, ret));
success.add(false);
}
latch.countDown();
}
}
@Override
public Class<String> getReturnClass() {
return String.class;
}
}, TimeUnit.SECONDS, 5);
}
@Test
public void test() throws InterruptedException {
for (int i = 0; i < num; i++) {
call();
}
latch.await(2, TimeUnit.MINUTES);
Assert.assertEquals(num, success.size());
for (Boolean r : success) {
Assert.assertTrue(r);
}
}
}