use runmat_execution::identity::{Digest, NodeLeaseId, ValueId, WorkerId};
use runmat_execution::value::{
DenseValue, ElementType, InlineValue, RegisteredData, RegisteredField, ResidentFence,
SparseValue, ValueLimits, ValuePayload, ValueRef, ValueRefKind,
};
#[test]
fn nested_payloads_obey_depth_and_node_limits() {
let payload = ValuePayload::Inline(Box::new(InlineValue::Cell {
shape: vec![1],
values: vec![ValuePayload::Inline(Box::new(InlineValue::Cell {
shape: vec![1],
values: vec![ValuePayload::Inline(Box::new(InlineValue::Logical(true)))],
}))],
}));
assert!(payload
.validate(ValueLimits {
max_depth: 1,
..ValueLimits::default()
})
.is_err());
assert!(payload.validate(ValueLimits::default()).is_ok());
}
#[test]
fn struct_fields_must_be_sorted_and_unique() {
use runmat_execution::value::StructField;
let scalar = || ValuePayload::Inline(Box::new(InlineValue::Logical(true)));
let payload = ValuePayload::Inline(Box::new(InlineValue::Struct(vec![
StructField {
name: "z".into(),
value: scalar(),
},
StructField {
name: "a".into(),
value: scalar(),
},
])));
assert!(payload.validate(ValueLimits::default()).is_err());
}
#[test]
fn dense_and_sparse_storage_must_match_declared_shapes() {
let dense = ValuePayload::Inline(Box::new(InlineValue::Dense(DenseValue {
element_type: ElementType::F64,
shape: vec![2, 2],
little_endian_data: vec![0; 24],
})));
assert!(dense.validate(ValueLimits::default()).is_err());
let sparse = ValuePayload::Inline(Box::new(InlineValue::Sparse(SparseValue {
element_type: ElementType::F64,
rows: 2,
columns: 2,
column_offsets: vec![0, 2, 1],
row_indices: vec![0],
little_endian_data: vec![0; 8],
})));
assert!(sparse.validate(ValueLimits::default()).is_err());
}
#[test]
fn registered_fields_are_validated_without_projecting_live_values() {
let scalar = || ValuePayload::Inline(Box::new(InlineValue::Logical(true)));
let payload = ValuePayload::Inline(Box::new(InlineValue::Symbolic(RegisteredData {
type_identity: "symbolic/v1".into(),
schema_version: 1,
fields: vec![
RegisteredField {
name: "z".into(),
value: scalar(),
},
RegisteredField {
name: "a".into(),
value: scalar(),
},
],
})));
assert!(payload.validate(ValueLimits::default()).is_err());
}
#[test]
fn resident_values_require_and_bind_a_worker_fence() {
let mut reference = ValueRef {
schema_version: runmat_execution::schema::VALUE_PAYLOAD_SCHEMA_V1,
id: ValueId::derive(&[b"value"]),
logical_digest: Digest::sha256(b"value"),
encoded_length: 1,
media_type: "application/runmat-value".into(),
value_schema: "runmat-value/v1".into(),
encryption_context: Digest::sha256(b"context"),
kind: ValueRefKind::ResidentObject,
authorization_scope: "scope".into(),
resident_fence: None,
};
assert!(ValuePayload::Object(Box::new(reference.clone()))
.validate(ValueLimits::default())
.is_err());
reference.resident_fence = Some(ResidentFence {
worker_id: WorkerId::derive(&[b"worker"]),
node_lease_id: NodeLeaseId::derive(&[b"lease"]),
process_generation: 2,
device_identity: Some("gpu-0".into()),
});
assert!(ValuePayload::Object(Box::new(reference.clone()))
.validate(ValueLimits::default())
.is_ok());
reference.kind = ValueRefKind::ResultObject;
assert!(ValuePayload::Object(Box::new(reference))
.validate(ValueLimits::default())
.is_err());
}
#[test]
fn logical_identity_is_independent_of_inline_or_object_placement() {
let inline = ValuePayload::Inline(Box::new(InlineValue::String("payload".into())));
let logical_digest = inline.logical_digest().unwrap();
let reference = ValuePayload::Object(Box::new(ValueRef {
schema_version: runmat_execution::schema::VALUE_PAYLOAD_SCHEMA_V1,
id: ValueId::derive(&[b"value"]),
logical_digest,
encoded_length: 1024,
media_type: "application/runmat-value".into(),
value_schema: "runmat-value/v1".into(),
encryption_context: Digest::sha256(b"context"),
kind: ValueRefKind::ResultObject,
authorization_scope: "scope".into(),
resident_fence: None,
}));
assert_eq!(reference.logical_digest().unwrap(), logical_digest);
let nested_inline = ValuePayload::Inline(Box::new(InlineValue::OutputList(vec![inline])));
let nested_reference = ValuePayload::Inline(Box::new(InlineValue::OutputList(vec![reference])));
assert_eq!(
nested_inline.logical_digest().unwrap(),
nested_reference.logical_digest().unwrap()
);
}