コード例 #1
0
        public async Task IteratorTest()
        {
            string sprocBody      = "function() { { var x = 42; } }";
            int    numberOfSprocs = 3;

            string[] sprocIds = new string[numberOfSprocs];

            for (int i = 0; i < numberOfSprocs; i++)
            {
                string sprocId = Guid.NewGuid().ToString();
                sprocIds[i] = sprocId;

                CosmosStoredProcedureResponse storedProcedureResponse =
                    await this.container.StoredProcedures.CreateStoredProceducreAsync(sprocId, sprocBody);

                Assert.AreEqual(HttpStatusCode.Created, storedProcedureResponse.StatusCode);
            }

            List <string> readSprocIds = new List <string>();
            CosmosResultSetIterator <CosmosStoredProcedureSettings> iter = this.container.StoredProcedures.GetStoredProcedureIterator();

            while (iter.HasMoreResults)
            {
                CosmosQueryResponse <CosmosStoredProcedureSettings> currentResultSet = await iter.FetchNextSetAsync();

                {
                    foreach (CosmosStoredProcedureSettings storedProcedureSettingsEntry in currentResultSet)
                    {
                        readSprocIds.Add(storedProcedureSettingsEntry.Id);
                    }
                }
            }

            CollectionAssert.AreEquivalent(sprocIds, readSprocIds);
        }
コード例 #2
0
        public async Task DeleteNonExistingTest()
        {
            string sprocId = Guid.NewGuid().ToString();

            CosmosStoredProcedure         storedProcedure         = this.container.StoredProcedures[sprocId];
            CosmosStoredProcedureResponse storedProcedureResponse = storedProcedureResponse = await storedProcedure.DeleteAsync();

            Assert.AreEqual(HttpStatusCode.NotFound, storedProcedureResponse.StatusCode);
        }
コード例 #3
0
        private static void ValidateStoredProcedureSettings(string id, string body, CosmosStoredProcedureResponse cosmosResponse)
        {
            CosmosStoredProcedureSettings settings = cosmosResponse.Resource;

            Assert.AreEqual(id, settings.Id,
                            "Stored Procedure id do not match");
            Assert.AreEqual(body, settings.Body,
                            "Stored Procedure functions do not match");
        }
コード例 #4
0
        public async Task ExecuteTestWithParameter()
        {
            string sprocId   = Guid.NewGuid().ToString();
            string sprocBody = @"function(param1) {
                var context = getContext();
                var response = context.getResponse();
                response.setBody(param1);
            }";

            CosmosStoredProcedureResponse storedProcedureResponse =
                await this.container.StoredProcedures.CreateStoredProceducreAsync(sprocId, sprocBody);

            Assert.AreEqual(HttpStatusCode.Created, storedProcedureResponse.StatusCode);
            StoredProcedureTests.ValidateStoredProcedureSettings(sprocId, sprocBody, storedProcedureResponse);

            // Insert document and then query
            string testPartitionId = Guid.NewGuid().ToString();
            var    payload         = new { id = testPartitionId, user = testPartitionId };
            CosmosItemResponse <dynamic> createItemResponse = await this.container.Items.CreateItemAsync <dynamic>(testPartitionId, payload);

            Assert.AreEqual(HttpStatusCode.Created, createItemResponse.StatusCode);

            CosmosStoredProcedure       storedProcedure = storedProcedureResponse.StoredProcedure;
            CosmosItemResponse <string> sprocResponse   = await storedProcedure.ExecuteAsync <string[], string>(testPartitionId, new string[] { "one" });

            Assert.AreEqual(HttpStatusCode.OK, sprocResponse.StatusCode);

            string stringResponse = sprocResponse.Resource;

            Assert.IsNotNull(stringResponse);
            Assert.AreEqual("one", stringResponse);

            CosmosItemResponse <string> sprocResponse2 = await storedProcedure.ExecuteAsync <string, string>(testPartitionId, "one");

            Assert.AreEqual(HttpStatusCode.OK, sprocResponse2.StatusCode);

            string stringResponse2 = sprocResponse2.Resource;

            Assert.IsNotNull(stringResponse2);
            Assert.AreEqual("one", stringResponse2);

            storedProcedureResponse = await storedProcedureResponse.StoredProcedure.DeleteAsync();

            Assert.AreEqual(HttpStatusCode.NoContent, storedProcedureResponse.StatusCode);
        }
コード例 #5
0
        public async Task ExecuteTest()
        {
            string sprocId   = Guid.NewGuid().ToString();
            string sprocBody = @"function() {
                var context = getContext();
                var response = context.getResponse();
                var collection = context.getCollection();
                var collectionLink = collection.getSelfLink();

                var filterQuery = 'SELECT * FROM c';

                collection.queryDocuments(collectionLink, filterQuery, { },
                    function(err, documents) {
                        response.setBody(documents);
                    }
                );
            }";

            CosmosStoredProcedureResponse storedProcedureResponse =
                await this.container.StoredProcedures.CreateStoredProceducreAsync(sprocId, sprocBody);

            Assert.AreEqual(HttpStatusCode.Created, storedProcedureResponse.StatusCode);
            StoredProcedureTests.ValidateStoredProcedureSettings(sprocId, sprocBody, storedProcedureResponse);

            // Insert document and then query
            string testPartitionId = Guid.NewGuid().ToString();
            var    payload         = new { id = testPartitionId, user = testPartitionId };
            CosmosItemResponse <dynamic> createItemResponse = await this.container.Items.CreateItemAsync <dynamic>(testPartitionId, payload);

            Assert.AreEqual(HttpStatusCode.Created, createItemResponse.StatusCode);

            CosmosStoredProcedure       storedProcedure = storedProcedureResponse;
            CosmosItemResponse <JArray> sprocResponse   = await storedProcedure.ExecuteAsync <object, JArray>(testPartitionId, null);

            Assert.AreEqual(HttpStatusCode.OK, sprocResponse.StatusCode);

            JArray jArray = sprocResponse;

            Assert.AreEqual(1, jArray.Count);

            storedProcedureResponse = await storedProcedureResponse.StoredProcedure.DeleteAsync();

            Assert.AreEqual(HttpStatusCode.NoContent, storedProcedureResponse.StatusCode);
        }
コード例 #6
0
        public async Task SprocContractTest()
        {
            string sprocId   = Guid.NewGuid().ToString();
            string sprocBody = "function() { { var x = 42; } }";

            CosmosStoredProcedureResponse storedProcedureResponse =
                await this.container.StoredProcedures.CreateStoredProcedureAsync(sprocId, sprocBody);

            Assert.AreEqual(HttpStatusCode.Created, storedProcedureResponse.StatusCode);
            Assert.IsTrue(storedProcedureResponse.RequestCharge > 0);

            CosmosStoredProcedureSettings sprocSettings = storedProcedureResponse;

            Assert.AreEqual(sprocId, sprocSettings.Id);
            Assert.IsNotNull(sprocSettings.ResourceId);
            Assert.IsNotNull(sprocSettings.ETag);
            Assert.IsTrue(sprocSettings.LastModified.HasValue);

            Assert.IsTrue(sprocSettings.LastModified.Value > new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), sprocSettings.LastModified.Value.ToString());
        }
コード例 #7
0
        public async Task CRUDTest()
        {
            string sprocId   = Guid.NewGuid().ToString();
            string sprocBody = "function() { { var x = 42; } }";

            CosmosStoredProcedureResponse storedProcedureResponse =
                await this.container.StoredProcedures.CreateStoredProceducreAsync(sprocId, sprocBody);

            double requestCharge = storedProcedureResponse.RequestCharge;

            Assert.IsTrue(requestCharge > 0);
            Assert.AreEqual(HttpStatusCode.Created, storedProcedureResponse.StatusCode);
            StoredProcedureTests.ValidateStoredProcedureSettings(sprocId, sprocBody, storedProcedureResponse);

            storedProcedureResponse = await storedProcedureResponse.StoredProcedure.ReadAsync();

            requestCharge = storedProcedureResponse.RequestCharge;
            Assert.IsTrue(requestCharge > 0);
            Assert.AreEqual(HttpStatusCode.OK, storedProcedureResponse.StatusCode);
            StoredProcedureTests.ValidateStoredProcedureSettings(sprocId, sprocBody, storedProcedureResponse);

            string updatedBody = @"function(name) { var context = getContext();
                    var response = context.getResponse();
                    response.setBody(""hello there "" + name);
                }";
            CosmosStoredProcedureResponse replaceResponse = await storedProcedureResponse.StoredProcedure.ReplaceAsync(updatedBody);

            StoredProcedureTests.ValidateStoredProcedureSettings(sprocId, updatedBody, replaceResponse);
            requestCharge = replaceResponse.RequestCharge;
            Assert.IsTrue(requestCharge > 0);
            Assert.AreEqual(HttpStatusCode.OK, replaceResponse.StatusCode);
            StoredProcedureTests.ValidateStoredProcedureSettings(sprocId, updatedBody, replaceResponse);


            storedProcedureResponse = await replaceResponse.StoredProcedure.DeleteAsync();

            requestCharge = storedProcedureResponse.RequestCharge;
            Assert.IsTrue(requestCharge > 0);
            Assert.AreEqual(HttpStatusCode.NoContent, storedProcedureResponse.StatusCode);
        }
コード例 #8
0
        public async Task ImplicitConversionTest()
        {
            string sprocId   = Guid.NewGuid().ToString();
            string sprocBody = "function() { { var x = 42; } }";

            CosmosStoredProcedureResponse storedProcedureResponse =
                await this.container.StoredProcedures.CreateStoredProceducreAsync(sprocId, sprocBody);

            CosmosStoredProcedure         cosmosStoredProcedure         = storedProcedureResponse;
            CosmosStoredProcedureSettings cosmosStoredProcedureSettings = storedProcedureResponse;

            Assert.AreEqual(HttpStatusCode.Created, storedProcedureResponse.StatusCode);
            Assert.IsNotNull(cosmosStoredProcedure);
            Assert.IsNotNull(cosmosStoredProcedureSettings);

            storedProcedureResponse = await storedProcedureResponse.StoredProcedure.DeleteAsync();

            cosmosStoredProcedure         = storedProcedureResponse;
            cosmosStoredProcedureSettings = storedProcedureResponse;
            Assert.IsNotNull(cosmosStoredProcedure);
            Assert.IsNull(cosmosStoredProcedureSettings);
        }
コード例 #9
0
        private void ValidateStoredProcedureSettings(CosmosStoredProcedureSettings storedProcedureSettings, CosmosStoredProcedureResponse cosmosResponse)
        {
            CosmosStoredProcedureSettings settings = cosmosResponse.Resource;

            Assert.AreEqual(storedProcedureSettings.Body, settings.Body,
                            "Stored Procedure functions do not match");
            Assert.AreEqual(storedProcedureSettings.Id, settings.Id,
                            "Stored Procedure id do not match");
            Assert.IsTrue(cosmosResponse.RequestCharge > 0);
            Assert.IsNotNull(cosmosResponse.MaxResourceQuota);
            Assert.IsNotNull(cosmosResponse.CurrentResourceQuotaUsage);
        }
コード例 #10
0
        public async Task TestReducePageSizeScenario()
        {
            int partitionKey = 0;
            // Create some docs to make sure that one separate response is returned for 1st execute of query before retries.
            // These are to make sure continuation token is passed along during retries.
            string sprocId   = "createTwoDocs";
            string sprocBody = @"function(startIndex) { for (var i = 0; i < 2; ++i) __.createDocument(
                            __.getSelfLink(),
                            { id: 'doc' + (i + startIndex).toString(), value: 'y'.repeat(1500000), pk:0 },
                            err => { if (err) throw err;}
                        );}";

            CosmosStoredProcedureResponse storedProcedureResponse =
                await this.Container.StoredProcedures.CreateStoredProcedureAsync(sprocId, sprocBody);

            ManualResetEvent allDocsProcessed = new ManualResetEvent(false);

            int    processedDocCount      = 0;
            string accumulator            = string.Empty;
            ChangeFeedProcessor processor = this.Container.Items
                                            .CreateChangeFeedProcessorBuilder("test", (IReadOnlyList <dynamic> docs, CancellationToken token) =>
            {
                processedDocCount += docs.Count;
                foreach (var doc in docs)
                {
                    accumulator += doc.id.ToString() + ".";
                }
                if (processedDocCount == 6)
                {
                    allDocsProcessed.Set();
                }

                return(Task.CompletedTask);
            })
                                            .WithInstanceName("random")
                                            .WithCosmosLeaseContainer(this.LeaseContainer).Build();

            // Start the processor, insert 1 document to generate a checkpoint
            await processor.StartAsync();

            await Task.Delay(BaseChangeFeedClientHelper.ChangeFeedSetupTime);

            await this.Container.Items.CreateItemAsync(partitionKey, new { id = "doc10", pk = 0 });

            await Task.Delay(BaseChangeFeedClientHelper.ChangeFeedCleanupTime);

            await processor.StopAsync();

            // Generate the payload
            await storedProcedureResponse.StoredProcedure.ExecuteAsync <int, object>(partitionKey, 0);

            // Create 3 docs each 1.5MB. All 3 do not fit into MAX_RESPONSE_SIZE (4 MB). 2nd and 3rd are in same transaction.
            var content = string.Format("{{\"id\": \"doc2\", \"value\": \"{0}\", \"pk\": 0}}", new string('x', 1500000));

            await this.Container.Items.CreateItemAsync(partitionKey, JsonConvert.DeserializeObject <dynamic>(content));

            await storedProcedureResponse.StoredProcedure.ExecuteAsync <int, object>(partitionKey, 3);

            await processor.StartAsync();

            // Letting processor initialize and pickup changes
            var isStartOk = allDocsProcessed.WaitOne(10 * BaseChangeFeedClientHelper.ChangeFeedSetupTime);
            await processor.StopAsync();

            Assert.IsTrue(isStartOk, "Timed out waiting for docs to process");
            Assert.AreEqual("doc10.doc0.doc1.doc2.doc3.doc4.", accumulator);
        }