diff --git a/doc/opentracks-schema-1.0.xsd b/doc/opentracks-schema-1.0.xsd
new file mode 100644
index 000000000..55c2b3d4b
--- /dev/null
+++ b/doc/opentracks-schema-1.0.xsd
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java
index 2e1484073..1bace4ece 100644
--- a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java
+++ b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java
@@ -22,7 +22,6 @@ import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -30,6 +29,9 @@ import de.dennisguse.opentracks.content.data.TrackPointsColumns;
import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.data.WaypointsColumns;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
/**
* Tests {@link CustomContentProvider}.
*
@@ -51,7 +53,7 @@ public class CustomContentProviderTest {
*/
@Test
public void testOnCreate() {
- Assert.assertTrue(customContentProvider.onCreate(context));
+ assertTrue(customContentProvider.onCreate(context));
}
/**
@@ -59,13 +61,13 @@ public class CustomContentProviderTest {
*/
@Test
public void testGetType() {
- Assert.assertEquals(TracksColumns.CONTENT_TYPE, customContentProvider.getType(TracksColumns.CONTENT_URI));
- Assert.assertEquals(TracksColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TracksColumns.CONTENT_URI.buildUpon(), 1).build()));
+ assertEquals(TracksColumns.CONTENT_TYPE, customContentProvider.getType(TracksColumns.CONTENT_URI));
+ assertEquals(TracksColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TracksColumns.CONTENT_URI.buildUpon(), 1).build()));
- Assert.assertEquals(TrackPointsColumns.CONTENT_TYPE, customContentProvider.getType(TrackPointsColumns.CONTENT_URI_BY_ID));
- Assert.assertEquals(TrackPointsColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TrackPointsColumns.CONTENT_URI_BY_TRACKID.buildUpon(), 1).build()));
+ assertEquals(TrackPointsColumns.CONTENT_TYPE, customContentProvider.getType(TrackPointsColumns.CONTENT_URI_BY_ID));
+ assertEquals(TrackPointsColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TrackPointsColumns.CONTENT_URI_BY_TRACKID.buildUpon(), 1).build()));
- Assert.assertEquals(WaypointsColumns.CONTENT_TYPE, customContentProvider.getType(WaypointsColumns.CONTENT_URI));
- Assert.assertEquals(WaypointsColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(WaypointsColumns.CONTENT_URI.buildUpon(), 1).build()));
+ assertEquals(WaypointsColumns.CONTENT_TYPE, customContentProvider.getType(WaypointsColumns.CONTENT_URI));
+ assertEquals(WaypointsColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(WaypointsColumns.CONTENT_URI.buildUpon(), 1).build()));
}
}
\ No newline at end of file
diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomSQLiteOpenHelperTest.java b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomSQLiteOpenHelperTest.java
index 6bab2c3b1..0dd5abe7a 100644
--- a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomSQLiteOpenHelperTest.java
+++ b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomSQLiteOpenHelperTest.java
@@ -2,6 +2,7 @@ package de.dennisguse.opentracks.content.provider;
import android.content.Context;
import android.database.Cursor;
+import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
@@ -9,7 +10,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import org.junit.Assert;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -21,6 +22,10 @@ import de.dennisguse.opentracks.content.data.TrackPointsColumns;
import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.data.WaypointsColumns;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
@RunWith(AndroidJUnit4.class)
public class CustomSQLiteOpenHelperTest {
@@ -88,6 +93,7 @@ public class CustomSQLiteOpenHelperTest {
}
@Before
+ @After
public void setUp() {
context.deleteDatabase(DATABASE_NAME);
}
@@ -95,13 +101,15 @@ public class CustomSQLiteOpenHelperTest {
@Test
public void onCreate() {
try (SQLiteDatabase db = new CustomSQLiteOpenHelper(context, DATABASE_NAME).getWritableDatabase()) {
- Assert.assertTrue(hasSqlCreate(db, TracksColumns.CREATE_TABLE));
+ assertTrue(hasSqlCreate(db, TracksColumns.CREATE_TABLE));
- Assert.assertTrue(hasSqlCreate(db, TrackPointsColumns.CREATE_TABLE));
- Assert.assertTrue(hasSqlCreate(db, TrackPointsColumns.CREATE_TABLE_INDEX));
+ assertTrue(hasSqlCreate(db, TrackPointsColumns.CREATE_TABLE));
+ assertTrue(hasSqlCreate(db, TrackPointsColumns.CREATE_TABLE_INDEX));
- Assert.assertTrue(hasSqlCreate(db, WaypointsColumns.CREATE_TABLE));
- Assert.assertTrue(hasSqlCreate(db, WaypointsColumns.CREATE_TABLE_INDEX));
+ assertTrue(hasSqlCreate(db, WaypointsColumns.CREATE_TABLE));
+ assertTrue(hasSqlCreate(db, WaypointsColumns.CREATE_TABLE_INDEX));
+ } catch (Exception e) {
+ fail();
}
}
@@ -127,18 +135,18 @@ public class CustomSQLiteOpenHelperTest {
}
// then - verify table structure
- Assert.assertEquals(3, tableByUpgrade.size());
- Assert.assertEquals(tableByUpgrade.size(), tablesByCreate.size());
+ assertEquals(3, tableByUpgrade.size());
+ assertEquals(tableByUpgrade.size(), tablesByCreate.size());
- Assert.assertEquals(tablesByCreate.get(TracksColumns.TABLE_NAME), tableByUpgrade.get(TracksColumns.TABLE_NAME));
- Assert.assertEquals(tablesByCreate.get(TrackPointsColumns.TABLE_NAME), tableByUpgrade.get(TrackPointsColumns.TABLE_NAME));
- Assert.assertEquals(tablesByCreate.get(WaypointsColumns.TABLE_NAME), tableByUpgrade.get(WaypointsColumns.TABLE_NAME));
+ assertEquals(tablesByCreate.get(TracksColumns.TABLE_NAME), tableByUpgrade.get(TracksColumns.TABLE_NAME));
+ assertEquals(tablesByCreate.get(TrackPointsColumns.TABLE_NAME), tableByUpgrade.get(TrackPointsColumns.TABLE_NAME));
+ assertEquals(tablesByCreate.get(WaypointsColumns.TABLE_NAME), tableByUpgrade.get(WaypointsColumns.TABLE_NAME));
// then - verify custom indices
- Assert.assertEquals(3, indicesByCreate.size());
- Assert.assertEquals(indicesByUpgrade.get(TracksColumns.TABLE_NAME), indicesByCreate.get(TracksColumns.TABLE_NAME));
- Assert.assertEquals(indicesByUpgrade.get(TrackPointsColumns.TABLE_NAME), indicesByCreate.get(TrackPointsColumns.TABLE_NAME));
- Assert.assertEquals(indicesByUpgrade.get(WaypointsColumns.TABLE_NAME), indicesByCreate.get(WaypointsColumns.TABLE_NAME));
+ assertEquals(3, indicesByCreate.size());
+ assertEquals(indicesByUpgrade.get(TracksColumns.TABLE_NAME), indicesByCreate.get(TracksColumns.TABLE_NAME));
+ assertEquals(indicesByUpgrade.get(TrackPointsColumns.TABLE_NAME), indicesByCreate.get(TrackPointsColumns.TABLE_NAME));
+ assertEquals(indicesByUpgrade.get(WaypointsColumns.TABLE_NAME), indicesByCreate.get(WaypointsColumns.TABLE_NAME));
}
@Test
@@ -155,12 +163,23 @@ public class CustomSQLiteOpenHelperTest {
}
// then - verify table structure
- Assert.assertEquals(TRACKS_CREATE_TABLE_V23, tablesByDowngrade.get("tracks"));
- Assert.assertEquals(TRACKPOINTS_CREATE_TABLE_V23, tablesByDowngrade.get("trackpoints"));
- Assert.assertEquals(WAYPOINTS_CREATE_TABLE_V23, tablesByDowngrade.get("waypoints"));
+ assertEquals(TRACKS_CREATE_TABLE_V23, tablesByDowngrade.get("tracks"));
+ assertEquals(TRACKPOINTS_CREATE_TABLE_V23, tablesByDowngrade.get("trackpoints"));
+ assertEquals(WAYPOINTS_CREATE_TABLE_V23, tablesByDowngrade.get("waypoints"));
// then - verify custom indices
- Assert.assertEquals(0, indicesByDowngrade.size());
+ assertEquals(0, indicesByDowngrade.size());
+ }
+
+ @Test
+ public void track_uuid_unique() {
+ try (SQLiteDatabase db = new CustomSQLiteOpenHelper(context, DATABASE_NAME).getWritableDatabase()) {
+ db.execSQL("INSERT INTO tracks (uuid) VALUES (0x00)");
+ db.execSQL("INSERT INTO tracks (uuid) VALUES (0x00)");
+ fail("unique constraint not enforced");
+ } catch (SQLiteConstraintException e) {
+ assertTrue(e.getMessage().contains("UNIQUE constraint failed: tracks.uuid"));
+ }
}
private void createVersion23() {
diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/AbstractTestFileTrackImporter.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/AbstractTestFileTrackImporter.java
index 4b5910b34..9b441dd47 100644
--- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/AbstractTestFileTrackImporter.java
+++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/AbstractTestFileTrackImporter.java
@@ -29,13 +29,13 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import java.text.SimpleDateFormat;
+import java.time.ZoneOffset;
import java.util.Locale;
import java.util.SimpleTimeZone;
+import java.util.TimeZone;
import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.content.data.TrackPoint;
-import de.dennisguse.opentracks.content.data.TracksColumns;
-import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.data.WaypointsColumns;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
@@ -64,11 +64,11 @@ public abstract class AbstractTestFileTrackImporter {
static final SimpleDateFormat DATE_FORMAT_0 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'", Locale.US);
static final SimpleDateFormat DATE_FORMAT_1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
- static final long TRACK_ID_0 = 1;
+
static final long TRACK_POINT_ID_0 = 1;
static final long TRACK_POINT_ID_1 = 2;
static final long TRACK_POINT_ID_3 = 4;
- static final Uri TRACK_ID_0_URI = ContentUris.appendId(TracksColumns.CONTENT_URI.buildUpon(), TRACK_ID_0).build();
+
private static final long WAYPOINT_ID_0 = 1;
private static final Uri WAYPOINT_ID_O_URI = ContentUris.appendId(WaypointsColumns.CONTENT_URI.buildUpon(), WAYPOINT_ID_0).build();
@@ -76,7 +76,7 @@ public abstract class AbstractTestFileTrackImporter {
static {
// We can't omit the timezones in the test, otherwise it'll use the local timezone and fail depending on where the test runner is.
- SimpleTimeZone utc = new SimpleTimeZone(0, "UTC");
+ TimeZone utc = SimpleTimeZone.getTimeZone(ZoneOffset.UTC);
DATE_FORMAT_0.setTimeZone(utc);
DATE_FORMAT_1.setTimeZone(utc);
}
@@ -114,7 +114,7 @@ public abstract class AbstractTestFileTrackImporter {
protected void expectTrackUpdate(ArgumentCaptor