Changes according to comments

This commit is contained in:
Steffen Horlacher
2010-05-30 18:10:56 +02:00
parent 61884e67ec
commit 477ba7c081
6 changed files with 295 additions and 408 deletions
@@ -1,10 +1,18 @@
package com.google.android.apps.mytracks.io;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.TrackPointsColumns;
import com.google.android.apps.mytracks.content.TracksColumns;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils.Factory;
import com.google.android.apps.mytracks.testing.TestingProviderUtilsFactory;
import com.google.android.testing.mocking.AndroidMock;
import com.google.android.testing.mocking.UsesMocks;
import android.content.ContentUris;
import android.location.Location;
import android.net.Uri;
import android.test.AndroidTestCase;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -14,33 +22,16 @@ import java.text.SimpleDateFormat;
import javax.xml.parsers.ParserConfigurationException;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.xml.sax.SAXException;
import android.content.ContentUris;
import android.location.Location;
import android.net.Uri;
import android.test.AndroidTestCase;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.TrackPointsColumns;
import com.google.android.apps.mytracks.content.TracksColumns;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils.Factory;
import com.google.android.apps.mytracks.testing.TestingProviderUtilsFactory;
/**
* Tests for the GPX importer.
*
* @author Steffen (steffen.horlacher@gmail.com)
* @author Steffen Horlacher
*/
public class GpxImporterTest extends AndroidTestCase {
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(
"yyyy-MM-dd'T'hh:mm:ss'Z'");
private static final String TRACK_NAME = "blablub";
private static final String TRACK_DESC = "s'Laebe isch koi Schlotzer";
private static final String TRACK_LAT_1 = "48.768364";
@@ -55,35 +46,44 @@ public class GpxImporterTest extends AndroidTestCase {
// TODO use real files from different sources with more track points
private static final String VALID_TEST_GPX = "<gpx><trk><name><![CDATA["
+ TRACK_NAME + "]]></name><desc><![CDATA[" + TRACK_DESC
+ "]]></desc><trkseg>" + "<trkpt lat=\"" + TRACK_LAT_1 + "\" lon=\""
+ TRACK_LON_1 + "\"><ele>" + TRACK_ELE_1 + "</ele><time>" + TRACK_TIME_1
+ "</time></trkpt> +" + "<trkpt lat=\"" + TRACK_LAT_2 + "\" lon=\""
+ TRACK_LON_2 + "\"><ele>" + TRACK_ELE_2 + "</ele><time>" + TRACK_TIME_2
+ "</time></trkpt>" + "</trkseg></trk></gpx>";
+ TRACK_NAME + "]]></name><desc><![CDATA[" + TRACK_DESC
+ "]]></desc><trkseg>" + "<trkpt lat=\"" + TRACK_LAT_1 + "\" lon=\""
+ TRACK_LON_1 + "\"><ele>" + TRACK_ELE_1 + "</ele><time>"
+ TRACK_TIME_1 + "</time></trkpt> +" + "<trkpt lat=\"" + TRACK_LAT_2
+ "\" lon=\"" + TRACK_LON_2 + "\"><ele>" + TRACK_ELE_2
+ "</ele><time>" + TRACK_TIME_2 + "</time></trkpt>"
+ "</trkseg></trk></gpx>";
// invalid xml
private static final String INVALID_TEST_GPX = VALID_TEST_GPX.substring(0,
VALID_TEST_GPX.length() - 50);
private static final String INVALID_XML_TEST_GPX = VALID_TEST_GPX
.substring(0, VALID_TEST_GPX.length() - 50);
private static final String INVALID_LOCATION_TEST_GPX = VALID_TEST_GPX
.replaceAll(TRACK_LAT_1, "1000.0");
private static final String INVALID_TIME_TEST_GPX = VALID_TEST_GPX
.replaceAll(TRACK_TIME_1, "invalid");
private static final long TRACK_ID = 1;
private static final long TRACK_POINT_ID = 1;
private static final long TRACK_POINT_ID_1 = 1;
private static final long TRACK_POINT_ID_2 = 1;
private static final Uri TRACK_ID_URI = ContentUris.appendId(
TracksColumns.CONTENT_URI.buildUpon(), TRACK_ID).build();
private static final Uri TRACK_POINT_ID_URI = ContentUris.appendId(
TrackPointsColumns.CONTENT_URI.buildUpon(), TRACK_POINT_ID).build();
TracksColumns.CONTENT_URI.buildUpon(), TRACK_ID).build();
private static final Uri TRACK_POINT_ID_URI_1 = ContentUris.appendId(
TrackPointsColumns.CONTENT_URI.buildUpon(), TRACK_POINT_ID_1).build();
private static final Uri TRACK_POINT_ID_URI_2 = ContentUris.appendId(
TrackPointsColumns.CONTENT_URI.buildUpon(), TRACK_POINT_ID_2).build();
private MyTracksProviderUtils providerUtils;
private Factory oldProviderUtilsFactory;
@UsesMocks(MyTracksProviderUtils.class)
@Override
protected void setUp() throws Exception {
super.setUp();
providerUtils = EasyMock.createMock(MyTracksProviderUtils.class);
providerUtils = AndroidMock.createMock(MyTracksProviderUtils.class);
oldProviderUtilsFactory = TestingProviderUtilsFactory
.installWithInstance(providerUtils);
.installWithInstance(providerUtils);
}
@Override
@@ -98,68 +98,123 @@ public class GpxImporterTest extends AndroidTestCase {
public void testImportSuccess() throws Exception {
Capture<Track> trackParam = new Capture<Track>();
Capture<Location> locParam = new Capture<Location>();
Capture<Long> idParam = new Capture<Long>();
Capture<Location> locParam1 = new MyLocationCaptue();
Capture<Location> locParam2 = new MyLocationCaptue();
expect(providerUtils.insertTrack(capture(trackParam)))
.andReturn(TRACK_ID_URI);
AndroidMock.expect(
providerUtils.insertTrack(AndroidMock.capture(trackParam)))
.andReturn(TRACK_ID_URI);
expect(providerUtils.insertTrackPoint(capture(locParam), capture(idParam)))
.andReturn(TRACK_POINT_ID_URI);
expectLastCall().times(2);
AndroidMock.expect(
providerUtils.insertTrackPoint(AndroidMock.capture(locParam1),
AndroidMock.anyLong())).andReturn(TRACK_POINT_ID_URI_1);
providerUtils.updateTrack(capture(trackParam));
AndroidMock.expect(
providerUtils.insertTrackPoint(AndroidMock.capture(locParam2),
AndroidMock.anyLong())).andReturn(TRACK_POINT_ID_URI_2);
replay(providerUtils);
providerUtils.updateTrack(AndroidMock.capture(trackParam));
AndroidMock.replay(providerUtils);
InputStream is = new ByteArrayInputStream(VALID_TEST_GPX.getBytes());
GpxSaxImporter.importGPXFile(is, providerUtils);
GpxImporter.importGPXFile(is, providerUtils);
verify();
AndroidMock.verify();
SimpleDateFormat format = GpxImporter.DATE_FORMAT2;
// verify track parameter
Track track = trackParam.getValue();
assertEquals(TRACK_NAME, track.getName());
assertEquals(TRACK_DESC, track.getDescription());
assertEquals(DATE_FORMAT.parse(TRACK_TIME_1).getTime(), track.getStartTime());
assertEquals(format.parse(TRACK_TIME_1).getTime(), track.getStartTime());
assertNotSame(-1, track.getStartId());
assertNotSame(-1, track.getStopId());
// verify last location parameter
Location loc = locParam.getValue();
assertEquals(Double.parseDouble(TRACK_LAT_2), loc.getLatitude());
assertEquals(Double.parseDouble(TRACK_LON_2), loc.getLongitude());
assertEquals(Double.parseDouble(TRACK_ELE_2), loc.getAltitude());
assertEquals(DATE_FORMAT.parse(TRACK_TIME_2).getTime(), loc.getTime());
Location loc1 = locParam1.getValue();
assertEquals(Double.parseDouble(TRACK_LAT_1), loc1.getLatitude());
assertEquals(Double.parseDouble(TRACK_LON_1), loc1.getLongitude());
assertEquals(Double.parseDouble(TRACK_ELE_1), loc1.getAltitude());
assertEquals(format.parse(TRACK_TIME_1).getTime(), loc1.getTime());
Location loc2 = locParam2.getValue();
assertEquals(Double.parseDouble(TRACK_LAT_2), loc2.getLatitude());
assertEquals(Double.parseDouble(TRACK_LON_2), loc2.getLongitude());
assertEquals(Double.parseDouble(TRACK_ELE_2), loc2.getAltitude());
assertEquals(format.parse(TRACK_TIME_2).getTime(), loc2.getTime());
}
/**
* Test if created track will be deleted on parsing errors
* Test with invalid location - track should be deleted
*/
public void testImportFailure() throws ParserConfigurationException,
SAXException, IOException {
public void testImportLocationFailure() throws ParserConfigurationException,
SAXException, IOException {
expect(
providerUtils.insertTrack((Track) EasyMock.anyObject())).andReturn(TRACK_ID_URI);
expect(
providerUtils.insertTrackPoint((Location) EasyMock.anyObject(),
EasyMock.anyLong())).andReturn(TRACK_POINT_ID_URI);
testInvalidXML(INVALID_LOCATION_TEST_GPX);
}
/**
* Test with invalid time - track should be deleted
*/
public void testImportTimeFailure() throws ParserConfigurationException,
SAXException, IOException {
testInvalidXML(INVALID_TIME_TEST_GPX);
}
/**
* Test with invalid xml - track should be deleted
*/
public void testImportXMLFailure() throws ParserConfigurationException,
SAXException, IOException {
testInvalidXML(INVALID_XML_TEST_GPX);
}
private void testInvalidXML(String xml) throws ParserConfigurationException,
IOException {
AndroidMock.expect(
providerUtils.insertTrack((Track) AndroidMock.anyObject()))
.andReturn(TRACK_ID_URI);
AndroidMock.expect(
providerUtils.insertTrackPoint((Location) AndroidMock.anyObject(),
AndroidMock.anyLong())).andStubReturn(TRACK_POINT_ID_URI_1);
expectLastCall().anyTimes();
providerUtils.deleteTrack(TRACK_ID);
replay(providerUtils);
AndroidMock.replay(providerUtils);
InputStream is = new ByteArrayInputStream(INVALID_TEST_GPX.getBytes());
InputStream is = new ByteArrayInputStream(xml.getBytes());
try {
GpxSaxImporter.importGPXFile(is, providerUtils);
GpxImporter.importGPXFile(is, providerUtils);
} catch (SAXException e) {
// expected exception
}
verify();
AndroidMock.verify();
}
/**
* Workaround because of capture bug 2617107 in easymock:
*
* http://sourceforge.net/tracker/?func=detail&aid=2617107&group_id=82958&atid=567837
*/
@SuppressWarnings("serial")
class MyLocationCaptue extends Capture<Location> {
@Override
public void setValue(Location value) {
if (!hasCaptured()) {
super.setValue(value);
}
}
}