Skip to content

Commit

Permalink
♻️✨ K6: Waypoint ha validation (#1045)
Browse files Browse the repository at this point in the history
* Refactor K6: multi-issuer, multi-holder

* Refactor waitForSSEEvent functions into single generic function
  • Loading branch information
wdbasson authored Sep 19, 2024
1 parent 39eef86 commit 865f02f
Show file tree
Hide file tree
Showing 15 changed files with 276 additions and 362 deletions.
3 changes: 2 additions & 1 deletion resources/postman-prf.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ graph TD
WaitConnectionReady[Wait for SSE connection-ready]:::sseHolder
WaitProofDone[Wait for SSE proof done]:::sseIssuer
WaitInvitationSent[Wait for SSE invitation-sent]:::sseIssuer
WaitForSSERevoked[Wait for SSE revoked]:::sseIssuer
%% Assertions
AssertVerifiedTrue>Assert: verified = true]:::assertion
AssertVerifiedFalse>Assert: verified = false]:::assertion
Expand All @@ -71,7 +72,7 @@ graph TD
ListCredentials --> SendProofRequest --> WaitRequestReceived --> GetProofID --> GetReferent --> AcceptProofRequest --> WaitProofDone --> GetProof
GetProof -->|Is revokedFlag true| AssertVerifiedFalse
GetProof -->|Is revokedFlag false| AssertVerifiedTrue
AssertVerifiedTrue --> RevokeCredential --> CheckRevoked -->|Set revokedFlag = true| SendProofRequest
AssertVerifiedTrue --> RevokeCredential --> CheckRevoked -->|Set revokedFlag = true| WaitForSSERevoked --> SendProofRequest
AssertVerifiedFalse -->|Is deleteTenantFlag true| DeleteIssuer --> DeleteHolder --> End
AssertVerifiedFalse -->|Is deleteTenantFlag false| End
%% Legend
Expand Down
296 changes: 81 additions & 215 deletions scripts/k6/libs/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -370,117 +370,6 @@ export function getCredentialIdByThreadId(holderAccessToken, threadId) {
}
}

export function waitForSSEEvent(holderAccessToken, holderWalletId, threadId) {
const sseUrl = `${__ENV.CLOUDAPI_URL}/tenant/v1/sse/${holderWalletId}/credentials/thread_id/${threadId}/offer-received`;
const headers = {
"x-api-key": holderAccessToken,
};

let eventReceived = false;

const response = sse.open(
sseUrl,
{
headers,
tags: { k6_sse_tag: "credential_offer_received" },
},
(client) => {
client.on("event", (event) => {
// console.log(`event data=${event.data}`);
const eventData = JSON.parse(event.data);
if (eventData.topic === "credentials" && eventData.payload.state === "offer-received") {
check(eventData, {
"Event received": (e) => e.payload.state === "offer-received",
});
eventReceived = true;
client.close();
}
});

client.on("error", (e) => {
console.log("An unexpected error occurred: ", e.error());
client.close();
});
},
);

check(response, {
"SSE connection established": (r) => r && r.status === 200,
});

// Wait for the event to be received or a maximum duration
const maxDuration = 10; // 10 seconds
const checkInterval = 1; // 1 second
let elapsedTime = 0;

while (!eventReceived && elapsedTime < maxDuration) {
console.log(`Waiting for event... Elapsed time: ${elapsedTime}ms`);
elapsedTime += checkInterval;
sleep(checkInterval);
}

return eventReceived;
}

export function waitForSSEEventConnection(holderAccessToken, holderWalletId, invitationConnectionId) {
const sseUrl = `${__ENV.CLOUDAPI_URL}/tenant/v1/sse/${holderWalletId}/connections/connection_id/${invitationConnectionId}/completed`;
const headers = {
"x-api-key": holderAccessToken,
};

let eventReceived = false;

const response = sse.open(
sseUrl,
{
headers,
tags: { k6_sse_tag: "connection_ready" },
},
(client) => {
client.on("event", (event) => {
// console.log(`event data=${event.data}`);
const eventData = JSON.parse(event.data);
if (eventData.topic === "connections" && eventData.payload.state === "completed") {
check(eventData, {
"Event received": (e) => e.payload.state === "completed",
});
eventReceived = true;
client.close();
}
});

client.on("error", (e) => {
console.log("An unexpected error occurred: ", e.error());
client.close();
});
},
);

check(response, {
"SSE connection established": (r) => r && r.status === 200,
});

// Create random number between 1 and 3
// const random = Math.floor(Math.random() * 3) + 1;

// Wait for the event to be received or a maximum duration
const maxDuration = 10; // 10 seconds
const checkInterval = 1; // 1 second
let elapsedTime = 0;

while (!eventReceived && elapsedTime < maxDuration) {
console.log(`Waiting for event... Elapsed time: ${elapsedTime}ms`);
elapsedTime += checkInterval;
sleep(checkInterval);
}
// if number equals 1, sleep for 1 second
// if (random === 1) {
// console.log("Sleeping for 1 second");
// eventReceived = false
// }
return eventReceived;
}

export function getCredentialDefinitionId(bearerToken, issuerAccessToken, credDefTag) {
const url = `${__ENV.CLOUDAPI_URL}/tenant/v1/definitions/credentials?schema_version=0.1.0`;
const params = {
Expand Down Expand Up @@ -544,58 +433,6 @@ export function sendProofRequest(issuerAccessToken, issuerConnectionId) {
}
}

export function waitForSSEEventReceived(holderAccessToken, holderWalletId, threadId) {
const sseUrl = `${__ENV.CLOUDAPI_URL}/tenant/v1/sse/${holderWalletId}/proofs/thread_id/${threadId}/request-received`;
const headers = {
"x-api-key": holderAccessToken,
};

let eventReceived = false;

const response = sse.open(
sseUrl,
{
headers,
// tags: { 'k6_sse_tag': 'proof_request_received' },
},
(client) => {
client.on("event", (event) => {
// console.log(`event data=${event.data}`);
const eventData = JSON.parse(event.data);
if (eventData.topic === "proofs" && eventData.payload.state === "request-received") {
check(eventData, {
"Request received": (e) => e.payload.state === "request-received",
});
eventReceived = true;
client.close();
}
});

client.on("error", (e) => {
console.log("An unexpected error occurred: ", e.error());
client.close();
});
},
);

check(response, {
"SSE connection established": (r) => r && r.status === 200,
});

// Wait for the event to be received or a maximum duration
const maxDuration = 10; // 10 seconds
const checkInterval = 1; // 1 second
let elapsedTime = 0;

while (!eventReceived && elapsedTime < maxDuration) {
console.log(`Waiting for event... Elapsed time: ${elapsedTime}ms`);
elapsedTime += checkInterval;
sleep(checkInterval);
}

return eventReceived;
}

export function getProofIdByThreadId(holderAccessToken, threadId) {
const url = `${__ENV.CLOUDAPI_URL}/tenant/v1/verifier/proofs?thread_id=${threadId}`;
const params = {
Expand Down Expand Up @@ -698,58 +535,6 @@ export function acceptProofRequest(holderAccessToken, proofId, referent) {
}
}

export function waitForSSEProofDone(issuerAccessToken, issuerWalletId, proofThreadId) {
const sseUrl = `${__ENV.CLOUDAPI_URL}/tenant/v1/sse/${issuerWalletId}/proofs/thread_id/${proofThreadId}/done`;
const headers = {
"x-api-key": issuerAccessToken,
};

let eventReceived = false;

const response = sse.open(
sseUrl,
{
headers,
tags: { k6_sse_tag: "proof_done" },
},
(client) => {
client.on("event", (event) => {
// console.log(`event data=${event.data}`);
const eventData = JSON.parse(event.data);
if (eventData.topic === "proofs" && eventData.payload.state === "done") {
check(eventData, {
"Request received": (e) => e.payload.state === "done",
});
eventReceived = true;
client.close();
}
});

client.on("error", (e) => {
console.log("An unexpected error occurred: ", e.error());
client.close();
});
},
);

check(response, {
"SSE connection established": (r) => r && r.status === 200,
});

// Wait for the event to be received or a maximum duration
const maxDuration = 10; // 10 seconds
const checkInterval = 1; // 1 second
let elapsedTime = 0;

while (!eventReceived && elapsedTime < maxDuration) {
console.log(`Waiting for event... Elapsed time: ${elapsedTime}ms`);
elapsedTime += checkInterval;
sleep(checkInterval);
}

return eventReceived;
}

export function getProof(issuerAccessToken, issuerConnectionId, proofThreadId) {
const url = `${__ENV.CLOUDAPI_URL}/tenant/v1/verifier/proofs?thread_id=${proofThreadId}`;
const params = {
Expand Down Expand Up @@ -952,6 +737,87 @@ export function checkRevoked(issuerAccessToken, credentialExchangeId) {
}
}

export function genericWaitForSSEEvent(config) {
const {
accessToken,
walletId,
threadId,
eventType,
sseUrlPath,
topic,
expectedState,
maxDuration = 60,
checkInterval = 1,
sseTag
} = config;

const sseUrl = `${__ENV.CLOUDAPI_URL}/tenant/v1/sse/${walletId}/${sseUrlPath}/${threadId}/${eventType}`;
const headers = {
"x-api-key": accessToken,
};

// console.log(`Connecting to SSE URL: ${sseUrl}`);
// console.log(`Using headers: ${JSON.stringify(headers)}`);

let eventReceived = false;

const response = sse.open(
sseUrl,
{
headers,
tags: sseTag ? { k6_sse_tag: sseTag } : undefined,
},
(client) => {
client.on("event", (event) => {
if (!event.data || event.data.trim() === '') {
console.log('Received empty event data');
return;
}

let eventData;
try {
eventData = JSON.parse(event.data);
} catch (error) {
console.error(`Error parsing event data: ${error.message}`);
eventData = event.data;
}

if (typeof eventData === 'object' && eventData.topic === topic && eventData.payload && eventData.payload.state === expectedState) {
check(eventData, {
"Event received": (e) => e.payload.state === expectedState,
});
eventReceived = true;
client.close();
} else {
console.log(`Received unexpected event format: ${JSON.stringify(eventData)}`);
}
});

client.on("error", (e) => {
console.log("An unexpected error occurred: ", e.error());
client.close();
});

client.on("end", () => {
console.log("SSE connection closed");
});
},
);

check(response, {
"SSE connection established": (r) => r && r.status === 200,
});

let elapsedTime = 0;
while (!eventReceived && elapsedTime < maxDuration) {
console.log(`Waiting for event... Elapsed time: ${elapsedTime}s`);
elapsedTime += checkInterval;
sleep(checkInterval);
}

return eventReceived;
}

// {
// "name": "load_pop",
// "version": "0.1.0",
Expand Down
Loading

0 comments on commit 865f02f

Please sign in to comment.