use nsc::geoparsers::v2ray::parsing::GeoSiteService; use nsc::geoparsers::v2ray::types::Domain; use std::fs; use std::path::PathBuf; fn download_geosite() -> Result> { let tmp_dir = std::env::temp_dir().join("seccontrol_test"); fs::create_dir_all(&tmp_dir)?; let geosite_path = tmp_dir.join("geosite.dat"); if !geosite_path.exists() { // Use v2fly domain-list-community which has standard protobuf format let url = "https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat"; let response = ureq::get(url).call()?; let mut file = fs::File::create(&geosite_path)?; let mut reader = response.into_reader(); std::io::copy(&mut reader, &mut file)?; } Ok(geosite_path) } fn get_geosite_service() -> Result> { let geosite_path = download_geosite()?; let service = GeoSiteService::new(geosite_path.to_str().unwrap())?; Ok(service) } #[test] fn geosite_service_creation() { let service = get_geosite_service(); assert!(service.is_ok(), "Failed to create GeoSiteService: {:?}", service.err()); } #[test] fn lookup_existing_domain() { let service = get_geosite_service().expect("Failed to create service"); assert!(!service.is_empty(), "Service should have entries"); println!("Loaded {} GeoSite entries", service.len()); } #[test] fn lookup_nonexistent_domain() { let service = get_geosite_service().expect("Failed to create service"); let domain = Domain { r#type: nsc::geoparsers::v2ray::types::domain::Type::Full as i32, value: "nfaklsfjlasfvjkcnjnasxcjsas-not-existing-domain.com".to_string(), attribute: vec![], }; let result = service.lookup(domain.value.as_str()); assert!(result.is_none(), "Should return none for not existing domain"); println!("{:?}", result); } #[test] fn geosite_list_not_empty() { let service = get_geosite_service().expect("Failed to create service"); assert!( !service.is_empty(), "GeoSiteList should not be empty" ); println!("Loaded {} GeoSite entries", service.len()); }