package org.zstack.test.core.asyncbatch;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.zstack.core.asyncbatch.AsyncBatch;
import org.zstack.core.asyncbatch.AsyncBatchRunner;
import org.zstack.core.thread.AsyncThread;
import org.zstack.header.core.FutureCompletion;
import org.zstack.header.core.NoErrorCompletion;
import org.zstack.test.BeanConstructor;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
public class TestAsyncBatch {
CLogger logger = Utils.getLogger(TestAsyncBatch.class);
volatile int count = 0;
int num = 10;
@Before
public void setUp() throws Exception {
new BeanConstructor().build();
}
@Test
public void test() {
FutureCompletion completion = new FutureCompletion(null);
new AsyncBatch(null) {
@Override
protected void setup() {
for (int i = 0; i < num; i++) {
batch(new AsyncBatchRunner() {
@Override
@AsyncThread
public void run(NoErrorCompletion completion) {
count++;
completion.done();
}
});
}
}
@Override
protected void done() {
completion.success();
}
}.start();
completion.await();
Assert.assertEquals(num, count);
count = 0;
FutureCompletion completion1 = new FutureCompletion(null);
new AsyncBatch(null) {
@Override
protected void setup() {
for (int i = 0; i < num; i++) {
batch(new AsyncBatchRunner() {
@Override
public void run(NoErrorCompletion completion) {
count++;
if (count % 2 == 0) {
throw new RuntimeException("on purpose");
} else {
completion.done();
}
}
});
}
}
@Override
protected void done() {
completion1.success();
}
}.start();
completion1.await();
Assert.assertTrue(completion1.isSuccess());
FutureCompletion completion2 = new FutureCompletion(null);
new AsyncBatch(completion2) {
@Override
protected void setup() {
for (int i = 0; i < num; i++) {
batch(new AsyncBatchRunner() {
@Override
public void run(NoErrorCompletion completion) {
completion.done();
}
});
}
}
@Override
protected void done() {
throw new RuntimeException("on purpose");
}
}.start();
completion.await();
Assert.assertFalse(completion2.isSuccess());
}
}