/*
This file is part of RouteConverter.
RouteConverter is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
RouteConverter is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with RouteConverter; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Copyright (C) 2007 Christian Pesch. All Rights Reserved.
*/
package slash.navigation.feedback.domain;
import org.junit.Test;
import slash.common.type.CompactCalendar;
import slash.navigation.common.BoundingBox;
import slash.navigation.common.SimpleNavigationPosition;
import slash.navigation.datasources.binding.*;
import slash.navigation.datasources.impl.DataSourceImpl;
import slash.navigation.download.Checksum;
import slash.navigation.download.FileAndChecksum;
import slash.navigation.rest.Get;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.lang.System.currentTimeMillis;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static slash.common.TestCase.calendar;
import static slash.common.type.CompactCalendar.fromMillis;
import static slash.navigation.datasources.DataSourceManager.DATASOURCES_URI;
import static slash.navigation.datasources.helpers.DataSourcesUtil.asBoundingBoxType;
public class SendChecksumsIT extends RouteFeedbackServiceBase {
private static final CompactCalendar CALENDARF1 = calendar(2014, 1, 1, 1, 1, 1);
private static final CompactCalendar CALENDARF1F1 = calendar(2014, 1, 1, 1, 3, 1);
private static final CompactCalendar CALENDARF2 = calendar(2014, 2, 2, 2, 2, 2);
private static final CompactCalendar CALENDARF2F2 = calendar(2014, 2, 2, 2, 6, 2);
private DatasourceType createDataSourceType(long id) {
DatasourceType datasourceType = new DatasourceType();
datasourceType.setId("id" + id);
datasourceType.setName("name" + id);
datasourceType.setBaseUrl("baseUrl" + id);
datasourceType.setDirectory("directory" + id);
datasourceType.setAction(ActionType.fromValue("Copy"));
return datasourceType;
}
private FileType createFileType(long id) {
FileType file = new FileType();
file.setUri("fileuri" + id);
FragmentType filefragment = new FragmentType();
filefragment.setKey("fragmentkey" + id);
file.getFragment().add(filefragment);
return file;
}
private String createFilterUriForFile(long id) {
return "baseUrl" + id + "fileuri" + id;
}
private FileAndChecksum createFileAndChecksum(String fileUri, CompactCalendar lastModified, Long contentLength, String sha1) {
FileAndChecksum result = new FileAndChecksum(new File(fileUri), new Checksum(lastModified, contentLength, sha1));
if (lastModified != null || contentLength != null || sha1 != null)
result.setActualChecksum(new Checksum(lastModified != null ? fromMillis(lastModified.getTimeInMillis() + 60 * 1000) : null,
contentLength != null ? contentLength + 1000 : null, sha1 != null ? sha1 + "-actual" : null));
return result;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndNoChecksumsForFile(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("fileuri" + id, null, null, null),
singletonList(createFileAndChecksum("fragmentkey", null, null, null)));
return result;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndChecksumForFile(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("fileuri" + id, CALENDARF1, 1L, "file-sha"),
singletonList(createFileAndChecksum("fragmentkey" + id, CALENDARF1F1, 11L, "file-fragment-sha")));
return result;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndChecksumForFileNoSHA(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("fileuri" + id, CALENDARF1, 1L, null),
singletonList(createFileAndChecksum("fragmentkey" + id, CALENDARF1F1, 11L, null)));
return result;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndChecksumForFileNoLastModified(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("fileuri" + id, null, 1L, "file-sha"),
singletonList(createFileAndChecksum("fragmentkey" + id, null, 11L, "file-fragment-sha")));
return result;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndChecksumForFileOtherLastModified(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("fileuri" + id, CALENDARF2, 3L, "file-sha"),
singletonList(createFileAndChecksum("fragmentkey" + id, CALENDARF2F2, 31L, "file-fragment-sha")));
return result;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndChecksumForFileOtherSHA(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("fileuri" + id, CALENDARF2, 2L, "file-sha-2"),
singletonList(createFileAndChecksum("fragmentkey" + id, CALENDARF2F2, 21L, "file-fragment-sha-2")));
return result;
}
private MapType createMapType(long id) {
MapType map = new MapType();
map.setUri("mapuri" + id);
map.setBoundingBox(asBoundingBoxType(new BoundingBox(new SimpleNavigationPosition(1.0, 2.0), new SimpleNavigationPosition(3.0, 4.0))));
FragmentType mapfragment = new FragmentType();
mapfragment.setKey("fragmentkey" + id);
map.getFragment().add(mapfragment);
return map;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndChecksumForMap(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("mapuri" + id, CALENDARF1, 100L, "map-sha"),
singletonList(createFileAndChecksum("fragmentkey" + id, CALENDARF1F1, 110L, "map-fragment-sha")));
return result;
}
private ThemeType createThemeType(long id) {
ThemeType theme = new ThemeType();
theme.setUri("themeuri" + id);
theme.setImageUrl("imageurl");
FragmentType themefragment1 = new FragmentType();
themefragment1.setKey("fragment1key" + id);
theme.getFragment().add(themefragment1);
FragmentType themefragment2 = new FragmentType();
themefragment2.setKey("fragment2key" + id);
theme.getFragment().add(themefragment2);
return theme;
}
private Map<FileAndChecksum, List<FileAndChecksum>> createFileAndChecksumForTheme(long id) {
Map<FileAndChecksum, List<FileAndChecksum>> result = new HashMap<>();
result.put(createFileAndChecksum("themeuri" + id, CALENDARF1, 5L, "theme-sha"),
asList(createFileAndChecksum("fragment1key" + id, CALENDARF1F1, 6L, "theme-fragment1-sha"),
createFileAndChecksum("fragment2key" + id, CALENDARF2F2, 7L, "theme-fragment2-sha")));
return result;
}
@Test
public void testFileWithFragmentNoChecksums() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceType = createDataSourceType(id);
FileType fileType = createFileType(id);
dataSourceType.getFile().add(fileType);
assertEquals("\"create DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"create FileFragment fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceType), createFileAndNoChecksumsForFile(id), createFilterUriForFile(id)));
Get get = new Get(API + DATASOURCES_URI + "id" + id + ".xml");
assertTrue(get.executeAsString().contains(Long.toString(id)));
fileType.setBoundingBox(asBoundingBoxType(new BoundingBox(new SimpleNavigationPosition(1.0, 2.0), new SimpleNavigationPosition(3.0, 4.0))));
assertEquals("\"read DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"read FileFragment fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceType), createFileAndNoChecksumsForFile(id), createFilterUriForFile(id)));
}
@Test
public void testFileWithFragment() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceType = createDataSourceType(id);
dataSourceType.getFile().add(createFileType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"create FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"create FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceType), createFileAndChecksumForFile(id), createFilterUriForFile(id)));
}
@Test
public void testFileWithFragmentAddChecksumsLater() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceTypeFirst = createDataSourceType(id);
dataSourceTypeFirst.getFile().add(createFileType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"create FileFragment fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeFirst), createFileAndNoChecksumsForFile(id), createFilterUriForFile(id)));
DatasourceType dataSourceTypeLater = createDataSourceType(id);
dataSourceTypeLater.getFile().add(createFileType(id));
assertEquals("\"read DataSource id" + id + ", " +
"read File fileuri" + id + ", " +
"create FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"read FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeLater), createFileAndChecksumForFile(id), createFilterUriForFile(id)));
DatasourceType dataSourceTypeRead = createDataSourceType(id);
dataSourceTypeRead.getFile().add(createFileType(id));
assertEquals("\"read DataSource id" + id + ", " +
"read File fileuri" + id + ", " +
"read FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"read FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"read FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeRead), createFileAndChecksumForFile(id), createFilterUriForFile(id)));
}
@Test
public void testFileWithFragmentNewChecksumOtherSHA() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceTypeFirst = createDataSourceType(id);
dataSourceTypeFirst.getFile().add(createFileType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"create FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"create FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeFirst), createFileAndChecksumForFile(id), createFilterUriForFile(id)));
DatasourceType dataSourceTypeSecond = createDataSourceType(id);
dataSourceTypeSecond.getFile().add(createFileType(id));
assertEquals("\"read DataSource id" + id + ", " +
"read File fileuri" + id + ", " +
"create FileChecksum 2014-02-02 02:03:02, 1002, file-sha-2-actual for fileuri" + id + ", " +
"read FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-02-02 02:07:02, 1021, file-fragment-sha-2-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeSecond), createFileAndChecksumForFileOtherSHA(id), createFilterUriForFile(id)));
}
@Test
public void testFileWithFragmentNewChecksumOtherLastModified() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceTypeFirst = createDataSourceType(id);
dataSourceTypeFirst.getFile().add(createFileType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"create FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"create FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeFirst), createFileAndChecksumForFile(id), createFilterUriForFile(id)));
DatasourceType dataSourceTypeSecond = createDataSourceType(id);
dataSourceTypeSecond.getFile().add(createFileType(id));
assertEquals("\"read DataSource id" + id + ", " +
"read File fileuri" + id + ", " +
"read FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"read FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"read FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeSecond), createFileAndChecksumForFileOtherLastModified(id), createFilterUriForFile(id)));
}
@Test
public void testFileWithFragmentAddSHALater() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceTypeFirst = createDataSourceType(id);
dataSourceTypeFirst.getFile().add(createFileType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"create FileChecksum 2014-01-01 01:02:01, 1001, None for fileuri" + id + ", " +
"create FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-01-01 01:04:01, 1011, None for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeFirst), createFileAndChecksumForFileNoSHA(id), createFilterUriForFile(id)));
DatasourceType dataSourceTypeSecond = createDataSourceType(id);
dataSourceTypeSecond.getFile().add(createFileType(id));
assertEquals("\"read DataSource id" + id + ", " +
"read File fileuri" + id + ", " +
"create FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"read FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeSecond), createFileAndChecksumForFile(id), createFilterUriForFile(id)));
}
@Test
public void testFileWithFragmentAddLastModifiedLater() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceTypeFirst = createDataSourceType(id);
dataSourceTypeFirst.getFile().add(createFileType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create File fileuri" + id + ", " +
"create FileChecksum None, 1001, file-sha-actual for fileuri" + id + ", " +
"create FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum None, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeFirst), createFileAndChecksumForFileNoLastModified(id), createFilterUriForFile(id)));
DatasourceType dataSourceTypeSecond = createDataSourceType(id);
dataSourceTypeSecond.getFile().add(createFileType(id));
assertEquals("\"read DataSource id" + id + ", " +
"read File fileuri" + id + ", " +
"create FileChecksum 2014-01-01 01:02:01, 1001, file-sha-actual for fileuri" + id + ", " +
"read FileFragment fileuri" + id + " -> fragmentkey" + id + ", " +
"create FileFragmentChecksum 2014-01-01 01:04:01, 1011, file-fragment-sha-actual for fileuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceTypeSecond), createFileAndChecksumForFile(id), createFilterUriForFile(id)));
}
@Test
public void testMapWithFragment() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceType = createDataSourceType(id);
dataSourceType.getMap().add(createMapType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create Map mapuri" + id + ", " +
"create MapChecksum 2014-01-01 01:02:01, 1100, map-sha-actual for mapuri" + id + ", " +
"create MapFragment mapuri" + id + " -> fragmentkey" + id + ", " +
"create MapFragmentChecksum 2014-01-01 01:04:01, 1110, map-fragment-sha-actual for mapuri" + id + " -> fragmentkey" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceType), createFileAndChecksumForMap(id), "baseUrl" + id + "mapuri" + id));
}
@Test
public void testThemeWithFragments() throws Exception {
long id = currentTimeMillis();
DatasourceType dataSourceType = createDataSourceType(id);
dataSourceType.getTheme().add(createThemeType(id));
assertEquals("\"create DataSource id" + id + ", " +
"create Theme themeuri" + id + ", " +
"create ThemeChecksum 2014-01-01 01:02:01, 1005, theme-sha-actual for themeuri" + id + ", " +
"create ThemeFragment themeuri" + id + " -> fragment1key" + id + ", " +
"create ThemeFragmentChecksum 2014-01-01 01:04:01, 1006, theme-fragment1-sha-actual for themeuri" + id + " -> fragment1key" + id + ", " +
"create ThemeFragment themeuri" + id + " -> fragment2key" + id + ", " +
"create ThemeFragmentChecksum 2014-02-02 02:07:02, 1007, theme-fragment2-sha-actual for themeuri" + id + " -> fragment2key" + id + ", \"",
routeFeedback.sendChecksums(new DataSourceImpl(dataSourceType), createFileAndChecksumForTheme(id), "baseUrl" + id + "themeuri" + id));
}
}