Skip to content

Commit 3f98b85

Browse files
authored
Merge pull request #218 from benthecarman/fix-cli-cfg
Allow unknown config options in client
2 parents 62ef9c9 + 1ca0dab commit 3f98b85

4 files changed

Lines changed: 95 additions & 24 deletions

File tree

e2e-tests/build.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ fn main() {
5454
println!("cargo:rerun-if-changed=../ldk-server/Cargo.toml");
5555
println!("cargo:rerun-if-changed=../ldk-server-cli/src");
5656
println!("cargo:rerun-if-changed=../ldk-server-cli/Cargo.toml");
57+
println!("cargo:rerun-if-changed=../ldk-server-client/src");
58+
println!("cargo:rerun-if-changed=../ldk-server-client/Cargo.toml");
5759
println!("cargo:rerun-if-changed=../ldk-server-grpc/src");
5860
println!("cargo:rerun-if-changed=../ldk-server-grpc/Cargo.toml");
5961
println!("cargo:rerun-if-changed=../ldk-server-mcp/src");

e2e-tests/src/lib.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ pub struct LdkServerHandle {
9191
pub grpc_port: u16,
9292
pub p2p_port: u16,
9393
pub storage_dir: PathBuf,
94+
pub config_path: PathBuf,
9495
pub api_key: String,
9596
pub tls_cert_path: PathBuf,
9697
pub node_id: String,
@@ -214,6 +215,7 @@ poll_metrics_interval = 1
214215
grpc_port,
215216
p2p_port,
216217
storage_dir,
218+
config_path,
217219
api_key,
218220
tls_cert_path,
219221
node_id: String::new(),
@@ -381,13 +383,42 @@ pub fn run_cli_raw(handle: &LdkServerHandle, args: &[&str]) -> String {
381383
String::from_utf8(output.stdout).unwrap()
382384
}
383385

386+
/// Run a CLI command using the server's config file for connection details.
387+
pub fn run_cli_with_config_raw(handle: &LdkServerHandle, args: &[&str]) -> String {
388+
let cli_path = cli_binary_path();
389+
let output = Command::new(&cli_path)
390+
.arg("--config")
391+
.arg(handle.config_path.to_str().unwrap())
392+
.args(args)
393+
.output()
394+
.unwrap_or_else(|e| panic!("Failed to run CLI at {:?}: {}", cli_path, e));
395+
396+
if !output.status.success() {
397+
let stderr = String::from_utf8_lossy(&output.stderr);
398+
let stdout = String::from_utf8_lossy(&output.stdout);
399+
panic!(
400+
"CLI command {:?} failed with status {}\nstdout: {}\nstderr: {}",
401+
args, output.status, stdout, stderr
402+
);
403+
}
404+
405+
String::from_utf8(output.stdout).unwrap()
406+
}
407+
384408
/// Run a CLI command against the given server handle and return parsed JSON output.
385409
pub fn run_cli(handle: &LdkServerHandle, args: &[&str]) -> serde_json::Value {
386410
let stdout = run_cli_raw(handle, args);
387411
serde_json::from_str(&stdout)
388412
.unwrap_or_else(|e| panic!("Failed to parse CLI output as JSON: {e}\nOutput: {stdout}"))
389413
}
390414

415+
/// Run a CLI command using the server's config file and return parsed JSON output.
416+
pub fn run_cli_with_config(handle: &LdkServerHandle, args: &[&str]) -> serde_json::Value {
417+
let stdout = run_cli_with_config_raw(handle, args);
418+
serde_json::from_str(&stdout)
419+
.unwrap_or_else(|e| panic!("Failed to parse CLI output as JSON: {e}\nOutput: {stdout}"))
420+
}
421+
391422
/// Mine blocks and wait for all servers to sync to the new chain tip.
392423
pub async fn mine_and_sync(
393424
bitcoind: &TestBitcoind, servers: &[&LdkServerHandle], block_count: u64,

e2e-tests/tests/e2e.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use std::str::FromStr;
1111
use std::time::Duration;
1212

1313
use e2e_tests::{
14-
find_available_port, mine_and_sync, run_cli, run_cli_raw, setup_funded_channel,
15-
wait_for_onchain_balance, wait_for_usable_channel, LdkServerConfig, LdkServerHandle,
16-
TestBitcoind,
14+
find_available_port, mine_and_sync, run_cli, run_cli_raw, run_cli_with_config,
15+
setup_funded_channel, wait_for_onchain_balance, wait_for_usable_channel, LdkServerConfig,
16+
LdkServerHandle, TestBitcoind,
1717
};
1818
use hex_conservative::{DisplayHex, FromHex};
1919
use ldk_node::bitcoin::hashes::{sha256, Hash};
@@ -57,6 +57,15 @@ async fn test_cli_get_node_info() {
5757
assert_eq!(output["node_id"], server.node_id());
5858
}
5959

60+
#[tokio::test]
61+
async fn test_cli_get_node_info_with_server_config() {
62+
let bitcoind = TestBitcoind::new();
63+
let server = LdkServerHandle::start(&bitcoind).await;
64+
65+
let output = run_cli_with_config(&server, &["get-node-info"]);
66+
assert_eq!(output["node_id"], server.node_id());
67+
}
68+
6069
#[tokio::test]
6170
async fn test_cli_onchain_receive() {
6271
let bitcoind = TestBitcoind::new();

ldk-server-client/src/config.rs

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ pub fn cert_path_for_storage_dir(storage_dir: &str) -> PathBuf {
7070

7171
/// Top-level structure of the `ldk-server` configuration TOML file.
7272
#[derive(Debug, Deserialize)]
73-
#[serde(deny_unknown_fields)]
7473
pub struct Config {
7574
/// Node-level configuration.
7675
pub node: NodeConfig,
@@ -82,15 +81,13 @@ pub struct Config {
8281

8382
/// `[tls]` section of the configuration file.
8483
#[derive(Debug, Deserialize, Serialize)]
85-
#[serde(deny_unknown_fields)]
8684
pub struct TlsConfig {
8785
/// Path to the server's TLS certificate in PEM format.
8886
pub cert_path: Option<String>,
8987
}
9088

9189
/// `[node]` section of the configuration file.
9290
#[derive(Debug, Deserialize)]
93-
#[serde(deny_unknown_fields)]
9491
pub struct NodeConfig {
9592
/// Address of the `ldk-server` gRPC service.
9693
#[serde(default = "default_grpc_service_address")]
@@ -100,15 +97,13 @@ pub struct NodeConfig {
10097

10198
/// `[storage]` section of the configuration file.
10299
#[derive(Debug, Deserialize)]
103-
#[serde(deny_unknown_fields)]
104100
pub struct StorageConfig {
105101
/// On-disk storage configuration.
106102
pub disk: Option<DiskConfig>,
107103
}
108104

109105
/// `[storage.disk]` section of the configuration file.
110106
#[derive(Debug, Deserialize)]
111-
#[serde(deny_unknown_fields)]
112107
pub struct DiskConfig {
113108
/// Directory used by the server to store its persistent data.
114109
pub dir_path: Option<String>,
@@ -208,28 +203,62 @@ mod tests {
208203
}
209204

210205
#[test]
211-
fn config_rejects_unknown_fields() {
212-
let top_level_err = toml::from_str::<Config>(
206+
fn config_allows_server_config_fields() {
207+
let config = toml::from_str::<Config>(
213208
r#"
214209
[node]
215210
network = "regtest"
216-
217-
[unknown]
218-
option = true
211+
listening_addresses = ["localhost:3001"]
212+
announcement_addresses = ["54.3.7.81:3001"]
213+
grpc_service_address = "127.0.0.1:3002"
214+
alias = "LDK Server"
215+
rgs_server_url = "https://rapidsync.lightningdevkit.org/snapshot/v2/"
216+
async_payments_role = "client"
217+
218+
[tls]
219+
cert_path = "/path/to/tls.crt"
220+
key_path = "/path/to/tls.key"
221+
hosts = ["example.com", "ldk-server.local"]
222+
223+
[storage.disk]
224+
dir_path = "/tmp"
225+
226+
[log]
227+
level = "Trace"
228+
file = "/var/log/ldk-server.log"
229+
230+
[bitcoind]
231+
rpc_address = "127.0.0.1:8332"
232+
rpc_user = "bitcoind-testuser"
233+
rpc_password = "bitcoind-testpassword"
234+
235+
[liquidity.lsps2_client]
236+
node_pubkey = "0217890e3aad8d35bc054f43acc00084b25229ecff0ab68debd82883ad65ee8266"
237+
address = "127.0.0.1:39735"
238+
token = "lsps2-token"
239+
240+
[liquidity.lsps2_service]
241+
advertise_service = false
242+
channel_opening_fee_ppm = 1000
243+
channel_over_provisioning_ppm = 500000
244+
min_channel_opening_fee_msat = 10000000
245+
min_channel_lifetime = 4320
246+
max_client_to_self_delay = 1440
247+
min_payment_size_msat = 10000000
248+
max_payment_size_msat = 25000000000
249+
client_trusts_lsp = true
250+
disable_client_reserve = false
251+
252+
[tor]
253+
proxy_address = "127.0.0.1:9050"
219254
"#,
220255
)
221-
.unwrap_err();
222-
assert!(top_level_err.to_string().contains("unknown field `unknown`"));
256+
.unwrap();
223257

224-
let node_err = toml::from_str::<Config>(
225-
r#"
226-
[node]
227-
network = "regtest"
228-
unknown = true
229-
"#,
230-
)
231-
.unwrap_err();
232-
assert!(node_err.to_string().contains("unknown field `unknown`"));
258+
assert_eq!(config.network().unwrap(), "regtest");
259+
assert_eq!(config.node.grpc_service_address, "127.0.0.1:3002");
260+
assert_eq!(config.tls.unwrap().cert_path.unwrap(), "/path/to/tls.crt");
261+
assert_eq!(config.storage.unwrap().disk.unwrap().dir_path.unwrap(), "/tmp");
233262
}
234263

235264
#[test]

0 commit comments

Comments
 (0)