Skip to content

Commit 8374a94

Browse files
author
wangbaiping(wbpcode)
committed
complete test
Signed-off-by: wangbaiping(wbpcode) <wangbaiping@bytedance.com>
1 parent 5cd6716 commit 8374a94

1 file changed

Lines changed: 196 additions & 2 deletions

File tree

  • dynamic/rust/ip_restriction/src

dynamic/rust/ip_restriction/src/lib.rs

Lines changed: 196 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ use std::sync::Arc;
1111
// TODO(wbpcode): to support ip range in the future.
1212
#[derive(Serialize, Deserialize, Debug)]
1313
pub struct RawFilterConfig {
14+
#[serde(default)]
1415
denied_addresses: HashSet<String>,
16+
#[serde(default)]
1517
allowed_addresses: HashSet<String>,
1618
}
1719

@@ -26,7 +28,7 @@ pub struct FilterConfigImpl {
2628
// The trait corresponds to a Envoy filter chain configuration.
2729
#[derive(Debug, Clone)]
2830
pub struct FilterConfig {
29-
config: Arc<FilterConfigImpl>,
31+
config: Arc<FilterConfigImpl>, // use Arc to make it is cheap to clone the FilterConfig.
3032
}
3133

3234
impl FilterConfig {
@@ -44,7 +46,7 @@ impl FilterConfig {
4446
};
4547

4648
// One and only one of denied_addresses and allowed_addresses should be set.
47-
if filter_config.denied_addresses.is_empty() != filter_config.allowed_addresses.is_empty() {
49+
if filter_config.denied_addresses.is_empty() == filter_config.allowed_addresses.is_empty() {
4850
eprintln!(
4951
"Error parsing filter config: one and only one of denied_addresses\
5052
and allowed_addresses should be set"
@@ -119,6 +121,7 @@ impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> for Filter {
119121
}
120122

121123
let mut downstream_addr_str = String::new();
124+
122125
let address_buffer = downstream_addr.unwrap();
123126
let downstream_addr_slice = address_buffer.as_slice();
124127

@@ -174,4 +177,195 @@ impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> for Filter {
174177
#[cfg(test)]
175178
mod tests {
176179
use super::*;
180+
181+
#[test]
182+
fn test_new_filter_config_both_set() {
183+
let filter_config = FilterConfig::new(
184+
r#"{
185+
"allowed_addresses": [
186+
"127.0.0.1",
187+
"::1"
188+
],
189+
"denied_addresses": [
190+
"192.168.1.1"
191+
]
192+
}"#,
193+
);
194+
assert!(filter_config.is_none()); // Only one of allowed_addresses and denied_addresses should be set.
195+
}
196+
197+
#[test]
198+
fn test_new_filter_config_allowed_set() {
199+
let filter_config = FilterConfig::new(
200+
r#"{
201+
"allowed_addresses": [
202+
"127.0.0.1",
203+
"::1"
204+
]
205+
}"#,
206+
);
207+
assert!(filter_config.is_some());
208+
}
209+
210+
#[test]
211+
fn test_new_filter_config_denied_set() {
212+
let filter_config = FilterConfig::new(
213+
r#"{
214+
"denied_addresses": [
215+
"192.168.1.1"
216+
]
217+
}"#,
218+
);
219+
assert!(filter_config.is_some());
220+
}
221+
222+
#[test]
223+
fn test_new_filter_config_invalid_ip() {
224+
let filter_config = FilterConfig::new(
225+
r#"{
226+
"allowed_addresses": [
227+
"127.0.0.1",
228+
"invalid_ip"
229+
]
230+
}"#,
231+
);
232+
assert!(filter_config.is_none());
233+
}
234+
235+
#[test]
236+
fn test_filter_denied_because_no_address() {
237+
let filter_config = FilterConfig::new(
238+
r#"{
239+
"denied_addresses": [
240+
"192.168.1.1"
241+
]
242+
}"#,
243+
);
244+
assert!(filter_config.is_some());
245+
246+
let mut filter = Filter {
247+
filter_config: filter_config.unwrap(),
248+
};
249+
250+
let mut mock_envoy_filter = envoy_proxy_dynamic_modules_rust_sdk::MockEnvoyHttpFilter::new();
251+
252+
mock_envoy_filter
253+
.expect_get_attribute_string()
254+
.times(1)
255+
.returning(|_| None);
256+
mock_envoy_filter
257+
.expect_get_attribute_int()
258+
.times(1)
259+
.returning(|_| None);
260+
mock_envoy_filter
261+
.expect_send_response()
262+
.times(1)
263+
.returning(|code, _, _| assert!(code == 403));
264+
265+
assert_eq!(
266+
filter.on_request_headers(&mut mock_envoy_filter, true),
267+
abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::StopIteration
268+
);
269+
}
270+
271+
#[test]
272+
fn test_filter_with_allowed_list() {
273+
let filter_config = FilterConfig::new(
274+
r#"{
275+
"allowed_addresses": [
276+
"127.0.0.1",
277+
"::1"
278+
]
279+
}"#,
280+
);
281+
assert!(filter_config.is_some());
282+
283+
let mut filter = Filter {
284+
filter_config: filter_config.unwrap(),
285+
};
286+
287+
let mut mock_envoy_filter = envoy_proxy_dynamic_modules_rust_sdk::MockEnvoyHttpFilter::new();
288+
289+
mock_envoy_filter
290+
.expect_get_attribute_string()
291+
.times(1)
292+
.returning(|_| Some(EnvoyBuffer::new("127.0.0.1:80")));
293+
mock_envoy_filter
294+
.expect_get_attribute_int()
295+
.times(1)
296+
.returning(|_| Some(80));
297+
298+
assert_eq!(
299+
filter.on_request_headers(&mut mock_envoy_filter, true),
300+
abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::Continue
301+
);
302+
303+
mock_envoy_filter
304+
.expect_get_attribute_string()
305+
.times(1)
306+
.returning(|_| Some(EnvoyBuffer::new("192.168.1.1:80")));
307+
mock_envoy_filter
308+
.expect_get_attribute_int()
309+
.times(1)
310+
.returning(|_| Some(80));
311+
mock_envoy_filter
312+
.expect_send_response()
313+
.times(1)
314+
.returning(|code, _, _| assert!(code == 403));
315+
316+
assert_eq!(
317+
filter.on_request_headers(&mut mock_envoy_filter, true),
318+
abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::StopIteration
319+
);
320+
}
321+
322+
#[test]
323+
fn test_filter_with_denied_list() {
324+
let filter_config = FilterConfig::new(
325+
r#"{
326+
"denied_addresses": [
327+
"192.168.1.1"
328+
]
329+
}"#,
330+
);
331+
assert!(filter_config.is_some());
332+
333+
let mut filter = Filter {
334+
filter_config: filter_config.unwrap(),
335+
};
336+
337+
let mut mock_envoy_filter = envoy_proxy_dynamic_modules_rust_sdk::MockEnvoyHttpFilter::new();
338+
339+
mock_envoy_filter
340+
.expect_get_attribute_string()
341+
.times(1)
342+
.returning(|_| Some(EnvoyBuffer::new("192.168.1.1:80")));
343+
mock_envoy_filter
344+
.expect_get_attribute_int()
345+
.times(1)
346+
.returning(|_| Some(80));
347+
mock_envoy_filter
348+
.expect_send_response()
349+
.times(1)
350+
.returning(|code, _, _| assert!(code == 403));
351+
352+
assert_eq!(
353+
filter.on_request_headers(&mut mock_envoy_filter, true),
354+
abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::StopIteration
355+
);
356+
357+
mock_envoy_filter
358+
.expect_get_attribute_string()
359+
.times(1)
360+
.returning(|_| Some(EnvoyBuffer::new("127.0.0.1:80")));
361+
mock_envoy_filter
362+
.expect_get_attribute_int()
363+
.times(1)
364+
.returning(|_| Some(80));
365+
366+
assert_eq!(
367+
filter.on_request_headers(&mut mock_envoy_filter, true),
368+
abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::Continue
369+
);
370+
}
177371
}

0 commit comments

Comments
 (0)