From 024dccba5a81d2e92f025ee76e08017ef8e67782 Mon Sep 17 00:00:00 2001 From: Brian Balser Date: Mon, 12 Aug 2024 14:33:16 -0400 Subject: [PATCH] Support new location source field on wifi heartbeats (#833) * Support new location source field on wifi heartbeats * fix imports * Reset proto back to master --- Cargo.lock | 8 ++++---- file_store/src/wifi_heartbeat.rs | 9 ++++++++- mobile_verifier/src/heartbeats/mod.rs | 7 ++++++- mobile_verifier/tests/integrations/heartbeats.rs | 4 +++- mobile_verifier/tests/integrations/hex_boosting.rs | 13 +++++++++++-- mobile_verifier/tests/integrations/last_location.rs | 3 ++- .../tests/integrations/modeled_coverage.rs | 3 ++- .../tests/integrations/rewarder_poc_dc.rs | 7 +++++-- mobile_verifier/tests/integrations/seniority.rs | 5 ++++- 9 files changed, 45 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c7390197..49984f909 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1617,7 +1617,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "beacon" version = "0.1.0" -source = "git+https://github.com/helium/proto?branch=master#62e22b2a4fb7de6f2ba7d67f933d77d4ad52a882" +source = "git+https://github.com/helium/proto?branch=master#fdef2c6774416b1b361a22894078fb1cc5e89203" dependencies = [ "base64 0.21.7", "byteorder", @@ -1627,7 +1627,7 @@ dependencies = [ "rand_chacha 0.3.0", "rust_decimal", "serde", - "sha2 0.9.9", + "sha2 0.10.8", "thiserror", ] @@ -3801,7 +3801,7 @@ dependencies = [ [[package]] name = "helium-proto" version = "0.1.0" -source = "git+https://github.com/helium/proto?branch=master#62e22b2a4fb7de6f2ba7d67f933d77d4ad52a882" +source = "git+https://github.com/helium/proto?branch=master#fdef2c6774416b1b361a22894078fb1cc5e89203" dependencies = [ "bytes", "prost", @@ -9851,7 +9851,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "sha2 0.9.9", + "sha2 0.10.8", "thiserror", "twox-hash", "xorf", diff --git a/file_store/src/wifi_heartbeat.rs b/file_store/src/wifi_heartbeat.rs index 68d72eb2e..fcb12d27c 100644 --- a/file_store/src/wifi_heartbeat.rs +++ b/file_store/src/wifi_heartbeat.rs @@ -4,7 +4,9 @@ use crate::{ }; use chrono::{DateTime, Utc}; use helium_crypto::PublicKeyBinary; -use helium_proto::services::poc_mobile::{WifiHeartbeatIngestReportV1, WifiHeartbeatReqV1}; +use helium_proto::services::poc_mobile::{ + LocationSource, WifiHeartbeatIngestReportV1, WifiHeartbeatReqV1, +}; use serde::{Deserialize, Serialize}; use uuid::Uuid; @@ -17,6 +19,7 @@ pub struct WifiHeartbeat { pub location_validation_timestamp: Option>, pub coverage_object: Vec, pub timestamp: DateTime, + pub location_source: LocationSource, } impl WifiHeartbeat { @@ -47,6 +50,7 @@ impl TryFrom for WifiHeartbeat { } else { v.location_validation_timestamp.to_timestamp().ok() }; + let location_source = v.location_source(); Ok(Self { pubkey: v.pub_key.into(), lat: v.lat, @@ -55,6 +59,7 @@ impl TryFrom for WifiHeartbeat { coverage_object: v.coverage_object, timestamp: v.timestamp.to_timestamp()?, location_validation_timestamp, + location_source, }) } } @@ -107,6 +112,7 @@ mod tests { coverage_object: vec![], timestamp: Utc::now().timestamp() as u64, location_validation_timestamp: now as u64, + location_source: LocationSource::Skyhook.into(), signature: vec![], }), }; @@ -120,6 +126,7 @@ mod tests { coverage_object: vec![], timestamp: Utc::now().timestamp() as u64, location_validation_timestamp: 0, + location_source: LocationSource::Gps.into(), signature: vec![], }), }; diff --git a/mobile_verifier/src/heartbeats/mod.rs b/mobile_verifier/src/heartbeats/mod.rs index 985fcae52..13417ba42 100644 --- a/mobile_verifier/src/heartbeats/mod.rs +++ b/mobile_verifier/src/heartbeats/mod.rs @@ -18,7 +18,7 @@ use file_store::{ use futures::stream::{Stream, StreamExt}; use h3o::{CellIndex, LatLng}; use helium_crypto::PublicKeyBinary; -use helium_proto::services::poc_mobile as proto; +use helium_proto::services::poc_mobile::{self as proto, LocationSource}; use retainer::Cache; use rust_decimal::{prelude::ToPrimitive, Decimal}; use rust_decimal_macros::dec; @@ -207,6 +207,7 @@ pub struct Heartbeat { pub lon: f64, pub coverage_object: Option, pub location_validation_timestamp: Option>, + pub location_source: LocationSource, pub timestamp: DateTime, } @@ -254,6 +255,7 @@ impl From for Heartbeat { lat: value.report.lat, lon: value.report.lon, location_validation_timestamp: None, + location_source: LocationSource::Gps, timestamp: value.received_timestamp, } } @@ -270,6 +272,7 @@ impl From for Heartbeat { lat: value.report.lat, lon: value.report.lon, location_validation_timestamp: value.report.location_validation_timestamp, + location_source: value.report.location_source, timestamp: value.received_timestamp, } } @@ -629,6 +632,7 @@ impl ValidatedHeartbeat { .location_validation_timestamp .map_or(0, |v| v.timestamp() as u64), distance_to_asserted: self.distance_to_asserted.map_or(0, |v| v as u64), + location_source: self.heartbeat.location_source.into(), ..Default::default() }, &[("validity", self.validity.as_str_name())], @@ -796,6 +800,7 @@ mod test { cbsd_id: None, coverage_object: Some(coverage_object), location_validation_timestamp: None, + location_source: LocationSource::Skyhook, }, validity: Default::default(), location_trust_score_multiplier: dec!(1.0), diff --git a/mobile_verifier/tests/integrations/heartbeats.rs b/mobile_verifier/tests/integrations/heartbeats.rs index c827e9f44..edd1faf1d 100644 --- a/mobile_verifier/tests/integrations/heartbeats.rs +++ b/mobile_verifier/tests/integrations/heartbeats.rs @@ -1,7 +1,7 @@ use chrono::{DateTime, Utc}; use futures_util::TryStreamExt; use helium_crypto::PublicKeyBinary; -use helium_proto::services::poc_mobile::HeartbeatValidity; +use helium_proto::services::poc_mobile::{HeartbeatValidity, LocationSource}; use mobile_verifier::{ cell_type::CellType, heartbeats::{HbType, Heartbeat, HeartbeatReward, ValidatedHeartbeat}, @@ -27,6 +27,7 @@ async fn test_save_wifi_heartbeat(pool: PgPool) -> anyhow::Result<()> { coverage_object: Some(coverage_object), location_validation_timestamp: None, timestamp: "2023-08-23 00:00:00.000000000 UTC".parse().unwrap(), + location_source: LocationSource::Skyhook, }, cell_type: CellType::SercommIndoor, distance_to_asserted: Some(1000), // Cannot be null @@ -64,6 +65,7 @@ async fn test_save_cbrs_heartbeat(pool: PgPool) -> anyhow::Result<()> { coverage_object: Some(coverage_object), location_validation_timestamp: None, timestamp: "2023-08-23 00:00:00.000000000 UTC".parse().unwrap(), + location_source: LocationSource::Gps, }, cell_type: CellType::SercommIndoor, distance_to_asserted: None, diff --git a/mobile_verifier/tests/integrations/hex_boosting.rs b/mobile_verifier/tests/integrations/hex_boosting.rs index af4dd1195..314a22a10 100644 --- a/mobile_verifier/tests/integrations/hex_boosting.rs +++ b/mobile_verifier/tests/integrations/hex_boosting.rs @@ -9,8 +9,8 @@ use helium_crypto::PublicKeyBinary; use helium_proto::services::{ poc_lora::UnallocatedRewardType, poc_mobile::{ - CoverageObjectValidity, HeartbeatValidity, RadioRewardV2, SeniorityUpdateReason, - SignalLevel, UnallocatedReward, + CoverageObjectValidity, HeartbeatValidity, LocationSource, RadioRewardV2, + SeniorityUpdateReason, SignalLevel, UnallocatedReward, }, }; use hextree::Cell; @@ -1393,6 +1393,7 @@ async fn seed_heartbeats_v2( coverage_object: Some(cov_obj_1.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(10), @@ -1420,6 +1421,7 @@ async fn seed_heartbeats_v2( coverage_object: Some(cov_obj_2.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(10), @@ -1447,6 +1449,7 @@ async fn seed_heartbeats_v2( coverage_object: Some(cov_obj_3.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(10), @@ -1502,6 +1505,7 @@ async fn seed_heartbeats_with_location_trust( coverage_object: Some(cov_obj_1.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(hs_1_location.meters), @@ -1529,6 +1533,7 @@ async fn seed_heartbeats_with_location_trust( coverage_object: Some(cov_obj_2.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(hs_2_location.meters), @@ -1556,6 +1561,7 @@ async fn seed_heartbeats_with_location_trust( coverage_object: Some(cov_obj_3.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(hs_3_location.meters), @@ -1604,6 +1610,7 @@ async fn seed_heartbeats_v4( coverage_object: Some(cov_obj_1.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(10), @@ -1631,6 +1638,7 @@ async fn seed_heartbeats_v4( coverage_object: Some(cov_obj_2.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(10), @@ -1659,6 +1667,7 @@ async fn seed_heartbeats_v4( coverage_object: Some(cov_obj_3.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::SercommOutdoor, distance_to_asserted: Some(1), diff --git a/mobile_verifier/tests/integrations/last_location.rs b/mobile_verifier/tests/integrations/last_location.rs index 5ba87e932..34b9f7b27 100644 --- a/mobile_verifier/tests/integrations/last_location.rs +++ b/mobile_verifier/tests/integrations/last_location.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Duration, Utc}; use file_store::coverage::RadioHexSignalLevel; use h3o::LatLng; use helium_crypto::PublicKeyBinary; -use helium_proto::services::poc_mobile as proto; +use helium_proto::services::poc_mobile::{self as proto, LocationSource}; use mobile_verifier::{ coverage::{CoverageObject, CoverageObjectCache}, geofence::GeofenceValidator, @@ -285,6 +285,7 @@ impl HeartbeatBuilder { coverage_object: Some(self.coverage_object.coverage_object.uuid), location_validation_timestamp: self.location_validation_timestamp, timestamp: self.timestamp.unwrap_or(Utc::now()), + location_source: LocationSource::Skyhook, } } } diff --git a/mobile_verifier/tests/integrations/modeled_coverage.rs b/mobile_verifier/tests/integrations/modeled_coverage.rs index 0a66fb322..b9f20f800 100644 --- a/mobile_verifier/tests/integrations/modeled_coverage.rs +++ b/mobile_verifier/tests/integrations/modeled_coverage.rs @@ -10,7 +10,7 @@ use h3o::{CellIndex, LatLng}; use helium_crypto::PublicKeyBinary; use helium_proto::services::{ mobile_config::NetworkKeyRole, - poc_mobile::{CoverageObjectValidity, SignalLevel}, + poc_mobile::{CoverageObjectValidity, LocationSource, SignalLevel}, }; use hextree::Cell; use mobile_config::boosted_hex_info::{BoostedHexInfo, BoostedHexes}; @@ -1395,6 +1395,7 @@ async fn ensure_lower_trust_score_for_distant_heartbeats(pool: PgPool) -> anyhow location_validation_timestamp: Some(DateTime::::MIN_UTC), operation_mode: true, coverage_object: Vec::from(coverage_object_uuid.into_bytes()), + location_source: LocationSource::Skyhook, }, received_timestamp: Utc::now(), }; diff --git a/mobile_verifier/tests/integrations/rewarder_poc_dc.rs b/mobile_verifier/tests/integrations/rewarder_poc_dc.rs index 07f5c4933..b9889cb2a 100644 --- a/mobile_verifier/tests/integrations/rewarder_poc_dc.rs +++ b/mobile_verifier/tests/integrations/rewarder_poc_dc.rs @@ -6,8 +6,8 @@ use file_store::{ }; use helium_crypto::PublicKeyBinary; use helium_proto::services::poc_mobile::{ - CoverageObjectValidity, GatewayReward, HeartbeatValidity, RadioRewardV2, SeniorityUpdateReason, - SignalLevel, + CoverageObjectValidity, GatewayReward, HeartbeatValidity, LocationSource, RadioRewardV2, + SeniorityUpdateReason, SignalLevel, }; use mobile_verifier::{ cell_type::CellType, @@ -175,6 +175,7 @@ async fn seed_heartbeats( coverage_object: Some(cov_obj_1.coverage_object.uuid), location_validation_timestamp: None, timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Gps, }, cell_type: CellType::SercommIndoor, distance_to_asserted: None, @@ -203,6 +204,7 @@ async fn seed_heartbeats( coverage_object: Some(cov_obj_2.coverage_object.uuid), location_validation_timestamp: None, timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Gps, }, cell_type: CellType::SercommOutdoor, distance_to_asserted: None, @@ -230,6 +232,7 @@ async fn seed_heartbeats( coverage_object: Some(cov_obj_3.coverage_object.uuid), location_validation_timestamp: Some(ts - ChronoDuration::hours(24)), timestamp: ts + ChronoDuration::hours(n), + location_source: LocationSource::Skyhook, }, cell_type: CellType::NovaGenericWifiIndoor, distance_to_asserted: Some(10), diff --git a/mobile_verifier/tests/integrations/seniority.rs b/mobile_verifier/tests/integrations/seniority.rs index 6b1fae38d..3d3d7435c 100644 --- a/mobile_verifier/tests/integrations/seniority.rs +++ b/mobile_verifier/tests/integrations/seniority.rs @@ -1,5 +1,7 @@ use chrono::{DateTime, Utc}; -use helium_proto::services::poc_mobile::{HeartbeatValidity, SeniorityUpdateReason}; +use helium_proto::services::poc_mobile::{ + HeartbeatValidity, LocationSource, SeniorityUpdateReason, +}; use mobile_verifier::cell_type::CellType; use mobile_verifier::heartbeats::{HbType, Heartbeat, ValidatedHeartbeat}; use mobile_verifier::seniority::{Seniority, SeniorityUpdate, SeniorityUpdateAction}; @@ -23,6 +25,7 @@ async fn test_seniority_updates(pool: PgPool) -> anyhow::Result<()> { coverage_object: Some(coverage_object), location_validation_timestamp: None, timestamp: "2023-08-23 00:00:00.000000000 UTC".parse().unwrap(), + location_source: LocationSource::Skyhook, }, cell_type: CellType::SercommIndoor, distance_to_asserted: None,