Skip to content
This repository was archived by the owner on May 16, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public class DiagnosisKey {
public static final int KEY_DATA_LENGTH = 16;
public static final int MIN_ROLLING_PERIOD = 1;
public static final int MAX_ROLLING_PERIOD = 144;
public static final int MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS = -14;
public static final int MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS = -15;
public static final int MAX_DAYS_SINCE_ONSET_OF_SYMPTOMS = 4000;
public static final int MIN_TRANSMISSION_RISK_LEVEL = 1;
public static final int MAX_TRANSMISSION_RISK_LEVEL = 8;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package app.coronawarn.server.common.persistence.domain;

import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MAX_ROLLING_PERIOD;
import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MAX_TRANSMISSION_RISK_LEVEL;
import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS;
import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MIN_ROLLING_PERIOD;
import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL;
import static app.coronawarn.server.common.persistence.domain.validation.ValidSubmissionTimestampValidator.SECONDS_PER_HOUR;
import static app.coronawarn.server.common.persistence.service.DiagnosisKeyServiceTestHelper.buildDiagnosisKeyForSubmissionTimestamp;
import static org.assertj.core.api.Assertions.assertThat;
Expand Down Expand Up @@ -48,7 +53,7 @@ void buildFromProtoBufObjWithSubmissionTimestamp() {
.newBuilder()
.setKeyData(ByteString.copyFrom(expKeyData))
.setRollingStartIntervalNumber(expRollingStartIntervalNumber)
.setRollingPeriod(DiagnosisKey.MAX_ROLLING_PERIOD)
.setRollingPeriod(MAX_ROLLING_PERIOD)
.setTransmissionRiskLevel(expTransmissionRiskLevel)
.setReportType(reportType)
.setDaysSinceOnsetOfSymptoms(daysSinceOnsetOfSymptoms)
Expand All @@ -73,7 +78,7 @@ void buildFromProtoBufObjWithoutSubmissionTimestamp() {
.newBuilder()
.setKeyData(ByteString.copyFrom(expKeyData))
.setRollingStartIntervalNumber(expRollingStartIntervalNumber)
.setRollingPeriod(DiagnosisKey.MAX_ROLLING_PERIOD)
.setRollingPeriod(MAX_ROLLING_PERIOD)
.setTransmissionRiskLevel(expTransmissionRiskLevel)
.setReportType(reportType)
.setDaysSinceOnsetOfSymptoms(daysSinceOnsetOfSymptoms)
Expand Down Expand Up @@ -131,7 +136,7 @@ void buildSuccessivelyWithRollingPeriod() {
.withRollingStartIntervalNumber(expRollingStartIntervalNumber)
.withTransmissionRiskLevel(expTransmissionRiskLevel)
.withSubmissionTimestamp(expSubmissionTimestamp)
.withRollingPeriod(DiagnosisKey.MAX_ROLLING_PERIOD)
.withRollingPeriod(MAX_ROLLING_PERIOD)
.withReportType(reportType)
.withDaysSinceOnsetOfSymptoms(daysSinceOnsetOfSymptoms)
.withConsentToFederation(expConsentToFederation)
Expand Down Expand Up @@ -258,32 +263,33 @@ void failsForInvalidVisitedCountries(String visitedCountries) {
}

@ParameterizedTest
@ValueSource(ints = { DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL - 1, DiagnosisKey.MAX_TRANSMISSION_RISK_LEVEL + 1 })
@ValueSource(ints = { MIN_TRANSMISSION_RISK_LEVEL - 1, MAX_TRANSMISSION_RISK_LEVEL + 1 })
void transmissionRiskLevelMustBeInRange(int invalidRiskLevel) {
assertThat(catchThrowable(() -> keyWithRiskLevel(invalidRiskLevel)))
.isInstanceOf(InvalidDiagnosisKeyException.class)
.hasMessage(
"[Risk level must be between " + DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL + " and "
+ DiagnosisKey.MAX_TRANSMISSION_RISK_LEVEL + ". Invalid Value: " + invalidRiskLevel + "]");
"[Risk level must be between " + MIN_TRANSMISSION_RISK_LEVEL + " and "
+ MAX_TRANSMISSION_RISK_LEVEL + ". Invalid Value: " + invalidRiskLevel + "]");
}

@ParameterizedTest
@ValueSource(ints = { DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL, DiagnosisKey.MAX_TRANSMISSION_RISK_LEVEL })
@ValueSource(ints = { MIN_TRANSMISSION_RISK_LEVEL, MAX_TRANSMISSION_RISK_LEVEL })
void transmissionRiskLevelDoesNotThrowForValid(int validRiskLevel) {
assertThatCode(() -> keyWithRiskLevel(validRiskLevel)).doesNotThrowAnyException();
}

@ParameterizedTest
@ValueSource(ints = { -15, -17, 4001 })
@ValueSource(ints = { MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS - 1, -17, 4001 })
void daysSinceOnsetSymptomsMustBeInRange(int invalidDsos) {
assertThat(catchThrowable(() -> keyWithDsos(invalidDsos)))
.isInstanceOf(InvalidDiagnosisKeyException.class)
.hasMessage(
"[Days since onset of symptoms value must be between -14 and 4000. Invalid Value: " + invalidDsos + "]");
"[Days since onset of symptoms value must be between " + MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS
+ " and 4000. Invalid Value: " + invalidDsos + "]");
}

@ParameterizedTest
@ValueSource(ints = { 0, 8, -14, 3986 })
@ValueSource(ints = { 0, 8, MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS, 3986 })
void daysSinceOnsetSymptomsValidationDoesNotThrowForValid(int validDsos) {
assertThatCode(() -> keyWithDsos(validDsos)).doesNotThrowAnyException();
}
Expand All @@ -293,13 +299,13 @@ void daysSinceOnsetSymptomsValidationDoesNotThrowForValid(int validDsos) {
void rollingPeriodMustBeExpectedValue(int invalidRollingPeriod) {
assertThat(catchThrowable(() -> keyWithRollingPeriod(invalidRollingPeriod)))
.isInstanceOf(InvalidDiagnosisKeyException.class)
.hasMessage("[Rolling period must be between " + DiagnosisKey.MIN_ROLLING_PERIOD + " and "
+ DiagnosisKey.MAX_ROLLING_PERIOD
.hasMessage("[Rolling period must be between " + MIN_ROLLING_PERIOD + " and "
+ MAX_ROLLING_PERIOD
+ ". Invalid Value: " + invalidRollingPeriod + "]");
}

@ParameterizedTest
@ValueSource(ints = { DiagnosisKey.MIN_ROLLING_PERIOD, 100, DiagnosisKey.MAX_ROLLING_PERIOD })
@ValueSource(ints = { MIN_ROLLING_PERIOD, 100, MAX_ROLLING_PERIOD })
void rollingPeriodDoesNotThrowForValid(int validRollingPeriod) {
assertThatCode(() -> keyWithRollingPeriod(validRollingPeriod)).doesNotThrowAnyException();
}
Expand Down Expand Up @@ -353,14 +359,12 @@ void testKeyHasDefaultForReportType() {
.newBuilder()
.setKeyData(ByteString.copyFrom(expKeyData))
.setRollingStartIntervalNumber(expRollingStartIntervalNumber)
.setRollingPeriod(DiagnosisKey.MAX_ROLLING_PERIOD)
.setRollingPeriod(MAX_ROLLING_PERIOD)
.setTransmissionRiskLevel(expTransmissionRiskLevel)
.build();

DiagnosisKey actDiagnosisKey = DiagnosisKey.builder()
.fromTemporaryExposureKeyAndMetadata(protoBufObj, expSubmissionType, List.of("DE"), "DE",
true
)
.fromTemporaryExposureKeyAndMetadata(protoBufObj, expSubmissionType, List.of("DE"), "DE", true)
.build();

assertThat(actDiagnosisKey.getReportType()).isEqualTo(reportType);
Expand All @@ -374,7 +378,7 @@ void testKeyBuildsSuccessfullyFromFederationDiagnosisKey() {
.addAllVisitedCountries(visitedCountries)
.setRollingStartIntervalNumber(expRollingStartIntervalNumber)
.setTransmissionRiskLevel(expTransmissionRiskLevel)
.setRollingPeriod(DiagnosisKey.MAX_ROLLING_PERIOD)
.setRollingPeriod(MAX_ROLLING_PERIOD)
.setDaysSinceOnsetOfSymptoms(daysSinceOnsetOfSymptoms)
.setReportType(reportType)
.setOrigin(originCountry)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
package app.coronawarn.server.services.download;

import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS;
import static app.coronawarn.server.common.persistence.domain.FederationBatchSourceSystem.EFGS;
import static app.coronawarn.server.common.persistence.domain.FederationBatchStatus.ERROR;
import static app.coronawarn.server.common.persistence.domain.FederationBatchStatus.ERROR_WONT_RETRY;
import static app.coronawarn.server.common.persistence.domain.FederationBatchStatus.PROCESSED;
import static app.coronawarn.server.common.persistence.domain.FederationBatchStatus.PROCESSED_WITH_ERROR;
import static app.coronawarn.server.common.persistence.domain.FederationBatchStatus.UNPROCESSED;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.util.Lists.list;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import app.coronawarn.server.common.federation.client.FederationGatewayClient;
import app.coronawarn.server.common.persistence.domain.FederationBatchInfo;
import app.coronawarn.server.common.persistence.domain.FederationBatchStatus;
Expand All @@ -12,7 +33,18 @@
import app.coronawarn.server.services.download.validation.ValidFederationKeyFilter;
import com.google.protobuf.ByteString;
import feign.FeignException;
import org.junit.jupiter.api.*;
import java.time.Duration;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneOffset;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
Expand All @@ -23,21 +55,6 @@
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import java.time.Duration;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneOffset;
import java.util.List;
import java.util.Optional;

import static app.coronawarn.server.common.persistence.domain.FederationBatchSourceSystem.EFGS;
import static app.coronawarn.server.common.persistence.domain.FederationBatchStatus.*;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.util.Lists.list;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;

@SuppressWarnings({"unchecked", "rawtypes"})
@SpringBootTest(classes = {FederationBatchProcessor.class, FederationBatchInfoService.class, DiagnosisKeyService.class,
Expand Down Expand Up @@ -399,7 +416,7 @@ void testDiagnosisKeyPassesDownloadValidationButBuildingFails() throws Exception
}

@ParameterizedTest
@ValueSource(ints = {-15, -17, 4001})
@ValueSource(ints = {MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS - 1, -17, 4001})
void testFailureInvalidDSOS(int invalidDsos) throws Exception {
FederationBatchInfo batchInfo = new FederationBatchInfo(batchTag1, date, UNPROCESSED, EFGS);
when(batchInfoService.findByStatus(UNPROCESSED, EFGS)).thenReturn(list(batchInfo));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@


package app.coronawarn.server.services.download.config;

import app.coronawarn.server.common.persistence.domain.DiagnosisKey;
import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS;
import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL;
import static org.assertj.core.api.Assertions.assertThat;

import app.coronawarn.server.common.persistence.domain.config.TekFieldDerivations;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
Expand All @@ -12,12 +17,6 @@
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import app.coronawarn.server.common.persistence.domain.config.TekFieldDerivations;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(classes = {DownloadServiceConfigValidator.class})
@DirtiesContext
Expand Down Expand Up @@ -64,7 +63,7 @@ private static Stream<Arguments> validTransmissionRiskLevelFromDaysSinceOnsetOfS
{0, 8},
{-1, 6},
{-3, 3},
{-14, 1}
{ MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS, 1 }
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));

Map<Integer, Integer> validMapping2 = Stream.of(new Integer[][] {
Expand All @@ -74,7 +73,7 @@ private static Stream<Arguments> validTransmissionRiskLevelFromDaysSinceOnsetOfS
{0, 4},
{-1, 5},
{-3, 6},
{-14, 7},
{ MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS, 7 },
{-2, 8}
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));

Expand All @@ -88,8 +87,8 @@ private static Stream<Arguments> invalidTransmissionRiskLevelFromDaysSinceOnsetO
return Stream.of(
Arguments.of(Map.of(4001, 1)),
Arguments.of(Map.of(14, 9)),
Arguments.of(Map.of(14, DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL - 1)),
Arguments.of(Map.of(-15, 1))
Arguments.of(Map.of(14, MIN_TRANSMISSION_RISK_LEVEL - 1)),
Arguments.of(Map.of(MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS - 1, 1))
);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package app.coronawarn.server.services.submission.validation;

import static org.springframework.util.ObjectUtils.isEmpty;

import app.coronawarn.server.common.protocols.external.exposurenotification.TemporaryExposureKey;
import app.coronawarn.server.common.protocols.internal.SubmissionPayload;
import com.google.protobuf.ByteString;
Expand All @@ -21,6 +23,7 @@ public class PrintableSubmissionPayload {

/**
* Creates a printable Version of SubmissionPayload the logger can work with.
*
* @param submissionPayload SubmissionPayload which shall be made printable
*/
public PrintableSubmissionPayload(SubmissionPayload submissionPayload) {
Expand All @@ -40,16 +43,20 @@ public String toString() {
.append(VISITED_COUNTRIES_MESSAGE).append(visitedCountries)
.append(CONSENT_MESSAGE).append(consentToFederation)
.append(PADDING_MESSAGE).append(padding.size());
stringBuilder.append(" keys: ");
if (isEmpty(keys)) {
stringBuilder.append(" keys: are empty!");
} else {
stringBuilder.append(" " + keys.size() + " keys: ");
}
for (TemporaryExposureKey key : keys) {
stringBuilder
.append(" {")
.append(" key_data: HIDDEN")
.append(" transmission_risk_level: ").append(key.getTransmissionRiskLevel())
.append(" rolling_start_interval_number: ").append(key.getRollingStartIntervalNumber())
.append(" report_type: ").append(key.getReportType())
.append(" days_since_onset_of_symptoms: ").append(key.getDaysSinceOnsetOfSymptoms())
.append(" }");
.append("{")
.append("data: HIDDEN")
.append(",trl: ").append(key.getTransmissionRiskLevel())
.append(",rsin: ").append(key.getRollingStartIntervalNumber())
.append(",type: ").append(key.getReportType())
.append(",dsoos: ").append(key.getDaysSinceOnsetOfSymptoms())
.append("},");
}
return stringBuilder.toString();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@


package app.coronawarn.server.services.submission.config;

import static app.coronawarn.server.common.persistence.domain.DiagnosisKey.MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS;
import static org.assertj.core.api.Assertions.assertThat;

import app.coronawarn.server.common.persistence.domain.DiagnosisKey;
import app.coronawarn.server.common.persistence.domain.config.TekFieldDerivations;
import app.coronawarn.server.services.submission.config.SubmissionServiceConfig.Payload;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
Expand All @@ -18,10 +20,6 @@
import org.springframework.util.unit.DataSize;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;


@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext
Expand Down Expand Up @@ -154,7 +152,7 @@ private static Stream<Arguments> validTrlFromDsosDatasets() {
{0, 8},
{-1, 6},
{-3, 3},
{-14, 1}
{ MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS, 1 }
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));

Map<Integer, Integer> validMapping2 = Stream.of(new Integer[][]{
Expand All @@ -164,7 +162,7 @@ private static Stream<Arguments> validTrlFromDsosDatasets() {
{0, 4},
{-1, 5},
{-3, 6},
{-14, 7},
{ MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS, 7 },
{-2, 8}
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));

Expand All @@ -179,7 +177,7 @@ private static Stream<Arguments> invalidTrlFromDsosDatasets() {
Arguments.of(Map.of(4001, 1)),
Arguments.of(Map.of(14, 9)),
Arguments.of(Map.of(14, DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL - 1)),
Arguments.of(Map.of(-15, 1))
Arguments.of(Map.of(MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS - 1, 1))
);
}

Expand All @@ -193,7 +191,7 @@ private static Stream<Arguments> validDsosFromTrlDatasets() {
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));

Map<Integer, Integer> map2 = Stream.of(new Integer[][]{
{1, -14},
{ 1, MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS },
{2, -3},
{3, -2},
{4, 0},
Expand All @@ -209,8 +207,7 @@ private static Stream<Arguments> validDsosFromTrlDatasets() {
private static Stream<Arguments> invalidDsosFromTrlDatasets() {
return Stream.of(
Arguments.of(Map.of(DiagnosisKey.MIN_TRANSMISSION_RISK_LEVEL - 1, -4)),
Arguments.of(Map.of(1, -15))
Arguments.of(Map.of(1, MIN_DAYS_SINCE_ONSET_OF_SYMPTOMS - 1))
);
}
}

Loading