Skip to content

Commit 1fd032e

Browse files
authored
Merge pull request #45 from ackintosh/feature/run-out
Write events to run.out
2 parents 2b85e4c + 45a28ff commit 1fd032e

File tree

4 files changed

+86
-17
lines changed

4 files changed

+86
-17
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [0.5.0] - unreleased
8+
### Added
9+
- Write events to `run.out`. See [PR 45].
10+
811
### Change
912
- Change `RunParameters::test_start_time` from `String` to `DateTime` for ease of use. See [PR 41].
1013

1114
[PR 41]: https://github.com/testground/sdk-rust/pull/41
15+
[PR 45]: https://github.com/testground/sdk-rust/pull/45
1216

1317
## [0.4.0]
1418
### Added

src/background.rs

+1-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::collections::HashMap;
2-
use std::time::{SystemTime, UNIX_EPOCH};
32

43
use futures::stream::StreamExt;
54
use influxdb::{Client, WriteQuery};
@@ -377,17 +376,7 @@ impl BackgroundTask {
377376
if let PayloadType::Event(ref event) = payload {
378377
// The Testground daemon determines the success or failure of a test
379378
// instance by parsing stdout for runtime events.
380-
println!(
381-
"{}",
382-
serde_json::to_string(&LogLine {
383-
ts: SystemTime::now()
384-
.duration_since(UNIX_EPOCH)
385-
.unwrap()
386-
.as_nanos(),
387-
event,
388-
})
389-
.unwrap(),
390-
);
379+
println!("{}", serde_json::to_string(&LogLine::new(event)).unwrap());
391380
}
392381

393382
let request = Request {

src/client.rs

+68-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
use std::borrow::Cow;
2+
use std::fs::File;
3+
use std::io::Write;
4+
use std::path::PathBuf;
25

36
use crate::{
47
background::{BackgroundTask, Command},
@@ -12,6 +15,7 @@ use clap::Parser;
1215

1316
use influxdb::WriteQuery;
1417

18+
use crate::events::LogLine;
1519
use tokio::sync::{
1620
mpsc::{self, channel, Sender},
1721
oneshot,
@@ -31,21 +35,39 @@ pub struct Client {
3135
global_seq: u64,
3236
/// A group-scoped sequence number assigned to this test instance by the sync service.
3337
group_seq: u64,
38+
/// A path to `run.out`.
39+
run_out: Option<PathBuf>,
3440
}
3541

3642
impl Client {
3743
pub async fn new_and_init() -> Result<Self, Box<dyn std::error::Error>> {
38-
let run_parameters = RunParameters::try_parse()?;
44+
let run_parameters: RunParameters = RunParameters::try_parse()?;
3945

4046
let (cmd_tx, cmd_rx) = channel(1);
4147

4248
let background = BackgroundTask::new(cmd_rx, run_parameters.clone()).await?;
49+
50+
let run_out = run_parameters
51+
.test_outputs_path
52+
.to_str()
53+
.map(|path_str| {
54+
if path_str.is_empty() {
55+
None
56+
} else {
57+
let mut path = PathBuf::from(path_str);
58+
path.push("run.out");
59+
Some(path)
60+
}
61+
})
62+
.unwrap_or(None);
63+
4364
// `global_seq` and `group_seq` are initialized by 0 at this point since no way to signal to the sync service.
4465
let mut client = Self {
4566
cmd_tx,
4667
run_parameters,
4768
global_seq: 0,
4869
group_seq: 0,
70+
run_out,
4971
};
5072

5173
tokio::spawn(background.run());
@@ -64,7 +86,7 @@ impl Client {
6486
// Note that the sdk-go only signals, but not waits.
6587
.signal_and_wait(
6688
format!("initialized_group_{}", client.run_parameters.test_group_id),
67-
client.run_parameters.test_group_instance_count as u64,
89+
client.run_parameters.test_group_instance_count,
6890
)
6991
.await?;
7092

@@ -252,6 +274,8 @@ impl Client {
252274
let json_event = serde_json::to_string(&event).expect("Event Serialization");
253275

254276
println!("{}", json_event);
277+
278+
self.write(&event.event);
255279
}
256280

257281
pub async fn record_success(self) -> Result<(), Error> {
@@ -263,6 +287,10 @@ impl Client {
263287

264288
receiver.await.expect(BACKGROUND_SENDER)?;
265289

290+
self.write(&EventType::Success {
291+
group: self.run_parameters.test_group_id.clone(),
292+
});
293+
266294
Ok(())
267295
}
268296

@@ -271,12 +299,20 @@ impl Client {
271299

272300
let (sender, receiver) = oneshot::channel();
273301

274-
let cmd = Command::SignalFailure { error, sender };
302+
let cmd = Command::SignalFailure {
303+
error: error.clone(),
304+
sender,
305+
};
275306

276307
self.cmd_tx.send(cmd).await.expect(BACKGROUND_RECEIVER);
277308

278309
receiver.await.expect(BACKGROUND_SENDER)?;
279310

311+
self.write(&EventType::Failure {
312+
group: self.run_parameters.test_group_id.clone(),
313+
error,
314+
});
315+
280316
Ok(())
281317
}
282318

@@ -291,15 +327,21 @@ impl Client {
291327
let (sender, receiver) = oneshot::channel();
292328

293329
let cmd = Command::SignalCrash {
294-
error,
295-
stacktrace,
330+
error: error.clone(),
331+
stacktrace: stacktrace.clone(),
296332
sender,
297333
};
298334

299335
self.cmd_tx.send(cmd).await.expect(BACKGROUND_RECEIVER);
300336

301337
receiver.await.expect(BACKGROUND_SENDER)?;
302338

339+
self.write(&EventType::Crash {
340+
groups: self.run_parameters.test_group_id.clone(),
341+
error,
342+
stacktrace,
343+
});
344+
303345
Ok(())
304346
}
305347

@@ -332,4 +374,25 @@ impl Client {
332374
pub fn group_seq(&self) -> u64 {
333375
self.group_seq
334376
}
377+
378+
/// Writes an event to `run.out`.
379+
fn write(&self, event_type: &EventType) {
380+
if let Some(path) = self.run_out.as_ref() {
381+
let mut file = match File::options().create(true).append(true).open(path) {
382+
Ok(file) => file,
383+
Err(e) => {
384+
eprintln!("Failed to open `run.out`: {}", e);
385+
return;
386+
}
387+
};
388+
389+
if let Err(e) = writeln!(
390+
file,
391+
"{}",
392+
serde_json::to_string(&LogLine::new(event_type)).expect("Event Serialization")
393+
) {
394+
eprintln!("Failed to write a log to `run.out`: {}", e);
395+
}
396+
}
397+
}
335398
}

src/events.rs

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![allow(dead_code)]
22

33
use serde::Serialize;
4+
use std::time::{SystemTime, UNIX_EPOCH};
45

56
#[derive(Serialize, Debug)]
67
pub struct Event {
@@ -13,6 +14,18 @@ pub struct LogLine<'a> {
1314
pub event: &'a EventType,
1415
}
1516

17+
impl LogLine<'_> {
18+
pub fn new(event: &EventType) -> LogLine {
19+
LogLine {
20+
ts: SystemTime::now()
21+
.duration_since(UNIX_EPOCH)
22+
.unwrap()
23+
.as_nanos(),
24+
event,
25+
}
26+
}
27+
}
28+
1629
#[derive(Serialize, Debug)]
1730
pub enum EventType {
1831
#[serde(rename = "start_event")]

0 commit comments

Comments
 (0)