From 7505e6d69300ffbcfd7c1a47d1e6aa306b1a83b9 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sat, 12 Sep 2026 19:43:54 +0200 Subject: [PATCH] Added KMLTrackExporterTest. Part of #2383. --- .../file/exporter/KMLTrackExporterTest.java | 131 +++++++++++++ .../io/file/importer/ExportImportTest.java | 6 +- src/androidTest/res/raw/kml23_twotracks.kml | 185 ++++++++++++++++++ 3 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 src/androidTest/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporterTest.java create mode 100644 src/androidTest/res/raw/kml23_twotracks.kml diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporterTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporterTest.java new file mode 100644 index 000000000..2a82aa38f --- /dev/null +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporterTest.java @@ -0,0 +1,131 @@ +package de.dennisguse.opentracks.io.file.exporter; + +import static org.junit.Assert.assertEquals; + +import android.content.Context; +import android.content.Intent; +import android.os.Looper; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.rule.GrantPermissionRule; +import androidx.test.rule.ServiceTestRule; + +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import de.dennisguse.opentracks.TestUtil; +import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.Altitude; +import de.dennisguse.opentracks.data.models.Distance; +import de.dennisguse.opentracks.data.models.Marker; +import de.dennisguse.opentracks.data.models.Position; +import de.dennisguse.opentracks.data.models.Speed; +import de.dennisguse.opentracks.data.models.Track; +import de.dennisguse.opentracks.io.file.TrackFileFormat; +import de.dennisguse.opentracks.io.file.importer.ExportImportTest; +import de.dennisguse.opentracks.services.TrackRecordingService; +import de.dennisguse.opentracks.services.handlers.TrackPointCreator; +import de.dennisguse.opentracks.settings.PreferencesUtils; + +@RunWith(JUnit4.class) +public class KMLTrackExporterTest { + + @Rule + public final ServiceTestRule mServiceRule = ServiceTestRule.withTimeout(5, TimeUnit.SECONDS); + + @Rule + public GrantPermissionRule mGrantPermissionRule = TestUtil.createGrantPermissionRule(); + + private static final Context context = ApplicationProvider.getApplicationContext(); + + @BeforeClass + public static void preSetUp() { + // Prepare looper for Android's message queue + if (Looper.myLooper() == null) Looper.prepare(); + + PreferencesUtils.resetPreferences(context, true); + } + + @Test + public void twoTrack_with_oneMarker() throws TimeoutException, IOException { + // given + ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context); + + TrackRecordingService service = ((TrackRecordingService.Binder) mServiceRule.bindService(new Intent(context, TrackRecordingService.class))) + .getService(); + + TrackPointCreator trackPointCreator = service.getTrackPointCreator(); + + final Track.Id trackIdOne; + { // first track + trackPointCreator.setClock("2020-02-02T02:02:02Z"); + trackIdOne = service.startNewTrack(); + + Position position = ExportImportTest.sendLocation(trackPointCreator, "2020-02-02T02:02:03Z", 3.1234567, 14.0014567, 10, 13, 15, 1020.25, 1f); + contentProviderUtils.insertMarker( + new Marker( + null, + trackIdOne, + "Marker 1", + "Marker 1 desc", + "Marker 1 typeLocalized", + position, + null + )); + service.endCurrentTrack(); + } + + final Track.Id trackIdTwo; + { // second track + trackPointCreator.setClock("2022-02-02T02:02:02Z"); + trackIdTwo = service.startNewTrack(); + + Position position = ExportImportTest.sendLocation(trackPointCreator, "2022-02-02T02:02:03Z", 3.1234567, 14.0014567, 10, 13, 15, 1020.25, 1f); + contentProviderUtils.insertMarker( + new Marker( + null, + trackIdTwo, + "Marker 2", + "Marker 2 desc", + "Marker 2 typeLocalized", + position, + null + )); + service.endCurrentTrack(); + } + + // when + TrackExporter exporter = TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA.createTrackExporter(context, new ContentProviderUtils(context)); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + exporter.writeTrack( + List.of(contentProviderUtils.getTrack(trackIdOne), contentProviderUtils.getTrack(trackIdTwo)), + outputStream + ); + + // then + try (InputStream inputStreamExpected = InstrumentationRegistry.getInstrumentation().getContext().getResources().openRawResource(de.dennisguse.opentracks.test.R.raw.kml23_twotracks)) { + String expectation = new String(inputStreamExpected.readAllBytes(), StandardCharsets.UTF_8); + String expectationAdjusted = expectation + .replace("ece162fb-d614-4431-9d33-eb20f8ee8e1d", contentProviderUtils.getTrack(trackIdOne).uuid().toString()) + .replace("6712f4ca-3456-4739-841a-9e62760cc447", contentProviderUtils.getTrack(trackIdTwo).uuid().toString()); + assertEquals(expectationAdjusted, outputStream.toString()); + } + } +} \ No newline at end of file diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index f137e2c68..77b3cc2ed 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -127,6 +127,7 @@ public class ExportImportTest { @Before public void fileSetup() throws IOException, TimeoutException { + //TODO Replace with a ByteArrayOutputStream instead of storing a file? tmpFile = File.createTempFile("test", "test", context.getFilesDir()); tmpFileUri = Uri.fromFile(tmpFile); @@ -769,7 +770,8 @@ public class ExportImportTest { sensorManager.getAltitudeChangeHandler().setAggregator(aggregatorBarometer); } - public static void sendLocation(TrackPointCreator trackPointCreator, String time, double latitude, double longitude, float accuracy, float verticalAccuracy, float speed, double altitude, Float altitudeGain) { + //TODO Use return value (for markers) + public static Position sendLocation(TrackPointCreator trackPointCreator, String time, double latitude, double longitude, float accuracy, float verticalAccuracy, float speed, double altitude, Float altitudeGain) { Location location = new Location("mock"); location.setLatitude(latitude); location.setLongitude(longitude); @@ -782,5 +784,7 @@ public class ExportImportTest { trackPointCreator.setClock(time); trackPointCreator.getSensorManager().getGpsHandler().onDataReceived(location); + + return Position.of(location, Instant.parse(time)); } } \ No newline at end of file diff --git a/src/androidTest/res/raw/kml23_twotracks.kml b/src/androidTest/res/raw/kml23_twotracks.kml new file mode 100644 index 000000000..3394c300c --- /dev/null +++ b/src/androidTest/res/raw/kml23_twotracks.kml @@ -0,0 +1,185 @@ + + + + + +1 +1 + + + + + + + + + + + + + + + + + + + + + + + +1 + + + +2020-02-02T03:02:03+01:00 +#waypoint + + + + +14.001456,3.123456,1020.25 + + + + + +1 + + + +2022-02-02T03:02:03+01:00 +#waypoint + + + + +14.001456,3.123456,1020.25 + + + + +Tracks +1 + + + +ece162fb-d614-4431-9d33-eb20f8ee8e1d +#track + + + + + + + +absolute +1 + +2020-02-02T03:02:02+01:00 + +2020-02-02T03:02:03+01:00 +14.001456 3.123456 1020.25 +2020-02-02T03:02:03+01:00 + + + + +SEGMENT_START_MANUAL +TRACKPOINT +SEGMENT_END_MANUAL + + + +15 + + + + +1 +1 + + + +1 +1 + + + +10 + + + + + + + + + + +6712f4ca-3456-4739-841a-9e62760cc447 +#track + + + + + + + +absolute +1 + +2022-02-02T03:02:02+01:00 + +2022-02-02T03:02:03+01:00 +14.001456 3.123456 1020.25 +2022-02-02T03:02:03+01:00 + + + + +SEGMENT_START_MANUAL +TRACKPOINT +SEGMENT_END_MANUAL + + + +15 + + + + +1 +1 + + + +1 +1 + + + +10 + + + + + + + + + +