use dstack_sdk::tappd_client::TappdClient;
use dstack_sdk_types::tappd::DeriveKeyResponse;
use std::env;
#[tokio::test]
async fn test_tappd_client_creation() {
let _client = TappdClient::new(None);
}
#[tokio::test]
async fn test_tappd_client_with_custom_endpoint() {
let _client = TappdClient::new(Some("/custom/path/tappd.sock"));
}
#[tokio::test]
async fn test_tappd_client_with_http_endpoint() {
let _client = TappdClient::new(Some("http://localhost:8080"));
}
#[tokio::test]
async fn test_tappd_client_info_integration() {
let client = get_test_client();
let info = client.info().await.unwrap();
println!("✓ Info request successful");
println!(" App ID: {}", info.app_id);
println!(" Instance ID: {}", info.instance_id);
println!(" App Name: {}", info.app_name);
assert!(!info.app_id.is_empty());
assert!(!info.instance_id.is_empty());
assert!(!info.app_name.is_empty());
assert!(!info.tcb_info.app_compose.is_empty());
assert!(!info.tcb_info.mrtd.is_empty());
assert!(!info.tcb_info.rtmr0.is_empty());
assert!(!info.tcb_info.rtmr1.is_empty());
assert!(!info.tcb_info.rtmr2.is_empty());
assert!(!info.tcb_info.rtmr3.is_empty());
assert!(!info.tcb_info.event_log.is_empty());
}
#[tokio::test]
async fn test_tappd_client_derive_key_integration() {
let client = get_test_client();
let response = client.derive_key("test/key/path").await.unwrap();
println!("✓ Derive key request successful");
println!(" Key length: {}", response.key.len());
println!(
" Certificate chain length: {}",
response.certificate_chain.len()
);
assert!(!response.key.is_empty());
let key_bytes = response.decode_key().unwrap();
println!("✓ Decoded key bytes length: {}", key_bytes.len());
assert_eq!(key_bytes.len(), 32);
}
#[tokio::test]
async fn test_tappd_client_derive_key_with_subject_integration() {
let client = get_test_client();
let response = client
.derive_key_with_subject("test/key/path", "example.com")
.await
.unwrap();
println!("✓ Derive key with subject request successful");
println!(" Key length: {}", response.key.len());
println!(
" Certificate chain length: {}",
response.certificate_chain.len()
);
assert!(!response.key.is_empty());
}
#[tokio::test]
async fn test_tappd_client_derive_key_with_alt_names_integration() {
let client = get_test_client();
let alt_names = vec!["www.example.com".to_string(), "api.example.com".to_string()];
let response = client
.derive_key_with_subject_and_alt_names(
"test/key/path",
Some("example.com"),
Some(alt_names),
)
.await
.unwrap();
println!("✓ Derive key with alt names request successful");
println!(" Key length: {}", response.key.len());
println!(
" Certificate chain length: {}",
response.certificate_chain.len()
);
assert!(!response.key.is_empty());
}
#[tokio::test]
async fn test_tappd_client_get_quote_integration() {
let client = get_test_client();
let mut report_data = b"test report data for quote".to_vec();
report_data.resize(64, 0);
let response = client.get_quote(report_data).await.unwrap();
println!("✓ Quote request successful");
println!(" Quote length: {}", response.quote.len());
println!(" Event log length: {}", response.event_log.len());
assert!(!response.quote.is_empty());
assert!(!response.event_log.is_empty());
match response.decode_quote() {
Ok(quote_bytes) => {
println!(" Decoded quote bytes length: {}", quote_bytes.len());
assert!(!quote_bytes.is_empty());
}
Err(e) => {
println!(" Quote decode error: {}", e);
}
}
match response.replay_rtmrs() {
Ok(rtmrs) => {
println!(" Replayed RTMRs: {} entries", rtmrs.len());
for (idx, rtmr) in rtmrs.iter() {
println!(" RTMR{}: {}", idx, rtmr);
}
}
Err(e) => {
println!(" RTMR replay error: {}", e);
}
}
}
fn get_test_client() -> TappdClient {
if let Ok(endpoint) = env::var("TAPPD_SIMULATOR_ENDPOINT") {
println!("Using TAPPD_SIMULATOR_ENDPOINT: {}", endpoint);
return TappdClient::new(Some(&endpoint));
}
if let Ok(endpoint) = env::var("DSTACK_SIMULATOR_ENDPOINT") {
println!("Using DSTACK_SIMULATOR_ENDPOINT as fallback: {}", endpoint);
return TappdClient::new(Some(&endpoint));
}
println!("Using default tappd endpoint: /var/run/tappd.sock");
TappdClient::new(None)
}
#[test]
fn test_derive_key_response_decode() {
let pem_key = "-----BEGIN PRIVATE KEY-----\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg3/aZQhz0nBx0tqG1\nwPNlB/ILBqnY1xvHT7bkZl9oJP2hRANCAATEwT3ixOl0zFOjEEUhpwP6xBz1F2jY\n3B1LokSVHFcFJHUWEHVZJQcFhBAhFGdhEn1B/9HYBQz5w5H8Vl0z3T9U\n-----END PRIVATE KEY-----";
let response = DeriveKeyResponse {
key: pem_key.to_string(),
certificate_chain: vec![],
};
let bytes = response.decode_key().unwrap();
assert!(!bytes.is_empty());
assert_eq!(bytes.len(), 32);
}