test: close STEP-076 V4 host API audit
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#include <mbgl/particle/ingress/qbin_v2_decoder.hpp>
|
||||
#include <mbgl/particle/field/offline_fixture_particle_adapter.hpp>
|
||||
#include <mbgl/style/sources/raster_array_source.hpp>
|
||||
#include <mbgl/style/sources/raster_array_source_impl.hpp>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
@@ -101,30 +103,89 @@ void submit(style::RasterArraySource& source, const char* key, const char* id, u
|
||||
style::RasterArrayEncodedFieldSubmitResult::AcceptedInserted);
|
||||
}
|
||||
|
||||
void expectSameParticleProjection(const particle::ParticleProjection& expected,
|
||||
const particle::ParticleProjection& actual) {
|
||||
EXPECT_EQ(actual.contentIdentity, expected.contentIdentity);
|
||||
EXPECT_EQ(actual.contentIdentity.t0Coordinate, expected.contentIdentity.t0Coordinate);
|
||||
EXPECT_EQ(actual.contentIdentity.t1Coordinate, expected.contentIdentity.t1Coordinate);
|
||||
EXPECT_EQ(actual.t0FirstPlaneStorage, expected.t0FirstPlaneStorage);
|
||||
EXPECT_EQ(actual.t1FirstPlaneStorage, expected.t1FirstPlaneStorage);
|
||||
EXPECT_EQ(actual.t0SecondPlaneStorage, expected.t0SecondPlaneStorage);
|
||||
EXPECT_EQ(actual.t1SecondPlaneStorage, expected.t1SecondPlaneStorage);
|
||||
EXPECT_EQ(actual.t0ValidityStorage, expected.t0ValidityStorage);
|
||||
EXPECT_EQ(actual.t1ValidityStorage, expected.t1ValidityStorage);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(Source, RasterArrayV4HostApiRejectsWithoutPartialMutationAndMapsStoreResults) {
|
||||
style::RasterArraySource source{"v4"}; const auto first = qbin(Base);
|
||||
style::RasterArraySource source{"v4"};
|
||||
const auto first = qbin(Base);
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 1), windContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::AcceptedInserted);
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 1), windContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::Duplicate);
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 2, 2), windContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::AcceptedReplacedRevision);
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 1), windContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedStaleRevision);
|
||||
auto corrupt = first; corrupt[0] = 'X';
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 3), windContract(), corrupt),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedDecode);
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 3), waveContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedContract);
|
||||
EXPECT_EQ(source.submitEncodedField("", metadata("wind", 3), windContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedInvalidFieldKey);
|
||||
submit(source, "wind", "wind", Base + Hour, 3);
|
||||
source.setParticleBinding({particle::ParticleBindingMode::VectorComponents, "wind",
|
||||
{1, 1, particle::FieldComponent::UEast}, {2, 1, particle::FieldComponent::VNorth}, {}, 1});
|
||||
ASSERT_TRUE(source.setRequestedForecastTime(Base + Hour / 2));
|
||||
EXPECT_TRUE(source.resolveParticleProjection().accepted());
|
||||
const auto baseline = source.resolveParticleProjection();
|
||||
ASSERT_TRUE(baseline.accepted());
|
||||
|
||||
const auto expectNoPartialMutation = [&] {
|
||||
const auto resolved = source.resolveParticleProjection();
|
||||
ASSERT_TRUE(resolved.accepted());
|
||||
expectSameParticleProjection(*baseline.projection, *resolved.projection);
|
||||
};
|
||||
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 1), windContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedStaleRevision);
|
||||
expectNoPartialMutation();
|
||||
auto corrupt = first; corrupt[0] = 'X';
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 3), windContract(), corrupt),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedDecode);
|
||||
expectNoPartialMutation();
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 3), waveContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedContract);
|
||||
expectNoPartialMutation();
|
||||
EXPECT_EQ(source.submitEncodedField("", metadata("wind", 3), windContract(), first),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedInvalidFieldKey);
|
||||
expectNoPartialMutation();
|
||||
}
|
||||
|
||||
TEST(Source, RasterArrayV4HostApiRejectsKeepPublicProjectionStable) {
|
||||
style::RasterArraySource source{"v4"};
|
||||
const auto t0 = qbin(Base);
|
||||
const auto t1 = qbin(Base + Hour);
|
||||
submit(source, "wind", "wind", Base, 2);
|
||||
submit(source, "wind", "wind", Base + Hour, 3);
|
||||
source.setParticleBinding({particle::ParticleBindingMode::VectorComponents, "wind",
|
||||
{1, 1, particle::FieldComponent::UEast}, {2, 1, particle::FieldComponent::VNorth}, {}, 1});
|
||||
ASSERT_TRUE(source.setRequestedForecastTime(Base + Hour / 2));
|
||||
const auto baseline = source.resolveParticleProjection();
|
||||
ASSERT_TRUE(baseline.accepted());
|
||||
const auto expectNoPartialMutation = [&] {
|
||||
const auto resolved = source.resolveParticleProjection();
|
||||
ASSERT_TRUE(resolved.accepted());
|
||||
expectSameParticleProjection(*baseline.projection, *resolved.projection);
|
||||
};
|
||||
|
||||
auto corrupt = t1;
|
||||
corrupt[0] = 'X';
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 4), windContract(), corrupt),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedDecode);
|
||||
expectNoPartialMutation();
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 4), waveContract(), t1),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedContract);
|
||||
expectNoPartialMutation();
|
||||
EXPECT_EQ(source.submitEncodedField("", metadata("wind", 4), windContract(), t1),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedInvalidFieldKey);
|
||||
expectNoPartialMutation();
|
||||
EXPECT_EQ(source.submitEncodedField("wind", metadata("wind", 1), windContract(), t0),
|
||||
style::RasterArrayEncodedFieldSubmitResult::RejectedStaleRevision);
|
||||
expectNoPartialMutation();
|
||||
}
|
||||
|
||||
TEST(Source, RasterArrayV4HostApiResolvesIndependentBindingsFromOneForecastClock) {
|
||||
@@ -154,6 +215,28 @@ TEST(Source, RasterArrayV4HostApiResolvesIndependentBindingsFromOneForecastClock
|
||||
|
||||
TEST(Source, RasterArrayV4HostApiClearRetainsBindingsAndNeverTouchesV3) {
|
||||
style::RasterArraySource source{"v4"};
|
||||
const auto v3T0 = particle::OfflineFixtureParticleAdapter::load("uniform-east", 71);
|
||||
auto v3T1 = particle::OfflineFixtureParticleAdapter::load("uniform-north", 72);
|
||||
v3T1.validTime = v3T0.validTime + Hour;
|
||||
ASSERT_EQ(source.submitInitialRuntimeFieldWindow(v3T0, v3T1), style::RasterArrayRuntimeFieldUpdateResult::Applied);
|
||||
ASSERT_TRUE(source.impl().field);
|
||||
ASSERT_TRUE(source.impl().nextField);
|
||||
const auto v3FieldIdentity = source.impl().field->fieldID;
|
||||
const auto v3FieldGeneration = source.impl().field->generation;
|
||||
const auto v3FieldValidTime = source.impl().field->validTime;
|
||||
const auto v3NextIdentity = source.impl().nextField->fieldID;
|
||||
const auto v3NextGeneration = source.impl().nextField->generation;
|
||||
const auto v3NextValidTime = source.impl().nextField->validTime;
|
||||
const auto expectV3Unchanged = [&] {
|
||||
ASSERT_TRUE(source.impl().field);
|
||||
ASSERT_TRUE(source.impl().nextField);
|
||||
EXPECT_EQ(source.impl().field->fieldID, v3FieldIdentity);
|
||||
EXPECT_EQ(source.impl().field->generation, v3FieldGeneration);
|
||||
EXPECT_EQ(source.impl().field->validTime, v3FieldValidTime);
|
||||
EXPECT_EQ(source.impl().nextField->fieldID, v3NextIdentity);
|
||||
EXPECT_EQ(source.impl().nextField->generation, v3NextGeneration);
|
||||
EXPECT_EQ(source.impl().nextField->validTime, v3NextValidTime);
|
||||
};
|
||||
submit(source, "wind", "wind", Base, 1); submit(source, "wind", "wind", Base + Hour, 2);
|
||||
submit(source, "wave", "wave", Base, 1, true); submit(source, "wave", "wave", Base + 3 * Hour, 2, true);
|
||||
source.setColorBinding({"wave", {99, 0, particle::FieldComponent::None}, particle::FieldValueClass::Scalar, 77});
|
||||
@@ -162,8 +245,15 @@ TEST(Source, RasterArrayV4HostApiClearRetainsBindingsAndNeverTouchesV3) {
|
||||
ASSERT_TRUE(source.setRequestedForecastTime(Base + Hour)); ASSERT_TRUE(source.resolveColorProjection().accepted());
|
||||
EXPECT_TRUE(source.clearEncodedField("wave")); EXPECT_TRUE(source.resolveParticleProjection().accepted());
|
||||
EXPECT_EQ(source.resolveColorProjection().error, particle::BindingProjectionError::FieldSeriesMissing);
|
||||
expectV3Unchanged();
|
||||
submit(source, "wave", "wave", Base, 1, true); submit(source, "wave", "wave", Base + 3 * Hour, 2, true);
|
||||
EXPECT_TRUE(source.resolveColorProjection().accepted()); source.clearAllEncodedFields();
|
||||
EXPECT_EQ(source.resolveColorProjection().error, particle::BindingProjectionError::FieldSeriesMissing);
|
||||
EXPECT_EQ(source.resolveParticleProjection().error, particle::BindingProjectionError::FieldSeriesMissing);
|
||||
expectV3Unchanged();
|
||||
submit(source, "wind", "wind", Base, 1); submit(source, "wind", "wind", Base + Hour, 2);
|
||||
submit(source, "wave", "wave", Base, 1, true); submit(source, "wave", "wave", Base + 3 * Hour, 2, true);
|
||||
EXPECT_TRUE(source.resolveColorProjection().accepted());
|
||||
EXPECT_TRUE(source.resolveParticleProjection().accepted());
|
||||
expectV3Unchanged();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user