/*
* Copyright (C) 2009 Google Inc.
*
* 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 com.google.sites.liberation.export;
import static org.junit.Assert.*;
import com.google.common.collect.Lists;
import com.google.gdata.client.Query;
import com.google.gdata.client.sites.SitesService;
import com.google.gdata.data.sites.BaseContentEntry;
import com.google.gdata.data.sites.WebPageEntry;
import com.google.gdata.util.ServiceException;
import com.google.sites.liberation.util.EntryProvider;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* @author bsimon@google.com (Ben Simon)
*/
public class ContinuousContentFeedTest {
private URL url;
private SitesService sitesService;
private final BaseContentEntry<?> serviceExceptionEntry = new WebPageEntry();
private final BaseContentEntry<?> ioExceptionEntry = new WebPageEntry();
@Before
public void initUrl() throws MalformedURLException {
url = new URL("http://test.com");
sitesService = new SitesService("");
}
@Test
public void testEmptyFeed() {
EntryProvider entryProvider = new FakeEntryDownloader(
new ArrayList<BaseContentEntry<?>>(), 5);
ContinuousContentFeed feed =
new ContinuousContentFeed(url, entryProvider, sitesService, 3);
for(BaseContentEntry<?> entry : feed) {
fail("There should be no entries!");
}
}
@Test
public void testClientLimitsNumPerRequest() {
List<BaseContentEntry<?>> entries = Lists.newArrayList();
addNormalEntries(entries, 32);
EntryProvider entryProvider = new FakeEntryDownloader(entries, 5);
ContinuousContentFeed feed =
new ContinuousContentFeed(url, entryProvider, sitesService, 3);
List<BaseContentEntry<?>> newEntries = Lists.newArrayList(feed);
assertEquals(entries, newEntries);
}
@Test
public void testClientLimitsWithExceptions() {
List<BaseContentEntry<?>> entries = Lists.newArrayList();
addNormalEntries(entries, 16);
addServiceExceptions(entries, 2);
addNormalEntries(entries, 5);
addIoExceptions(entries, 1);
addNormalEntries(entries, 4);
addIoExceptions(entries, 3);
EntryProvider entryProvider = new FakeEntryDownloader(entries, 5);
ContinuousContentFeed feed =
new ContinuousContentFeed(url, entryProvider, sitesService, 4);
List<BaseContentEntry<?>> newEntries = Lists.newArrayList(feed);
while(entries.remove(serviceExceptionEntry)) {}
while(entries.remove(ioExceptionEntry)) {}
assertEquals(entries, newEntries);
}
@Test
public void testServerLimitsNumPerRequest() {
List<BaseContentEntry<?>> entries = Lists.newArrayList();
addNormalEntries(entries, 45);
EntryProvider entryProvider = new FakeEntryDownloader(entries, 5);
ContinuousContentFeed feed =
new ContinuousContentFeed(url, entryProvider, sitesService, 7);
List<BaseContentEntry<?>> newEntries = Lists.newArrayList(feed);
assertEquals(entries, newEntries);
}
@Test
public void testServerLimitsWithExceptions() {
List<BaseContentEntry<?>> entries = Lists.newArrayList();
addNormalEntries(entries, 8);
addIoExceptions(entries, 1);
addServiceExceptions(entries, 2);
addNormalEntries(entries, 16);
addIoExceptions(entries, 3);
addServiceExceptions(entries, 1);
addNormalEntries(entries, 20);
EntryProvider entryProvider = new FakeEntryDownloader(entries, 5);
ContinuousContentFeed feed =
new ContinuousContentFeed(url, entryProvider, sitesService, 8);
List<BaseContentEntry<?>> newEntries = Lists.newArrayList(feed);
while(entries.remove(serviceExceptionEntry)) {}
while(entries.remove(ioExceptionEntry)) {}
assertEquals(entries, newEntries);
}
@Test
public void testNothingLimitsNumPerRequest() {
List<BaseContentEntry<?>> entries = Lists.newArrayList();
addNormalEntries(entries, 28);
EntryProvider entryProvider = new FakeEntryDownloader(entries, 100);
ContinuousContentFeed feed =
new ContinuousContentFeed(url, entryProvider, sitesService, 100);
List<BaseContentEntry<?>> newEntries = Lists.newArrayList(feed);
assertEquals(entries, newEntries);
}
@Test
public void testNothingLimitsWithExceptions() {
List<BaseContentEntry<?>> entries = Lists.newArrayList();
addIoExceptions(entries, 4);
addNormalEntries(entries, 21);
addServiceExceptions(entries, 1);
addNormalEntries(entries, 20);
addServiceExceptions(entries, 4);
addNormalEntries(entries, 1);
EntryProvider entryProvider = new FakeEntryDownloader(entries, 100);
ContinuousContentFeed feed =
new ContinuousContentFeed(url, entryProvider, sitesService, 100);
List<BaseContentEntry<?>> newEntries = Lists.newArrayList(feed);
while(entries.remove(serviceExceptionEntry)) {}
while(entries.remove(ioExceptionEntry)) {}
assertEquals(entries, newEntries);
}
private void addNormalEntries(List<BaseContentEntry<?>> entries, int num) {
for(int i = 0; i < num; i++) {
entries.add(new WebPageEntry());
}
}
private void addServiceExceptions(List<BaseContentEntry<?>> entries, int num) {
for(int i = 0; i < num; i++) {
entries.add(serviceExceptionEntry);
}
}
private void addIoExceptions(List<BaseContentEntry<?>> entries, int num) {
for(int i = 0; i < num; i++) {
entries.add(ioExceptionEntry);
}
}
private class FakeEntryDownloader implements EntryProvider {
private final int maxResultsPerRequest;
private final List<BaseContentEntry<?>> entries;
FakeEntryDownloader(List<BaseContentEntry<?>> entries, int maxResultsPerRequest) {
this.maxResultsPerRequest = maxResultsPerRequest;
this.entries = entries;
}
public List<BaseContentEntry<?>> getEntries(Query query, SitesService sitesService)
throws ServiceException, IOException {
int fromIndex = query.getStartIndex() - 1;
int max = Math.min(maxResultsPerRequest, query.getMaxResults());
int toIndex = Math.min(fromIndex + max, entries.size());
if (fromIndex > toIndex) {
return new ArrayList<BaseContentEntry<?>>();
}
List<BaseContentEntry<?>> response = entries.subList(fromIndex, toIndex);
if (response.contains(serviceExceptionEntry)) {
throw new ServiceException("Error");
}
if (response.contains(ioExceptionEntry)) {
throw new IOException("Error");
}
return response;
}
}
}