summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/get-test-duration.rs30
-rw-r--r--src/bin/get-test-job.rs52
-rw-r--r--src/lib.rs49
3 files changed, 80 insertions, 51 deletions
diff --git a/src/bin/get-test-duration.rs b/src/bin/get-test-duration.rs
new file mode 100644
index 0000000..79dc819
--- /dev/null
+++ b/src/bin/get-test-duration.rs
@@ -0,0 +1,30 @@
+use std::fs::File;
+use memmap::MmapOptions;
+use std::process;
+use ci_cgi::{ciconfig_read, test_duration};
+use clap::Parser;
+
+#[derive(Parser)]
+#[command(author, version, about, long_about = None)]
+struct Args {
+ test: String,
+ subtest: String,
+}
+
+fn main() {
+ let args = Args::parse();
+
+ let rc = ciconfig_read();
+ if let Err(e) = rc {
+ eprintln!("could not read config; {}", e);
+ process::exit(1);
+ }
+ let rc = rc.unwrap();
+ let rc = rc.ktest;
+
+ let durations_file = File::open(rc.output_dir.join("test_durations.capnp")).ok();
+ let durations_map = durations_file.map(|x| unsafe { MmapOptions::new().map(&x).ok() } ).flatten();
+ let durations = durations_map.as_ref().map(|x| x.as_ref());
+
+ println!("{:?}", test_duration(durations, &args.test, &args.subtest));
+}
diff --git a/src/bin/get-test-job.rs b/src/bin/get-test-job.rs
index b60498a..0d1294e 100644
--- a/src/bin/get-test-job.rs
+++ b/src/bin/get-test-job.rs
@@ -34,8 +34,7 @@ use memmap::MmapOptions;
use std::fs::OpenOptions;
use std::str;
-use ci_cgi::durations_capnp::durations;
-use capnp::serialize;
+use ci_cgi::test_duration;
fn commit_test_matches(job: &Option<TestJob>, commit: &str, test: &str) -> bool {
if let Some(job) = job {
@@ -47,55 +46,6 @@ fn commit_test_matches(job: &Option<TestJob>, commit: &str, test: &str) -> bool
false
}
-fn test_duration(durations: Option<&[u8]>, test: &str, subtest: &str) -> Option<u64> {
-
- if let Some(d) = durations {
- let mut d = d;
- let d_reader = serialize::read_message_from_flat_slice(&mut d, capnp::message::ReaderOptions::new()).ok();
- let d = d_reader.as_ref().map(|x| x.get_root::<durations::Reader>().ok()).flatten();
- if d.is_none() {
- return None;
- }
- let d = d.unwrap();
-
- let d = d.get_entries();
- if let Err(e) = d.as_ref() {
- eprintln!("error getting test duration entries: {}", e);
- return None;
- }
- let d = d.unwrap();
-
- let full_test = subtest_full_name(test, subtest);
- let full_test = full_test.as_str();
-
- let mut l = 0;
- let mut r = d.len();
-
- while l < r {
- let m = l + (r - l) / 2;
- let d_m = d.get(m);
- let d_m_test = d_m.get_test();
-
- // why does this happen? */
- if d_m_test.is_err() {
- eprintln!("no test at idx {}/){}", m, d.len());
- return None;
- }
-
- let d_m_test = d_m_test.unwrap().to_str().unwrap();
-
- use std::cmp::Ordering::*;
- match full_test.cmp(d_m_test) {
- Less => r = m,
- Equal => return Some(d_m.get_duration()),
- Greater => l = m,
- }
- }
- }
-
- None
-}
-
fn get_test_job(args: &Args, rc: &Ktestrc, durations: Option<&[u8]>) -> Option<TestJob> {
let file = OpenOptions::new()
.read(true)
diff --git a/src/lib.rs b/src/lib.rs
index 14d8390..ca3537f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -420,3 +420,52 @@ pub fn lockfile_exists(rc: &Ktestrc, commit: &str, test_name: &str, create: bool
r.is_ok()
}
}
+
+use durations_capnp::durations;
+pub fn test_duration(durations: Option<&[u8]>, test: &str, subtest: &str) -> Option<u64> {
+
+ if let Some(d) = durations {
+ let mut d = d;
+ let d_reader = serialize::read_message_from_flat_slice(&mut d, capnp::message::ReaderOptions::new()).ok();
+ let d = d_reader.as_ref().map(|x| x.get_root::<durations::Reader>().ok()).flatten();
+ if d.is_none() {
+ return None;
+ }
+
+ let d = d.unwrap().get_entries();
+ if let Err(e) = d.as_ref() {
+ eprintln!("error getting test duration entries: {}", e);
+ return None;
+ }
+ let d = d.unwrap();
+
+ let full_test = subtest_full_name(test, subtest);
+ let full_test = full_test.as_str();
+
+ let mut l = 0;
+ let mut r = d.len();
+
+ while l < r {
+ let m = l + (r - l) / 2;
+ let d_m = d.get(m);
+ let d_m_test = d_m.get_test();
+
+ // why does this happen? */
+ if d_m_test.is_err() {
+ eprintln!("no test at idx {}/){}", m, d.len());
+ return None;
+ }
+
+ let d_m_test = d_m_test.unwrap().to_str().unwrap();
+
+ use std::cmp::Ordering::*;
+ match full_test.cmp(d_m_test) {
+ Less => r = m,
+ Equal => return Some(d_m.get_duration()),
+ Greater => l = m,
+ }
+ }
+ }
+
+ None
+}