test: add tests for config parsing and examples

This commit is contained in:
Yujia Qiao 2021-12-18 22:36:40 +08:00
parent b5c9007efe
commit ed3b3a9831
No known key found for this signature in database
GPG Key ID: DC129173B148701B
8 changed files with 213 additions and 9 deletions

View File

@ -4,4 +4,3 @@ default_token = "123"
[server.services.foo1]
bind_addr = "0.0.0.0:5202"

View File

@ -10,4 +10,3 @@ pkcs12_password = "1234"
[server.services.foo1]
bind_addr = "0.0.0.0:5202"

View File

@ -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"

View File

@ -169,21 +169,150 @@ impl Config {
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use std::{fs, path::PathBuf};
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]
fn test_mimic_client_config() -> Result<()> {
let s = fs::read_to_string("./example/minimal/client.toml").unwrap();
Config::from_str(&s)?;
fn test_example_config() -> Result<()> {
let paths = get_all_example_config()?;
for p in paths {
let s = fs::read_to_string(p)?;
Config::from_str(&s)?;
}
Ok(())
}
#[test]
fn test_mimic_server_config() -> Result<()> {
let s = fs::read_to_string("./example/minimal/server.toml").unwrap();
Config::from_str(&s)?;
fn test_valid_config() -> Result<()> {
let paths = list_config_files("tests/config_test/valid_config")?;
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(())
}
}

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"