diff --git a/Cargo.lock b/Cargo.lock index 3837020..6bc2130 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -262,6 +262,21 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -1213,6 +1228,7 @@ version = "0.1.1" dependencies = [ "chrono", "config", + "proptest", "prost", "prost-types", "serde", @@ -1727,6 +1743,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.4", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.13.1" @@ -1780,6 +1816,12 @@ dependencies = [ "prost", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.36" @@ -1847,6 +1889,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rayon" version = "1.10.0" @@ -2117,6 +2168,18 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.18" @@ -2759,6 +2822,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.15" diff --git a/Cargo.toml b/Cargo.toml index 7cbf451..fc86bb6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,3 +54,4 @@ tower-http = { version = "0.5.2", features = ["cors"] } reqwest = { version = "0.12.7", features = ["json"] } dashmap = "6.0.1" derive_more = {version = "1.0.0" , features=["debug", "from"]} +proptest = "1.0.0" diff --git a/crates/melon-common/Cargo.toml b/crates/melon-common/Cargo.toml index c2fd814..c5c5137 100644 --- a/crates/melon-common/Cargo.toml +++ b/crates/melon-common/Cargo.toml @@ -15,6 +15,7 @@ chrono = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } config = { workspace = true } +proptest = { workspace = true } [build-dependencies] tonic-build = { workspace = true } diff --git a/crates/melon-common/src/lib.rs b/crates/melon-common/src/lib.rs index 9a98aab..b8f1bf3 100644 --- a/crates/melon-common/src/lib.rs +++ b/crates/melon-common/src/lib.rs @@ -368,3 +368,47 @@ impl From<&proto::JobResult> for JobResult { } } } + +#[cfg(test)] +mod tests { + use super::*; + use proptest::prelude::*; + + proptest! { + #[test] + fn job_conversion_roundtrip(id in 0u64.., user in ".*", script_path in ".*", + script_args in proptest::collection::vec(".*", 0..10), + cpu_count in 1u32..16, memory in 0u64..(1 << 30), time in 0u32..) { + let req_res = RequestedResources::new(cpu_count, memory, time); + let job = Job::new(id, user, script_path, script_args, req_res); + + let proto_job: proto::Job = (&job).into(); + let converted_job: Job = (&proto_job).into(); + + assert_eq!(job.id, converted_job.id); + assert_eq!(job.user, converted_job.user); + assert_eq!(job.script_path, converted_job.script_path); + assert_eq!(job.script_args, converted_job.script_args); + assert_eq!(job.req_res.cpu_count, converted_job.req_res.cpu_count); + assert_eq!(job.req_res.memory, converted_job.req_res.memory); + assert_eq!(job.req_res.time, converted_job.req_res.time); + } + + #[test] + fn resource_reduction_and_free(cpu_count in 1u32..16, memory in 0u64..(1 << 30), time in 0u32..) { + let mut node = Node::new("node-1".to_string(), "127.0.0.1".to_string(), + NodeResources::new(cpu_count, memory), NodeStatus::Available); + + let req_res = RequestedResources::new(cpu_count / 2, memory / 2, time); + node.reduce_avail_resources(&req_res); + + assert!(node.used_resources.cpu_count <= node.avail_resources.cpu_count); + assert!(node.used_resources.memory <= node.avail_resources.memory); + + node.free_avail_resource(&req_res); + + assert_eq!(node.used_resources.cpu_count, 0); + assert_eq!(node.used_resources.memory, 0); + } + } +}