test: wip validate scope replacement and target compatibility
This commit is contained in:
@@ -457,3 +457,84 @@ async fn ancestor_replacement_during_in_flight_call_keeps_the_original_descripto
|
|||||||
assert_eq!(new.content.as_deref(), Some("2"));
|
assert_eq!(new.content.as_deref(), Some("2"));
|
||||||
assert_eq!(provider.calls.load(Ordering::SeqCst), 2);
|
assert_eq!(provider.calls.load(Ordering::SeqCst), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn same_name_scope_replacement_or_loss_of_ref_rejects_old_metadata_without_replay() {
|
||||||
|
for identity in [Some("replacement"), None] {
|
||||||
|
let (runtime, provider) = fixture("/github/team", true, false);
|
||||||
|
let selected = reference("/github/team", "read");
|
||||||
|
runtime
|
||||||
|
.inspect(provider.target_path.clone(), false)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
{
|
||||||
|
let mut state = provider.state.lock().unwrap();
|
||||||
|
state.identity = identity.map(Into::into);
|
||||||
|
if identity.is_some() {
|
||||||
|
state.generation = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert_eq!(
|
||||||
|
rejected_code(
|
||||||
|
&runtime,
|
||||||
|
metadata_request(
|
||||||
|
&provider.target_path,
|
||||||
|
json!({"scope":"/github/team","name":"read"}),
|
||||||
|
None,
|
||||||
|
Some("live-scope")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.await,
|
||||||
|
"interface_mismatch"
|
||||||
|
);
|
||||||
|
let failed = runtime
|
||||||
|
.invoke(
|
||||||
|
provider.target_path.clone(),
|
||||||
|
selected.clone(),
|
||||||
|
"read".into(),
|
||||||
|
json!({}),
|
||||||
|
ToolExecutionContext::direct(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap_err();
|
||||||
|
assert!(failed.to_string().contains("InterfaceMismatch"), "{failed}");
|
||||||
|
assert_eq!(provider.calls.load(Ordering::SeqCst), 0);
|
||||||
|
let fetched = runtime.host.fetch_interface_live(&selected).await.unwrap();
|
||||||
|
assert_eq!(fetched.scope_ref.as_deref(), identity);
|
||||||
|
assert_eq!(
|
||||||
|
fetched.descriptor.documentation.unwrap().summary,
|
||||||
|
if identity.is_some() {
|
||||||
|
"Published generation 1"
|
||||||
|
} else {
|
||||||
|
"Published generation 0"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
runtime
|
||||||
|
.inspect(provider.target_path.clone(), true)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
runtime
|
||||||
|
.invoke(
|
||||||
|
provider.target_path.clone(),
|
||||||
|
selected,
|
||||||
|
"read".into(),
|
||||||
|
json!({}),
|
||||||
|
ToolExecutionContext::direct(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(provider.calls.load(Ordering::SeqCst), 1);
|
||||||
|
let state = runtime.state.lock().unwrap();
|
||||||
|
let call = state
|
||||||
|
.client
|
||||||
|
.call_history(&state.session)
|
||||||
|
.unwrap()
|
||||||
|
.back()
|
||||||
|
.unwrap();
|
||||||
|
// Omitted scope_ref is never filled from the placeholder or other observations.
|
||||||
|
assert_eq!(
|
||||||
|
call.context.request().interface.scope_ref.as_deref(),
|
||||||
|
identity
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ Cargo resolves the release, not that checkout or an unreleased Rust revision.
|
|||||||
|
|
||||||
## Executed checks on registry 0.2.0
|
## Executed checks on registry 0.2.0
|
||||||
|
|
||||||
- `cargo test -p worker --locked --offline`: **893 unit + 110 integration tests
|
- `cargo test -p worker --locked --offline`: **894 unit + 110 integration tests
|
||||||
passed**, no ignored/failed tests. This includes ordinary Tools mode, Feature
|
passed**, no ignored/failed tests. This includes ordinary Tools mode, Feature
|
||||||
permission/revocation, restore, session/history and controller integration.
|
permission/revocation, restore, session/history and controller integration.
|
||||||
- Narrow development checks: `wip::binding` (25), `wip::provider_tests` (11), existing
|
- Narrow development checks: `wip::binding` (25), `wip::provider_tests` (12), existing
|
||||||
`wip::tests` and workdir projection tests (43), checkout transports/providers
|
`wip::tests` and workdir projection tests (43), checkout transports/providers
|
||||||
(20), workspace-config production/authority tests (19). These are included
|
(20), workspace-config production/authority tests (19). These are included
|
||||||
in the complete worker run.
|
in the complete worker run.
|
||||||
@@ -36,6 +36,26 @@ Cargo resolves the release, not that checkout or an unreleased Rust revision.
|
|||||||
hash. This validates credential-free dependency acquisition, not a full Nix
|
hash. This validates credential-free dependency acquisition, not a full Nix
|
||||||
binary/image build or deployment update.
|
binary/image build or deployment update.
|
||||||
|
|
||||||
|
## Current target compatibility (preview, not integration)
|
||||||
|
|
||||||
|
Source runtime at `23cf6c4f882ce78985ba4bd673751cebe64e2d87` and current develop
|
||||||
|
`b5ea162f838fc36e364edec9ab6689292b59cffd` produce the conflict-free `git merge-tree`
|
||||||
|
preview tree `7ef3545b635cbdfc5e24658f6d1532e0f8b0947c`. An archive of this tree,
|
||||||
|
without a branch/ref change, passed root locked/offline Cargo check, all **91**
|
||||||
|
Server API TypeScript tests (including OpenAPI/checked-in generator freshness),
|
||||||
|
registry WIP resolution checks, and Nix dependency acquisition with the same hash.
|
||||||
|
T-722's API macros, Server API/Drive/Server source, OpenAPI and generated TS blobs
|
||||||
|
are unchanged from develop in the combined tree; no artifact overwrite or
|
||||||
|
regeneration is necessary for this source change. The later added same-name scope
|
||||||
|
regression changes tests only, not the validated runtime or shared contracts.
|
||||||
|
|
||||||
|
The initial archive check reused a Cargo target directory; returning to the older
|
||||||
|
main checkout exposed stale preview Server API artifacts. All local workspace
|
||||||
|
artifacts were invalidated, and a fresh main root check and complete **894 + 110**
|
||||||
|
Worker suite passed. Use an isolated target directory for future cross-tree checks.
|
||||||
|
No target push, integration branch, deployment, or live dogfood update was made.
|
||||||
|
Orchestrator readiness/integration must still resolve the then-current target.
|
||||||
|
|
||||||
## Contract evidence
|
## Contract evidence
|
||||||
|
|
||||||
`crates/worker/src/wip/binding.rs` tests exercise fresh/loading/stale/failed and
|
`crates/worker/src/wip/binding.rs` tests exercise fresh/loading/stale/failed and
|
||||||
@@ -60,6 +80,8 @@ valid live ancestor refs that differ from registration placeholders, root `/` an
|
|||||||
intermediate provider-owned ancestors, ref-less and ref-bearing scope deletion
|
intermediate provider-owned ancestors, ref-less and ref-bearing scope deletion
|
||||||
without a prior scope Inspect, rejected cached dispatch and orphan observation,
|
without a prior scope Inspect, rejected cached dispatch and orphan observation,
|
||||||
replacement/republication without restoring old Interface registrations,
|
replacement/republication without restoring old Interface registrations,
|
||||||
|
same-name scope replacement or loss of public ref rejecting copied old metadata
|
||||||
|
without replay (and later explicit Inspect/Invoke copying only the new optional ref),
|
||||||
shape/target/Object-validator/Interface-mismatch precedence, and frozen in-flight
|
shape/target/Object-validator/Interface-mismatch precedence, and frozen in-flight
|
||||||
ancestor Descriptor/handler/result validation after replacement. Valid Invoke
|
ancestor Descriptor/handler/result validation after replacement. Valid Invoke
|
||||||
makes one provider publication call for the target, not a separate scope lookup.
|
makes one provider publication call for the target, not a separate scope lookup.
|
||||||
|
|||||||
Reference in New Issue
Block a user