Skip to content

Commit ea66ff0

Browse files
committed
tests: add test infra to speed up tests
1 parent 201af14 commit ea66ff0

19 files changed

Lines changed: 134 additions & 50 deletions

File tree

crates/auths-cli/src/commands/id/identity.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ pub fn handle_id(
402402
passphrase_provider.as_ref(),
403403
&get_platform_keychain()?,
404404
None,
405+
auths_crypto::CurveType::default(),
405406
) {
406407
Ok((controller_did_keri, alias)) => {
407408
println!("\n✅ Identity created.");

crates/auths-cli/src/commands/id/migrate.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ fn perform_gpg_migration(
436436
&passphrase_provider,
437437
keychain.as_ref(),
438438
None,
439+
auths_crypto::CurveType::default(),
439440
) {
440441
Ok((controller_did, alias)) => {
441442
out.print_success(&format!("Created Auths identity: {}", controller_did));
@@ -832,6 +833,7 @@ fn perform_ssh_migration(
832833
&passphrase_provider,
833834
keychain.as_ref(),
834835
None,
836+
auths_crypto::CurveType::default(),
835837
) {
836838
Ok((controller_did, alias)) => {
837839
out.print_success(&format!("Created Auths identity: {}", controller_did));

crates/auths-cli/src/commands/org.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ pub fn handle_org(
319319
passphrase_provider.as_ref(),
320320
&get_platform_keychain()?,
321321
None,
322+
auths_crypto::CurveType::default(),
322323
)
323324
.context("Failed to initialize org identity")?;
324325

crates/auths-id/src/agent_identity.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,14 @@ fn get_or_create_identity(
261261
return Ok(did);
262262
}
263263

264-
let (did, _) =
265-
initialize_registry_identity(backend, key_alias, passphrase_provider, keychain, None)?;
264+
let (did, _) = initialize_registry_identity(
265+
backend,
266+
key_alias,
267+
passphrase_provider,
268+
keychain,
269+
None,
270+
auths_crypto::CurveType::default(),
271+
)?;
266272

267273
Ok(did)
268274
}

crates/auths-id/src/identity/initialize.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
use std::sync::Arc;
77

8+
use crate::keri::inception::create_keri_identity_with_curve;
89
use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD};
910
use git2::Repository;
1011
use std::path::Path;
@@ -14,7 +15,7 @@ use crate::error::InitError;
1415
use crate::identity::helpers::{encode_seed_as_pkcs8, extract_seed_bytes};
1516
use crate::keri::{
1617
CesrKey, Event, IcpEvent, KeriSequence, Prefix, Said, Threshold, VersionString,
17-
create_keri_identity, finalize_icp_event, serialize_for_signing,
18+
finalize_icp_event, serialize_for_signing,
1819
};
1920
use crate::storage::identity::IdentityStorage;
2021
use crate::storage::registry::RegistryBackend;
@@ -41,6 +42,7 @@ use auths_core::{
4142
/// ```ignore
4243
/// let (did, alias) = initialize_keri_identity(&path, "my-key", None, &provider, &storage, &keychain)?;
4344
/// ```
45+
#[allow(clippy::too_many_arguments)]
4446
pub fn initialize_keri_identity(
4547
repo_path: &Path,
4648
local_key_alias: &KeyAlias,
@@ -49,10 +51,11 @@ pub fn initialize_keri_identity(
4951
identity_storage: &dyn IdentityStorage,
5052
keychain: &(dyn KeyStorage + Send + Sync),
5153
now: chrono::DateTime<chrono::Utc>,
54+
curve: auths_crypto::CurveType,
5255
) -> Result<(IdentityDID, KeyAlias), InitError> {
5356
let repo = Repository::open(repo_path)?;
54-
let result =
55-
create_keri_identity(&repo, None, now).map_err(|e| InitError::Keri(e.to_string()))?;
57+
let result = create_keri_identity_with_curve(&repo, None, now, curve)
58+
.map_err(|e| InitError::Keri(e.to_string()))?;
5659
#[allow(clippy::disallowed_methods)]
5760
// INVARIANT: create_keri_identity returns a valid did:keri: DID
5861
let controller_did = IdentityDID::new_unchecked(result.did());
@@ -127,14 +130,12 @@ pub fn initialize_registry_identity(
127130
passphrase_provider: &dyn PassphraseProvider,
128131
keychain: &(dyn KeyStorage + Send + Sync),
129132
witness_config: Option<&WitnessConfig>,
133+
curve: auths_crypto::CurveType,
130134
) -> Result<(IdentityDID, KeyAlias), InitError> {
131135
backend
132136
.init_if_needed()
133137
.map_err(|e| InitError::Registry(e.to_string()))?;
134138

135-
// Generate keypairs using P-256 (default curve)
136-
let curve = auths_crypto::CurveType::default();
137-
138139
let current = crate::keri::inception::generate_keypair_for_init(curve)
139140
.map_err(|e| InitError::Crypto(e.to_string()))?;
140141
let next = crate::keri::inception::generate_keypair_for_init(curve)

crates/auths-id/tests/cases/lifecycle.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ fn init_identity(
4141
&identity_storage,
4242
keychain,
4343
chrono::Utc::now(),
44+
auths_crypto::CurveType::Ed25519,
4445
)
4546
.expect("Failed to initialize identity");
4647
(did.to_string(), alias.into_inner())

crates/auths-infra-rekor/src/client.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,11 +508,15 @@ fn pubkey_to_pem(raw: &[u8]) -> String {
508508
#[cfg(test)]
509509
mod tests {
510510
use super::*;
511+
use std::sync::LazyLock;
512+
513+
/// Shared RekorClient — TLS client construction is expensive (~10s).
514+
static TEST_CLIENT: LazyLock<RekorClient> = LazyLock::new(|| RekorClient::public().unwrap());
511515

512516
#[test]
513517
fn payload_size_limit() {
514518
let big = vec![0u8; MAX_PAYLOAD_SIZE + 1];
515-
let client = RekorClient::public().unwrap();
519+
let client = &*TEST_CLIENT;
516520
let rt = tokio::runtime::Runtime::new().unwrap();
517521
let result = rt.block_on(client.submit(&big, b"pk", b"sig"));
518522
match result {
@@ -525,7 +529,7 @@ mod tests {
525529

526530
#[test]
527531
fn dsse_format() {
528-
let client = RekorClient::public().unwrap();
532+
let client = &*TEST_CLIENT;
529533
let entry = client.build_dsse(b"test data", b"public_key", b"signature");
530534

531535
assert_eq!(entry.kind, "dsse");

crates/auths-infra-rekor/tests/cases/rekor_integration.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
//! Tests that require real Rekor are gated on `AUTHS_TEST_REKOR=1`.
44
//! Tests using the FakeTransparencyLog run always.
55
6+
use std::sync::LazyLock;
7+
68
use auths_core::ports::transparency_log::{LogError, TransparencyLog};
79
use auths_infra_rekor::RekorClient;
10+
11+
/// Shared RekorClient across all integration tests in this file.
12+
static TEST_REKOR: LazyLock<RekorClient> = LazyLock::new(|| RekorClient::public().unwrap());
813
use auths_transparency::TrustConfig;
914
use auths_transparency::merkle::hash_leaf;
1015
use ring::signature::KeyPair;
@@ -25,7 +30,7 @@ async fn rekor_happy_path_submit_and_verify() {
2530
return;
2631
}
2732

28-
let client = RekorClient::public().unwrap();
33+
let client = &*TEST_REKOR;
2934

3035
// Generate a throwaway Ed25519 key
3136
let keypair = ring::signature::Ed25519KeyPair::from_seed_unchecked(&[99u8; 32]).unwrap();
@@ -68,7 +73,7 @@ async fn rekor_get_checkpoint() {
6873
return;
6974
}
7075

71-
let client = RekorClient::public().unwrap();
76+
let client = &*TEST_REKOR;
7277
let checkpoint = client.get_checkpoint().await;
7378
assert!(checkpoint.is_ok(), "should fetch Rekor checkpoint");
7479
let cp = checkpoint.unwrap();
@@ -88,7 +93,7 @@ async fn unreachable_endpoint_returns_network_error() {
8893

8994
#[tokio::test]
9095
async fn payload_size_rejection_is_local() {
91-
let client = RekorClient::public().unwrap();
96+
let client = &*TEST_REKOR;
9297
let big = vec![0u8; 101 * 1024]; // > 100KB
9398
let result = client.submit(&big, b"pk", b"sig").await;
9499
match result {
@@ -226,9 +231,9 @@ async fn pluggability_same_flow_different_backends() {
226231
let real_pk = keypair.public_key().as_ref();
227232
let real_sig = keypair.sign(attestation);
228233

229-
let rekor = RekorClient::public().unwrap();
234+
let rekor = &*TEST_REKOR;
230235
let rekor_result =
231-
submit_attestation_to_log(attestation, real_pk, real_sig.as_ref(), &rekor).await;
236+
submit_attestation_to_log(attestation, real_pk, real_sig.as_ref(), rekor).await;
232237

233238
match rekor_result {
234239
Ok(bundle) => {

crates/auths-mcp-server/tests/cases/helpers.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,25 @@ static KEYS: LazyLock<TestKeys> = LazyLock::new(|| {
7979
}
8080
});
8181

82+
/// Shared mock JWKS server — started once per process, reused across tests.
83+
static SHARED_JWKS_URL: tokio::sync::OnceCell<String> = tokio::sync::OnceCell::const_new();
84+
8285
/// Starts a mock JWKS server serving the static test key.
83-
/// Returns (base_url, join_handle).
86+
/// First call starts the server; subsequent calls return the cached URL.
8487
pub(super) async fn start_mock_jwks_server() -> (String, tokio::task::JoinHandle<()>) {
88+
let url = SHARED_JWKS_URL
89+
.get_or_init(|| async {
90+
let (url, handle) = start_mock_jwks_server_inner().await;
91+
std::mem::forget(handle); // keep server alive for process lifetime
92+
url
93+
})
94+
.await
95+
.clone();
96+
let noop_handle = tokio::spawn(async {});
97+
(url, noop_handle)
98+
}
99+
100+
async fn start_mock_jwks_server_inner() -> (String, tokio::task::JoinHandle<()>) {
85101
let jwks = KEYS.jwks_json.clone();
86102

87103
let app = axum::Router::new().route(

crates/auths-sdk/src/domains/identity/provision.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ pub fn enforce_identity_state(
154154
passphrase_provider,
155155
keychain,
156156
witness_config.as_ref(),
157+
auths_crypto::CurveType::default(),
157158
)
158159
.map_err(|e| ProvisionError::IdentityInit(e.to_string()))?;
159160

0 commit comments

Comments
 (0)