Пример #1
0
        public void TestApplySessionForDataOperation()
        {
            List <ResourceType> resourceTypes = new List <ResourceType>()
            {
                ResourceType.Document,
                ResourceType.Conflict,
                ResourceType.Batch
            };

            List <OperationType> operationTypes = new List <OperationType>()
            {
                OperationType.Create,
                OperationType.Delete,
                OperationType.Read,
                OperationType.Upsert,
                OperationType.Replace
            };

            foreach (ResourceType resourceType in resourceTypes)
            {
                foreach (OperationType operationType in operationTypes)
                {
                    Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                                       resourceType,
                                       operationType),
                                   $"{resourceType}, {operationType}");

                    // Verify when user does set session token
                    DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                        operationType,
                        "Test",
                        resourceType,
                        AuthorizationTokenType.PrimaryMasterKey);

                    string dsrSessionToken = Guid.NewGuid().ToString();
                    dsr.Headers.Add(HttpConstants.HttpHeaders.SessionToken, dsrSessionToken);

                    GatewayStoreModel.ApplySessionToken(
                        dsr,
                        ConsistencyLevel.Session,
                        new Mock <ISessionContainer>().Object);

                    Assert.AreEqual(dsrSessionToken, dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);

                    // Verify when user does not set session token
                    DocumentServiceRequest dsrNoSessionToken = DocumentServiceRequest.CreateFromName(
                        operationType,
                        "Test",
                        resourceType,
                        AuthorizationTokenType.PrimaryMasterKey);

                    Mock <ISessionContainer> sMock = new Mock <ISessionContainer>();
                    sMock.Setup(x => x.ResolveGlobalSessionToken(dsrNoSessionToken)).Returns(dsrSessionToken);

                    GatewayStoreModel.ApplySessionToken(
                        dsrNoSessionToken,
                        ConsistencyLevel.Session,
                        sMock.Object);

                    Assert.AreEqual(dsrSessionToken, dsrNoSessionToken.Headers[HttpConstants.HttpHeaders.SessionToken]);
                }
            }

            // Verify stored procedure execute
            Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                               ResourceType.StoredProcedure,
                               OperationType.ExecuteJavaScript));

            DocumentServiceRequest dsrSprocExecute = DocumentServiceRequest.CreateFromName(
                OperationType.ExecuteJavaScript,
                "Test",
                ResourceType.StoredProcedure,
                AuthorizationTokenType.PrimaryMasterKey);

            string sessionToken = Guid.NewGuid().ToString();

            dsrSprocExecute.Headers.Add(HttpConstants.HttpHeaders.SessionToken, sessionToken);

            GatewayStoreModel.ApplySessionToken(
                dsrSprocExecute,
                ConsistencyLevel.Session,
                new Mock <ISessionContainer>().Object);

            Assert.AreEqual(sessionToken, dsrSprocExecute.Headers[HttpConstants.HttpHeaders.SessionToken]);
        }
Пример #2
0
        public void TestApplySessionForMasterOperation()
        {
            List <ResourceType> resourceTypes = new List <ResourceType>()
            {
                ResourceType.Database,
                ResourceType.Collection,
                ResourceType.User,
                ResourceType.Permission,
                ResourceType.StoredProcedure,
                ResourceType.Trigger,
                ResourceType.UserDefinedFunction,
                ResourceType.Offer,
                ResourceType.DatabaseAccount,
                ResourceType.PartitionKeyRange,
                ResourceType.UserDefinedType,
            };

            List <OperationType> operationTypes = new List <OperationType>()
            {
                OperationType.Create,
                OperationType.Delete,
                OperationType.Read,
                OperationType.Upsert,
                OperationType.Replace
            };

            foreach (ResourceType resourceType in resourceTypes)
            {
                foreach (OperationType operationType in operationTypes)
                {
                    Assert.IsTrue(GatewayStoreModel.IsMasterOperation(
                                      resourceType,
                                      operationType),
                                  $"{resourceType}, {operationType}");

                    DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                        operationType,
                        "Test",
                        resourceType,
                        AuthorizationTokenType.PrimaryMasterKey);

                    dsr.Headers.Add(HttpConstants.HttpHeaders.SessionToken, Guid.NewGuid().ToString());

                    GatewayStoreModel.ApplySessionToken(
                        dsr,
                        ConsistencyLevel.Session,
                        new Mock <ISessionContainer>().Object);

                    Assert.IsNull(dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                }
            }

            Assert.IsTrue(GatewayStoreModel.IsMasterOperation(
                              ResourceType.Document,
                              OperationType.QueryPlan));

            DocumentServiceRequest dsrQueryPlan = DocumentServiceRequest.CreateFromName(
                OperationType.QueryPlan,
                "Test",
                ResourceType.Document,
                AuthorizationTokenType.PrimaryMasterKey);

            dsrQueryPlan.Headers.Add(HttpConstants.HttpHeaders.SessionToken, Guid.NewGuid().ToString());

            GatewayStoreModel.ApplySessionToken(
                dsrQueryPlan,
                ConsistencyLevel.Session,
                new Mock <ISessionContainer>().Object);

            Assert.IsNull(dsrQueryPlan.Headers[HttpConstants.HttpHeaders.SessionToken]);
        }
Пример #3
0
        public void TestResolveSessionTokenFromParent_Gateway_AfterMerge()
        {
            SessionContainer sessionContainer = new SessionContainer("127.0.0.1");

            string collectionResourceId = ResourceId.NewDocumentCollectionId(42, 129).DocumentCollectionId.ToString();
            string collectionFullname   = "dbs/db1/colls/collName";

            // Set tokens for the parents
            string parentPKRangeId = "0";
            int    maxGlobalLsn    = 100;
            int    maxLsnRegion1   = 200;
            int    maxLsnRegion2   = 300;
            int    maxLsnRegion3   = 400;

            // Generate 2 tokens, one has max global but lower regional, the other lower global but higher regional
            // Expect the merge to contain all the maxes
            string parentSession = $"1#{maxGlobalLsn}#1={maxLsnRegion1 - 1}#2={maxLsnRegion2}#3={maxLsnRegion3 - 1}";

            sessionContainer.SetSessionToken(
                collectionResourceId,
                collectionFullname,
                new StoreRequestNameValueCollection()
            {
                { HttpConstants.HttpHeaders.SessionToken, $"{parentPKRangeId}:{parentSession}" }
            }
                );

            string parent2PKRangeId = "1";
            string parent2Session   = $"1#{maxGlobalLsn - 1}#1={maxLsnRegion1}#2={maxLsnRegion2 - 1}#3={maxLsnRegion3}";

            sessionContainer.SetSessionToken(
                collectionResourceId,
                collectionFullname,
                new StoreRequestNameValueCollection()
            {
                { HttpConstants.HttpHeaders.SessionToken, $"{parent2PKRangeId}:{parent2Session}" }
            }
                );

            string tokenWithAllMax = $"1#{maxGlobalLsn}#1={maxLsnRegion1}#2={maxLsnRegion2}#3={maxLsnRegion3}";

            // Request for a child from both parents
            string childPKRangeId = "2";

            DocumentServiceRequest documentServiceRequestToChild1 = DocumentServiceRequest.CreateFromName(OperationType.Read, "dbs/db1/colls/collName/docs/42", ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null);

            documentServiceRequestToChild1.RequestContext.ResolvedPartitionKeyRange = new PartitionKeyRange()
            {
                Id           = childPKRangeId,
                MinInclusive = "",
                MaxExclusive = "FF",
                Parents      = new Collection <string>()
                {
                    parentPKRangeId, parent2PKRangeId
                }                                                                        // PartitionKeyRange says who are the parents
            };

            string resolvedToken = sessionContainer.ResolvePartitionLocalSessionTokenForGateway(
                documentServiceRequestToChild1,
                childPKRangeId);// For one of the children

            // Expect the resulting token is for the child partition but containing all maxes of the lsn of the parents
            Assert.AreEqual($"{childPKRangeId}:{tokenWithAllMax}", resolvedToken);
        }
Пример #4
0
        public async Task TestApplySessionForDataOperation()
        {
            List <ResourceType> resourceTypes = new List <ResourceType>()
            {
                ResourceType.Document,
                ResourceType.Conflict,
                ResourceType.Batch
            };

            List <OperationType> operationTypes = new List <OperationType>()
            {
                OperationType.Create,
                OperationType.Delete,
                OperationType.Read,
                OperationType.Upsert,
                OperationType.Replace
            };

            foreach (ResourceType resourceType in resourceTypes)
            {
                foreach (OperationType operationType in operationTypes)
                {
                    Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                                       resourceType,
                                       operationType),
                                   $"{resourceType}, {operationType}");
                    {
                        // Verify when user does set session token
                        DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                            operationType,
                            "Test",
                            resourceType,
                            AuthorizationTokenType.PrimaryMasterKey);

                        string dsrSessionToken = Guid.NewGuid().ToString();
                        dsr.Headers.Add(HttpConstants.HttpHeaders.SessionToken, dsrSessionToken);

                        await GatewayStoreModel.ApplySessionTokenAsync(
                            dsr,
                            ConsistencyLevel.Session,
                            new Mock <ISessionContainer>().Object,
                            partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                            clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


                        Assert.AreEqual(dsrSessionToken, dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                    }

                    {
                        // Verify when user does not set session token
                        DocumentServiceRequest dsrNoSessionToken = DocumentServiceRequest.CreateFromName(
                            operationType,
                            "Test",
                            resourceType,
                            AuthorizationTokenType.PrimaryMasterKey);

                        string dsrSessionToken         = Guid.NewGuid().ToString();
                        Mock <ISessionContainer> sMock = new Mock <ISessionContainer>();
                        sMock.Setup(x => x.ResolveGlobalSessionToken(dsrNoSessionToken)).Returns(dsrSessionToken);

                        await GatewayStoreModel.ApplySessionTokenAsync(
                            dsrNoSessionToken,
                            ConsistencyLevel.Session,
                            sMock.Object,
                            partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                            clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


                        if (dsrNoSessionToken.IsReadOnlyRequest || dsrNoSessionToken.OperationType == OperationType.Batch)
                        {
                            Assert.AreEqual(dsrSessionToken, dsrNoSessionToken.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                        else
                        {
                            Assert.IsNull(dsrNoSessionToken.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                    }

                    {
                        // Verify when partition key range is configured
                        DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                            operationType,
                            "Test",
                            resourceType,
                            AuthorizationTokenType.PrimaryMasterKey);

                        string partitionKeyRangeId = "1";
                        dsr.Headers[WFConstants.BackendHeaders.PartitionKeyRangeId] = new PartitionKeyRangeIdentity(partitionKeyRangeId).ToHeader();

                        string dsrSessionToken         = Guid.NewGuid().ToString();
                        Mock <ISessionContainer> sMock = new Mock <ISessionContainer>();
                        sMock.Setup(x => x.ResolveGlobalSessionToken(dsr)).Returns(dsrSessionToken);

                        ContainerProperties containerProperties = ContainerProperties.CreateWithResourceId("ccZ1ANCszwk=");
                        containerProperties.Id = "TestId";
                        containerProperties.PartitionKeyPath = "/pk";

                        Mock <CollectionCache> mockCollectionCahce = new Mock <CollectionCache>(MockBehavior.Strict);
                        mockCollectionCahce.Setup(x => x.ResolveCollectionAsync(
                                                      dsr,
                                                      It.IsAny <CancellationToken>(),
                                                      NoOpTrace.Singleton)).Returns(Task.FromResult(containerProperties));

                        Mock <PartitionKeyRangeCache> mockPartitionKeyRangeCache = new Mock <PartitionKeyRangeCache>(MockBehavior.Strict, null, null, null);
                        mockPartitionKeyRangeCache.Setup(x => x.TryGetPartitionKeyRangeByIdAsync(
                                                             containerProperties.ResourceId,
                                                             partitionKeyRangeId,
                                                             It.IsAny <ITrace>(),
                                                             false)).Returns(Task.FromResult(new PartitionKeyRange()));

                        await GatewayStoreModel.ApplySessionTokenAsync(
                            dsr,
                            ConsistencyLevel.Session,
                            sMock.Object,
                            partitionKeyRangeCache : mockPartitionKeyRangeCache.Object,
                            clientCollectionCache : mockCollectionCahce.Object);

                        if (dsr.IsReadOnlyRequest || dsr.OperationType == OperationType.Batch)
                        {
                            Assert.AreEqual(dsrSessionToken, dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                        else
                        {
                            Assert.IsNull(dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                    }
                }
            }

            // Verify stored procedure execute
            Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                               ResourceType.StoredProcedure,
                               OperationType.ExecuteJavaScript));

            DocumentServiceRequest dsrSprocExecute = DocumentServiceRequest.CreateFromName(
                OperationType.ExecuteJavaScript,
                "Test",
                ResourceType.StoredProcedure,
                AuthorizationTokenType.PrimaryMasterKey);

            string sessionToken = Guid.NewGuid().ToString();

            dsrSprocExecute.Headers.Add(HttpConstants.HttpHeaders.SessionToken, sessionToken);

            await GatewayStoreModel.ApplySessionTokenAsync(
                dsrSprocExecute,
                ConsistencyLevel.Session,
                new Mock <ISessionContainer>().Object,
                partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


            Assert.AreEqual(sessionToken, dsrSprocExecute.Headers[HttpConstants.HttpHeaders.SessionToken]);
        }
Пример #5
0
        public void TestResolveSessionTokenFromParent_Gateway_AfterSplit()
        {
            SessionContainer sessionContainer = new SessionContainer("127.0.0.1");

            string collectionResourceId = ResourceId.NewDocumentCollectionId(42, 129).DocumentCollectionId.ToString();
            string collectionFullname   = "dbs/db1/colls/collName";

            // Set token for the parent
            string parentPKRangeId = "0";
            string parentSession   = "1#100#4=90#5=1";

            sessionContainer.SetSessionToken(
                collectionResourceId,
                collectionFullname,
                new StoreRequestNameValueCollection()
            {
                { HttpConstants.HttpHeaders.SessionToken, $"{parentPKRangeId}:{parentSession}" }
            }
                );

            // We send requests for the children

            string childPKRangeId  = "1";
            string childPKRangeId2 = "1";

            DocumentServiceRequest documentServiceRequestToChild1 = DocumentServiceRequest.CreateFromName(OperationType.Read, "dbs/db1/colls/collName/docs/42", ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null);

            documentServiceRequestToChild1.RequestContext.ResolvedPartitionKeyRange = new PartitionKeyRange()
            {
                Id           = childPKRangeId,
                MinInclusive = "",
                MaxExclusive = "AA",
                Parents      = new Collection <string>()
                {
                    parentPKRangeId
                }                                                      // PartitionKeyRange says who is the parent
            };

            string resolvedToken = sessionContainer.ResolvePartitionLocalSessionTokenForGateway(
                documentServiceRequestToChild1,
                childPKRangeId);// For one of the children

            Assert.AreEqual($"{childPKRangeId}:{parentSession}", resolvedToken);

            DocumentServiceRequest documentServiceRequestToChild2 = DocumentServiceRequest.CreateFromName(OperationType.Read, "dbs/db1/colls/collName/docs/42", ResourceType.Document, AuthorizationTokenType.PrimaryMasterKey, null);

            documentServiceRequestToChild2.RequestContext.ResolvedPartitionKeyRange = new PartitionKeyRange()
            {
                Id           = childPKRangeId2,
                MinInclusive = "AA",
                MaxExclusive = "FF",
                Parents      = new Collection <string>()
                {
                    parentPKRangeId
                }                                                      // PartitionKeyRange says who is the parent
            };

            resolvedToken = sessionContainer.ResolvePartitionLocalSessionTokenForGateway(
                documentServiceRequestToChild2,
                childPKRangeId2);// For the other child

            Assert.AreEqual($"{childPKRangeId2}:{parentSession}", resolvedToken);
        }