1- import { crypto } from "k6/experimental/webcrypto" ;
1+ import { crypto } from "k6/experimental/webcrypto" ;
22import encoding from 'k6/encoding' ;
3- import { check } from 'k6' ;
3+ import { check } from 'k6' ;
44import http from 'k6/http' ;
55
6- const testDurationInSeconds = 2500 ;
7- const tokenGenerateTests = true ;
8- const tokenRefreshTests = true ;
9- const identityMapTests = true ;
10- const identityBucketTests = true ;
11-
6+ const generateVUs = 10 ;
7+ const refreshVUs = 10 ;
8+ const identityMapVUs = 10 ;
9+ const testDuration = '30s'
1210
1311//30 warm up on each
1412// 5 min each
1513// 12, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600
1614// 13 scenarios, each 5.5 min = 4290 se
1715
1816export const options = {
19- insecureSkipTLSVerify : true ,
20- noConnectionReuse : true ,
17+ insecureSkipTLSVerify : true ,
18+ noConnectionReuse : false ,
2119 scenarios : {
2220 // Warmup scenarios
21+
2322 tokenGenerateWarmup : {
24- executor : 'constant -vus' ,
23+ executor : 'ramping -vus' ,
2524 exec : 'tokenGenerate' ,
26- vus : 300 ,
27- duration : '30s' ,
28- gracefulStop : '0s' ,
29- } /*,
25+ stages : [
26+ { duration : '30s' , target : generateVUs }
27+ ] ,
28+ gracefulRampDown : '0s' ,
29+ } ,
3030 tokenRefreshWarmup : {
31- executor: 'constant -vus',
31+ executor : 'ramping -vus' ,
3232 exec : 'tokenRefresh' ,
33- vus: 300,
34- duration: '30s',
35- gracefulStop: '0s',
33+ stages : [
34+ { duration : '30s' , target : refreshVUs }
35+ ] ,
36+ gracefulRampDown : '0s' ,
3637 } ,
3738 identityMapWarmup : {
38- executor: 'constant -vus',
39+ executor : 'ramping -vus' ,
3940 exec : 'identityMap' ,
40- vus: 300,
41- duration: '30s',
42- gracefulStop: '0s',
43- },
44- identityBucketsWarmup: {
45- executor: 'constant-vus',
46- exec: 'identityBuckets',
47- vus: 2,
48- duration: '30s',
49- gracefulStop: '0s',
41+ stages : [
42+ { duration : '30s' , target : identityMapVUs }
43+ ] ,
44+ gracefulRampDown : '0s' ,
5045 } ,
5146 // Actual testing scenarios
5247 tokenGenerate : {
5348 executor : 'constant-vus' ,
5449 exec : 'tokenGenerate' ,
55- vus: 300 ,
56- duration: '300s' ,
50+ vus : generateVUs ,
51+ duration : testDuration ,
5752 gracefulStop : '0s' ,
58- startTime: '40s ',
53+ startTime : '30s ' ,
5954 } ,
6055 tokenRefresh : {
6156 executor : 'constant-vus' ,
6257 exec : 'tokenRefresh' ,
63- vus: 300 ,
64- duration: '300s' ,
58+ vus : refreshVUs ,
59+ duration : testDuration ,
6560 gracefulStop : '0s' ,
66- startTime: '350s ',
61+ startTime : '30s ' ,
6762 } ,
6863 identityMap : {
6964 executor : 'constant-vus' ,
70- exec: 'identityMap ',
71- vus: 300 ,
72- duration: '300s' ,
65+ exec : 'identityMapLargeBatch ' ,
66+ vus : identityMapVUs ,
67+ duration : testDuration ,
7368 gracefulStop : '0s' ,
74- startTime: '660s ',
75- },
69+ startTime : '30s ' ,
70+ } , /*
7671 identityMapLargeBatchSequential: {
7772 executor: 'constant-vus',
7873 exec: 'identityMapLargeBatch',
@@ -125,12 +120,14 @@ const clientKey = __ENV.CLIENT_KEY;
125120const baseUrl = __ENV . BASE_URL ;
126121
127122export async function setup ( ) {
128- // pregenerate the envelopes so they don't expire, but can be reused. Means the load test is not constrained by the client
129- // Each is used for 45 sec. Add 2 to ensure we have enough
130- const numberOfRequestsToGenerate = Math . round ( testDurationInSeconds / 45 ) + 2 ;
131-
123+ var token = await generateRefreshRequest ( ) ;
124+ return {
125+ tokenGenerate : null ,
126+ identityMap : null ,
127+ refreshToken : token
128+ } ;
132129
133- async function generateRefreshRequest ( data ) {
130+ async function generateRefreshRequest ( ) {
134131 let request = await createReq ( { 'optout_check' :
1 , 'email' :
'[email protected] ' } ) ; 135132 var requestData = {
136133 endpoint : '/v2/token/generate' ,
@@ -141,89 +138,63 @@ export async function setup() {
141138 return decrypt . body . refresh_token ;
142139 } ;
143140
144-
145-
146- let tokenGenerateData = { } ;
147- if ( tokenGenerateTests ) {
148- tokenGenerateData = {
149- endpoint : '/v2/token/generate' ,
150- requestData : await generateFutureGenerateRequests ( numberOfRequestsToGenerate ) ,
151- } ;
152- }
153- let tokenRefreshData = { } ;
154- if ( tokenRefreshTests ) {
155- tokenRefreshData = {
156- endpoint : '/v2/token/refresh' ,
157- requestBody : await generateRefreshRequest ( tokenGenerateData ) ,
158- } ;
159- }
160-
161- let identityMapData = { } ;
162- let identityMapLargeBatchData = { } ;
163- if ( identityMapTests ) {
164- identityMapData = {
165- endpoint : '/v2/identity/map' ,
166- requestData : await generateFutureMapRequest ( numberOfRequestsToGenerate , 2 )
167- } ;
168- identityMapLargeBatchData = {
169- requestData : await generateFutureMapRequest ( numberOfRequestsToGenerate , 5000 )
170- } ;
171- }
172-
173- let identityBucketData = { }
174- if ( identityBucketTests ) {
175- identityBucketData = {
176- endpoint : '/v2/identity/buckets' ,
177- requestData : await generateFutureBucketRequests ( numberOfRequestsToGenerate )
178- } ;
179- }
180-
181- return {
182- tokenGenerate : tokenGenerateData ,
183- tokenRefresh : tokenRefreshData ,
184- identityMap : identityMapData ,
185- identityMapLargeBatch : identityMapLargeBatchData ,
186- identityBuckets : identityBucketData
187- } ;
188141}
189142
190143// Scenarios
191- export function tokenGenerate ( data ) {
192- var requestData = data . tokenGenerate . requestData ;
193- var elementToUse = selectRequestData ( requestData ) ;
144+ export async function tokenGenerate ( data ) {
145+ const endpoint = '/v2/token/generate' ;
146+ if ( data . tokenGenerate == null ) {
147+ var newData = await generateTokenGenerateRequestWithTime ( ) ;
148+ data . tokenGenerate = newData ;
149+ } else if ( data . tokenGenerate . time < ( Date . now ( ) - 45000 ) ) {
150+ data . tokenGenerate = await generateTokenGenerateRequestWithTime ( ) ;
151+ }
194152
153+ var requestBody = data . tokenGenerate . requestBody ;
195154 var tokenGenerateData = {
196- endpoint : data . tokenGenerate . endpoint ,
197- requestBody : elementToUse . requestBody ,
155+ endpoint : endpoint ,
156+ requestBody : requestBody ,
198157 }
158+
199159 execute ( tokenGenerateData , true ) ;
200160}
201161
202162export function tokenRefresh ( data ) {
203- execute ( data . tokenRefresh , false ) ;
163+ var requestBody = data . refreshToken ;
164+ var refreshData = {
165+ endpoint : '/v2/token/refresh' ,
166+ requestBody : requestBody
167+ }
168+
169+ execute ( refreshData , false ) ;
204170}
205171
206- export function identityMap ( data ) {
207- var requestData = data . identityMap . requestData ;
208- var elementToUse = selectRequestData ( requestData ) ;
172+ export async function identityMap ( data ) {
173+ const endpoint = '/v2/identity/map' ;
174+ if ( ( data . identityMap == null ) || ( data . identityMap . time < ( Date . now ( ) - 45000 ) ) ) {
175+ data . identityMap = await generateIdentityMapRequestWithTime ( 2 ) ; ;
176+ }
209177
178+ var requestBody = data . identityMap . requestBody ;
210179 var identityData = {
211- endpoint : '/v2/identity/map' ,
212- requestBody : elementToUse . requestBody ,
180+ endpoint : endpoint ,
181+ requestBody : requestBody ,
213182 }
214183 execute ( identityData , true ) ;
215184}
216185
217- export function identityMapLargeBatch ( data ) {
218- var requestData = data . identityMapLargeBatch . requestData ;
219- var elementToUse = selectRequestData ( requestData ) ;
186+ export async function identityMapLargeBatch ( data ) {
187+ const endpoint = '/v2/identity/map' ;
188+ if ( ( data . identityMap == null ) || ( data . identityMap . time < ( Date . now ( ) - 45000 ) ) ) {
189+ data . identityMap = await generateIdentityMapRequestWithTime ( 5000 ) ; ;
190+ }
220191
192+ var requestBody = data . identityMap . requestBody ;
221193 var identityData = {
222- endpoint : '/v2/identity/map' ,
223- requestBody : elementToUse . requestBody ,
194+ endpoint : endpoint ,
195+ requestBody : requestBody ,
224196 }
225-
226- execute ( identityData , true ) ;
197+ execute ( identityData , true ) ;
227198}
228199
229200export function identityBuckets ( data ) {
@@ -238,24 +209,6 @@ export function identityBuckets(data) {
238209}
239210
240211// Helpers
241- function selectRequestData ( requestData ) {
242- var elementToUse = requestData [ 0 ] ;
243- for ( var i = 0 ; i < requestData . length ; i ++ ) {
244- var currentTime = Date . now ( ) + 5000 ;
245- if ( currentTime > requestData [ i ] . time && currentTime < requestData [ i + 1 ] . time ) {
246- elementToUse = requestData [ i ] ;
247- //console.log("VU: " + exec.vu.idInTest + ", item: " + i);
248- break ;
249- }
250- }
251- return elementToUse ;
252- }
253-
254- async function createReq ( obj ) {
255- var envelope = getEnvelope ( obj ) ;
256- return encoding . b64encode ( ( await encryptEnvelope ( envelope , clientSecret ) ) . buffer ) ;
257- } ;
258-
259212async function createReqWithTimestamp ( timestampArr , obj ) {
260213 var envelope = getEnvelopeWithTimestamp ( timestampArr , obj ) ;
261214 return encoding . b64encode ( ( await encryptEnvelope ( envelope , clientSecret ) ) . buffer ) ;
@@ -335,13 +288,13 @@ async function decryptEnvelope(envelope, clientSecret) {
335288 const iv = rawData . slice ( 0 , 12 ) ;
336289
337290 const decrypted = await crypto . subtle . decrypt (
338- {
339- name : "AES-GCM" ,
340- iv : iv ,
341- tagLength : 128
342- } ,
343- key ,
344- rawData . slice ( 12 )
291+ {
292+ name : "AES-GCM" ,
293+ iv : iv ,
294+ tagLength : 128
295+ } ,
296+ key ,
297+ rawData . slice ( 12 )
345298 ) ;
346299
347300
@@ -415,29 +368,32 @@ function stringToUint8Array(str) {
415368 return view ;
416369}
417370
418- async function generateFutureRequests ( count , obj ) {
419- const result = [ ] ;
420- for ( var i = 0 ; i < count ; i ++ ) {
421- var time = Date . now ( ) + ( i * 45000 )
422- var timestampArr = new Uint8Array ( getTimestampFromTime ( time ) ) ;
423- var requestBody = await createReqWithTimestamp ( timestampArr , obj ) ;
424- var element = {
425- time : time ,
426- requestBody : requestBody
427- } ;
428- result . push ( element ) ;
429- }
430- return result ;
371+ async function createReq ( obj ) {
372+ var envelope = getEnvelope ( obj ) ;
373+ return encoding . b64encode ( ( await encryptEnvelope ( envelope , clientSecret ) ) . buffer ) ;
374+ } ;
375+
376+ async function generateRequestWithTime ( obj ) {
377+ var time = Date . now ( ) ;
378+ var timestampArr = new Uint8Array ( getTimestampFromTime ( time ) ) ;
379+ var requestBody = await createReqWithTimestamp ( timestampArr , obj ) ;
380+ var element = {
381+ time : time ,
382+ requestBody : requestBody
383+ } ;
384+
385+ return element ;
431386}
432387
433- async function generateFutureMapRequest ( count , emailCount ) {
434- let emails = generateIdentityMapRequest ( emailCount ) ;
435- return await generateFutureRequests ( count , emails ) ;
388+
389+ async function generateTokenGenerateRequestWithTime ( ) {
390+ let requestData = { 'optout_check' :
1 , 'email' :
'[email protected] ' } ; 391+ return await generateRequestWithTime ( requestData ) ;
436392}
437393
438- async function generateFutureGenerateRequests ( count ) {
439- let obj = { 'optout_check' : 1 , 'email' : '[email protected] ' } ; 440- return await generateFutureRequests ( count , obj )
394+ async function generateIdentityMapRequestWithTime ( emailCount ) {
395+ let emails = generateIdentityMapRequest ( emailCount ) ;
396+ return await generateRequestWithTime ( emails ) ;
441397}
442398
443399const generateSinceTimestampStr = ( ) => {
@@ -449,7 +405,3 @@ const generateSinceTimestampStr = () => {
449405 return `${ year } -${ month } -${ day } T00:00:00` ;
450406} ;
451407
452- async function generateFutureBucketRequests ( count ) {
453- let obj = { "since_timestamp" : generateSinceTimestampStr ( ) } ;
454- return await generateFutureRequests ( count , obj )
455- }
0 commit comments