diff --git a/ts_control_serde/src/derp_map.rs b/ts_control_serde/src/derp_map.rs index b0a46186..9ce170b5 100644 --- a/ts_control_serde/src/derp_map.rs +++ b/ts_control_serde/src/derp_map.rs @@ -339,6 +339,7 @@ pub struct DerpMap<'a> { /// If there aren't any non-default DERP servers in [`DerpMap::regions`], this field is /// ignored. This field is only meaningful if [`DerpMap::regions`] is also populated, which /// indicates a change in the set of DERP regions/servers. + #[serde(rename = "omitDefaultRegions")] pub omit_default_regions: bool, } diff --git a/ts_control_serde/tests/data/derp_map_odr.json b/ts_control_serde/tests/data/derp_map_odr.json new file mode 100644 index 00000000..6bf84929 --- /dev/null +++ b/ts_control_serde/tests/data/derp_map_odr.json @@ -0,0 +1,47 @@ +{ + "Regions": { + "1": { + "RegionID": 1, + "RegionCode": "nyc", + "RegionName": "New York City", + "Latitude": 40.7128, + "Longitude": -74.006, + "Nodes": [ + { + "Name": "1h", + "RegionID": 1, + "HostName": "derp1h.tailscale.com", + "IPv4": "199.38.181.93", + "IPv6": "2607:f740:f::afd", + "CanPort80": true + }, + { + "Name": "1g", + "RegionID": 1, + "HostName": "derp1g.tailscale.com", + "IPv4": "209.177.145.120", + "IPv6": "2607:f740:f::3eb", + "CanPort80": true + }, + { + "Name": "1f", + "RegionID": 1, + "HostName": "derp1f.tailscale.com", + "IPv4": "199.38.181.104", + "IPv6": "2607:f740:f::bc", + "CanPort80": true + }, + { + "Name": "1i", + "RegionID": 1, + "HostName": "derp1i.tailscale.com", + "IPv4": "199.38.181.103", + "IPv6": "2607:f740:f::e19", + "STUNOnly": true, + "CanPort80": true + } + ] + } + }, + "omitDefaultRegions": true +} diff --git a/ts_control_serde/tests/parsing_tests.rs b/ts_control_serde/tests/parsing_tests.rs index 4818a3d2..19662e56 100644 --- a/ts_control_serde/tests/parsing_tests.rs +++ b/ts_control_serde/tests/parsing_tests.rs @@ -1,6 +1,6 @@ #![allow(missing_docs)] -use ts_control_serde::{MapResponse, Node}; +use ts_control_serde::{DerpMap, MapResponse, Node}; #[test] fn test_map_response_parse() { @@ -18,3 +18,16 @@ fn test_node_parse() { let node = serde_json::from_str::(TEST_NODE).expect("could not parse Node"); println!("{node:#?}"); } + +/// Validates that a `DerpMap` with "omitDefaultRegions" set is properly parsed. +#[test] +fn test_derp_map_omit_default_regions() { + const TEST_DERP_MAP: &str = include_str!("data/derp_map_odr.json"); + + let map = serde_json::from_str::(TEST_DERP_MAP) + .expect("could not parse DerpMap with omit_default_regions"); + assert!( + map.omit_default_regions, + "omit_default_regions should be true" + ); +}