mirror of https://github.com/rapiz1/rathole.git
test: add tests for config parsing and examples
This commit is contained in:
parent
b5c9007efe
commit
ed3b3a9831
|
@ -4,4 +4,3 @@ default_token = "123"
|
||||||
|
|
||||||
[server.services.foo1]
|
[server.services.foo1]
|
||||||
bind_addr = "0.0.0.0:5202"
|
bind_addr = "0.0.0.0:5202"
|
||||||
|
|
||||||
|
|
|
@ -10,4 +10,3 @@ pkcs12_password = "1234"
|
||||||
|
|
||||||
[server.services.foo1]
|
[server.services.foo1]
|
||||||
bind_addr = "0.0.0.0:5202"
|
bind_addr = "0.0.0.0:5202"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
# rathole configuration can put in one file as long as running mode is specified via cli
|
||||||
|
|
||||||
|
[client]
|
||||||
|
remote_addr = "localhost:2333"
|
||||||
|
default_token = "123"
|
||||||
|
|
||||||
|
[client.services.foo1]
|
||||||
|
local_addr = "127.0.0.1:80"
|
||||||
|
|
||||||
|
[server]
|
||||||
|
bind_addr = "0.0.0.0:2333"
|
||||||
|
default_token = "123"
|
||||||
|
|
||||||
|
[server.services.foo1]
|
||||||
|
bind_addr = "0.0.0.0:5202"
|
143
src/config.rs
143
src/config.rs
|
@ -169,21 +169,150 @@ impl Config {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use std::fs;
|
use std::{fs, path::PathBuf};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
|
||||||
|
fn list_config_files<T: AsRef<Path>>(root: T) -> Result<Vec<PathBuf>> {
|
||||||
|
let mut files = Vec::new();
|
||||||
|
for entry in fs::read_dir(root)? {
|
||||||
|
let entry = entry?;
|
||||||
|
let path = entry.path();
|
||||||
|
if path.is_file() {
|
||||||
|
files.push(path);
|
||||||
|
} else if path.is_dir() {
|
||||||
|
files.append(&mut list_config_files(path)?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(files)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_all_example_config() -> Result<Vec<PathBuf>> {
|
||||||
|
Ok(list_config_files("./examples")?
|
||||||
|
.into_iter()
|
||||||
|
.filter(|x| x.ends_with(".toml"))
|
||||||
|
.collect())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mimic_client_config() -> Result<()> {
|
fn test_example_config() -> Result<()> {
|
||||||
let s = fs::read_to_string("./example/minimal/client.toml").unwrap();
|
let paths = get_all_example_config()?;
|
||||||
Config::from_str(&s)?;
|
for p in paths {
|
||||||
|
let s = fs::read_to_string(p)?;
|
||||||
|
Config::from_str(&s)?;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mimic_server_config() -> Result<()> {
|
fn test_valid_config() -> Result<()> {
|
||||||
let s = fs::read_to_string("./example/minimal/server.toml").unwrap();
|
let paths = list_config_files("tests/config_test/valid_config")?;
|
||||||
Config::from_str(&s)?;
|
for p in paths {
|
||||||
|
let s = fs::read_to_string(p)?;
|
||||||
|
Config::from_str(&s)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_invalid_config() -> Result<()> {
|
||||||
|
let paths = list_config_files("tests/config_test/invalid_config")?;
|
||||||
|
for p in paths {
|
||||||
|
let s = fs::read_to_string(p)?;
|
||||||
|
assert!(Config::from_str(&s).is_err());
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_validate_server_config() -> Result<()> {
|
||||||
|
let mut cfg = ServerConfig::default();
|
||||||
|
|
||||||
|
cfg.services.insert(
|
||||||
|
"foo1".into(),
|
||||||
|
ServerServiceConfig {
|
||||||
|
name: "foo1".into(),
|
||||||
|
bind_addr: "127.0.0.1:80".into(),
|
||||||
|
token: None,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Missing the token
|
||||||
|
assert!(Config::validate_server_config(&mut cfg).is_err());
|
||||||
|
|
||||||
|
// Use the default token
|
||||||
|
cfg.default_token = Some("123".into());
|
||||||
|
assert!(Config::validate_server_config(&mut cfg).is_ok());
|
||||||
|
assert_eq!(
|
||||||
|
cfg.services
|
||||||
|
.get("foo1")
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.token
|
||||||
|
.as_ref()
|
||||||
|
.unwrap(),
|
||||||
|
"123"
|
||||||
|
);
|
||||||
|
|
||||||
|
// The default token won't override the service token
|
||||||
|
cfg.services.get_mut("foo1").unwrap().token = Some("4".into());
|
||||||
|
assert!(Config::validate_server_config(&mut cfg).is_ok());
|
||||||
|
assert_eq!(
|
||||||
|
cfg.services
|
||||||
|
.get("foo1")
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.token
|
||||||
|
.as_ref()
|
||||||
|
.unwrap(),
|
||||||
|
"4"
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_validate_client_config() -> Result<()> {
|
||||||
|
let mut cfg = ClientConfig::default();
|
||||||
|
|
||||||
|
cfg.services.insert(
|
||||||
|
"foo1".into(),
|
||||||
|
ClientServiceConfig {
|
||||||
|
name: "foo1".into(),
|
||||||
|
local_addr: "127.0.0.1:80".into(),
|
||||||
|
token: None,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Missing the token
|
||||||
|
assert!(Config::validate_client_config(&mut cfg).is_err());
|
||||||
|
|
||||||
|
// Use the default token
|
||||||
|
cfg.default_token = Some("123".into());
|
||||||
|
assert!(Config::validate_client_config(&mut cfg).is_ok());
|
||||||
|
assert_eq!(
|
||||||
|
cfg.services
|
||||||
|
.get("foo1")
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.token
|
||||||
|
.as_ref()
|
||||||
|
.unwrap(),
|
||||||
|
"123"
|
||||||
|
);
|
||||||
|
|
||||||
|
// The default token won't override the service token
|
||||||
|
cfg.services.get_mut("foo1").unwrap().token = Some("4".into());
|
||||||
|
assert!(Config::validate_client_config(&mut cfg).is_ok());
|
||||||
|
assert_eq!(
|
||||||
|
cfg.services
|
||||||
|
.get("foo1")
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.token
|
||||||
|
.as_ref()
|
||||||
|
.unwrap(),
|
||||||
|
"4"
|
||||||
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
[client]
|
||||||
|
remote_addr = "example.com:2333"
|
||||||
|
|
||||||
|
[client.transport]
|
||||||
|
type = "tls"
|
||||||
|
|
||||||
|
[client.services.service1]
|
||||||
|
token = "whatever"
|
||||||
|
local_addr = "127.0.0.1:1081"
|
|
@ -0,0 +1,11 @@
|
||||||
|
[server]
|
||||||
|
bind_addr = "0.0.0.0:2333"
|
||||||
|
|
||||||
|
[server.transport]
|
||||||
|
type = "tls"
|
||||||
|
[server.transport.tls]
|
||||||
|
pkcs12_password = "password"
|
||||||
|
|
||||||
|
[server.services.service1]
|
||||||
|
token = "whatever"
|
||||||
|
bind_addr = "0.0.0.0:8081"
|
|
@ -0,0 +1,9 @@
|
||||||
|
[server]
|
||||||
|
bind_addr = "0.0.0.0:2333"
|
||||||
|
|
||||||
|
[server.transport]
|
||||||
|
type = "tls"
|
||||||
|
|
||||||
|
[server.services.service1]
|
||||||
|
token = "whatever"
|
||||||
|
bind_addr = "0.0.0.0:8081"
|
|
@ -0,0 +1,33 @@
|
||||||
|
[client]
|
||||||
|
remote_addr = "example.com:2333"
|
||||||
|
default_token = "default_token_if_not_specify"
|
||||||
|
|
||||||
|
[client.transport]
|
||||||
|
type = "tcp"
|
||||||
|
[client.transport.tls]
|
||||||
|
trusted_root = "ca.pem"
|
||||||
|
hostname = "example.com"
|
||||||
|
|
||||||
|
[client.services.service1]
|
||||||
|
token = "whatever"
|
||||||
|
local_addr = "127.0.0.1:1081"
|
||||||
|
|
||||||
|
[client.services.service2]
|
||||||
|
local_addr = "127.0.0.1:1082"
|
||||||
|
|
||||||
|
[server]
|
||||||
|
bind_addr = "0.0.0.0:2333"
|
||||||
|
default_token = "default_token_if_not_specify"
|
||||||
|
|
||||||
|
[server.transport]
|
||||||
|
type = "tls"
|
||||||
|
[server.transport.tls]
|
||||||
|
pkcs12 = "identify.pfx"
|
||||||
|
pkcs12_password = "password"
|
||||||
|
|
||||||
|
[server.services.service1]
|
||||||
|
token = "whatever"
|
||||||
|
bind_addr = "0.0.0.0:8081"
|
||||||
|
|
||||||
|
[server.services.service2]
|
||||||
|
bind_addr = "0.0.0.1:8082"
|
Loading…
Reference in New Issue