app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
master
Drew Owens
Port occurrence translation and contract authoring to Rust; publish verified R21 source
a06dfd7
26d ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
#[test]
#[cfg(not(feature = "native-wake-probe"))]
fn assembly_headers_admission_unknown_reads_and_no_effect_journal() {
let queue = Queue::new(4).unwrap();
let epoch = queue.epoch().to_string();
let directory = std::env::temp_dir().join(format!(
"fusion-r20-assembly-{}-{epoch}",
std::process::id()
));
let reader = OperationStatusReader::new(directory.clone(), epoch.clone());
let wakes = Arc::new(AtomicU64::new(0));
let count = wakes.clone();
let mut server = Service::start_with_operations(
TcpListener::bind("127.0.0.1:0").unwrap(),
queue.clone(),
TOKEN.into(),
Arc::new(move || {
count.fetch_add(1, Ordering::Relaxed);
true
}),
Arc::new(Stats::default()),
reader.clone(),
)
.unwrap();
let address = server.address();
let end = Instant::now() + Duration::from_secs(5);
while reader.health()["connected"] != true {
assert!(Instant::now() < end);
thread::sleep(Duration::from_millis(1));
}
let doc = format!("d:{epoch}:0000000000000001");
let request = json!({"op":"native_assembly_inspect","sessionId":epoch,"operationId":"assembly-read","target":{"documentId":doc}});
let denied = post_mechanical(
address,
&epoch,
crate::sketches::dimensions::CONTRACT,
request.clone(),
);
assert_eq!(denied.0, 409);
assert_eq!(denied.1["errorCode"], "native_assembly_contract_required");
let mut bad = request.clone();
bad["target"]["revision"] = json!("wrong-projection");
let denied = post_mechanical(address, &epoch, crate::assembly::CONTRACT, bad);
assert_eq!(denied.0, 400);
assert_eq!(denied.1["errorCode"], "native_assembly_revision_required");
assert_eq!(wakes.load(Ordering::Relaxed), 0);
assert!(!queue.has_queued());
for unknown in [false, true] {
let client_epoch = epoch.clone();
let r = request.clone();
let client = thread::spawn(move || {
post_mechanical(address, &client_epoch, crate::assembly::CONTRACT, r)
});
let end = Instant::now() + Duration::from_secs(5);
let claim = loop {
assert!(Instant::now() < end);
if let Some(c) = queue.take_next(queue.epoch()).unwrap() {
break c;
}
thread::sleep(Duration::from_millis(1));
};
let Task::Inspect(r) = claim.task() else {
panic!("line state must be a read")
};
assert!(!r.is_write());
assert_eq!(r.operation(), "native_assembly_inspect");
let result = if unknown {
json!({"success":false,"errorCode":"native_line_sdk_read_failed_status_7_stage_404_error_3","outcome":"unknown","reconciliationRequired":true,"nativeExecutionStarted":false,"readBackendInvoked":true,"sdkDiagnostic":{"stage":404,"sdkError":3}})
} else {
json!({"success":true,"data":{"constraintMutationSupported":false}})
};
claim.complete(Ok(Reply::Value(result))).unwrap();
let response = client.join().unwrap();
assert_eq!(response.0, if unknown { 503 } else { 200 });
if unknown {
assert_eq!(response.1["outcome"], "unknown");
assert_eq!(response.1["sdkDiagnostic"]["sdkError"], 3);
}
}
assert!(reader
.journal()
.unwrap()
.status(&epoch, "assembly-read")
.unwrap()
.durable
.unwrap()
.record
.is_none());
assert!(server.stop());
drop(server);
drop(reader);
std::fs::remove_dir_all(directory).unwrap();
}
#[test]
#[cfg(not(feature = "native-wake-probe"))]
fn placement_header_and_static_refusal_do_not_admit_or_wake() {
let queue = Queue::new(4).unwrap();
let epoch = queue.epoch().to_string();
let directory =
std::env::temp_dir().join(format!("fusion-r21-header-{}-{epoch}", std::process::id()));
let reader = OperationStatusReader::new(directory.clone(), epoch.clone());
let wakes = Arc::new(AtomicU64::new(0));
let count = wakes.clone();
let mut server = Service::start_with_operations(
TcpListener::bind("127.0.0.1:0").unwrap(),
queue.clone(),
TOKEN.into(),
Arc::new(move || {
count.fetch_add(1, Ordering::Relaxed);
true
}),
Arc::new(Stats::default()),
reader.clone(),
)
.unwrap();
let end = Instant::now() + Duration::from_secs(5);
while reader.health()["connected"] != true {
assert!(Instant::now() < end);
thread::sleep(Duration::from_millis(1));
}
let doc = format!("d:{epoch}:0000000000000001");
let revision = format!("{}{}", crate::assembly::PREFIX, "a".repeat(64));
let request = json!({"op":"occurrence_update","sessionId":epoch,"operationId":"header","target":{"documentId":doc,"revision":revision},"occurrence":{"documentId":doc,"revision":revision,"objectType":"Occurrence","occurrenceId":"owned"},"transform":{"position":[25,-10,5]}});
let denied = post_mechanical(
server.address(),
&epoch,
crate::assembly::CONTRACT,
request.clone(),
);
assert_eq!(denied.0, 409);
assert_eq!(denied.1["errorCode"], "native_placement_contract_required");
let mut bad = request;
bad["transform"]["angle"] = json!(0);
let denied = post_mechanical(
server.address(),
&epoch,
crate::assembly::placement::CONTRACT,
bad,
);
assert_eq!(denied.0, 400);
assert_eq!(denied.1["errorCode"], "native_placement_position_only");
assert_eq!(wakes.load(Ordering::Relaxed), 0);
assert!(!queue.has_queued());
assert!(reader
.journal()
.unwrap()
.status(&epoch, "header")
.unwrap()
.durable
.unwrap()
.record
.is_none());
assert!(server.stop());
drop(server);
drop(reader);
std::fs::remove_dir_all(directory).unwrap();
}