/*
* Copyright 2016 Victor Albertos
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.rx_cache2.internal;
import io.reactivex.Observable;
import io.reactivex.observers.TestObserver;
import io.rx_cache2.DynamicKey;
import io.rx_cache2.DynamicKeyGroup;
import io.rx_cache2.EvictDynamicKey;
import io.rx_cache2.EvictDynamicKeyGroup;
import io.rx_cache2.EvictProvider;
import io.rx_cache2.ProviderHelper;
import io.rx_cache2.Reply;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class ProvidersDynamicsKeysRxCacheTest {
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
private ProvidersRxCache providersRxCache;
private static final int SIZE = 100;
private static final String filter1page1 = "filer1_page1", filter1Page2 = "filer1_page2",
filter1Page3 = "filer1_page3",
filter2Page1 = "filer2_page1", filter2Page2 = "filer2_page2", filter2Page3 = "filer2_page3";
@Before public void setUp() {
providersRxCache = new RxCache.Builder()
.persistence(temporaryFolder.getRoot(), Jolyglot$.newInstance())
.using(ProvidersRxCache.class);
}
@Test public void Pagination() {
TestObserver<List<io.rx_cache2.internal.Mock>> testObserver;
List<io.rx_cache2.internal.Mock> mocksPage1 = createMocks(SIZE);
String mockPage1Value = mocksPage1.get(0).getMessage();
testObserver =
providersRxCache.getMocksPaginate(Observable.just(mocksPage1), new DynamicKey(1)).test();
testObserver.awaitTerminalEvent();
List<io.rx_cache2.internal.Mock> mocksPage2 = createMocks(SIZE);
String mockPage2Value = mocksPage2.get(0).getMessage();
testObserver =
providersRxCache.getMocksPaginate(Observable.just(mocksPage2), new DynamicKey(2)).test();
testObserver.awaitTerminalEvent();
List<io.rx_cache2.internal.Mock> mocksPage3 = createMocks(SIZE);
String mockPage3Value = mocksPage3.get(0).getMessage();
testObserver =
providersRxCache.getMocksPaginate(Observable.just(mocksPage3), new DynamicKey(3)).test();
testObserver.awaitTerminalEvent();
testObserver =
providersRxCache.getMocksPaginate(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(), new DynamicKey(1))
.test();
testObserver.awaitTerminalEvent();
assertThat(testObserver.values().get(0).get(0).getMessage(), is(mockPage1Value));
testObserver =
providersRxCache.getMocksPaginate(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(), new DynamicKey(2))
.test();
testObserver.awaitTerminalEvent();
assertThat(testObserver.values().get(0).get(0).getMessage(), is(mockPage2Value));
testObserver =
providersRxCache.getMocksPaginate(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(), new DynamicKey(3))
.test();
testObserver.awaitTerminalEvent();
assertThat(testObserver.values().get(0).get(0).getMessage(), is(mockPage3Value));
}
@Test public void Pagination_Evict_All() {
paginationEvictAll();
}
private void paginationEvictAll() {
TestObserver<List<io.rx_cache2.internal.Mock>> observer = new TestObserver<>();
EvictProvider evictProviderFalse = new EvictProvider(false);
EvictProvider evictProviderTrue = new EvictProvider(true);
providersRxCache.getMocksPaginateEvictProvider(Observable.just(createMocks(SIZE)),
new DynamicKey(1), evictProviderFalse)
.subscribe(observer);
observer.awaitTerminalEvent();
assertThat(observer.errors().size(), is(0));
assertThat(observer.values().size(), is(1));
observer = providersRxCache.getMocksPaginateEvictProvider(Observable.just(createMocks(SIZE)),
new DynamicKey(2), evictProviderFalse).test();
observer.awaitTerminalEvent();
assertThat(observer.errors().size(), is(0));
assertThat(observer.values().size(), is(1));
Observable<List<io.rx_cache2.internal.Mock>> oMocks = Observable.<List<io.rx_cache2.internal.Mock>>just(new ArrayList<io.rx_cache2.internal.Mock>());
observer = new TestObserver<>();
providersRxCache.getMocksPaginateEvictProvider(oMocks, new DynamicKey(1), evictProviderTrue)
.subscribe(observer);
observer.awaitTerminalEvent();
observer = providersRxCache.getMocksPaginateEvictProvider(oMocks,
new DynamicKey(1), evictProviderFalse).test();
observer.awaitTerminalEvent();
assertThat(observer.values().size(), is(1));
assertThat(observer.values().get(0).size(), is(0));
observer = providersRxCache.getMocksPaginateEvictProvider(oMocks,
new DynamicKey(2), evictProviderFalse).test();
observer.awaitTerminalEvent();
assertThat(observer.values().size(), is(1));
assertThat(observer.values().get(0).size(), is(0));
}
@Test public void Pagination_With_Evict_Cache_By_Page() {
TestObserver<Reply<List<io.rx_cache2.internal.Mock>>> observer;
observer = providersRxCache.getMocksDynamicKeyEvictPage(Observable.just(createMocks(SIZE)),
new DynamicKey(1), new EvictDynamicKey(true)).test();
observer.awaitTerminalEvent();
observer = providersRxCache.getMocksDynamicKeyEvictPage(Observable.just(createMocks(SIZE)),
new DynamicKey(2), new EvictDynamicKey(true)).test();
observer.awaitTerminalEvent();
observer = providersRxCache.getMocksDynamicKeyEvictPage(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(),
new DynamicKey(1), new EvictDynamicKey(true)).test();
observer.awaitTerminalEvent();
assertThat(observer.errors().size(), is(1));
assertThat(observer.values().size(), is(0));
observer = providersRxCache.getMocksDynamicKeyEvictPage(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(),
new DynamicKey(2), new EvictDynamicKey(false))
.test();
observer.awaitTerminalEvent();
assertThat(observer.errors().size(), is(0));
assertThat(observer.values().size(), is(1));
}
@Test public void Pagination_Filtering_Evicting_DynamicKeyGroup() {
populateAndCheckRetrieved();
evictDynamicKeyGroup(filter1page1);
retrieveAndCheckFilterPageValue(filter1page1, true);
retrieveAndCheckFilterPageValue(filter1Page2, false);
retrieveAndCheckFilterPageValue(filter1Page3, false);
retrieveAndCheckFilterPageValue(filter2Page1, false);
evictDynamicKeyGroup(filter1Page2);
retrieveAndCheckFilterPageValue(filter1Page2, true);
retrieveAndCheckFilterPageValue(filter1Page3, false);
retrieveAndCheckFilterPageValue(filter2Page2, false);
evictDynamicKeyGroup(filter1Page3);
retrieveAndCheckFilterPageValue(filter1Page3, true);
retrieveAndCheckFilterPageValue(filter2Page3, false);
evictDynamicKeyGroup(filter2Page1);
retrieveAndCheckFilterPageValue(filter2Page1, true);
retrieveAndCheckFilterPageValue(filter2Page2, false);
retrieveAndCheckFilterPageValue(filter2Page3, false);
evictDynamicKeyGroup(filter2Page2);
retrieveAndCheckFilterPageValue(filter2Page2, true);
retrieveAndCheckFilterPageValue(filter2Page3, false);
evictDynamicKeyGroup(filter2Page3);
retrieveAndCheckFilterPageValue(filter2Page3, true);
populateAndCheckRetrieved();
}
@Test public void Pagination_Filtering_Evicting_DynamicKey() {
populateAndCheckRetrieved();
evictDynamicKey(filter1Page2);
retrieveAndCheckFilterPageValue(filter1page1, true);
retrieveAndCheckFilterPageValue(filter1Page2, true);
retrieveAndCheckFilterPageValue(filter1Page3, true);
retrieveAndCheckFilterPageValue(filter2Page1, false);
evictDynamicKey(filter2Page1);
retrieveAndCheckFilterPageValue(filter2Page1, true);
retrieveAndCheckFilterPageValue(filter2Page2, true);
retrieveAndCheckFilterPageValue(filter2Page3, true);
populateAndCheckRetrieved();
}
@Test public void Pagination_Filtering_Evicting_ProviderKey() {
populateAndCheckRetrieved();
evictProviderKey(filter1Page2);
retrieveAndCheckFilterPageValue(filter1page1, true);
retrieveAndCheckFilterPageValue(filter1Page2, true);
retrieveAndCheckFilterPageValue(filter1Page3, true);
retrieveAndCheckFilterPageValue(filter2Page1, true);
retrieveAndCheckFilterPageValue(filter2Page2, true);
retrieveAndCheckFilterPageValue(filter2Page3, true);
populateAndCheckRetrieved();
}
private void populateAndCheckRetrieved() {
populateFilterPage(filter1page1);
populateFilterPage(filter1Page2);
populateFilterPage(filter1Page3);
populateFilterPage(filter2Page1);
populateFilterPage(filter2Page2);
populateFilterPage(filter2Page3);
retrieveAndCheckFilterPageValue(filter1page1, false);
retrieveAndCheckFilterPageValue(filter1Page2, false);
retrieveAndCheckFilterPageValue(filter1Page3, false);
retrieveAndCheckFilterPageValue(filter2Page1, false);
retrieveAndCheckFilterPageValue(filter2Page2, false);
retrieveAndCheckFilterPageValue(filter2Page3, false);
}
private void populateFilterPage(String filter_page) {
TestObserver<List<io.rx_cache2.internal.Mock>> subscriber = new TestObserver<>();
List<io.rx_cache2.internal.Mock> mocksFilterPage = getMock(filter_page);
String filter = filter_page.split("_")[0];
String page = filter_page.split("_")[1];
providersRxCache.getMocksFilteredPaginateEvict(Observable.just(mocksFilterPage),
new DynamicKeyGroup(filter, page), new EvictDynamicKeyGroup(false)).subscribe(subscriber);
subscriber.awaitTerminalEvent();
}
private void retrieveAndCheckFilterPageValue(String filter_page, boolean shouldThrowException) {
String filter = filter_page.split("_")[0];
String page = filter_page.split("_")[1];
TestObserver<List<io.rx_cache2.internal.Mock>> observer =
providersRxCache.getMocksFilteredPaginateEvict(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(),
new DynamicKeyGroup(filter, page), new EvictDynamicKeyGroup(false)).test();
observer.awaitTerminalEvent();
if (shouldThrowException) {
observer.assertNoValues();
observer.assertError(Exception.class);
} else {
observer.assertNoErrors();
String valueFilterPage = observer.values().get(0).get(0).getMessage();
assertThat(valueFilterPage, is(filter_page));
}
}
private void evictProviderKey(String filter_page) {
TestObserver<List<io.rx_cache2.internal.Mock>> subscriber = new TestObserver<>();
String filter = filter_page.split("_")[0];
String page = filter_page.split("_")[1];
providersRxCache.getMocksFilteredPaginateEvict(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(),
new DynamicKeyGroup(filter, page), new EvictProvider(true)).subscribe(subscriber);
subscriber.awaitTerminalEvent();
}
private void evictDynamicKey(String filter_page) {
TestObserver<List<io.rx_cache2.internal.Mock>> subscriber = new TestObserver<>();
String filter = filter_page.split("_")[0];
String page = filter_page.split("_")[1];
providersRxCache.getMocksFilteredPaginateEvict(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(),
new DynamicKeyGroup(filter, page), new EvictDynamicKey(true)).subscribe(subscriber);
subscriber.awaitTerminalEvent();
}
private void evictDynamicKeyGroup(String filter_page) {
TestObserver<List<io.rx_cache2.internal.Mock>> subscriber = new TestObserver<>();
String filter = filter_page.split("_")[0];
String page = filter_page.split("_")[1];
providersRxCache.getMocksFilteredPaginateEvict(ProviderHelper.<List<io.rx_cache2.internal.Mock>>withoutLoader(),
new DynamicKeyGroup(filter, page), new EvictDynamicKeyGroup(true)).subscribe(subscriber);
subscriber.awaitTerminalEvent();
}
private List<io.rx_cache2.internal.Mock> getMock(String value) {
return Arrays.asList(new io.rx_cache2.internal.Mock(value));
}
private List<io.rx_cache2.internal.Mock> createMocks(int size) {
long currentTime = System.currentTimeMillis();
List<io.rx_cache2.internal.Mock> mocks = new ArrayList(size);
for (int i = 0; i < size; i++) {
mocks.add(new io.rx_cache2.internal.Mock("mock" + currentTime));
}
return mocks;
}
}