fix(client): retain request ownership revisions
This commit is contained in:
@@ -535,6 +535,54 @@ fn overlapping_tree_work_preserves_newer_subject_request_ownership() {
|
||||
Some(b"newer-fetch".to_vec())
|
||||
);
|
||||
|
||||
let older_tree = client.prepare_tree(&session, "/", 1, 4).unwrap();
|
||||
let completed_newer_fetch = client.prepare_fetch(&session, "/child").unwrap();
|
||||
client
|
||||
.complete(
|
||||
completed_newer_fetch.id,
|
||||
fetch_response("/child", &object("child", None, b"completed-newer")),
|
||||
)
|
||||
.unwrap();
|
||||
client
|
||||
.complete(
|
||||
older_tree.id,
|
||||
encode_fetch_tree_response(&tree_request, &tree_value, wire_limits()).unwrap(),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(
|
||||
client.object(&session, "/child").unwrap().validator,
|
||||
Some(b"completed-newer".to_vec())
|
||||
);
|
||||
|
||||
let older_omitting_tree = client.prepare_tree(&session, "/", 1, 4).unwrap();
|
||||
let newer_fetch = client.prepare_fetch(&session, "/child").unwrap();
|
||||
client
|
||||
.complete(
|
||||
newer_fetch.id,
|
||||
fetch_response("/child", &object("child", None, b"newer-than-omission")),
|
||||
)
|
||||
.unwrap();
|
||||
client
|
||||
.complete(
|
||||
older_omitting_tree.id,
|
||||
encode_fetch_tree_response(
|
||||
&tree_request,
|
||||
&FetchTreeResponse {
|
||||
root: ObjectTreeNode {
|
||||
object: object("", None, b"older-root"),
|
||||
children: vec![],
|
||||
},
|
||||
truncated: false,
|
||||
},
|
||||
wire_limits(),
|
||||
)
|
||||
.unwrap(),
|
||||
)
|
||||
.unwrap();
|
||||
let child = client.object(&session, "/child").unwrap();
|
||||
assert_eq!(child.state, ObservationState::Fresh);
|
||||
assert_eq!(child.validator, Some(b"newer-than-omission".to_vec()));
|
||||
|
||||
let old_tree = client.prepare_tree(&session, "/", 1, 4).unwrap();
|
||||
let newer_child_tree = client.prepare_tree(&session, "/child", 0, 1).unwrap();
|
||||
client
|
||||
@@ -569,6 +617,40 @@ fn overlapping_tree_work_preserves_newer_subject_request_ownership() {
|
||||
client.tree(&session, "/child").unwrap().state,
|
||||
ObservationState::Fresh
|
||||
);
|
||||
|
||||
let older_parent = client.prepare_tree(&session, "/", 1, 4).unwrap();
|
||||
let newer_child = client.prepare_tree(&session, "/child", 0, 1).unwrap();
|
||||
client
|
||||
.complete(
|
||||
newer_child.id,
|
||||
encode_fetch_tree_response(
|
||||
&child_request,
|
||||
&FetchTreeResponse {
|
||||
root: ObjectTreeNode {
|
||||
object: object("child", None, b"completed-newer-tree"),
|
||||
children: vec![],
|
||||
},
|
||||
truncated: false,
|
||||
},
|
||||
wire_limits(),
|
||||
)
|
||||
.unwrap(),
|
||||
)
|
||||
.unwrap();
|
||||
client
|
||||
.complete(
|
||||
older_parent.id,
|
||||
encode_fetch_tree_response(&tree_request, &tree_value, wire_limits()).unwrap(),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(
|
||||
client.object(&session, "/child").unwrap().validator,
|
||||
Some(b"completed-newer-tree".to_vec())
|
||||
);
|
||||
assert_eq!(
|
||||
client.tree(&session, "/child").unwrap().revision,
|
||||
newer_child.id
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -701,6 +783,49 @@ fn validator_free_interface_observation_remains_immutable() {
|
||||
assert_eq!(client.interface(&session, "math").unwrap().validator, None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn entry_eviction_never_discards_a_loading_tree_subject() {
|
||||
let mut client = client(1, 8, 8, 8);
|
||||
let session = client
|
||||
.open_session("https://example.test/wip", SecurityContext::new("subject"))
|
||||
.unwrap();
|
||||
observe_object(&mut client, &session, "/", object("", None, b"root"));
|
||||
let tree = client.prepare_tree(&session, "/", 0, 1).unwrap();
|
||||
assert_eq!(
|
||||
client.prepare_fetch(&session, "/other").unwrap_err().kind,
|
||||
ClientErrorKind::Capacity
|
||||
);
|
||||
assert!(matches!(
|
||||
client.tree(&session, "/").unwrap().state,
|
||||
ObservationState::Loading(id) if id == tree.id
|
||||
));
|
||||
client
|
||||
.complete(
|
||||
tree.id,
|
||||
encode_fetch_tree_response(
|
||||
&FetchTreeRequest {
|
||||
path: "/".into(),
|
||||
depth: 0,
|
||||
limit: 1,
|
||||
},
|
||||
&FetchTreeResponse {
|
||||
root: ObjectTreeNode {
|
||||
object: object("", None, b"tree"),
|
||||
children: vec![],
|
||||
},
|
||||
truncated: false,
|
||||
},
|
||||
wire_limits(),
|
||||
)
|
||||
.unwrap(),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(
|
||||
client.tree(&session, "/").unwrap().state,
|
||||
ObservationState::Fresh
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn failed_entry_and_tree_observation_metadata_is_bounded() {
|
||||
let mut client = client(2, 8, 2, 8);
|
||||
|
||||
Reference in New Issue
Block a user