package org.zstack.test.core.asyncbatch;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.zstack.core.asyncbatch.AsyncBatchRunner;
import org.zstack.core.asyncbatch.LoopAsyncBatch;
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;
import java.util.Collection;
import java.util.List;
import static java.util.Arrays.asList;
public class TestAsyncBatch1 {
CLogger logger = Utils.getLogger(TestAsyncBatch1.class);
volatile int count = 0;
@Before
public void setUp() throws Exception {
new BeanConstructor().build();
}
@Test
public void test() {
FutureCompletion completion = new FutureCompletion(null);
List<Integer> nums = asList(1, 2, 3);
new LoopAsyncBatch<Integer>(completion) {
@Override
protected Collection<Integer> collect() {
return nums;
}
@Override
protected AsyncBatchRunner forEach(Integer item) {
return new AsyncBatchRunner() {
@Override
@AsyncThread
public void run(NoErrorCompletion completion) {
count += item;
completion.done();
}
};
}
@Override
protected void done() {
completion.success();
}
}.start();
completion.await();
Assert.assertEquals(1 + 2 + 3, count);
count = 0;
FutureCompletion completion1 = new FutureCompletion(null);
new LoopAsyncBatch<Integer>(completion1) {
@Override
protected Collection<Integer> collect() {
return nums;
}
@Override
protected AsyncBatchRunner forEach(Integer item) {
return new AsyncBatchRunner() {
@Override
@AsyncThread
public void run(NoErrorCompletion completion) {
if (item == 2) {
throw new RuntimeException("on purpose");
} else {
count += item;
completion.done();
}
}
};
}
@Override
protected void done() {
completion1.success();
}
}.start();
completion1.await();
Assert.assertEquals(1 + 3, count);
FutureCompletion completion2 = new FutureCompletion(null);
new LoopAsyncBatch<Integer>(completion2) {
@Override
protected Collection<Integer> collect() {
return nums;
}
@Override
protected AsyncBatchRunner forEach(Integer item) {
return new AsyncBatchRunner() {
@Override
public void run(NoErrorCompletion completion) {
completion.done();
}
};
}
@Override
protected void done() {
throw new RuntimeException("on purpose");
}
}.start();
completion2.await();
Assert.assertFalse(completion2.isSuccess());
}
}