-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adds extra key-value string data storage to runtime objects
Allows external processes to store data in durable runtimes. Signed-off-by: David Gilligan-Cook <dcook@imageworks.com>
- Loading branch information
Showing
9 changed files
with
382 additions
and
2 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,196 @@ | ||
// Copyright (c) Sony Pictures Imageworks, et al. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// https://github.com/imageworks/spk | ||
|
||
use std::fs; | ||
|
||
use rstest::rstest; | ||
|
||
use super::fixtures::*; | ||
use super::ExtraData; | ||
|
||
// Test - --extra-data field1:value1 --extra-data field2:value2 | ||
// Test - --extra-data field1=value1 --extra-data field2=value2 | ||
// Test - --extra-data field1:value1 --extra-data field2=value2 | ||
// Test - --extra-data field1=value1 --extra-data field2:value2 | ||
// Test - --extra-data '{ field1: value1, field2: value2 }' | ||
#[rstest] | ||
#[case(vec!["field1:value1".to_string(), "field2:value2".to_string()])] | ||
#[case(vec!["field1=value1".to_string(), "field2=value2".to_string()])] | ||
#[case(vec!["field1:value1".to_string(), "field2=value2".to_string()])] | ||
#[case(vec!["field1=value1".to_string(), "field2:value2".to_string()])] | ||
#[case(vec!["{field1: value1, field2: value2}".to_string()])] | ||
fn test_cmd_run_create_extra_data(#[case] values: Vec<String>) { | ||
// Setup some data for the key value pairs | ||
let field1 = "field1".to_string(); | ||
let field2 = "field2".to_string(); | ||
let value1 = "value1".to_string(); | ||
let value2 = "value2".to_string(); | ||
|
||
let filenames = Vec::new(); | ||
|
||
// Test - --extra-data field1:value1 --extra-data field2:value2 | ||
let data = ExtraData { | ||
extra_data: values, | ||
extra_data_file: filenames, | ||
}; | ||
|
||
let result = data | ||
.get_data() | ||
.expect("unable to parse cmd_run --extra-data values"); | ||
assert!(!result.is_empty()); | ||
assert!(result.len() == 2); | ||
assert!(result[0] == (field1, value1)); | ||
assert!(result[1] == (field2, value2)); | ||
} | ||
|
||
#[rstest] | ||
#[should_panic] | ||
#[case(vec!["field1,value1".to_string(), "field2/value2".to_string()])] | ||
#[should_panic] | ||
#[case(vec!["field1 value1".to_string(), "field2 value2".to_string()])] | ||
#[should_panic] | ||
#[case(vec!["{field1: value1, field2: - value2 - value1}".to_string()])] | ||
fn test_cmd_run_create_extra_data_invalid(#[case] invalid_values: Vec<String>) { | ||
let filenames = Vec::new(); | ||
|
||
// Test - --extra-data with_an_invalid_argument_value | ||
let data = ExtraData { | ||
extra_data: invalid_values, | ||
extra_data_file: filenames, | ||
}; | ||
|
||
let _result = data | ||
.get_data() | ||
.expect("unable to parse cmd_run --extra-data values"); | ||
} | ||
|
||
#[rstest] | ||
fn test_cmd_run_create_extra_data_from_file(tmpdir: tempfile::TempDir) { | ||
// Setup some data for the key value pairs | ||
let field1 = "field1".to_string(); | ||
let field2 = "field2".to_string(); | ||
let value1 = "value1".to_string(); | ||
let value2 = "value2".to_string(); | ||
let extra_data = format!("{field1}: {value1}\n{field2}: {value2}\n"); | ||
|
||
let filename = tmpdir.path().join("filename.yaml"); | ||
fs::write(filename.clone(), extra_data) | ||
.expect("Unable to write extra data to file during setup"); | ||
let filenames = vec![filename]; | ||
|
||
let values = Vec::new(); | ||
|
||
// Test - --extra-data-file filename.yaml | ||
let data = ExtraData { | ||
extra_data: values, | ||
extra_data_file: filenames, | ||
}; | ||
|
||
let result = data | ||
.get_data() | ||
.expect("unable to parse cmd_run --extra-data values"); | ||
assert!(!result.is_empty()); | ||
assert!(result.len() == 2); | ||
assert!(result[0] == (field1, value1)); | ||
assert!(result[1] == (field2, value2)); | ||
} | ||
|
||
#[rstest] | ||
#[should_panic] | ||
fn test_cmd_run_create_extra_data_from_file_not_exist(tmpdir: tempfile::TempDir) { | ||
// Setup a file name that does not exist | ||
let filename = tmpdir.path().join("nosuchfile.yaml"); | ||
let filenames = vec![filename]; | ||
|
||
let values = Vec::new(); | ||
|
||
// Test - --extra-data-file nosuchfile.yaml | ||
let data = ExtraData { | ||
extra_data: values, | ||
extra_data_file: filenames, | ||
}; | ||
|
||
let _result = data | ||
.get_data() | ||
.expect("unable to parse cmd_run --extra-data values"); | ||
} | ||
|
||
#[rstest] | ||
#[should_panic] | ||
fn test_cmd_run_create_extra_data_from_file_invalid_keyvalues(tmpdir: tempfile::TempDir) { | ||
// Setup some data for the key value pairs | ||
let field1 = "field1".to_string(); | ||
let field2 = "field2".to_string(); | ||
let value1 = "value1".to_string(); | ||
let value2 = "value2".to_string(); | ||
let extra_data = format!("{field1}: {value1}\n{field2}:\n - {value2}\n - {value1}\n"); | ||
|
||
let filename = tmpdir.path().join("filename.yaml"); | ||
fs::write(filename.clone(), extra_data) | ||
.expect("Unable to write extra data to file during setup"); | ||
let filenames = vec![filename]; | ||
|
||
let values = Vec::new(); | ||
|
||
// Test - --extra-data-file filename.yaml that contains more than key-value string pairs | ||
let data = ExtraData { | ||
extra_data: values, | ||
extra_data_file: filenames, | ||
}; | ||
|
||
let _result = data | ||
.get_data() | ||
.expect("unable to parse cmd_run --extra-data values"); | ||
} | ||
|
||
#[rstest] | ||
fn test_cmd_run_create_extra_data_all(tmpdir: tempfile::TempDir) { | ||
// Setup some data for the key value pairs | ||
let field1 = "field1".to_string(); | ||
let field2 = "field2".to_string(); | ||
let field3 = "field3".to_string(); | ||
let field4 = "field4".to_string(); | ||
|
||
let value1 = "value1".to_string(); | ||
let value2 = "value2".to_string(); | ||
let value3 = "value3".to_string(); | ||
let value4 = "value4".to_string(); | ||
|
||
let values: Vec<String> = vec![ | ||
format!("{field1}:{value1}"), | ||
format!("{field2}={value2}"), | ||
"{field3: value3, field4: value4}".to_string(), | ||
]; | ||
|
||
let extra_data = format!("{field4}: {value4}\n{field3}: {value3}\n"); | ||
|
||
let filename = tmpdir.path().join("filename.yaml"); | ||
fs::write(filename.clone(), extra_data) | ||
.expect("Unable to write extra data to file during setup"); | ||
let filenames = vec![filename]; | ||
|
||
// Test - --extra-data field1:value1 --extra-data field2=value2 | ||
// --extra-data '{ field1: value1, field2: value2 }' | ||
// --extra-data-file filename.yaml | ||
let data = ExtraData { | ||
extra_data: values, | ||
extra_data_file: filenames, | ||
}; | ||
|
||
let result = data | ||
.get_data() | ||
.expect("unable to parse cmd_run --extra-data values"); | ||
|
||
assert!(!result.is_empty()); | ||
assert!(result.len() == 6); | ||
// from --extra-data-file filename.taml | ||
assert!(result[0] == (field3.clone(), value3.clone())); | ||
assert!(result[1] == (field4.clone(), value4.clone())); | ||
// from --extra-data field1:value1 extra-data field2:value2 | ||
assert!(result[2] == (field1, value1)); | ||
assert!(result[3] == (field2, value2)); | ||
// from --extra-data '{field3: value3, field4: value4}' | ||
assert!(result[4] == (field3, value3)); | ||
assert!(result[5] == (field4, value4)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
use rstest::fixture; | ||
use tempfile::TempDir; | ||
|
||
#[fixture] | ||
pub fn tmpdir() -> TempDir { | ||
tempfile::Builder::new() | ||
.prefix("spfs-test-") | ||
.tempdir() | ||
.expect("failed to create dir for test") | ||
} |
Oops, something went wrong.