From da928fb5499e56e873fc1d7746b64862a8ed02ed Mon Sep 17 00:00:00 2001 From: Rodrigo Damazio Date: Thu, 19 May 2011 21:42:40 -0300 Subject: [PATCH] Making data hub tests run considerably faster. --- .../apps/mytracks/content/TrackDataHub.java | 25 ++++++++++------- .../mytracks/content/TrackDataHubTest.java | 28 ++++++++++--------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java index 7749ad42f..dc00b599e 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java @@ -15,11 +15,13 @@ */ package com.google.android.apps.mytracks.content; +import static com.google.android.apps.mytracks.Constants.DEFAULT_MIN_REQUIRED_ACCURACY; +import static com.google.android.apps.mytracks.Constants.MAX_DISPLAYED_WAYPOINTS_POINTS; +import static com.google.android.apps.mytracks.Constants.TARGET_DISPLAYED_TRACK_POINTS; import static com.google.android.apps.mytracks.Constants.MAX_LOCATION_AGE_MS; import static com.google.android.apps.mytracks.Constants.MAX_NETWORK_AGE_MS; import static com.google.android.apps.mytracks.Constants.TAG; -import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.content.DataSourceManager.DataSourceListener; import com.google.android.apps.mytracks.content.MyTracksProviderUtils.DoubleBufferedLocationFactory; import com.google.android.apps.mytracks.content.MyTracksProviderUtils.LocationIterator; @@ -63,6 +65,9 @@ public class TrackDataHub { private final String METRIC_UNITS_KEY; private final String SPEED_REPORTING_KEY; + // Overridable constants + private final int targetNumPoints; + /** Types of data that we can expose. */ public static enum ListenerDataType { /** Listen to when the selected track changes. */ @@ -193,7 +198,7 @@ public class TrackDataHub { public TrackDataHub(Context ctx, SharedPreferences preferences, MyTracksProviderUtils providerUtils) { this(ctx, new DataSourcesWrapperImpl(ctx, preferences), new TrackDataListeners(), - preferences, providerUtils); + preferences, providerUtils, TARGET_DISPLAYED_TRACK_POINTS); } /** @@ -201,12 +206,13 @@ public class TrackDataHub { */ // @VisibleForTesting TrackDataHub(Context ctx, DataSourcesWrapper dataSources, TrackDataListeners listeners, - SharedPreferences preferences, MyTracksProviderUtils providerUtils) { + SharedPreferences preferences, MyTracksProviderUtils providerUtils, int targetNumPoints) { this.context = ctx; this.listeners = listeners; this.preferences = preferences; this.providerUtils = providerUtils; this.dataSources = dataSources; + this.targetNumPoints = targetNumPoints; this.dataSourceManager = new DataSourceManager(dataSourceListener, dataSources); this.locationFactory = new DoubleBufferedLocationFactory(); @@ -249,7 +255,7 @@ public class TrackDataHub { useMetricUnits = preferences.getBoolean(METRIC_UNITS_KEY, true); reportSpeed = preferences.getBoolean(SPEED_REPORTING_KEY, true); minRequiredAccuracy = preferences.getInt(MIN_REQUIRED_ACCURACY_KEY, - Constants.DEFAULT_MIN_REQUIRED_ACCURACY); + DEFAULT_MIN_REQUIRED_ACCURACY); } /** @@ -566,7 +572,7 @@ public class TrackDataHub { notifyPointsUpdated(true, 0, 0, pointListeners, sampledOutPointListeners); notifyWaypointUpdated(getListenersFor(ListenerDataType.WAYPOINT_UPDATES)); - + if (lastSeenLocation != null) { notifyLocationChanged(lastSeenLocation, true, getListenersFor(ListenerDataType.LOCATION_UPDATES)); @@ -587,7 +593,7 @@ public class TrackDataHub { private void notifyPreferenceChanged(String key) { if (MIN_REQUIRED_ACCURACY_KEY.equals(key)) { minRequiredAccuracy = preferences.getInt(MIN_REQUIRED_ACCURACY_KEY, - Constants.DEFAULT_MIN_REQUIRED_ACCURACY); + DEFAULT_MIN_REQUIRED_ACCURACY); } else if (METRIC_UNITS_KEY.equals(key)) { useMetricUnits = preferences.getBoolean(METRIC_UNITS_KEY, true); notifyUnitsChanged(); @@ -824,7 +830,7 @@ public class TrackDataHub { // Always reload all the waypoints. final Cursor cursor = providerUtils.getWaypointsCursor( - selectedTrackId, 0L, Constants.MAX_DISPLAYED_WAYPOINTS_POINTS); + selectedTrackId, 0L, MAX_DISPLAYED_WAYPOINTS_POINTS); runInListenerThread(new Runnable() { @Override @@ -919,7 +925,7 @@ public class TrackDataHub { long maxPointId = keepState ? -1 : lastSeenLocationId; // TODO: Move (re)sampling to a separate class. - if (numLoadedPoints >= Constants.TARGET_DISPLAYED_TRACK_POINTS) { + if (numLoadedPoints >= targetNumPoints) { // We're about to exceed the maximum desired number of points, so reload // the whole track with fewer points (the sampling frequency will be // lower). We do this for every listener even if we were loading just for @@ -987,8 +993,7 @@ public class TrackDataHub { // no matter how many points we get in the newest batch, we'll never exceed // MAX_DISPLAYED_TRACK_POINTS = 2 * TARGET_DISPLAYED_TRACK_POINTS before resampling. long numTotalPoints = lastStoredLocationId - localFirstSeenLocationId; - pointSamplingFrequency = - (int) (1 + numTotalPoints / Constants.TARGET_DISPLAYED_TRACK_POINTS); + pointSamplingFrequency = (int) (1 + numTotalPoints / targetNumPoints); } notifyNewPoint(location, locationId, lastStoredLocationId, diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java index 12a72999e..9f69c79f5 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java @@ -63,6 +63,8 @@ import org.easymock.IAnswer; public class TrackDataHubTest extends AndroidTestCase { private static final long TRACK_ID = 42L; + private static final int TARGET_POINTS = 50; + private MyTracksProviderUtils providerUtils; private TrackDataHub hub; private TrackDataListeners listeners; @@ -89,7 +91,7 @@ public class TrackDataHubTest extends AndroidTestCase { dataSources = AndroidMock.createNiceMock("dataSources", DataSourcesWrapper.class); listeners = new TrackDataListeners(); - hub = new TrackDataHub(context, dataSources, listeners, prefs, providerUtils) { + hub = new TrackDataHub(context, dataSources, listeners, prefs, providerUtils, TARGET_POINTS) { @Override protected void runInListenerThread(Runnable runnable) { // Run everything in the same thread. @@ -627,11 +629,11 @@ public class TrackDataHubTest extends AndroidTestCase { dataSources.registerContentObserver( eq(TrackPointsColumns.CONTENT_URI), eq(false), capture(observerCapture)); - FixedSizeLocationIterator locationIterator = new FixedSizeLocationIterator(1, 20000, 4, 253, 700, 712); + FixedSizeLocationIterator locationIterator = new FixedSizeLocationIterator(1, 200, 4, 25, 71, 120); expect(providerUtils.getLocationIterator( eq(TRACK_ID), eq(0L), eq(false), isA(LocationFactory.class))) .andReturn(locationIterator); - expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(20000L); + expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(200L); listener1.clearTrackPoints(); listener2.clearTrackPoints(); @@ -660,12 +662,12 @@ public class TrackDataHubTest extends AndroidTestCase { dataSources.registerContentObserver( eq(TrackPointsColumns.CONTENT_URI), eq(false), capture(observerCapture)); - // Deliver 3000 points (no sampling happens) - FixedSizeLocationIterator locationIterator = new FixedSizeLocationIterator(1, 3000, 5); + // Deliver 30 points (no sampling happens) + FixedSizeLocationIterator locationIterator = new FixedSizeLocationIterator(1, 30, 5); expect(providerUtils.getLocationIterator( eq(TRACK_ID), eq(0L), eq(false), isA(LocationFactory.class))) .andReturn(locationIterator); - expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(3000L); + expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(30L); listener1.clearTrackPoints(); locationIterator.expectLocationsDelivered(listener1); @@ -678,13 +680,13 @@ public class TrackDataHubTest extends AndroidTestCase { verifyAndReset(); - // Now deliver 3000 more (incrementally sampled) + // Now deliver 30 more (incrementally sampled) ContentObserver observer = observerCapture.getValue(); - locationIterator = new FixedSizeLocationIterator(3001, 3000); + locationIterator = new FixedSizeLocationIterator(31, 30); expect(providerUtils.getLocationIterator( - eq(TRACK_ID), eq(3001L), eq(false), isA(LocationFactory.class))) + eq(TRACK_ID), eq(31L), eq(false), isA(LocationFactory.class))) .andReturn(locationIterator); - expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(6000L); + expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(60L); locationIterator.expectSampledLocationsDelivered(listener1, 2, false); listener1.onNewTrackPointsDone(); @@ -695,12 +697,12 @@ public class TrackDataHubTest extends AndroidTestCase { verifyAndReset(); - // Now another 3000 (triggers resampling) - locationIterator = new FixedSizeLocationIterator(1, 9000); + // Now another 30 (triggers resampling) + locationIterator = new FixedSizeLocationIterator(1, 90); expect(providerUtils.getLocationIterator( eq(TRACK_ID), eq(0L), eq(false), isA(LocationFactory.class))) .andReturn(locationIterator); - expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(9000L); + expect(providerUtils.getLastLocationId(TRACK_ID)).andReturn(90L); listener1.clearTrackPoints(); locationIterator.expectSampledLocationsDelivered(listener1, 2, false);