From 653ce1f35656042583c0fc227fa7dee14b0492d1 Mon Sep 17 00:00:00 2001
From: Lukas Lechner <lukas.lechner@sap.com>
Date: Tue, 23 Mar 2021 10:52:37 +0100
Subject: [PATCH] Add tracelocation byterepresentation to TraceLocation
 database table (DEV) (#2647)

* Add byteRepresentation property for TraceLocation and TraceLocationEntity

* Fix TraceLocationVerifierTest.kt and TraceLocationDatabaseData.kt

Co-authored-by: Matthias Urhahn <matthias.urhahn@sap.com>
---
 .../1.json                                            | 11 ++++++++---
 .../checkins/qrcode/TraceLocationVerifierTest.kt      |  2 ++
 .../storage/TraceLocationDatabaseData.kt              |  2 ++
 .../ui/createevent/CreateEventTestViewModel.kt        |  1 +
 .../checkins/qrcode/TraceLocation.kt                  |  2 ++
 .../checkins/qrcode/TraceLocationVerifyResult.kt      |  1 +
 .../storage/entity/TraceLocationEntity.kt             |  3 ++-
 .../events/DefaultTraceLocationKtTest.kt              |  8 ++++++++
 .../storage/entity/TraceLocationEntityTest.kt         |  4 ++++
 9 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json b/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json
index 0c3879814..54da7b805 100644
--- a/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json
+++ b/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json
@@ -2,7 +2,7 @@
   "formatVersion": 1,
   "database": {
     "version": 1,
-    "identityHash": "3130771db80d789cd0ef50b8d24e0354",
+    "identityHash": "58db835392620886de3bb25c22d5190a",
     "entities": [
       {
         "tableName": "checkin",
@@ -116,7 +116,7 @@
       },
       {
         "tableName": "traceLocations",
-        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`guid` TEXT NOT NULL, `version` INTEGER NOT NULL, `type` INTEGER NOT NULL, `description` TEXT NOT NULL, `address` TEXT NOT NULL, `startDate` TEXT, `endDate` TEXT, `defaultCheckInLengthInMinutes` INTEGER, `signature` TEXT NOT NULL, PRIMARY KEY(`guid`))",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`guid` TEXT NOT NULL, `version` INTEGER NOT NULL, `type` INTEGER NOT NULL, `description` TEXT NOT NULL, `address` TEXT NOT NULL, `startDate` TEXT, `endDate` TEXT, `defaultCheckInLengthInMinutes` INTEGER, `byteRepresentation` TEXT NOT NULL, `signature` TEXT NOT NULL, PRIMARY KEY(`guid`))",
         "fields": [
           {
             "fieldPath": "guid",
@@ -165,6 +165,11 @@
             "columnName": "defaultCheckInLengthInMinutes",
             "affinity": "INTEGER",
             "notNull": false
+          },{
+            "fieldPath": "byteRepresentationBase64",
+            "columnName": "byteRepresentation",
+            "affinity": "TEXT",
+            "notNull": true
           },
           {
             "fieldPath": "signatureBase64",
@@ -186,7 +191,7 @@
     "views": [],
     "setupQueries": [
       "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
-      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3130771db80d789cd0ef50b8d24e0354')"
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '58db835392620886de3bb25c22d5190a')"
     ]
   }
 }
\ No newline at end of file
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt
index 50a7c51e6..ec3103243 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt
@@ -61,6 +61,7 @@ class TraceLocationVerifierTest : BaseTestInstrumentation() {
             startDate = Instant.ofEpochSecond(2687955),
             endDate = Instant.ofEpochSecond(2687991),
             defaultCheckInLengthInMinutes = 0,
+            byteRepresentation = verifyResult.signedTraceLocation.location.toByteArray().toByteString(),
             signature = verifyResult.signedTraceLocation.signature.toByteArray().toByteString()
         )
 
@@ -193,6 +194,7 @@ class TraceLocationVerifierTest : BaseTestInstrumentation() {
                 startDate = Instant.ofEpochSecond(2687955),
                 endDate = Instant.ofEpochSecond(2687991),
                 defaultCheckInLengthInMinutes = 0,
+                byteRepresentation = signedTraceLocation.location.toByteArray().toByteString(),
                 signature = signedTraceLocation.signature.toByteArray().toByteString()
             )
         }
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt
index fe4fa4ee2..f59d0d6dc 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt
@@ -16,6 +16,7 @@ object TraceLocationDatabaseData {
         startDate = Instant.parse("2021-01-01T12:00:00.000Z"),
         endDate = Instant.parse("2021-01-01T18:00:00.000Z"),
         defaultCheckInLengthInMinutes = null,
+        byteRepresentationBase64 = "byteRepresentationBase64",
         signatureBase64 = "signature1"
     )
 
@@ -28,6 +29,7 @@ object TraceLocationDatabaseData {
         startDate = null,
         endDate = null,
         defaultCheckInLengthInMinutes = 15,
+        byteRepresentationBase64 = "byteRepresentationBase64",
         signatureBase64 = "signature2"
     )
 }
diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt
index dcce1bfc5..264bb97c7 100644
--- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt
+++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt
@@ -59,6 +59,7 @@ class CreateEventTestViewModel @AssistedInject constructor(
                 startDate?.toInstant(),
                 endDate?.toInstant(),
                 defaultCheckInLengthInMinutes.toInt(),
+                "ByteRepresentation".toByteArray().toByteString(),
                 "ServerSignature".toByteArray().toByteString()
             )
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt
index 2d2f867af..2e95213bc 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt
@@ -19,6 +19,7 @@ data class TraceLocation(
     val startDate: Instant?,
     val endDate: Instant?,
     val defaultCheckInLengthInMinutes: Int?,
+    val byteRepresentation: ByteString,
     val signature: ByteString,
     val version: Int = TRACE_LOCATION_VERSION,
 ) : Parcelable
@@ -33,6 +34,7 @@ fun TraceLocationEntity.toTraceLocation() = TraceLocation(
     startDate = startDate,
     endDate = endDate,
     defaultCheckInLengthInMinutes = defaultCheckInLengthInMinutes,
+    byteRepresentation = byteRepresentationBase64.decodeBase64()!!,
     signature = signatureBase64.decodeBase64()!!,
     version = version
 )
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt
index 164ec045a..b68af8ee0 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt
@@ -29,6 +29,7 @@ data class TraceLocationVerifyResult(
         startDate = traceLocation.startTimestamp.toInstant(),
         endDate = traceLocation.endTimestamp.toInstant(),
         defaultCheckInLengthInMinutes = traceLocation.defaultCheckInLengthInMinutes,
+        byteRepresentation = signedTraceLocation.location.toByteArray().toByteString(),
         signature = signedTraceLocation.signature.toByteArray().toByteString()
     )
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt
index b6b1e032b..cf295e62b 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt
@@ -18,8 +18,8 @@ data class TraceLocationEntity(
     @ColumnInfo(name = "startDate") val startDate: Instant?,
     @ColumnInfo(name = "endDate") val endDate: Instant?,
     @ColumnInfo(name = "defaultCheckInLengthInMinutes") val defaultCheckInLengthInMinutes: Int?,
+    @ColumnInfo(name = "byteRepresentation") val byteRepresentationBase64: String,
     @ColumnInfo(name = "signature") val signatureBase64: String
-
 )
 
 fun TraceLocation.toTraceLocationEntity(): TraceLocationEntity =
@@ -31,6 +31,7 @@ fun TraceLocation.toTraceLocationEntity(): TraceLocationEntity =
         startDate = startDate,
         endDate = endDate,
         defaultCheckInLengthInMinutes = defaultCheckInLengthInMinutes,
+        byteRepresentationBase64 = byteRepresentation.base64(),
         signatureBase64 = signature.base64(),
         version = version
     )
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt
index b36cfeac9..88032335e 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt
@@ -25,6 +25,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
             startDate = Instant.parse("2021-01-01T12:00:00.000Z"),
             endDate = Instant.parse("2021-01-01T18:00:00.000Z"),
             defaultCheckInLengthInMinutes = 15,
+            byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(),
             signatureBase64 = "signature".toByteArray().toByteString().base64()
         ).toTraceLocation() shouldBe TraceLocation(
             guid = "TestGuid",
@@ -35,6 +36,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
             startDate = Instant.parse("2021-01-01T12:00:00.000Z"),
             endDate = Instant.parse("2021-01-01T18:00:00.000Z"),
             defaultCheckInLengthInMinutes = 15,
+            byteRepresentation = "byteRepresentation".toByteArray().toByteString(),
             signature = "signature".toByteArray().toByteString()
         )
     }
@@ -50,6 +52,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
             startDate = null,
             endDate = null,
             defaultCheckInLengthInMinutes = null,
+            byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(),
             signatureBase64 = "signature".toByteArray().toByteString().base64()
         ).toTraceLocation() shouldBe TraceLocation(
             guid = "TestGuid",
@@ -60,6 +63,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
             startDate = null,
             endDate = null,
             defaultCheckInLengthInMinutes = null,
+            byteRepresentation = "byteRepresentation".toByteArray().toByteString(),
             signature = "signature".toByteArray().toByteString()
         )
     }
@@ -76,6 +80,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
                 startDate = Instant.parse("2021-01-01T12:00:00.000Z"),
                 endDate = Instant.parse("2021-01-01T18:00:00.000Z"),
                 defaultCheckInLengthInMinutes = 15,
+                byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(),
                 signatureBase64 = "signature".toByteArray().toByteString().base64()
             ),
             TraceLocationEntity(
@@ -87,6 +92,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
                 startDate = null,
                 endDate = null,
                 defaultCheckInLengthInMinutes = null,
+                byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(),
                 signatureBase64 = "signature".toByteArray().toByteString().base64()
             )
         ).toTraceLocations() shouldBe listOf(
@@ -99,6 +105,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
                 startDate = Instant.parse("2021-01-01T12:00:00.000Z"),
                 endDate = Instant.parse("2021-01-01T18:00:00.000Z"),
                 defaultCheckInLengthInMinutes = 15,
+                byteRepresentation = "byteRepresentation".toByteArray().toByteString(),
                 signature = "signature".toByteArray().toByteString()
             ),
             TraceLocation(
@@ -110,6 +117,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
                 startDate = null,
                 endDate = null,
                 defaultCheckInLengthInMinutes = null,
+                byteRepresentation = "byteRepresentation".toByteArray().toByteString(),
                 signature = "signature".toByteArray().toByteString()
             )
         )
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt
index 5a0b6ad52..40c90f1d0 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt
@@ -22,6 +22,7 @@ internal class TraceLocationEntityTest : BaseTest() {
             startDate = Instant.parse("2021-01-01T12:00:00.000Z"),
             endDate = Instant.parse("2021-01-01T18:00:00.000Z"),
             defaultCheckInLengthInMinutes = 15,
+            byteRepresentation = "byteRepresentation".toByteArray().toByteString(),
             signature = "signature".toByteArray().toByteString()
         ).toTraceLocationEntity() shouldBe TraceLocationEntity(
             guid = "TestGuid",
@@ -32,6 +33,7 @@ internal class TraceLocationEntityTest : BaseTest() {
             startDate = Instant.parse("2021-01-01T12:00:00.000Z"),
             endDate = Instant.parse("2021-01-01T18:00:00.000Z"),
             defaultCheckInLengthInMinutes = 15,
+            byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(),
             signatureBase64 = "signature".toByteArray().toByteString().base64()
         )
     }
@@ -47,6 +49,7 @@ internal class TraceLocationEntityTest : BaseTest() {
             startDate = null,
             endDate = null,
             defaultCheckInLengthInMinutes = null,
+            byteRepresentation = "byteRepresentation".toByteArray().toByteString(),
             signature = "signature".toByteArray().toByteString()
         ).toTraceLocationEntity() shouldBe TraceLocationEntity(
             guid = "TestGuid",
@@ -57,6 +60,7 @@ internal class TraceLocationEntityTest : BaseTest() {
             startDate = null,
             endDate = null,
             defaultCheckInLengthInMinutes = null,
+            byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(),
             signatureBase64 = "signature".toByteArray().toByteString().base64()
         )
     }
-- 
GitLab