Skip to content

Commit b168643

Browse files
committed
Added KeyVault test and aligned tracker output with that of C++
1 parent 8d58f99 commit b168643

File tree

3 files changed

+132
-1
lines changed

3 files changed

+132
-1
lines changed

sdk/core/azure_core_test/src/perf/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,10 @@ impl PerfRunner {
298298
_ = async {
299299
loop {
300300
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
301-
println!("{:?} elapsed: {} per operation.", start.elapsed(), Duration::seconds_f64( start.elapsed().as_secs_f64() / self.progress.load(Ordering::SeqCst) as f64 ));
301+
println!("{:?} elapsed: {} op/sec, {} sec/ operation.",
302+
start.elapsed(),
303+
self.progress.load(Ordering::SeqCst) as f64 / start.elapsed().as_secs_f64(),
304+
Duration::seconds_f64( start.elapsed().as_secs_f64() / self.progress.load(Ordering::SeqCst) as f64 ));
302305
}
303306
}, if !self.options.disable_progress => {},
304307
);

sdk/keyvault/azure_security_keyvault_secrets/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,8 @@ rustc_version.workspace = true
4040

4141
[lints]
4242
workspace = true
43+
44+
[[test]]
45+
name = "performance_tests"
46+
path = "perf/get_secret.rs"
47+
harness = false
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
use std::sync::OnceLock;
5+
6+
use azure_core::Result;
7+
use azure_core_test::{
8+
perf::{CreatePerfTestReturn, PerfRunner, PerfTest, TestMetadata, TestOption},
9+
TestContext,
10+
};
11+
use azure_security_keyvault_secrets::{models::SetSecretParameters, SecretClient};
12+
use rand::{distr::Alphanumeric, Rng};
13+
struct GetSecrets {
14+
vault_url: String,
15+
random_key_name: OnceLock<String>,
16+
client: OnceLock<SecretClient>,
17+
}
18+
19+
impl GetSecrets {
20+
fn test_metadata() -> TestMetadata {
21+
TestMetadata {
22+
name: "get_secret",
23+
description: "Get a secret from Key Vault",
24+
options: vec![TestOption {
25+
name: "vault_url",
26+
display_message: "The URL of the Key Vault to use in the test",
27+
mandatory: true,
28+
short_activator: 'u',
29+
long_activator: "vault-url",
30+
expected_args_len: 1,
31+
..Default::default()
32+
}],
33+
create_test: Self::create_new_test,
34+
}
35+
}
36+
37+
fn create_new_test(runner: &PerfRunner) -> CreatePerfTestReturn {
38+
let vault_url_ref: Option<&String> = match runner.try_get_test_arg("vault_url") {
39+
Ok(v) => v,
40+
Err(e) => {
41+
// Return a future that immediately yields the error.
42+
return Box::pin(async move { Err(e) });
43+
}
44+
};
45+
// Own the String so the future can be 'static.
46+
let vault_url = vault_url_ref
47+
.expect("vault_url argument is mandatory")
48+
.clone();
49+
Box::pin(async move {
50+
Ok(Box::new(GetSecrets {
51+
vault_url,
52+
random_key_name: OnceLock::new(),
53+
client: OnceLock::new(),
54+
}) as Box<dyn PerfTest>)
55+
})
56+
}
57+
58+
fn create_random_key_name() -> String {
59+
let random_suffix: String = rand::rng()
60+
.sample_iter(&Alphanumeric)
61+
.take(8)
62+
.map(char::from)
63+
.collect();
64+
format!("perf-{}", random_suffix)
65+
}
66+
67+
fn get_random_key_name(&self) -> &String {
68+
self.random_key_name
69+
.get_or_init(Self::create_random_key_name)
70+
}
71+
}
72+
73+
#[cfg_attr(target_arch="wasm32", async_trait::async_trait(?Send))]
74+
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
75+
impl PerfTest for GetSecrets {
76+
async fn setup(&self, _context: &TestContext) -> azure_core::Result<()> {
77+
let credential = azure_identity::DeveloperToolsCredential::new(None)?;
78+
let client = SecretClient::new(self.vault_url.as_str(), credential.clone(), None)?;
79+
self.client.get_or_init(|| client);
80+
81+
self.client
82+
.get()
83+
.unwrap()
84+
.set_secret(
85+
self.get_random_key_name(),
86+
SetSecretParameters {
87+
value: Some("secret_value".into()),
88+
..Default::default()
89+
}
90+
.try_into()?,
91+
None,
92+
)
93+
.await?;
94+
Ok(())
95+
}
96+
async fn cleanup(&self, _context: &TestContext) -> azure_core::Result<()> {
97+
Ok(())
98+
}
99+
async fn run(&self) -> Result<()> {
100+
let _secret = self
101+
.client
102+
.get()
103+
.unwrap()
104+
.get_secret(self.get_random_key_name(), None)
105+
.await?
106+
.into_body()
107+
.await?;
108+
Ok(())
109+
}
110+
}
111+
112+
#[tokio::main]
113+
async fn main() -> azure_core::Result<()> {
114+
let runner = PerfRunner::new(
115+
env!("CARGO_MANIFEST_DIR"),
116+
"foo",
117+
vec![GetSecrets::test_metadata()],
118+
)?;
119+
120+
runner.run().await?;
121+
122+
Ok(())
123+
}

0 commit comments

Comments
 (0)