diff --git a/.DS_Store b/.DS_Store index 5008ddf..814898c 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 223366e..c62246f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ *.iml .idea/* target/* - +results/ +src.zip +.DS_Store /gatling.log diff --git a/pom.xml b/pom.xml index 840cefa..0e96be6 100644 --- a/pom.xml +++ b/pom.xml @@ -8,9 +8,9 @@ UTF-8 - 2.3.1 - 2.2.4 - 3.3.1 + 3.0.3 + 3.0.1 + 3.4.4 @@ -32,12 +32,12 @@ 1.4.4.RELEASE - - io.netty - netty-handler - 4.0.56.Final - runtime - + + + + + + io.gatling.highcharts gatling-charts-highcharts @@ -94,78 +94,95 @@ + src/main/scala + src/test/scala net.alchim31.maven scala-maven-plugin ${scala-maven-plugin.version} - - - scala-compile-first - process-resources - - add-source - compile - - - - scala-test-compile - process-test-resources - - testCompile - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - compile - - compile - - - + + 2.12.8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + io.gatling gatling-maven-plugin ${gatling-plugin.version} + src/test/resources src/test/scala true + + -Xmx4096m + + + -Xmx2048m + + true + + true + true + true - - - CaseData - - execute - - - uk.gov.hmcts.ccd.simulation.CaseDataSimulation - - - - UserProfile - - execute - - - uk.gov.hmcts.ccd.simulation.UserProfileSimulation - - - - CaseDefinition - - execute - - - uk.gov.hmcts.ccd.simulation.CaseDefinitionSimulation - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins diff --git a/src/test/resources/application.conf b/src/test/resources/application.conf index e6d4544..180cd38 100644 --- a/src/test/resources/application.conf +++ b/src/test/resources/application.conf @@ -23,6 +23,18 @@ getUserProfileUrl = "caseworkers/538/profile" localhost { maxSimulationDurationMinutes = 99999 + maxResponseTime = 20000 + meanResponseTime = 1000 + minthinktime = 1 + maxthinktime = 2 + minWaitForNextIteration = 1 + maxWaitForNextIteration = 2 + totalDuration = 1 + reachRPSTarget = 20 + reachRPSDuration = 10 + reachRPSHoldForDuration = 60 + jumptoRPSTarget = 50 + jumptoRPSDuration = 900 userCcdId = 538 userImportId = 1 userProfileUrl = "http://localhost:4453" @@ -30,8 +42,8 @@ localhost { caseDefinitionUrl = "http://localhost:4451" idamS2SUrl = "http://localhost:4502" idamUserTokenUrl = "http://localhost:4501" - dataStoreS2STokenGeneratorSecret = "${IDAM_KEY_CCD_DATA_STORE}" - gatewayS2STokenGeneratorSecret = "${IDAM_KEY_CCD_GATEWAY}" + dataStoreS2STokenGeneratorSecret = "AAAAAAAAAAAAAAAB" + gatewayS2STokenGeneratorSecret = "AAAAAAAAAAAAAAAC" cases = ["1519742486891285", "1519742533143128", "1519742539447358", "1519742543506512", "1519742552469933", "1519904309069941", "1519904309386295", "1519904309753528"] getCaseUrl = "caseworkers/"${userCcdId}"/jurisdictions/PROBATE/case-types/GrantOfRepresentation/cases/:case_reference" @@ -50,8 +62,8 @@ localhostDocker { caseDefinitionUrl = "http://localhost:4451" idamS2SUrl = "http://localhost:4502" idamUserTokenUrl = "http://localhost:4501" - dataStoreS2STokenGeneratorSecret = "${IDAM_KEY_CCD_DATA_STORE}" - gatewayS2STokenGeneratorSecret = "${IDAM_KEY_CCD_GATEWAY}" + dataStoreS2STokenGeneratorSecret = "AAAAAAAAAAAAAAAB" + gatewayS2STokenGeneratorSecret = "AAAAAAAAAAAAAAAC" } test { @@ -75,18 +87,18 @@ cnp_sanbox { httpProxyPort = "8080" userCcdId = 6687 userImportId = 445 - idamS2SUrl = "http://betaDevBccidamS2SLB.reform.hmcts.net" + idamS2SUrl = "http://rpe-service-auth-provider-sandbox.service.core-compute-sandbox.internal" idamUserTokenUrl = "http://betaDevBccidamAppLB.reform.hmcts.net" userProfileUrl = "https://ccd-user-profile-api-sandbox.service.core-compute-sandbox.internal" caseDataUrl = "https://ccd-data-store-api-sandbox.service.core-compute-sandbox.internal" caseDefinitionUrl = "https://ccd-definition-store-api-sandbox.service.core-compute-sandbox.internal" dataStoreS2STokenGeneratorSecret = "${IDAM_KEY_CCD_DATA_STORE}" gatewayS2STokenGeneratorSecret = "${IDAM_KEY_CCD_GATEWAY}" - getCaseUrl = "caseworkers/6687/jurisdictions/DIVORCE/case-types/DIVORCE/cases/1512470862480575" + getCaseUrl = "caseworkers/6687/jurisdictions/DIVORCE/case-types/DIVORCE/cases/1537538269434386" createCaseUrl = "caseworkers/6687/jurisdictions/PROBATE/case-types/GrantOfRepresentation/cases" } -cnp_sprod { +cnp_sandbox { maxSimulationDurationMinutes = 99999 maxResponseTime = 20000 meanResponseTime = 1000 @@ -94,7 +106,47 @@ cnp_sprod { maxthinktime = 3 minWaitForNextIteration = 4 maxWaitForNextIteration = 5 - totalDuration = 2 + totalDuration = 1 + reachRPSTarget = 20 + reachRPSDuration = 10 + reachRPSHoldForDuration = 60 + jumptoRPSTarget = 50 + jumptoRPSDuration = 900 + httpProxyHost = "proxyout.reform.hmcts.net" + httpProxyPort = "8080" + userCcdId = 176475 + userImportId = 445 + idamS2SUrl = "http://rpe-service-auth-provider-sandbox.service.core-compute-sandbox.internal" + idamUserTokenUrl = "http://betaDevBccidamAppLB.reform.hmcts.net" + userProfileUrl = "https://ccd-user-profile-api-sandbox.service.core-compute-sandbox.internal" + caseDataUrl = "https://ccd-data-store-api-sandbox.service.core-compute-sandbox.internal" + caseDefinitionUrl = "https://ccd-definition-store-api-sandbox.service.core-compute-sandbox.internal" + dataStoreS2STokenGeneratorSecret = "${IDAM_KEY_CCD_DATA_STORE}" + gatewayS2STokenGeneratorSecret = "${IDAM_KEY_CCD_GATEWAY}" + getCaseUrl = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/1537782078866335" + createCaseUrl = "caseworkers/176475/jurisdictions/:jurisdictions_reference/case-types/:casetype_reference/cases" + validateCaseUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases" + getUserProfileUrl = "caseworkers/176475/profile" + searchCases = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases?state=CaseCreated" + getPaginationMetadataUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/pagination_metadata?state=CaseCreated" + saveEventUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/CASETYPE2/cases/1531207599597587/events" + searchInputDetails = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/inputs" + workbasketInputDetails = "/aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/work-basket-inputs" + getPrintableDocumentsForEvent = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/CASETYPE2/cases/1531207599597587/documents" + validateCaseDetails = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/validate" + docStoreBashURL = "https://dm-store-sprod.service.core-compute-sprod.internal" + ESSearch = "searchCases" +} + +cnp_sprod { + maxSimulationDurationMinutes = 99999 + maxResponseTime = 20000 + meanResponseTime = 1000 + minthinktime = 1 + maxthinktime = 2 + minWaitForNextIteration = 1 + maxWaitForNextIteration = 2 + totalDuration = 1 reachRPSTarget = 20 reachRPSDuration = 10 reachRPSHoldForDuration = 60 @@ -107,16 +159,65 @@ cnp_sprod { idamS2SUrl = "http://rpe-service-auth-provider-sprod.service.core-compute-sprod.internal" idamUserTokenUrl = "http://betaDevBccidamAppLB.reform.hmcts.net" userProfileUrl = "https://ccd-user-profile-api-sprod.service.core-compute-sprod.internal" + escaseDataUrl = "https://ccd-api-gateway-web-sprod.service.core-compute-sprod.internal" caseDataUrl = "https://ccd-data-store-api-sprod.service.core-compute-sprod.internal" caseDefinitionUrl = "https://ccd-definition-store-api-sprod.service.core-compute-sprod.internal" dataStoreS2STokenGeneratorSecret = "${IDAM_KEY_CCD_DATA_STORE}" gatewayS2STokenGeneratorSecret = "${IDAM_KEY_CCD_GATEWAY}" - getCaseUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/1525778314235511" - createCaseUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases" + getCaseUrl = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/1532983170361929" + createCaseUrl = "caseworkers/176475/jurisdictions/:jurisdictions_reference/case-types/:casetype_reference/cases" + validateCaseUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases" getUserProfileUrl = "caseworkers/176475/profile" - searchCases = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases?state=CaseCreated" + searchCases = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases?state=CaseCreated" getPaginationMetadataUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/pagination_metadata?state=CaseCreated" - saveEventUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/1525778314235511/events" + saveEventUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/CASETYPE2/cases/1531207599597587/events" + searchInputDetails = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/inputs" + workbasketInputDetails = "/aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/work-basket-inputs" + getPrintableDocumentsForEvent = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/CASETYPE2/cases/1531207599597587/documents" + validateCaseDetails = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/validate" + docStoreBashURL = "https://dm-store-sprod.service.core-compute-sprod.internal" + ESSearch = "searchCases" +} + +cnp_saat { + maxSimulationDurationMinutes = 99999 + maxResponseTime = 20000 + meanResponseTime = 1000 + minthinktime = 1 + maxthinktime = 2 + minWaitForNextIteration = 1 + maxWaitForNextIteration = 2 + totalDuration = 1 + reachRPSTarget = 20 + reachRPSDuration = 10 + reachRPSHoldForDuration = 60 + jumptoRPSTarget = 50 + jumptoRPSDuration = 900 + httpProxyHost = "proxyout.reform.hmcts.net" + httpProxyPort = "8080" + userCcdId = 176475 + userImportId = 445 + idamS2SUrl = "http://rpe-service-auth-provider-saat.service.core-compute-saat.internal" + idamUserTokenUrl = "http://betaDevBccidamAppLB.reform.hmcts.net" + userProfileUrl = "https://ccd-user-profile-api-saat.service.core-compute-saat.internal" + escaseDataUrl = "https://ccd-api-gateway-web-saat.service.core-compute-saat.internal" + caseDataUrl = "https://ccd-data-store-api-saat.service.core-compute-saat.internal" + caseDefinitionUrl = "https://ccd-definition-store-api-saat.service.core-compute-saat.internal" + dataStoreS2STokenGeneratorSecret = "${IDAM_KEY_CCD_DATA_STORE}" + gatewayS2STokenGeneratorSecret = "${IDAM_KEY_CCD_GATEWAY}" + getCaseUrl = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/1532983170361929" + createCaseUrl = "caseworkers/176475/jurisdictions/:jurisdictions_reference/case-types/:casetype_reference/cases" + validateCaseUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases" + getUserProfileUrl = "caseworkers/176475/profile" + searchCases = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases?state=CaseCreated" + getPaginationMetadataUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases/pagination_metadata?state=CaseCreated" + saveEventUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/CASETYPE2/cases/1531207599597587/events" + searchInputDetails = "aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/inputs" + workbasketInputDetails = "/aggregated/caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/work-basket-inputs" + getPrintableDocumentsForEvent = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/CASETYPE2/cases/1531207599597587/documents" + validateCaseDetails = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/validate" + docStoreBashURL = "https://dm-store-saat.service.core-compute-saat.internal" + ESSearch = "searchCases" } cnp_aat { @@ -127,7 +228,7 @@ cnp_aat { maxthinktime = 2 minWaitForNextIteration = 1 maxWaitForNextIteration = 2 - totalDuration = 1000 + totalDuration = 2 reachRPSTarget = 50 reachRPSDuration = 10 reachRPSHoldForDuration = 60 @@ -152,6 +253,7 @@ cnp_aat { cases = ["1521477620166395", "1521-4779-1892-1964", "1521477967979301", "1521477963778319", "1521-4779-6301-4715", "1521-4779-5350-7637", "1521-4779-4876-0499", "1521-4779-4365-6189"] getCaseUrl = "caseworkers/18/jurisdictions/SSCS/case-types/Benefit/cases/:case_reference" saveEventUrl = "caseworkers/6687/jurisdictions/PROBATE/case-types/GrantOfRepresentation/cases/1520505513296274/events" + createCaseUrl = "caseworkers/176475/jurisdictions/AUTOTEST1/case-types/AAT/cases?ignore-warning=false" createCaseUrl = "caseworkers/6687/jurisdictions/PROBATE/case-types/GrantOfRepresentation/cases" getPaginationMetadataUrl = "caseworkers/6687/jurisdictions/PROBATE/case-types/GrantOfRepresentation/cases/pagination_metadata?state=CaseCreated" searchCases = "caseworkers/6687/jurisdictions/PROBATE/case-types/GrantOfRepresentation/cases?state=CaseCreated" diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml index c66dc9c..a4d57ec 100644 --- a/src/test/resources/logback-test.xml +++ b/src/test/resources/logback-test.xml @@ -1,16 +1,12 @@ - - true - - - + gatling.log @@ -21,22 +17,19 @@ - - - + + - - - - - - - + + - + + + + \ No newline at end of file diff --git a/src/test/scala/Engine.scala b/src/test/scala/Engine.scala index e25e917..b61c9ea 100644 --- a/src/test/scala/Engine.scala +++ b/src/test/scala/Engine.scala @@ -3,11 +3,11 @@ import io.gatling.core.config.GatlingPropertiesBuilder object Engine extends App { - val props = new GatlingPropertiesBuilder - props.dataDirectory(Helper.dataDirectory.toString) - props.resultsDirectory(Helper.resultsDirectory.toString) - props.bodiesDirectory(Helper.bodiesDirectory.toString) - props.binariesDirectory(Helper.mavenBinariesDirectory.toString) - - Gatling.fromMap(props.build) -} \ No newline at end of file +// val props = new GatlingPropertiesBuilder +// props.dataDirectory(Helper.dataDirectory.toString) +// props.resultsDirectory(Helper.resultsDirectory.toString) +// props.bodiesDirectory(Helper.bodiesDirectory.toString) +// props.binariesDirectory(Helper.mavenBinariesDirectory.toString) +// +// Gatling.fromMap(props.build) +} diff --git a/src/test/scala/Recorder.scala b/src/test/scala/Recorder.scala index 5627527..a12d650 100644 --- a/src/test/scala/Recorder.scala +++ b/src/test/scala/Recorder.scala @@ -3,10 +3,10 @@ import io.gatling.recorder.config.RecorderPropertiesBuilder object Recorder extends App { - val props = new RecorderPropertiesBuilder - props.simulationOutputFolder(Helper.recorderOutputDirectory.toString) - props.simulationPackage("uk.gov.hmcts.ccd.scenarios") - props.bodiesFolder(Helper.bodiesDirectory.toString) - - GatlingRecorder.fromMap(props.build, Some(Helper.recorderConfigFile)) -} \ No newline at end of file +// val props = new RecorderPropertiesBuilder +// props.simulationOutputFolder(Helper.recorderOutputDirectory.toString) +// props.simulationPackage("uk.gov.hmcts.ccd.scenarios") +// props.bodiesFolder(Helper.bodiesDirectory.toString) +// +// GatlingRecorder.fromMap(props.build, Some(Helper.recorderConfigFile)) +} diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESExactMatchYesOrNo.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESExactMatchYesOrNo.scala new file mode 100644 index 0000000..c791ea6 --- /dev/null +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESExactMatchYesOrNo.scala @@ -0,0 +1,55 @@ +package uk.gov.hmcts.ccd.corecasedata.scenarios + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import uk.gov.hmcts.ccd.util.{CcdTokenGenerator, PerformanceTestsConfig} + +import scala.concurrent.duration._ + +object ESExactMatchYesOrNo extends PerformanceTestsConfig { + + private val url: String = config.getString("caseDataUrl") + "/" + config.getString("ESSearch") + println("Elastic Search Exact Match on YesORNo field PT - URL: " + url) + + val ESExactMatchYesOrNoReqPayload = StringBody( + """ + { + "query":{ + "bool":{ + "filter":{ + "match":{ + "data.YesOrNoField":"Yes" + } + } + } + } + } + """ + ) + + def httpRequest() = { + val s2sToken = CcdTokenGenerator.generateGatewayS2SToken() + val userToken = CcdTokenGenerator.generateWebUserToken(url) + + http("TX12_CCD_ElasticSearchEndpoint_ExactMatch_YesORNoField") + .post(url) + .queryParam("ctid", "AAT") + .body( + ESExactMatchYesOrNoReqPayload).asJson + .header("ServiceAuthorization", s2sToken) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status in (200)) + } + + println("ESExactMatchYesOrNo: Minimum think time " + MinThinkTime + " Maximum think time " + MaxThinkTime) + + val ESExactMatchYesOrNoSCN = scenario("Elastic Search Exact Match on YesORNo Field").during(TotalRunDuration minutes) { + exec( + httpRequest() + ) + .pause(MinThinkTime seconds, MaxThinkTime seconds) + } + + val waitForNextIteration = pace(MinWaitForNextIteration seconds, MaxWaitForNextIteration seconds) +} diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESMatchAllCases.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESMatchAllCases.scala new file mode 100644 index 0000000..3003140 --- /dev/null +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESMatchAllCases.scala @@ -0,0 +1,50 @@ +package uk.gov.hmcts.ccd.corecasedata.scenarios + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import uk.gov.hmcts.ccd.util.{CcdTokenGenerator, PerformanceTestsConfig} + +import scala.concurrent.duration._ + +object ESMatchAllCases extends PerformanceTestsConfig { + + private val url: String = config.getString("caseDataUrl") + "/" + config.getString("ESSearch") + println("Elastic Search Match All & return 50 PT - URL: " + url) + + val ReqPayload = StringBody( + """ + { + "query": { + "match_all": {} + }, + "size": 50 + } + """ + ) + + def httpRequest() = { + val s2sToken = CcdTokenGenerator.generateGatewayS2SToken() + val userToken = CcdTokenGenerator.generateWebUserToken(url) + + http("TX11_CCD_ElasticSearchEndpoint_MatchAll_Return50Cases") + .post(url) + .queryParam("ctid", "AAT") + .body( + ReqPayload).asJson + .header("ServiceAuthorization", s2sToken) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status in (200)) + } + + println("ESMatchAllCases: Minimum think time " + MinThinkTime + " Maximum think time " + MaxThinkTime) + + val ESMatchAll_Return50Cases = scenario("Elastic Search Match all and return 50 cases").during(TotalRunDuration minutes) { + exec( + httpRequest() + ) + .pause(MinThinkTime seconds, MaxThinkTime seconds) + } + + val waitForNextIteration = pace(MinWaitForNextIteration seconds, MaxWaitForNextIteration seconds) +} diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESSeachONTextArea.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESSeachONTextArea.scala new file mode 100644 index 0000000..b9b1409 --- /dev/null +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESSeachONTextArea.scala @@ -0,0 +1,57 @@ +package uk.gov.hmcts.ccd.corecasedata.scenarios + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import uk.gov.hmcts.ccd.util.{CcdTokenGenerator, PerformanceTestsConfig} + +import scala.concurrent.duration._ + +object ESSeachONTextArea extends PerformanceTestsConfig { + + private val url: String = config.getString("caseDataUrl") + "/" + config.getString("ESSearch") + println("Elastic Search on text area field PT - URL: " + url) + + val ESSeachONTextAreaReqPayload = StringBody( + """ + { + "query":{ + "match_phrase_prefix":{ + "data.TextAreaField":"Performance Testing " + } + }, + "sort":[ + { + "last_modified":"desc" + }, + "_score" + ] + } + """ + ) + + def httpRequest() = { + val s2sToken = CcdTokenGenerator.generateGatewayS2SToken() + val userToken = CcdTokenGenerator.generateWebUserToken(url) + + http("TX14_CCD_ElasticSearchEndpoint_SearchONTextAreaField") + .post(url) + .queryParam("ctid", "AAT") + .body( + ESSeachONTextAreaReqPayload).asJson + .header("ServiceAuthorization", s2sToken) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status in (200)) + } + + println("ESSeachONTextArea: Minimum think time " + MinThinkTime + " Maximum think time " + MaxThinkTime) + + val ESSeachONTextAreaSCN = scenario("Elastic Search on TextArea Field").during(TotalRunDuration minutes) { + exec( + httpRequest() + ) + .pause(MinThinkTime seconds, MaxThinkTime seconds) + } + + val waitForNextIteration = pace(MinWaitForNextIteration seconds, MaxWaitForNextIteration seconds) +} diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESStdTest.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESStdTest.scala new file mode 100644 index 0000000..934465c --- /dev/null +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/ESStdTest.scala @@ -0,0 +1,208 @@ +package uk.gov.hmcts.ccd.corecasedata.scenarios + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import uk.gov.hmcts.ccd.util.{CcdTokenGenerator, PerformanceTestsConfig} + +import scala.concurrent.duration._ +import scala.util.Random + + +object ESStdTest extends PerformanceTestsConfig { + + // val EventId = "applyForGrant" + private val rng: Random = new Random() + private def firstpageText(): String = rng.alphanumeric.take(10).mkString + private def firstpageNumberField(): Int = rng.nextInt(999999999) + private def firstpageEmailRandNumber(): Int = rng.nextInt(999999) + private def firstpageMoneyField(): Int = rng.nextInt(9999999) + private def secondpageText(): String = rng.alphanumeric.take(15).mkString + private def thirdpageText(): String = rng.alphanumeric.take(15).mkString + private def thirdpageNestedNumberField(): Int = rng.nextInt(99999999) + private def caseSummaryText(): String = rng.alphanumeric.take(20).mkString + private def caseDescriptionText(): String = rng.alphanumeric.take(30).mkString + + // val EventId = "CREATE" + val randcaseType = new Random(System.currentTimeMillis()) + val caseEventTypeValue = Array("CREATE","CREATEASPROG","CREATEASDONE") + val caseTypeValue_random_index = randcaseType.nextInt(caseEventTypeValue.length) + val EventId = caseEventTypeValue(caseTypeValue_random_index) + def PickCaseType(): String = EventId + //def PickCaseType(): String = caseEventTypeValue(randcaseType.nextInt(caseEventTypeValue.length)) + + println("ES caseTypeText Value " + EventId) + println("ES caseTypeText Value " + PickCaseType()) + + var CreateCaseUrl = caseDataUrl(config.getString("createCaseUrl")) + + println("ES create case url: " + CreateCaseUrl) + + //val caseTypeValue = Array("AAT","CASETYPE2","CASETYPE3","CASETYPE4") + //val caseTypeValue = Array("ATCASETYPE1","ATCASETYPE2","ATCASETYPE3","ATCASETYPE4") + val caseTypeValue = Array("AAT") + val jurisdictionsValue = Array("AUTOTEST1") + + val rand = new Random(System.currentTimeMillis()) + val caseType_random_index = rand.nextInt(caseTypeValue.length) + + val jurisdictions_random_index = rand.nextInt(jurisdictionsValue.length) + + if(!CreateCaseUrl.contains(":casetype_reference")) + { + CreateCaseUrl + } + else{ + CreateCaseUrl = CreateCaseUrl.replace(":casetype_reference", caseTypeValue(caseType_random_index)) + } + + println("create case url: " + CreateCaseUrl) + + if(!CreateCaseUrl.contains(":jurisdictions_reference")) + { + CreateCaseUrl + } + else{ + CreateCaseUrl = CreateCaseUrl.replace(":jurisdictions_reference", jurisdictionsValue(jurisdictions_random_index)) + } + + println("create case url: " + CreateCaseUrl) + val CreateCaseTokenUrl = s"${CreateCaseUrl.replaceAll("cases", "")}event-triggers/$EventId/token" + + + println("create case url: " + CreateCaseUrl) + println("create case token url: " + CreateCaseTokenUrl) + + + + //val EventBodyMain = StringBody("""{"data": {"TextField": "Performance Testing First Page Text ${FirstpageText}","NumberField": "${FirstpageNumberField}","YesOrNoField": "Yes","PhoneUKField": "02020002002","EmailField": "confirmation${FirstpageEmailRandNumber}@confirmation.com","MoneyGBPField": "${FirstpageMoneyField}","DateField": "2018-06-12","TextAreaField": "Performance Testing Second page TextArea ${SecondpageText}","FixedListField": "","MultiSelectListField": [],"ComplexField": {"ComplexTextField": "Performance Testing Third page Text - Third page Text ${ThirdpageText}","ComplexFixedListField": "","ComplexNestedField": {"NestedNumberField": "${ThirdpageNestedNumberField}","NestedCollectionTextField": []}}},"event": {"id": "CREATE","summary": "4th Page Check your answers - Performance Testing Event summary ${CaseSummaryText}","description": "4th Page Check your answers - Performance Testing Event description ${CaseDescriptionText}"},"event_token": """" + "${eventToken}" + """","ignore_warning": false}""") + val EventBodyMain = StringBody("""{"data": {"TextField": "Performance Testing First Page Text ${FirstpageText}","NumberField": "${FirstpageNumberField}","YesOrNoField": "Yes","PhoneUKField": "02020002002","EmailField": "confirmation${FirstpageEmailRandNumber}@confirmation.com","MoneyGBPField": "${FirstpageMoneyField}","DateField": "2018-06-12","TextAreaField": "Performance Testing Second page TextArea ${SecondpageText}","FixedListField": "","MultiSelectListField": [],"ComplexField": {"ComplexTextField": "Performance Testing Third page Text - Third page Text ${ThirdpageText}","ComplexFixedListField": "","ComplexNestedField": {"NestedNumberField": "${ThirdpageNestedNumberField}","NestedCollectionTextField": []}}},"event": {"id": "${PickCaseEventType}","summary": "4th Page Check your answers - Performance Testing Event summary ${CaseSummaryText}","description": "4th Page Check your answers - Performance Testing Event description ${CaseDescriptionText}"},"event_token": """" + "${eventToken}" + """","ignore_warning": false}""") + + + + val token = CcdTokenGenerator.generateGatewayS2SToken() + val userToken = CcdTokenGenerator.generateWebUserToken(CreateCaseUrl) + + + /* def createCaseDatahttp() = { + val token = CcdTokenGenerator.generateGatewayS2SToken() + val userToken = CcdTokenGenerator.generateWebUserToken(CreateCaseUrl) + exec( + //http("get create case event token") + http("TX02_CCD_CreateCaseEndpoint_createcase_eventtoken") + .get(CreateCaseTokenUrl) + .header("ServiceAuthorization", token) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status.is(200),jsonPath("$.token").saveAs("eventToken")) + ).exec( + //http("create case data") + http("TX02_CCD_CreateCaseEndpoint_createcasedata") + .post(CreateCaseUrl) + /*.body( + EventBody).asJson*/ + .body(EventBodyMain).asJson + .header("ServiceAuthorization", token) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status is 201) + ) + } + + + println("PostCaseData: Minimum think time " + MinThinkTime + " Maximum think time " + MaxThinkTime) + + val createCaseData = scenario("Create Case Data").during(TotalRunDuration minutes) { + exec( + _.setAll( + ("FirstpageText", firstpageText()), + ("FirstpageNumberField", firstpageNumberField()), + ("FirstpageEmailRandNumber", firstpageEmailRandNumber()), + ("FirstpageMoneyField",firstpageMoneyField()), + ("SecondpageText",secondpageText()), + ("ThirdpageText",thirdpageText()), + ("ThirdpageNestedNumberField",thirdpageNestedNumberField()), + ("CaseSummaryText",caseSummaryText()), + ("CaseDescriptionText",caseDescriptionText()), + ("PickCaseEventType",PickCaseType()) + ) + ).exec( + createCaseDatahttp() + ) + .pause(MinThinkTime seconds, MaxThinkTime seconds) + } +*/ + private val url: String = config.getString("caseDataUrl") + "/" + config.getString("ESSearch") + println("Elastic Search on reference metadata PT - URL: " + url) + + val ESSearchONReferenceMetaDataReqPayload = StringBody( + """ + { + "query":{ + "bool":{ + "filter":{ + "match":{ + "reference":"${ESNew_Case_Id}" + } + } + } + } + } + """ + ) + + val ESStdTEST = scenario("CCD Create Case Data").during(TotalRunDuration minutes) { + exec( + _.setAll( + ("FirstpageText", firstpageText()), + ("FirstpageNumberField", firstpageNumberField()), + ("FirstpageEmailRandNumber", firstpageEmailRandNumber()), + ("FirstpageMoneyField",firstpageMoneyField()), + ("SecondpageText",secondpageText()), + ("ThirdpageText",thirdpageText()), + ("ThirdpageNestedNumberField",thirdpageNestedNumberField()), + ("CaseSummaryText",caseSummaryText()), + ("CaseDescriptionText",caseDescriptionText()), + ("PickCaseEventType",PickCaseType()) + ) + ).exec( + //http("get create case event token") + http("TX02_CCD_CreateCaseEndpoint_createcase_eventtoken") + .get(CreateCaseTokenUrl) + .header("ServiceAuthorization", token) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status.is(200),jsonPath("$.token").saveAs("eventToken")) + ).exec( + //http("create case data") + http("TX02_CCD_CreateCaseEndpoint_createcasedata") + .post(CreateCaseUrl) + .body(EventBodyMain).asJson + .header("ServiceAuthorization", token) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(jsonPath("$.id").saveAs("ESNew_Case_Id")) + .check(status is 201) + ) + + .pause(MinThinkTime seconds, MaxThinkTime seconds) + + .exec( + http("TX13_CCD_ElasticSearchEndpoint_ReferenceMetaDataSearch") + .post(url) + .queryParam("ctid", "AAT") + .body( + ESSearchONReferenceMetaDataReqPayload).asJson + // .body(StringBody("""{"query": {"bool": {"filter": {"wildcard": {"reference": """" + "${ESNew_Case_Id}" + """""}}}}""")).asJson + .header("ServiceAuthorization", token) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status in (200)) + ) + + .pause(MinThinkTime seconds, MaxThinkTime seconds) + } + + + val waitForNextIteration = pace(MinWaitForNextIteration seconds, MaxWaitForNextIteration seconds) +} + diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetPaginationMetaData.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetPaginationMetaData.scala index b579650..bb6c939 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetPaginationMetaData.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetPaginationMetaData.scala @@ -3,6 +3,7 @@ package uk.gov.hmcts.ccd.corecasedata.scenarios import io.gatling.core.Predef._ import io.gatling.http.Predef._ import uk.gov.hmcts.ccd.util.{CcdTokenGenerator, PerformanceTestsConfig} +import scala.concurrent.duration._ object GetPaginationMetaData extends PerformanceTestsConfig { @@ -12,7 +13,7 @@ object GetPaginationMetaData extends PerformanceTestsConfig { def httpRequest() = { val s2sToken = CcdTokenGenerator.generateGatewayS2SToken() val userToken = CcdTokenGenerator.generateWebUserToken(url) - http("get pagination metadata data") + http("TX06_CCD_GetPaginationMetadataData") .get(url) .header("ServiceAuthorization", s2sToken) .header("Authorization", userToken) @@ -20,6 +21,9 @@ object GetPaginationMetaData extends PerformanceTestsConfig { .check(status in (200)) } - val getPaginationMetaData = scenario("Get Pagination Metadata") - .exec(httpRequest()) + println("GetCaseData: Minimum think time " + MinThinkTime + " Maximum think time " + MaxThinkTime) + + val getPaginationMetaData = scenario("Get Pagination Metadata").during(TotalRunDuration minutes) { + exec(httpRequest()) + } } diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetUserProfile.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetUserProfile.scala index c2a2f63..305600a 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetUserProfile.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/GetUserProfile.scala @@ -13,6 +13,7 @@ object GetUserProfile extends PerformanceTestsConfig { def call() = { val s2sToken = CcdTokenGenerator.generateGatewayS2SToken() val userToken = CcdTokenGenerator.generateWebUserToken(endpointUrl) + println("s2sToken: " + s2sToken + " userToken " + userToken) //http("get user profile") http("TX05_CCD_GetUserProfileEndpoint_getuserprofile") .get(_ => endpointUrl) diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostCaseData.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostCaseData.scala index a1eaca7..79e65c6 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostCaseData.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostCaseData.scala @@ -3,103 +3,88 @@ package uk.gov.hmcts.ccd.corecasedata.scenarios import io.gatling.core.Predef._ import io.gatling.http.Predef._ import uk.gov.hmcts.ccd.util.{CcdTokenGenerator, PerformanceTestsConfig} + import scala.concurrent.duration._ +import java.text.SimpleDateFormat + +import scala.util.Random + object PostCaseData extends PerformanceTestsConfig { // val EventId = "applyForGrant" - val EventId = "CREATE" - val CreateCaseUrl = caseDataUrl(config.getString("createCaseUrl")) + private val rng: Random = new Random() + private def firstpageText(): String = rng.alphanumeric.take(10).mkString + private def firstpageNumberField(): Int = rng.nextInt(999999999) + private def firstpageEmailRandNumber(): Int = rng.nextInt(999999) + private def firstpageMoneyField(): Int = rng.nextInt(9999999) + private def secondpageText(): String = rng.alphanumeric.take(15).mkString + private def thirdpageText(): String = rng.alphanumeric.take(15).mkString + private def thirdpageNestedNumberField(): Int = rng.nextInt(99999999) + private def caseSummaryText(): String = rng.alphanumeric.take(20).mkString + private def caseDescriptionText(): String = rng.alphanumeric.take(30).mkString + + // val EventId = "CREATE" + val randcaseType = new Random(System.currentTimeMillis()) + val caseEventTypeValue = Array("CREATE","CREATEASPROG","CREATEASDONE") + val caseTypeValue_random_index = randcaseType.nextInt(caseEventTypeValue.length) + val EventId = caseEventTypeValue(caseTypeValue_random_index) + def PickCaseType(): String = EventId + //def PickCaseType(): String = caseEventTypeValue(randcaseType.nextInt(caseEventTypeValue.length)) + + println("caseTypeText Value " + EventId) + println("caseTypeText Value " + PickCaseType()) + + var CreateCaseUrl = caseDataUrl(config.getString("createCaseUrl")) + + println("create case url: " + CreateCaseUrl) + + //val caseTypeValue = Array("AAT","CASETYPE2","CASETYPE3","CASETYPE4") + val caseTypeValue = Array("ATCASETYPE1","ATCASETYPE2","ATCASETYPE3","ATCASETYPE4") + val jurisdictionsValue = Array("AUTOTEST2") + + val rand = new Random(System.currentTimeMillis()) + val caseType_random_index = rand.nextInt(caseTypeValue.length) + + val jurisdictions_random_index = rand.nextInt(jurisdictionsValue.length) + + if(!CreateCaseUrl.contains(":casetype_reference")) + { + CreateCaseUrl + } + else{ + CreateCaseUrl = CreateCaseUrl.replace(":casetype_reference", caseTypeValue(caseType_random_index)) + } + + println("create case url: " + CreateCaseUrl) + + if(!CreateCaseUrl.contains(":jurisdictions_reference")) + { + CreateCaseUrl + } + else{ + CreateCaseUrl = CreateCaseUrl.replace(":jurisdictions_reference", jurisdictionsValue(jurisdictions_random_index)) + } + + println("create case url: " + CreateCaseUrl) val CreateCaseTokenUrl = s"${CreateCaseUrl.replaceAll("cases", "")}event-triggers/$EventId/token" + + println("create case url: " + CreateCaseUrl) println("create case token url: " + CreateCaseTokenUrl) - val EventBody = StringBody(s""" - { - "event": { - "description": "case automatically created by performance test", - "id": "${EventId}", - "summary": "Performance testing" - }, - "event_token": """" + "${eventToken}" + """", - "data": { - "willDate": "2013-01-01", - "amountPaid": "120000", - "willExists": "Yes", - "declaration": "Declaration text does here and it is long and long that means it goes on ffor a very long time and then im going to cop and paste a few times to make it long. Hope ok with youDeclaration text does here and it is long and long that means it goes on ffor a very long time and then im going to cop and paste a few times to make it long. Hope ok with youDeclaration text does here and it is long and long that means it goes on ffor a very long time and then im going to cop and paste a few times to make it long. Hope ok with youDeclaration text does here and it is long and long that means it goes on ffor a very long time and then im going to cop and paste a few times to make it long. Hope ok with you", - "ihtNetValue": "120000", - "ihtGrossValue": "120000", - "legalStatement": "Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much. Legal Statement is just as long and again I am going to copy and paste a number time so I dont have ti type too much.", - "deceasedAddress": "5 Death Road\nFake Town", - "deceasedSurname": "Plummer", - "willHasCodicils": "No", - "willIsAnOriginal": "Yes", - "deceasedForenames": "Bella", - "numberOfExecutors": "3", - "extraCopiesOfGrant": "0", - "ihtReferenceNumber": "250", - "numberOfApplicants": "0", - "deceasedDateOfBirth": "1970-01-01", - "deceasedDateOfDeath": "2018-02-02", - "executorsNotApplying": [ - { - "id": "ef68c99a-ea40-4000-af62-974081f2cd02", - "value": { - "notApplyingExecutorName": "Mr Other Exec Plummer", - "notApplyingExecutorReason": "DiedBefore", - "notApplyingExecutorNotified": "No", - "notApplyingExecutorNameOnWill": "Mr Other Exec Plummer", - "notApplyingExecutorNameDifferenceComment": "None" - } - }, - { - "id": "35110c98-7fcf-4d4c-8c57-b8810407443d", - "value": { - "notApplyingExecutorName": "Mr Third Exec Plummer", - "notApplyingExecutorReason": "DiedAfter", - "notApplyingExecutorNotified": "Yes", - "notApplyingExecutorNameOnWill": "Mr Third Exec Plummer", - "notApplyingExecutorNameDifferenceComment": "None" - } - } - ], - "outsideUKGrantCopies": "0", - "willNumberOfCodicils": "1", - "deceasedAliasNameList": [ - { - "id": "8c46923a-8b1a-407d-aae1-ee85c297d0ca", - "value": { - "LastName": "Plummer", - "Forenames": "Alias Bella", - "AppearOnGrant": "Yes" - } - }, - { - "id": "282c0413-4247-4f30-840c-06fc44a261ed", - "value": { - "LastName": "Plummer", - "Forenames": "B", - "AppearOnGrant": "No" - } - } - ], - "willLatestCodicilDate": "2016-01-01", - "ihtFormCompletedOnline": "Yes", - "paymentReferenceNumber": "PaymentRef1111111", - "primaryApplicantAddress": "5 Fake road,\nFake Town", - "primaryApplicantSurname": "Plummer", - "willLatestCodicilHasDate": "No", - "primaryApplicantForenames": "Rex", - "deceasedDomicileInEngWales": "", - "primaryApplicantIsExecutor": "Yes", - "primaryApplicantPhoneNumber": "080909090909", - "primaryApplicantEmailAddress": "fake@gmail.com" - } - } - """) - - - def createCaseDatahttp() = { + + + //val EventBodyMain = StringBody("""{"data": {"TextField": "Performance Testing First Page Text ${FirstpageText}","NumberField": "${FirstpageNumberField}","YesOrNoField": "Yes","PhoneUKField": "02020002002","EmailField": "confirmation${FirstpageEmailRandNumber}@confirmation.com","MoneyGBPField": "${FirstpageMoneyField}","DateField": "2018-06-12","TextAreaField": "Performance Testing Second page TextArea ${SecondpageText}","FixedListField": "","MultiSelectListField": [],"ComplexField": {"ComplexTextField": "Performance Testing Third page Text - Third page Text ${ThirdpageText}","ComplexFixedListField": "","ComplexNestedField": {"NestedNumberField": "${ThirdpageNestedNumberField}","NestedCollectionTextField": []}}},"event": {"id": "CREATE","summary": "4th Page Check your answers - Performance Testing Event summary ${CaseSummaryText}","description": "4th Page Check your answers - Performance Testing Event description ${CaseDescriptionText}"},"event_token": """" + "${eventToken}" + """","ignore_warning": false}""") + val EventBodyMain = StringBody("""{"data": {"TextField": "Performance Testing First Page Text ${FirstpageText}","NumberField": "${FirstpageNumberField}","YesOrNoField": "Yes","PhoneUKField": "02020002002","EmailField": "confirmation${FirstpageEmailRandNumber}@confirmation.com","MoneyGBPField": "${FirstpageMoneyField}","DateField": "2018-06-12","TextAreaField": "Performance Testing Second page TextArea ${SecondpageText}","FixedListField": "","MultiSelectListField": [],"ComplexField": {"ComplexTextField": "Performance Testing Third page Text - Third page Text ${ThirdpageText}","ComplexFixedListField": "","ComplexNestedField": {"NestedNumberField": "${ThirdpageNestedNumberField}","NestedCollectionTextField": []}}},"event": {"id": "${PickCaseEventType}","summary": "4th Page Check your answers - Performance Testing Event summary ${CaseSummaryText}","description": "4th Page Check your answers - Performance Testing Event description ${CaseDescriptionText}"},"event_token": """" + "${eventToken}" + """","ignore_warning": false}""") + + + + val token = CcdTokenGenerator.generateGatewayS2SToken() + val userToken = CcdTokenGenerator.generateWebUserToken(CreateCaseUrl) + + + /* def createCaseDatahttp() = { val token = CcdTokenGenerator.generateGatewayS2SToken() val userToken = CcdTokenGenerator.generateWebUserToken(CreateCaseUrl) exec( @@ -114,8 +99,9 @@ object PostCaseData extends PerformanceTestsConfig { //http("create case data") http("TX02_CCD_CreateCaseEndpoint_createcasedata") .post(CreateCaseUrl) - .body( - EventBody).asJSON + /*.body( + EventBody).asJson*/ + .body(EventBodyMain).asJson .header("ServiceAuthorization", token) .header("Authorization", userToken) .header("Content-Type","application/json") @@ -127,11 +113,62 @@ object PostCaseData extends PerformanceTestsConfig { println("PostCaseData: Minimum think time " + MinThinkTime + " Maximum think time " + MaxThinkTime) val createCaseData = scenario("Create Case Data").during(TotalRunDuration minutes) { - exec( + exec( + _.setAll( + ("FirstpageText", firstpageText()), + ("FirstpageNumberField", firstpageNumberField()), + ("FirstpageEmailRandNumber", firstpageEmailRandNumber()), + ("FirstpageMoneyField",firstpageMoneyField()), + ("SecondpageText",secondpageText()), + ("ThirdpageText",thirdpageText()), + ("ThirdpageNestedNumberField",thirdpageNestedNumberField()), + ("CaseSummaryText",caseSummaryText()), + ("CaseDescriptionText",caseDescriptionText()), + ("PickCaseEventType",PickCaseType()) + ) + ).exec( createCaseDatahttp() ) .pause(MinThinkTime seconds, MaxThinkTime seconds) } +*/ + + val createCaseData = scenario("Create Case Data").during(TotalRunDuration minutes) { + exec( + _.setAll( + ("FirstpageText", firstpageText()), + ("FirstpageNumberField", firstpageNumberField()), + ("FirstpageEmailRandNumber", firstpageEmailRandNumber()), + ("FirstpageMoneyField",firstpageMoneyField()), + ("SecondpageText",secondpageText()), + ("ThirdpageText",thirdpageText()), + ("ThirdpageNestedNumberField",thirdpageNestedNumberField()), + ("CaseSummaryText",caseSummaryText()), + ("CaseDescriptionText",caseDescriptionText()), + ("PickCaseEventType",PickCaseType()) + ) + ).exec( + //http("get create case event token") + http("TX02_CCD_CreateCaseEndpoint_createcase_eventtoken") + .get(CreateCaseTokenUrl) + .header("ServiceAuthorization", token) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status.is(200),jsonPath("$.token").saveAs("eventToken")) + ).exec( + //http("create case data") + http("TX02_CCD_CreateCaseEndpoint_createcasedata") + .post(CreateCaseUrl) + .body(EventBodyMain).asJson + .header("ServiceAuthorization", token) + .header("Authorization", userToken) + .header("Content-Type","application/json") + .check(status is 201) + ) + + .pause(MinThinkTime seconds, MaxThinkTime seconds) + } + val waitForNextIteration = pace(MinWaitForNextIteration seconds, MaxWaitForNextIteration seconds) } diff --git a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostEvent.scala b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostEvent.scala index 2c73617..e43ad5b 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostEvent.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/corecasedata/scenarios/PostEvent.scala @@ -43,7 +43,7 @@ object PostEvent extends PerformanceTestsConfig { http("TX04_CCD_SaveEventEndpoint") .post(SaveEventUrl) .body( - EventBody).asJSON + EventBody).asJson .header("ServiceAuthorization", token) .header("Authorization", userToken) .header("Content-Type","application/json") diff --git a/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDPTSimulation.scala b/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDPTSimulation.scala index c10b0a6..98eec7b 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDPTSimulation.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDPTSimulation.scala @@ -2,6 +2,9 @@ package uk.gov.hmcts.ccd.simulation import io.gatling.core.Predef._ import uk.gov.hmcts.ccd.corecasedata.scenarios._ +import uk.gov.hmcts.ccd.casedefinition.scenarios._ +import uk.gov.hmcts.ccd.corecasedata.scenarios._ + import scala.concurrent.duration._ @@ -12,13 +15,91 @@ class CCDPTSimulation extends CCDSimulation { val baseHttpUrl: String = config.getString("caseDataUrl") + /* + val scenarios = List( + GetCaseData.scenarios.inject( + atOnceUsers(1)), + PostCaseData.createCaseData.inject( + atOnceUsers(1)), + SearchCases.searchCases.inject( + atOnceUsers(10)), + PostEvent.saveEventData.inject( + atOnceUsers(1)), + GetUserProfile.scenarios.inject( + atOnceUsers(1)) + ) + */ + + + /* + User Concurrency Stress Test + minthinktime = 2 + maxthinktime = 3 + minWaitForNextIteration = 4 + maxWaitForNextIteration = 5 + totalDuration = 1000 + + + + val scenarios = List( + GetCaseData.scenarios.inject(splitUsers(1000) into(rampUsers(10) over(5 minutes)) separatedBy(5 minutes)), + PostCaseData.createCaseData.inject(splitUsers(1000) into(rampUsers(10) over(5 minutes)) separatedBy(5 minutes)), + SearchCases.searchCases.inject(splitUsers(1000) into(rampUsers(10) over(5 minutes)) separatedBy(5 minutes)), + PostEvent.saveEventData.inject(splitUsers(1000) into(rampUsers(10) over(5 minutes)) separatedBy(5 minutes)), + GetUserProfile.scenarios.inject(splitUsers(1000) into(rampUsers(10) over(5 minutes)) separatedBy(5 minutes)) + ) +*/ + + + + /* Single User Test + minthinktime = 2 + maxthinktime = 3 + minWaitForNextIteration = 4 + maxWaitForNextIteration = 5 + totalDuration = 2 + + +*/ + + val scenarios = List( + ESMatchAllCases.ESMatchAll_Return50Cases.inject(atOnceUsers(1)) + ) + + + + /* + CCD Stress Test - RPS + + jurisdiction = "autotest1" + maxSimulationDurationMinutes = 99999 + maxResponseTime = 20000 + meanResponseTime = 1000 + minthinktime = 1 + maxthinktime = 2 + minWaitForNextIteration = 1 + maxWaitForNextIteration = 2 + totalDuration = 1000 + reachRPSTarget = 150 + reachRPSDuration = 10 + reachRPSHoldForDuration = 60 + jumptoRPSTarget = 200 + jumptoRPSDuration = 900 + + Data Volume + reachRPSTarget = 25 + jumptoRPSTarget = 50 + + + val scenarios = List( - GetCaseData.scenarios.inject(rampUsers(2) over(1 minutes)), - PostCaseData.createCaseData.inject(rampUsers(50) over(5 minutes)), - SearchCases.searchCases.inject(rampUsers(2) over(1 minutes)), - PostEvent.saveEventData.inject(rampUsers(2) over(1 minutes)), - GetUserProfile.scenarios.inject(rampUsers(2) over(1 minutes)) + // GetCaseData.scenarios.inject(rampUsers(2) over(1 minutes)), + CreateDocument.createDocumentData.inject(rampUsers(10) over(5 minutes)) + // SearchCases.searchCases.inject(rampUsers(2) over(1 minutes)), + // PostEvent.saveEventData.inject(rampUsers(2) over(1 minutes)), + // GetUserProfile.scenarios.inject(rampUsers(2) over(1 minutes)) ) +*/ setup() } diff --git a/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDSimulation.scala b/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDSimulation.scala index 43b0216..27a4d56 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDSimulation.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/simulation/CCDSimulation.scala @@ -14,7 +14,7 @@ abstract class CCDSimulation extends Simulation with PerformanceTestsConfig { val baseHttpUrl: String - val httpConf = http.baseURL(baseHttpUrl).headers(Headers.commonHeaders) + val httpConf = http.baseUrl(baseHttpUrl).headers(Headers.commonHeaders) def getProxiedHttpConf(): Option[HttpProtocolBuilder] = { val proxyHostOptional = config.getOptionalString("httpProxyHost") @@ -32,12 +32,12 @@ abstract class CCDSimulation extends Simulation with PerformanceTestsConfig { def setup() = setUp(scenarios()) .protocols(getHttpConf()) - .throttle( + /* .throttle( reachRps(ReachRPSTarget) in (ReachRPSDuration minutes), holdFor(ReachRPSHoldForDuration minutes), jumpToRps(JumptoRPSTarget), holdFor(JumptoRPSDuration minutes) - ) + )*/ .assertions( global.responseTime.mean.lt(config.getInt("meanResponseTime")) diff --git a/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PostUserProfile.scala b/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PostUserProfile.scala index 3058b6d..b62f95f 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PostUserProfile.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PostUserProfile.scala @@ -20,7 +20,10 @@ object PostUserProfile extends PerformanceTestsConfig { exec( http("create a user profile") .post(url) - .body(StringBody("""{ "id":"""" + "${userEmailprefix}" + """@perftest.com", "jurisdictions":[{"id":"DIVORCE"}],"work_basket_default_case_type":"Case1", "work_basket_default_jurisdiction":"DIVORCE","work_basket_default_state":"state1" }""")).asJSON + .body(StringBody("""{ "id":"""" + "${userEmailprefix}" + + """@perftest.com", "jurisdictions":[{"id":"DIVORCE"}], + |"work_basket_default_case_type":"Case1", "work_basket_default_jurisdiction":"DIVORCE","work_basket_default_state":"state1" }""" + .stripMargin)).asJson .header("ServiceAuthorization", token) .header("Authorization", CcdTokenGenerator.generateWebUserToken(url)) .check(status is 201) diff --git a/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PutUserProfiles.scala b/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PutUserProfiles.scala index ab56b84..517f08d 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PutUserProfiles.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/userprofile/scenarios/PutUserProfiles.scala @@ -12,7 +12,9 @@ object PutUserProfiles extends PerformanceTestsConfig { http("update a user profile") .put(s"$UserProfileUrl/user-profile/users") - .body(StringBody("""[{ "id": "3@perftest.com", "jurisdictions":[{"id":"DIVORCE"}],"work_basket_default_case_type":"Case1", "work_basket_default_jurisdiction":"DIVORCE","work_basket_default_state":"state1" }]""")).asJSON + .body(StringBody( + """[{ "id": "3@perftest.com", "jurisdictions":[{"id":"DIVORCE"}],"work_basket_default_case_type":"Case1", + |"work_basket_default_jurisdiction":"DIVORCE","work_basket_default_state":"state1" }]""".stripMargin)).asJson .header("ServiceAuthorization", token) .check(status is 201) } @@ -20,4 +22,4 @@ object PutUserProfiles extends PerformanceTestsConfig { val updateUsers = scenario("Update A User Profile") .exec(updateUsersHttp()) -} \ No newline at end of file +} diff --git a/src/test/scala/uk/gov/hmcts/ccd/util/CcdTokenGenerator.scala b/src/test/scala/uk/gov/hmcts/ccd/util/CcdTokenGenerator.scala index b2f97d0..e190d33 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/util/CcdTokenGenerator.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/util/CcdTokenGenerator.scala @@ -37,7 +37,7 @@ object CcdTokenGenerator extends PerformanceTestsConfig with SpringApplicationCo } private def roleFor(url: String) = { - val result = "caseworker" + parseJurisdiction(url).map(j => s"-$j").getOrElse("") + val result = "caseworker,caseworker-autotest1,caseworker-autotest1-junior,caseworker-autotest1-senior,caseworker-autotest1-manager,caseworker-autotest2,caseworker-loa1,caseworker-autotest1-loa1,caseworker-autotest1-junior-loa1,caseworker-autotest1-senior-loa1,caseworker-autotest1-manager-loa1,caseworker-autotest2-loa1" + parseJurisdiction(url).map(j => s"-$j").getOrElse("") println(s"role used for user token generation: $result") result } diff --git a/src/test/scala/uk/gov/hmcts/ccd/util/SpringApplicationContext.scala b/src/test/scala/uk/gov/hmcts/ccd/util/SpringApplicationContext.scala index d816ae6..ca3855f 100644 --- a/src/test/scala/uk/gov/hmcts/ccd/util/SpringApplicationContext.scala +++ b/src/test/scala/uk/gov/hmcts/ccd/util/SpringApplicationContext.scala @@ -8,6 +8,7 @@ trait SpringApplicationContext { def S2SAuthUrl(): String // val applicationContext = SpringApplication.run(classOf[CCDPerformanceTestsApplication], s"--idam.s2s-auth.url=${s2sAuthUrl()}", "--logging.level.org.springframework=DEBUG"); + //val applicationContext = SpringApplication.run(classOf[PerformanceTestsApplication], s"--idam.s2s-auth.url=$S2SAuthUrl") val applicationContext = SpringApplication.run(classOf[PerformanceTestsApplication], s"--idam.s2s-auth.url=$S2SAuthUrl") }