/*******************************************************************************
* Gisgraphy Project
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
*
* Copyright 2008 Gisgraphy project
* David Masclet <davidmasclet@gisgraphy.com>
*
*
*******************************************************************************/
package com.gisgraphy.importer;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import com.gisgraphy.domain.valueobject.ImporterStatus;
import com.gisgraphy.domain.valueobject.ImporterStatusDto;
import com.gisgraphy.helper.FileHelper;
import com.gisgraphy.service.IInternationalisationService;
import com.gisgraphy.test.GisgraphyTestHelper;
public class OpenStreetMapHouseNumberFileRetrieverTest {
@Test
public void processShouldExtractFilesEvenIfRetrieveFileIsFalse(){
final List<String> methodCalled = new ArrayList<String>();
final String downloadFlag = "download";
final String decompressFlag = "decompress";
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever(){
@Override
protected void downloadFiles() {
methodCalled.add(downloadFlag);
}
@Override
public void decompressFiles() throws IOException {
methodCalled.add(decompressFlag);
}
};
ImporterConfig importerConfig = new ImporterConfig();
importerConfig.setOpenstreetmapHouseNumberImporterEnabled(true);
importerConfig.setRetrieveFiles(false);
openStreetMapHouseNumberFileRetriever.setInternationalisationService(createMockInternationalisationService());
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
openStreetMapHouseNumberFileRetriever.process();
Assert.assertEquals(decompressFlag, methodCalled.get(0));
}
@Test
public void processShouldExtractAndDownloadFilesIfRetrieveFileIsTrue(){
final List<String> methodCalled = new ArrayList<String>();
final String downloadFlag = "download";
final String decompressFlag = "decompress";
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever(){
@Override
protected void downloadFiles() {
methodCalled.add(downloadFlag);
}
@Override
public void decompressFiles() throws IOException {
methodCalled.add(decompressFlag);
}
};
ImporterConfig importerConfig = new ImporterConfig();
importerConfig.setOpenstreetmapImporterEnabled(true);
importerConfig.setRetrieveFiles(true);
openStreetMapHouseNumberFileRetriever.setInternationalisationService(createMockInternationalisationService());
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
openStreetMapHouseNumberFileRetriever.process();
Assert.assertEquals(downloadFlag, methodCalled.get(0));
Assert.assertEquals(decompressFlag, methodCalled.get(1));
}
@Test
public void processShouldDoNothingIfopenstreetmapIsDisabled(){
final List<String> methodCalled = new ArrayList<String>();
final String downloadFlag = "download";
final String decompressFlag = "decompress";
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever(){
@Override
protected void downloadFiles() {
methodCalled.add(downloadFlag);
}
@Override
public void decompressFiles() throws IOException {
methodCalled.add(decompressFlag);
}
};
ImporterConfig importerConfig = new ImporterConfig();
importerConfig.setOpenstreetmapHouseNumberImporterEnabled(false);
importerConfig.setRetrieveFiles(true);
openStreetMapHouseNumberFileRetriever.setInternationalisationService(createMockInternationalisationService());
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
openStreetMapHouseNumberFileRetriever.process();
Assert.assertEquals(0, methodCalled.size());
}
@Test
public void process() {
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever();
openStreetMapHouseNumberFileRetriever.setInternationalisationService(createMockInternationalisationService());
ImporterConfig importerConfig = new ImporterConfig();
importerConfig.setOpenstreetMaphouseNumbersDownloadURL(ImporterConfigTest.GISGRAPHY_DOWNLOAD_SERVER+"/openstreetmap/version_3_0/");
// create a temporary directory to download files
File tempDir = FileHelper.createTempDir(this.getClass()
.getSimpleName());
// get files to download
List<String> filesToDownload =new ArrayList<String>();
String fileTobeDownload = "NU.gis";
filesToDownload.add(fileTobeDownload);
importerConfig.setOpenStreetMapHouseNumberFilesToDownload(fileTobeDownload);
importerConfig.setRetrieveFiles(true);
importerConfig.setOpenStreetMapHouseNumberDir(tempDir.getAbsolutePath());
// check that the directory is ending with the / or \ according to the
// System
Assert.assertTrue("openstreetmap house number dir must ends with" + File.separator,
importerConfig.getOpenStreetMapHouseNumberDir().endsWith(File.separator));
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
openStreetMapHouseNumberFileRetriever.process();
// check that openStreetmapURL ends with '/' : normally "/" is added
// if not
Assert.assertTrue("openstreetmapHouseNumberDownloadURL must ends with '/' but was "
+ importerConfig.getOpenstreetMaphouseNumbersDownloadURL(), importerConfig
.getOpenstreetMaphouseNumbersDownloadURL().endsWith("/"));
// check that files have been Downloaded
File file = null;
for (String fileToDownload : filesToDownload) {
file = new File(importerConfig.getOpenStreetMapHouseNumberDir() + fileToDownload);
if (importerConfig.isRetrieveFiles()) {
Assert.assertTrue("Le fichier " + fileToDownload
+ " have not been downloaded in "
+ importerConfig.getOpenStreetMapHouseNumberDir(), file.exists());
} else {
Assert.assertFalse("Le fichier " + fileToDownload
+ " have been downloaded in "
+ importerConfig.getOpenStreetMapHouseNumberDir()
+ " even if the option retrievefile is"
+ importerConfig.isRetrieveFiles(), file.exists());
}
}
// check that files have been untar
for (String fileToDownload : filesToDownload) {
String fileNameWithCSVExtension = fileToDownload.substring(0,
(fileToDownload.length()) - importerConfig.OPENSTREETAMP_COMPRESSED_FILE_EXTENSION.length())
+ ".txt";
file = new File(importerConfig.getOpenStreetMapHouseNumberDir()
+ fileNameWithCSVExtension);
if (importerConfig.isRetrieveFiles()) {
Assert.assertTrue("Le fichier " + fileNameWithCSVExtension
+ " have not been untar in "
+ importerConfig.getOpenStreetMapHouseNumberDir(), file.exists());
} else {
Assert.assertFalse("Le fichier " + fileToDownload
+ " have been unzip in "
+ importerConfig.getOpenStreetMapHouseNumberDir()
+ " even if the option retrievefile is"
+ importerConfig.isRetrieveFiles(), file.exists());
}
}
// delete temp dir
Assert.assertTrue("the tempDir has not been deleted", GisgraphyTestHelper
.DeleteNonEmptyDirectory(tempDir));
}
@Test
public void processWhenNotExistingFile() {
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever();
openStreetMapHouseNumberFileRetriever.setInternationalisationService(createMockInternationalisationService());
ImporterConfig importerConfig = new ImporterConfig();
importerConfig.setOpenstreetMaphouseNumbersDownloadURL(ImporterConfigTest.GISGRAPHY_DOWNLOAD_SERVER+"/openstreetmap/version_3_0/");
// create a temporary directory to download files
File tempDir = FileHelper.createTempDir(this.getClass()
.getSimpleName());
// get files to download
List<String> filesToDownload =new ArrayList<String>();
String fileTobeDownload = "notExisting.gis";
filesToDownload.add(fileTobeDownload);
importerConfig.setOpenStreetMapHouseNumberFilesToDownload(fileTobeDownload);
importerConfig.setRetrieveFiles(true);
importerConfig.setOpenStreetMapHouseNumberDir(tempDir.getAbsolutePath());
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
try {
openStreetMapHouseNumberFileRetriever.process();
fail("all the files specify should exists");
} catch (ImporterException e) {
Assert.assertEquals(FileNotFoundException.class, e.getCause().getCause().getClass());
}
// delete temp dir
Assert.assertTrue("the tempDir has not been deleted", GisgraphyTestHelper
.DeleteNonEmptyDirectory(tempDir));
}
private IInternationalisationService createMockInternationalisationService() {
IInternationalisationService internationalisationService = EasyMock.createMock(IInternationalisationService.class);
EasyMock.expect(internationalisationService.getString((String)EasyMock.anyObject())).andStubReturn("localizedValue");
EasyMock.replay(internationalisationService);
return internationalisationService;
}
@Test
public void StatusShouldBeEqualsToSkipedIfRetrieveFileIsFalse(){
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever(){
@Override
public void decompressFiles() throws IOException {
return;
}
};
openStreetMapHouseNumberFileRetriever.setInternationalisationService(createMockInternationalisationService());
ImporterConfig importerConfig = new ImporterConfig();
importerConfig.setOpenstreetmapHouseNumberImporterEnabled(false);
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
openStreetMapHouseNumberFileRetriever.process();
Assert.assertEquals(ImporterStatus.SKIPPED, openStreetMapHouseNumberFileRetriever.getStatus());
ImporterStatusDto statusDto = new ImporterStatusDto(openStreetMapHouseNumberFileRetriever);
Assert.assertEquals(0, statusDto.getPercent());
}
@Test
public void StatusShouldBeEqualsToPROCESSEDIfNoError(){
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever();
openStreetMapHouseNumberFileRetriever.setInternationalisationService(createMockInternationalisationService());
ImporterConfig importerConfig = EasyMock.createMock(ImporterConfig.class);
EasyMock.expect(importerConfig.isRetrieveFiles()).andReturn(true).times(2);
EasyMock.expect(importerConfig.isOpenstreetmapHouseNumberImporterEnabled()).andReturn(true);
EasyMock.expect(importerConfig.getGeonamesDownloadFilesListFromOption()).andStubReturn(new ArrayList<String>());
EasyMock.expect(importerConfig.getOpenStreetMapHouseNumberDir()).andStubReturn("");
EasyMock.expect(importerConfig.getOpenstreetMaphouseNumbersDownloadURL()).andStubReturn("");
EasyMock.expect(importerConfig.getOpenStreetMapHouseNumberDownloadFilesListFromOption()).andStubReturn(new ArrayList<String>());
EasyMock.replay(importerConfig);
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
openStreetMapHouseNumberFileRetriever.process();
Assert.assertEquals(ImporterStatus.PROCESSED, openStreetMapHouseNumberFileRetriever.getStatus());
ImporterStatusDto statusDto = new ImporterStatusDto(openStreetMapHouseNumberFileRetriever);
Assert.assertEquals(100, statusDto.getPercent());
}
@Test
public void shouldBeSkipShouldReturnCorrectValue(){
ImporterConfig importerConfig = new ImporterConfig();
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever();
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
importerConfig.setOpenstreetmapHouseNumberImporterEnabled(false);
Assert.assertTrue(openStreetMapHouseNumberFileRetriever.shouldBeSkipped());
importerConfig.setOpenstreetmapHouseNumberImporterEnabled(true);
Assert.assertFalse(openStreetMapHouseNumberFileRetriever.shouldBeSkipped());
}
@Test
public void getFilesToDownloadShouldReturnTheImporterConfigOption(){
ImporterConfig importerConfig = new ImporterConfig();
String fileTobeDownload = "AD.gis";
List<String> filesToDownload =new ArrayList<String>();
filesToDownload.add(fileTobeDownload);
importerConfig.setOpenStreetMapHouseNumberFilesToDownload(fileTobeDownload);
OpenStreetMapHouseNumberFileRetriever openStreetMapHouseNumberFileRetriever = new OpenStreetMapHouseNumberFileRetriever();
openStreetMapHouseNumberFileRetriever.setImporterConfig(importerConfig);
Assert.assertEquals("getFilesToDownload should return the importerConfig Option",filesToDownload, openStreetMapHouseNumberFileRetriever.getFilesToDownload());
}
}