/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.streaming;
import static org.mule.test.allure.AllureConstants.StreamingFeature.STREAMING;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import org.mule.runtime.core.internal.streaming.object.iterator.ClosedConsumerException;
import org.mule.runtime.core.internal.streaming.object.iterator.Consumer;
import org.mule.runtime.core.internal.streaming.object.iterator.ListConsumer;
import org.mule.runtime.core.internal.streaming.object.iterator.Producer;
import org.mule.tck.size.SmallTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import ru.yandex.qatools.allure.annotations.Features;
@SmallTest
@Features(STREAMING)
public class ListConsumerTestCase {
private static final int totalCount = 50;
private static final int pageSize = 10;
private Consumer<Integer> consumer;
private Producer<List<Integer>> producer;
private List<List<Integer>> pages;
@Before
public void setUp() {
this.pages = this.getPages();
this.producer = spy(new TestProducer());
this.consumer = spy(new ListConsumer<>(this.producer));
}
@Test(expected = ClosedConsumerException.class)
public void happyPath() throws Exception {
List<Integer> elements = new ArrayList<Integer>();
while (!this.consumer.isConsumed()) {
elements.add(this.consumer.consume());
}
assertEquals(elements.size(), totalCount);
assertTrue(this.consumer.isConsumed());
for (List<Integer> page : pages) {
assertTrue(elements.containsAll(page));
}
verify(this.consumer).close();
verify(this.producer).close();
this.consumer.consume();
}
@Test(expected = ClosedConsumerException.class)
public void closeEarly() throws Exception {
List<Integer> elements = new ArrayList<Integer>();
for (int i = 0; i < pageSize; i++) {
elements.add(this.consumer.consume());
}
this.consumer.close();
assertEquals(pageSize, elements.size());
assertTrue(elements.containsAll(this.pages.get(0)));
assertTrue(this.consumer.isConsumed());
this.consumer.consume();
}
@Test
public void totalAvailable() {
assertEquals(this.consumer.getSize(), totalCount);
}
@Test
public void doubleClose() throws Exception {
this.consumer.close();
this.consumer.close();
}
private List<List<Integer>> getPages() {
List<List<Integer>> pages = new ArrayList<>();
List<Integer> page = new ArrayList<>();
for (int i = 1; i <= totalCount; i++) {
page.add(i);
if (i % pageSize == 0) {
pages.add(page);
page = new ArrayList<>();
}
}
return pages;
}
private class TestProducer implements Producer<List<Integer>> {
private int index = 0;
@Override
public void close() throws IOException {}
@Override
public List<Integer> produce() {
List<Integer> ret;
if (this.index < pages.size()) {
ret = pages.get(index);
index++;
} else {
ret = new ArrayList<>();
}
return ret;
}
public int getSize() {
return totalCount;
}
}
}