From 4ec4f459ec13a6889a39d5f388608a88c0e1f9c5 Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Wed, 28 Oct 2020 17:55:47 -0700 Subject: [PATCH 1/3] Fixed diagnostics information and other APIs on cosmos stored procedure response --- .../azure/cosmos/models/CosmosResponse.java | 5 -- .../models/CosmosStoredProcedureResponse.java | 56 ++++++++++++++++++- .../cosmos/CosmosSyncStoredProcTest.java | 53 ++++++++++++++---- 3 files changed, 96 insertions(+), 18 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosResponse.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosResponse.java index c2f5617c177a..31b54f02c831 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosResponse.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosResponse.java @@ -31,11 +31,6 @@ public class CosmosResponse { this.properties = properties; } - // Only used in CosmosStoredProcedureResponse compatibility with StoredProcedureResponse - CosmosResponse(StoredProcedureResponse response) { - this.resourceResponseWrapper = null; - } - /** * Gets properties. * diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java index d7aa3b91a6ec..76b2c68f986a 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java @@ -2,11 +2,15 @@ // Licensed under the MIT License. package com.azure.cosmos.models; +import com.azure.cosmos.CosmosDiagnostics; import com.azure.cosmos.implementation.ResourceResponse; import com.azure.cosmos.implementation.StoredProcedure; import com.azure.cosmos.implementation.StoredProcedureResponse; import com.azure.cosmos.implementation.apachecommons.lang.StringUtils; +import java.time.Duration; +import java.util.Map; + /** * The type Cosmos stored procedure response. */ @@ -24,7 +28,7 @@ public class CosmosStoredProcedureResponse extends CosmosResponse getResponseHeaders() { + if (storedProcedureResponse != null) { + return storedProcedureResponse.getResponseHeaders(); + } + return super.getResponseHeaders(); + } + + @Override + public CosmosDiagnostics getDiagnostics() { + if (storedProcedureResponse != null) { + return storedProcedureResponse.getCosmosDiagnostics(); + } + return super.getDiagnostics(); + } + + @Override + public Duration getDuration() { + if (storedProcedureResponse != null) { + return storedProcedureResponse.getCosmosDiagnostics().getDuration(); + } + return super.getDuration(); + } + /** * Gets the response of the stored procedure as a string. * * @return the response as a string. */ public String getResponseAsString() { - return this.storedProcedureResponse.getResponseAsString(); + if (storedProcedureResponse != null) { + return storedProcedureResponse.getResponseAsString(); + } + return null; } /** @@ -105,6 +152,9 @@ public String getResponseAsString() { * @return the output string from the stored procedure console.log() statements. */ public String getScriptLog() { - return this.storedProcedureResponse.getScriptLog(); + if (storedProcedureResponse != null) { + return this.storedProcedureResponse.getScriptLog(); + } + return null; } } diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java index f4d84f3e3a6a..2284e0504be8 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosSyncStoredProcTest.java @@ -4,10 +4,10 @@ package com.azure.cosmos; import com.azure.cosmos.implementation.HttpConstants; -import com.azure.cosmos.models.CosmosStoredProcedureResponse; +import com.azure.cosmos.models.CosmosQueryRequestOptions; import com.azure.cosmos.models.CosmosStoredProcedureProperties; import com.azure.cosmos.models.CosmosStoredProcedureRequestOptions; -import com.azure.cosmos.models.CosmosQueryRequestOptions; +import com.azure.cosmos.models.CosmosStoredProcedureResponse; import com.azure.cosmos.models.PartitionKey; import com.azure.cosmos.models.SqlQuerySpec; import com.azure.cosmos.rx.TestSuiteBase; @@ -17,10 +17,10 @@ import org.testng.annotations.Factory; import org.testng.annotations.Test; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -58,6 +58,7 @@ public void createStoredProcedure() throws Exception { CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(storedProcedureDef); validateResponse(storedProcedureDef, response); + validateDiagnostics(response, false); storedProcedureDef.setId(UUID.randomUUID().toString()); storedProcedureDef.setBody("function() {var x = 11;}"); @@ -65,6 +66,7 @@ public void createStoredProcedure() throws Exception { .createStoredProcedure(storedProcedureDef, new CosmosStoredProcedureRequestOptions()); validateResponse(storedProcedureDef, response1); + validateDiagnostics(response1, false); } @@ -74,6 +76,7 @@ public void createSproc_alreadyExists() throws Exception { CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(storedProcedureDef); validateResponse(storedProcedureDef, response); + validateDiagnostics(response, false); // Test for conflict try { @@ -90,14 +93,17 @@ public void readStoredProcedure() throws Exception { CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(storedProcedureDef); validateResponse(storedProcedureDef, response); + validateDiagnostics(response, false); CosmosStoredProcedure storedProcedure = container.getScripts().getStoredProcedure(storedProcedureDef.getId()); CosmosStoredProcedureResponse readResponse = storedProcedure.read(); validateResponse(storedProcedureDef, readResponse); + validateDiagnostics(readResponse, false); CosmosStoredProcedureResponse readResponse2 = storedProcedure.read(new CosmosStoredProcedureRequestOptions()); validateResponse(storedProcedureDef, readResponse2); + validateDiagnostics(readResponse2, false); } @Test(groups = {"simple"}, timeOut = TIMEOUT) @@ -106,11 +112,13 @@ public void replaceStoredProcedure() throws Exception { CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(storedProcedureDef); validateResponse(storedProcedureDef, response); + validateDiagnostics(response, false); CosmosStoredProcedureResponse readResponse = container.getScripts() .getStoredProcedure(storedProcedureDef.getId()) .read(); validateResponse(storedProcedureDef, readResponse); + validateDiagnostics(readResponse, false); //replace storedProcedureDef = readResponse.getProperties(); storedProcedureDef.setBody("function(){ var y = 20;}"); @@ -118,6 +126,7 @@ public void replaceStoredProcedure() throws Exception { .getStoredProcedure(storedProcedureDef.getId()) .replace(storedProcedureDef); validateResponse(storedProcedureDef, replaceResponse); + validateDiagnostics(replaceResponse, false); storedProcedureDef.setBody("function(){ var z = 2;}"); CosmosStoredProcedureResponse replaceResponse2 = container.getScripts() @@ -125,6 +134,7 @@ public void replaceStoredProcedure() throws Exception { .replace(storedProcedureDef, new CosmosStoredProcedureRequestOptions()); validateResponse(storedProcedureDef, replaceResponse2); + validateDiagnostics(replaceResponse2, false); } @@ -143,6 +153,8 @@ public void deleteStoredProcedure() throws Exception { CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(storedProcedureDef); validateResponse(storedProcedureDef, response); + validateDiagnostics(response, false); + container.getScripts() .getStoredProcedure(storedProcedureDef.getId()) .delete(); @@ -164,7 +176,8 @@ public void executeStoredProcedure() throws Exception { " }" + "}"); - container.getScripts().createStoredProcedure(storedProcedure); + CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(storedProcedure); + validateDiagnostics(response, false); CosmosStoredProcedureRequestOptions options = new CosmosStoredProcedureRequestOptions(); options.setPartitionKey(PartitionKey.NONE); CosmosStoredProcedureResponse executeResponse = container.getScripts() @@ -173,6 +186,7 @@ public void executeStoredProcedure() throws Exception { assertThat(executeResponse.getActivityId()).isNotEmpty(); assertThat(executeResponse.getScriptLog()).isNull(); + validateDiagnostics(executeResponse, true); } @Test(groups = "simple", timeOut = TIMEOUT) @@ -192,7 +206,8 @@ public void executeStoredProcedureWithScriptLoggingEnabled() throws Exception { " }" + "}"); - container.getScripts().createStoredProcedure(storedProcedure); + CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(storedProcedure); + validateDiagnostics(response, false); CosmosStoredProcedureRequestOptions options = new CosmosStoredProcedureRequestOptions(); options.setScriptLoggingEnabled(true); options.setPartitionKey(PartitionKey.NONE); @@ -203,12 +218,15 @@ public void executeStoredProcedureWithScriptLoggingEnabled() throws Exception { String logResult = "The value of x is 1."; assertThat(executeResponse.getScriptLog()).isEqualTo(logResult); + validateDiagnostics(executeResponse, true); } @Test(groups = {"simple"}, timeOut = TIMEOUT) - private void readAllSprocs() throws Exception { + public void readAllSprocs() throws Exception { CosmosStoredProcedureProperties storedProcedureDef = getCosmosStoredProcedureProperties(); - container.getScripts().createStoredProcedure(storedProcedureDef); + CosmosStoredProcedureResponse response = + container.getScripts().createStoredProcedure(storedProcedureDef); + validateDiagnostics(response, false); CosmosQueryRequestOptions cosmosQueryRequestOptions = new CosmosQueryRequestOptions(); @@ -219,9 +237,10 @@ private void readAllSprocs() throws Exception { } @Test(groups = {"simple"}, timeOut = TIMEOUT) - private void querySprocs() throws Exception { + public void querySprocs() throws Exception { CosmosStoredProcedureProperties properties = getCosmosStoredProcedureProperties(); - container.getScripts().createStoredProcedure(properties); + CosmosStoredProcedureResponse response = container.getScripts().createStoredProcedure(properties); + validateDiagnostics(response, false); String query = String.format("SELECT * from c where c.id = '%s'", properties.getId()); CosmosQueryRequestOptions cosmosQueryRequestOptions = new CosmosQueryRequestOptions(); @@ -245,4 +264,18 @@ private void validateResponse(CosmosStoredProcedureProperties properties, .isEqualTo(properties.getId()); } + + private void validateDiagnostics(CosmosStoredProcedureResponse response, boolean storedProcedureExecuted ) { + CosmosDiagnostics diagnostics = response.getDiagnostics(); + Duration duration = response.getDuration(); + Map responseHeaders = response.getResponseHeaders(); + assertThat(diagnostics).isNotNull(); + assertThat(duration).isNotNull(); + assertThat(duration.toMillis()).isGreaterThan(0); + assertThat(responseHeaders).isNotEmpty(); + if (storedProcedureExecuted) { + String responseAsString = response.getResponseAsString(); + assertThat(responseAsString).isNotNull(); + } + } } From 02b1e970832b26d2efbc2495ce2f899fcb29742a Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Thu, 29 Oct 2020 10:03:45 -0700 Subject: [PATCH 2/3] Code review comments --- .../StoredProcedureResponse.java | 4 ++ .../models/CosmosStoredProcedureResponse.java | 47 +------------------ 2 files changed, 5 insertions(+), 46 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StoredProcedureResponse.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StoredProcedureResponse.java index 02f2c869ed28..c32aeb55eb63 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StoredProcedureResponse.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StoredProcedureResponse.java @@ -135,4 +135,8 @@ public String getScriptLog() { public CosmosDiagnostics getCosmosDiagnostics() { return this.response.getCosmosDiagnostics(); } + + public RxDocumentServiceResponse getRxDocumentServiceResponse() { + return response; + } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java index 76b2c68f986a..c2a14864ff4f 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosStoredProcedureResponse.java @@ -2,15 +2,11 @@ // Licensed under the MIT License. package com.azure.cosmos.models; -import com.azure.cosmos.CosmosDiagnostics; import com.azure.cosmos.implementation.ResourceResponse; import com.azure.cosmos.implementation.StoredProcedure; import com.azure.cosmos.implementation.StoredProcedureResponse; import com.azure.cosmos.implementation.apachecommons.lang.StringUtils; -import java.time.Duration; -import java.util.Map; - /** * The type Cosmos stored procedure response. */ @@ -28,9 +24,8 @@ public class CosmosStoredProcedureResponse extends CosmosResponse(response.getRxDocumentServiceResponse(), StoredProcedure.class)); this.storedProcedureResponse = response; - } /** @@ -94,46 +89,6 @@ public double getRequestCharge() { return super.getRequestCharge(); } - @Override - public String getMaxResourceQuota() { - if (storedProcedureResponse != null) { - return storedProcedureResponse.getMaxResourceQuota(); - } - return super.getMaxResourceQuota(); - } - - @Override - public String getCurrentResourceQuotaUsage() { - if (storedProcedureResponse != null) { - return storedProcedureResponse.getCurrentResourceQuotaUsage(); - } - return super.getCurrentResourceQuotaUsage(); - } - - @Override - public Map getResponseHeaders() { - if (storedProcedureResponse != null) { - return storedProcedureResponse.getResponseHeaders(); - } - return super.getResponseHeaders(); - } - - @Override - public CosmosDiagnostics getDiagnostics() { - if (storedProcedureResponse != null) { - return storedProcedureResponse.getCosmosDiagnostics(); - } - return super.getDiagnostics(); - } - - @Override - public Duration getDuration() { - if (storedProcedureResponse != null) { - return storedProcedureResponse.getCosmosDiagnostics().getDuration(); - } - return super.getDuration(); - } - /** * Gets the response of the stored procedure as a string. * From 050a8b95d56eccc0f4878f227cd535af0e0a5c89 Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Thu, 29 Oct 2020 10:23:37 -0700 Subject: [PATCH 3/3] Fixing conflict resolution policy CRUD test --- .../com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java index e4c781f6f62a..9953ff84d20c 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/MultiMasterConflictResolutionTest.java @@ -81,7 +81,7 @@ public void conflictResolutionPolicyCRUD() { // when (e.StatusCode == HttpStatusCode.BadRequest) CosmosException dce = Utils.as(e, CosmosException.class); if (dce != null && dce.getStatusCode() == 400) { - assertThat(dce.getMessage()).contains("Invalid path '\\/a\\/b' for last writer wins conflict resolution"); + assertThat(dce.getMessage()).contains("Invalid path '\\\\\\/a\\\\\\/b' for last writer wins conflict resolution"); } else { throw e; }