public void QueryWithFormat()
        {
#if (NETCOREAPP1_0 || NETCOREAPP2_0)
            Dictionary <string, string> testCases = new Dictionary <string, string>()
            {
                { "Customers?$format=application/json", "application/json" },
                { "Customers?$format=application/json;odata.metadata=full", "application/json; odata.metadata=full" },
                { "Customers?$format=json", "application/json" },
            };
#else
            Dictionary <string, string> testCases = new Dictionary <string, string>()
            {
                { "Customers?$format=application/json", "application/json" },
                { "Customers?$format=application/json;odata.metadata=full", "application/json;odata.metadata=full" },
                { "Customers?$format=json", "application/json" },
            };
#endif

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };
            foreach (var testCase in testCases)
            {
                var requestMessage  = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute));
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(200, responseMessage.StatusCode);

                string contentType = responseMessage.Headers.FirstOrDefault(x => x.Key.Equals("Content-Type")).Value;
                Assert.True(contentType.StartsWith(testCase.Value),
                            string.Format("contentType is '{0}', when the expected string starts with '{1}'", contentType, testCase.Value));

                using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                {
                    var reader = messageReader.CreateODataResourceSetReader();

                    while (reader.Read())
                    {
                        if (reader.State == ODataReaderState.ResourceEnd)
                        {
                            ODataResource entry = reader.Item as ODataResource;
                            if (entry != null && entry.TypeName.EndsWith("Customer"))
                            {
                                Assert.NotNull(entry.Properties.Single(p => p.Name == "PersonID").Value);
                            }
                        }
                    }

                    Assert.Equal(ODataReaderState.Completed, reader.State);
                }
            }
        }
Ejemplo n.º 2
0
        public void TestCreateODataResourceSetReader_WithoutEntitySetOrType_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage       request  = CreateRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel model = CreateModel();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                ExceptionAssert.DoesNotThrow(() => reader.CreateODataResourceSetReader());
            }
        }
Ejemplo n.º 3
0
        public async Task <ODataResponse> GetResponseAsync(IODataResponseMessageAsync responseMessage)
        {
            var readerSettings = new ODataMessageReaderSettings();

            // TODO ODataLib7
            //if (_session.Settings.IgnoreUnmappedProperties)
            //    readerSettings.UndeclaredPropertyBehaviorKinds = ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty;
            readerSettings.MessageQuotas.MaxReceivedMessageSize = Int32.MaxValue;
            readerSettings.ShouldIncludeAnnotation = x => _session.Settings.IncludeAnnotationsInResults;
            using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, _model))
            {
                var payloadKind = messageReader.DetectPayloadKind();
                if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Error))
                {
                    return(ODataResponse.FromStatusCode(responseMessage.StatusCode));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Value))
                {
                    if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        return(ODataResponse.FromValueStream(await responseMessage.GetStreamAsync().ConfigureAwait(false), responseMessage is ODataBatchOperationResponseMessage));
                    }
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Batch))
                {
                    return(await ReadResponse(messageReader.CreateODataBatchReader()).ConfigureAwait(false));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.ResourceSet))
                {
                    return(ReadResponse(messageReader.CreateODataResourceSetReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Collection))
                {
                    return(ReadResponse(messageReader.CreateODataCollectionReader()));
                }
                else if (payloadKind.Any(x => x.PayloadKind == ODataPayloadKind.Property))
                {
                    var property = messageReader.ReadProperty();
                    return(ODataResponse.FromProperty(property.Name, GetPropertyValue(property.Value)));
                }
                else
                {
                    return(ReadResponse(messageReader.CreateODataResourceReader()));
                }
            }
        }
Ejemplo n.º 4
0
        public void TestCreateODataResourceSetReader_WithEntitySetButWithoutType_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage       request  = CreateRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel     model     = CreateModel();
            IEdmEntitySet entitySet = model.EntityContainer.EntitySets().First();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                ExceptionAssert.DoesNotThrow(() => reader.CreateODataResourceSetReader(entitySet, null));
            }
        }
Ejemplo n.º 5
0
        public void TestCreateODataResourceSetReader_WithComplexTypeButWithoutSet_DoesNotThrow()
        {
            // Arrange
            IODataRequestMessage       request  = CreateRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel       model       = CreateModel();
            IEdmComplexType complexType = model.SchemaElements.OfType <IEdmComplexType>().First();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                ExceptionAssert.DoesNotThrow(() => reader.CreateODataResourceSetReader(complexType));
            }
        }
Ejemplo n.º 6
0
        public void TestCreateODataResourceSetReader_WithEntityTypeButWithoutSet_Throws()
        {
            // Arrange
            IODataRequestMessage       request  = CreateRequest();
            ODataMessageReaderSettings settings = CreateSettings();
            IEdmModel      model      = CreateModel();
            IEdmEntityType entityType = model.EntityContainer.EntitySets().First().EntityType();

            using (ODataMessageReader reader = new ODataMessageReader(request, settings, model))
            {
                // Act & Assert
                ExceptionAssert.Throws <ODataException>(() => reader.CreateODataResourceSetReader(entityType));
            }
        }
Ejemplo n.º 7
0
        private void PrimitiveValueInFilterInURL(string filterQuery)
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = this.ServiceUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new Microsoft.Test.OData.Tests.Client.Common.HttpWebRequestMessage(new Uri(this.ServiceUri.AbsoluteUri + filterQuery, UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, RetrieveServiceEdmModel()))
                    {
                        var reader = messageReader.CreateODataResourceSetReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                string pattern = filterQuery.Substring(0, filterQuery.IndexOf("?")) + "/" + dataPattern + "$";
                                Regex  rgx     = new Regex(pattern, RegexOptions.IgnoreCase);

                                ODataResource entry = reader.Item as ODataResource;
                                Assert.IsTrue(rgx.Match(entry.Id.ToString()).Success, "Expected : Entry's Id doesn't contain trailing when Key is Int64/float/double/decimal");
                                if (mimeType.Equals(MimeTypes.ApplicationJson + MimeTypes.ODataParameterFullMetadata))
                                {
                                    Assert.IsTrue(rgx.Match(entry.EditLink.ToString()).Success, "Expected : Entry's EditLink doesn't contain trailing when Key is Int64/float/double/decimal");
                                    Assert.IsTrue(rgx.Match(entry.ReadLink.ToString()).Success, "Expected : Entry's ReadLink doesn't contain trailing when Key is Int64/float/double/decimal");
                                }
                            }
                            else if (reader.State == ODataReaderState.ResourceSetEnd)
                            {
                                //TODO: Nextlink is appened by data service. So whether L|F|D|M could be returned in nextLink
                                var              pattern = filterQuery.Substring(0, filterQuery.IndexOf("?")) + @"\?\$filter=Id\sge\s" + dataPattern + @"(L|F|D|M)?&\$skiptoken=\d+$";
                                Regex            rgx     = new Regex(pattern, RegexOptions.IgnoreCase);
                                ODataResourceSet feed    = reader.Item as ODataResourceSet;
                                Assert.IsTrue(rgx.Match(feed.NextPageLink.ToString()).Success, "Expected : Feed's NextLink doesn't contain trailing when Key is Int64/float/double/decimal");
                            }
                        }
                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
Ejemplo n.º 8
0
        private IEnumerable <T> ReadFeedImpl <T>(Stream response, Db.OeEntitySetMetaAdapter entitySetMetaAdatpter)
        {
            IODataRequestMessage responseMessage = new OeInMemoryMessage(response, null);
            var settings = new ODataMessageReaderSettings()
            {
                EnableMessageStreamDisposal = false
            };
            var messageReader = new ODataMessageReader(responseMessage, settings, _edmModel);

            IEdmEntitySet entitySet = _edmModel.EntityContainer.FindEntitySet(entitySetMetaAdatpter.EntitySetName);
            ODataReader   reader    = messageReader.CreateODataResourceSetReader(entitySet, entitySet.EntityType());

            var stack = new Stack <StackItem>();

            while (reader.Read())
            {
                switch (reader.State)
                {
                case ODataReaderState.ResourceStart:
                    stack.Push(new StackItem((ODataResource)reader.Item));
                    break;

                case ODataReaderState.ResourceEnd:
                    StackItem stackItem = stack.Pop();

                    Object entity = CreateEntity(stackItem);
                    if (stack.Count == 0)
                    {
                        yield return((T)entity);
                    }
                    else
                    {
                        stack.Peek().AddEntry(entity);
                    }
                    break;

                case ODataReaderState.NestedResourceInfoStart:
                    stack.Push(new StackItem((ODataNestedResourceInfo)reader.Item));
                    break;

                case ODataReaderState.NestedResourceInfoEnd:
                    StackItem item = stack.Pop();
                    stack.Peek().AddLink((ODataNestedResourceInfo)item.Item, item.Value);
                    break;
                }
            }
        }
        public void ModelReferneceWithFilterOption()
        {
            Dictionary <string, int> testCases = new Dictionary <string, int>()
            {
                { "VehicleGPSSet?$filter=VehicleSpeed gt 90", 3 },
                { "DerivedVehicleGPSSet?$filter=DisplayName eq 'DisplayName4'", 1 },
            };

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var testCase in testCases)
            {
                foreach (var mimeType in mimeTypes)
                {
                    var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute));
                    requestMessage.SetHeader("Accept", mimeType);
                    var responseMessage = requestMessage.GetResponse();
                    Assert.Equal(200, responseMessage.StatusCode);

                    if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                    {
                        using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                        {
                            List <ODataResource> entries = new List <ODataResource>();

                            var reader = messageReader.CreateODataResourceSetReader();
                            while (reader.Read())
                            {
                                if (reader.State == ODataReaderState.ResourceEnd)
                                {
                                    var entry = reader.Item as ODataResource;
                                    if (entry.TypeName.Contains("VehicleGPSType"))
                                    {
                                        entries.Add(reader.Item as ODataResource);
                                    }
                                }
                            }
                            Assert.Equal(ODataReaderState.Completed, reader.State);
                            Assert.Equal(testCase.Value, entries.Count);
                        }
                    }
                }
            }
        }
Ejemplo n.º 10
0
        public void QueryEntitySet()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Products", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        List <ODataResource> entries = new List <ODataResource>();
                        var reader = messageReader.CreateODataResourceSetReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                ODataResource entry = reader.Item as ODataResource;
                                Assert.NotNull(entry);
                                entries.Add(entry);
                            }
                            else if (reader.State == ODataReaderState.ResourceSetEnd)
                            {
                                Assert.NotNull(reader.Item as ODataResourceSet);
                            }
                        }

                        Assert.Equal(ODataReaderState.Completed, reader.State);
                        Assert.Equal(5, entries.Count);

                        ODataEnumValue skinColor  = (ODataEnumValue)entries[1].Properties.Single(p => p.Name == "SkinColor").Value;
                        ODataEnumValue userAccess = (ODataEnumValue)entries[1].Properties.Single(p => p.Name == "UserAccess").Value;
                        Assert.Equal("Blue", skinColor.Value);
                        Assert.Equal("ReadWrite", userAccess.Value);
                    }
                }
            }
        }
Ejemplo n.º 11
0
        public void QueryWithOrderByTime()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Orders?$OrderBy=ShipTime", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    var list = new List <ODataResource>();
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        var reader = messageReader.CreateODataResourceSetReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                ODataResource entry = reader.Item as ODataResource;
                                if (entry != null)
                                {
                                    foreach (ODataResource pre in list)
                                    {
                                        TimeOfDay entryTimeOfDay = (TimeOfDay)entry.Properties.Single(p => p.Name == "ShipTime").Value;
                                        TimeOfDay preTimeOfDay   = (TimeOfDay)pre.Properties.Single(p => p.Name == "ShipTime").Value;
                                        Assert.True(preTimeOfDay > entryTimeOfDay);
                                    }

                                    list.Add(entry);
                                }
                            }
                        }
                        Assert.Equal(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
Ejemplo n.º 12
0
        public void QueryEntitiesOrderByEnumProperty()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Products?$orderby=SkinColor", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        List <ODataResource> entries = new List <ODataResource>();
                        var reader = messageReader.CreateODataResourceSetReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                ODataResource entry = reader.Item as ODataResource;
                                Assert.NotNull(entry);
                                entries.Add(entry);
                            }
                        }

                        Assert.Equal(ODataReaderState.Completed, reader.State);
                        Assert.Equal(5, entries.Count);

                        Assert.Equal(5, entries[0].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.Equal(7, entries[1].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.Equal(8, entries[2].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.Equal(9, entries[3].Properties.Single(p => p.Name == "ProductID").Value);
                        Assert.Equal(6, entries[4].Properties.Single(p => p.Name == "ProductID").Value);
                    }
                }
            }
        }
Ejemplo n.º 13
0
        private List <ODataResource> QueryFeed(string uri, string mimeType, params string[] entryTypeNames)
        {
            List <ODataResource>       entries        = new List <ODataResource>();
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + uri, UriKind.Absolute));

            requestMessage.SetHeader("Accept", mimeType);
            var responseMessage = requestMessage.GetResponse();

            Assert.AreEqual(200, responseMessage.StatusCode);

            if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
            {
                using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                {
                    var reader = messageReader.CreateODataResourceSetReader();

                    while (reader.Read())
                    {
                        if (reader.State == ODataReaderState.ResourceEnd)
                        {
                            ODataResource entry = reader.Item as ODataResource;
                            if (entry != null && (entryTypeNames.Length == 0 || entryTypeNames.Any(e => entry.TypeName.Contains(e))))
                            {
                                entries.Add(entry);
                            }
                        }
                        else if (reader.State == ODataReaderState.ResourceSetEnd)
                        {
                            Assert.IsNotNull(reader.Item as ODataResourceSet);
                        }
                    }
                    Assert.AreEqual(ODataReaderState.Completed, reader.State);
                }
            }

            return(entries);
        }
        private void SendRequestAndVerifyResponse(Dictionary <string, int> testCases)
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var testCase in testCases)
            {
                foreach (var mimeType in mimeTypes)
                {
                    var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute));
                    requestMessage.SetHeader("Accept", mimeType);
                    var responseMessage = requestMessage.GetResponse();
                    Assert.AreEqual(200, responseMessage.StatusCode);
                    if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                    {
                        ODataResource entry = null;
                        using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                        {
                            var reader = messageReader.CreateODataResourceSetReader();

                            while (reader.Read())
                            {
                                if (reader.State == ODataReaderState.ResourceEnd)
                                {
                                    entry = reader.Item as ODataResource;
                                }
                                else if (reader.State == ODataReaderState.ResourceSetEnd)
                                {
                                    Assert.IsNotNull(reader.Item as ODataResourceSet);
                                }
                            }
                        }

                        Assert.IsNotNull(entry);
                        Assert.AreEqual(testCase.Value, entry.Properties.Single(p => p.Name == "PersonID").Value,
                                        String.Format("Mime:{0},URL:{1}", mimeType, testCase.Key));
                    }
                }
            }
        }
        public void QueryEntitySet()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Customers", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        var reader = messageReader.CreateODataResourceSetReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                ODataResource entry = reader.Item as ODataResource;
                                if (entry != null && entry.TypeName.EndsWith("Customer"))
                                {
                                    Assert.IsNotNull(entry.Properties.Single(p => p.Name == "PersonID").Value);
                                }
                            }
                            else if (reader.State == ODataReaderState.ResourceSetEnd)
                            {
                                Assert.IsNotNull(reader.Item as ODataResourceSet);
                            }
                        }

                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
        public void FeedTypeDerivedFromReferencedModel()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "DerivedVehicleGPSSet", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        var           reader = messageReader.CreateODataResourceSetReader();
                        ODataResource entry  = null;

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                entry = reader.Item as ODataResource;
                            }
                            else if (reader.State == ODataReaderState.ResourceSetEnd)
                            {
                                Assert.NotNull(reader.Item as ODataResourceSet);
                            }
                        }

                        Assert.NotNull(entry.Properties.Single(p => p.Name == "DisplayName").Value);
                        // string.Format("{0}.TruckDemo.DerivedVehicleGPSType", TestModelNameSpace)
                        Assert.NotNull(entry.TypeName);
                        Assert.Equal(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
        public void ModelReferenceWithOrderbyOption()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(
                    new Uri(ServiceBaseUri.AbsoluteUri + "DerivedVehicleGPSSet?$orderby=DisplayName desc", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        List <ODataResource> entries = new List <ODataResource>();

                        var reader = messageReader.CreateODataResourceSetReader();
                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                var resource = reader.Item as ODataResource;
                                if (resource.TypeName.Contains("VehicleGPSType"))
                                {
                                    entries.Add(reader.Item as ODataResource);
                                }
                            }
                        }

                        Assert.Equal(ODataReaderState.Completed, reader.State);
                        Assert.Equal("DisplayName5", entries[0].Properties.SingleOrDefault(p => p.Name == "DisplayName").Value);
                        Assert.Equal("DisplayName4", entries[1].Properties.SingleOrDefault(p => p.Name == "DisplayName").Value);
                    }
                }
            }
        }
Ejemplo n.º 18
0
        public void QueryEntitiesSelectEnumProperty()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Products?$select=SkinColor,UserAccess", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        List <ODataResource> entries = new List <ODataResource>();
                        var reader = messageReader.CreateODataResourceSetReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                ODataResource entry = reader.Item as ODataResource;
                                Assert.IsNotNull(entry);
                                entries.Add(entry);
                            }
                        }

                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                        Assert.AreEqual(5, entries.Count);

                        Assert.AreEqual(false, entries[0].Properties.Any(p => p.Name != "SkinColor" && p.Name != "UserAccess"));
                    }
                }
            }
        }
Ejemplo n.º 19
0
        public List <ODataResource> QueryFeed(string requestUri, string mimeType)
        {
            List <ODataResource> entries = new List <ODataResource>();

            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = baseUri
            };
            var requestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + requestUri, UriKind.Absolute));

            requestMessage.SetHeader("Accept", mimeType);
            var responseMessage = requestMessage.GetResponse();

            Assert.AreEqual(200, responseMessage.StatusCode);

            if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
            {
                using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model))
                {
                    var reader = messageReader.CreateODataResourceSetReader();

                    while (reader.Read())
                    {
                        if (reader.State == ODataReaderState.ResourceEnd)
                        {
                            ODataResource entry = reader.Item as ODataResource;
                            entries.Add(entry);
                        }
                        else if (reader.State == ODataReaderState.ResourceSetEnd)
                        {
                            Assert.IsNotNull(reader.Item as ODataResourceSet);
                        }
                    }

                    Assert.AreEqual(ODataReaderState.Completed, reader.State);
                }
            }
            return(entries);
        }
        /// <inheritdoc />
        public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
        {
            if (messageReader == null)
            {
                throw Error.ArgumentNull("messageReader");
            }

            IEdmTypeReference edmType = readContext.GetEdmType(type);

            Contract.Assert(edmType != null);

            // TODO: is it ok to read the top level collection of entity?
            if (!(edmType.IsCollection() && edmType.AsCollection().ElementType().IsStructured()))
            {
                throw Error.Argument("edmType", SRResources.ArgumentMustBeOfType, EdmTypeKind.Complex + " or " + EdmTypeKind.Entity);
            }

            ODataReader resourceSetReader = messageReader.CreateODataResourceSetReader();
            object      resourceSet       = resourceSetReader.ReadResourceOrResourceSet();

            return(ReadInline(resourceSet, edmType, readContext));
        }
Ejemplo n.º 21
0
        public void QueryWithFilterTime()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "Orders?$filter=ShipTime eq 12:40:5.05", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.Equal(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        var reader = messageReader.CreateODataResourceSetReader();

                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                ODataResource entry = reader.Item as ODataResource;
                                if (entry != null)
                                {
                                    // Verify Date Property
                                    Assert.Equal(new Date(2014, 8, 31), entry.Properties.Single(p => p.Name == "ShipDate").Value);
                                    Assert.Equal(new TimeOfDay(12, 40, 5, 50), entry.Properties.Single(p => p.Name == "ShipTime").Value);
                                }
                            }
                        }
                        Assert.Equal(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
Ejemplo n.º 22
0
        public void FeedDefinedInReferencedModel()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "VehicleGPSSetInGPS", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(200, responseMessage.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
                    {
                        var           reader = messageReader.CreateODataResourceSetReader();
                        ODataResource entry  = null;
                        while (reader.Read())
                        {
                            if (reader.State == ODataReaderState.ResourceEnd)
                            {
                                entry = reader.Item as ODataResource;
                            }
                            else if (reader.State == ODataReaderState.ResourceSetEnd)
                            {
                                Assert.IsNotNull(reader.Item as ODataResourceSet);
                            }
                        }

                        Assert.IsNotNull(entry.Properties.Single(p => p.Name == "Key").Value);
                        Assert.AreEqual(ODataReaderState.Completed, reader.State);
                    }
                }
            }
        }
        public void CustomInstanceAnnotationFromFeedAndEntryInJsonLightShouldBeSkippedByTheReaderByDefault()
        {
            var stream         = new MemoryStream(Encoding.UTF8.GetBytes(JsonLightFeedAndEntryPayloadWithCustomInstanceAnnotations));
            var readerSettings = new ODataMessageReaderSettings {
                EnableMessageStreamDisposal = true
            };
            IODataResponseMessage messageToRead = new InMemoryMessage {
                StatusCode = 200, Stream = stream
            };

            messageToRead.SetHeader("Content-Type", "application/json;odata.streaming=true");

            using (var messageReader = new ODataMessageReader(messageToRead, readerSettings, Model))
            {
                var odataReader = messageReader.CreateODataResourceSetReader(EntitySet, EntityType);
                while (odataReader.Read())
                {
                    switch (odataReader.State)
                    {
                    case ODataReaderState.ResourceSetStart:
                    case ODataReaderState.ResourceSetEnd:
                        var resourceSet = Assert.IsType <ODataResourceSet>(odataReader.Item);
                        Assert.Empty(resourceSet.InstanceAnnotations);
                        break;

                    case ODataReaderState.NestedResourceInfoStart:
                    case ODataReaderState.NestedResourceInfoEnd:
                        break;

                    case ODataReaderState.ResourceStart:
                    case ODataReaderState.ResourceEnd:
                        Assert.Empty((odataReader.Item as ODataResource).InstanceAnnotations);
                        break;
                    }
                }
            }
        }
Ejemplo n.º 24
0
        private void BatchRequestWithPayloadUriWritingOption(BatchPayloadUriOption option)
        {
            var writerSettings = new ODataMessageWriterSettings();

            writerSettings.BaseUri = ServiceBaseUri;
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            var accountType                = Model.FindDeclaredType(NameSpacePrefix + "Account") as IEdmEntityType;
            var accountSet                 = Model.EntityContainer.FindEntitySet("Accounts");
            var paymentInstrumentType      = Model.FindDeclaredType(NameSpacePrefix + "PaymentInstrument") as IEdmEntityType;
            IEdmNavigationProperty navProp = accountType.FindProperty("MyPaymentInstruments") as IEdmNavigationProperty;
            var myPaymentInstrumentSet     = accountSet.FindNavigationTarget(navProp);

            var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "$batch"));

            requestMessage.SetHeader("Content-Type", "multipart/mixed;boundary=batch_01AD6766-4A45-47CC-9463-94D4591D8DA9");
            requestMessage.SetHeader("OData-Version", "4.0");
            requestMessage.Method = "POST";

            using (var messageWriter = new ODataMessageWriter(requestMessage, writerSettings, Model))
            {
                var batchWriter = messageWriter.CreateODataBatchWriter();

                //Batch start.
                batchWriter.WriteStartBatch();

                //A Get request.

                var batchOperation1 = batchWriter.CreateOperationRequestMessage("GET", new Uri(ServiceBaseUri + "Accounts(101)/MyPaymentInstruments"), null, option);
                batchOperation1.SetHeader("Accept", "application/json;odata.metadata=full");
                //Get request ends.

                //Changeset start.
                batchWriter.WriteStartChangeset();

                //The first operation in changeset is a Create request.

                ODataBatchOperationRequestMessage batchChangesetOperation1 = batchWriter.CreateOperationRequestMessage("POST", new Uri(ServiceBaseUri + "Accounts(102)/MyPaymentInstruments"), "1", option);
                batchChangesetOperation1.SetHeader("Content-Type", "application/json;odata.metadata=full");
                batchChangesetOperation1.SetHeader("Accept", "application/json;odata.metadata=full");
                var paymentInstrumentEntry = new ODataResource()
                {
                    TypeName = NameSpacePrefix + "PaymentInstrument"
                };
                var paymentInstrumentEntryP1 = new ODataProperty {
                    Name = "PaymentInstrumentID", Value = 102910
                };
                var paymentInstrumentEntryP2 = new ODataProperty {
                    Name = "FriendlyName", Value = "102 batch new PI"
                };
                var paymentInstrumentEntryP3 = new ODataProperty {
                    Name = "CreatedDate", Value = new DateTimeOffset(new DateTime(2013, 12, 29, 11, 11, 57))
                };
                paymentInstrumentEntry.Properties = new[] { paymentInstrumentEntryP1, paymentInstrumentEntryP2, paymentInstrumentEntryP3 };

                using (var entryMessageWriter = new ODataMessageWriter(batchChangesetOperation1, writerSettings, Model))
                {
                    var odataEntryWriter = entryMessageWriter.CreateODataResourceWriter(myPaymentInstrumentSet, paymentInstrumentType);
                    odataEntryWriter.WriteStart(paymentInstrumentEntry);
                    odataEntryWriter.WriteEnd();
                }

                //Changeset end.
                batchWriter.WriteEndChangeset();

                //Another Get request.

                var batchOperation2 = batchWriter.CreateOperationRequestMessage("GET", new Uri(ServiceBaseUri + "Accounts(103)/MyPaymentInstruments(103901)/BillingStatements(103901001)"), null, option);
                batchOperation2.SetHeader("Accept", "application/json;odata.metadata=full");

                //Batch end.
                batchWriter.WriteEndBatch();
            }

            var responseMessage = requestMessage.GetResponse();

            Assert.AreEqual(200, responseMessage.StatusCode);

            using (var innerMessageReader = new ODataMessageReader(responseMessage, readerSettings, Model))
            {
                var batchReader      = innerMessageReader.CreateODataBatchReader();
                int batchOperationId = 0;

                while (batchReader.Read())
                {
                    switch (batchReader.State)
                    {
                    case ODataBatchReaderState.Initial:
                        break;

                    case ODataBatchReaderState.ChangesetStart:
                        break;

                    case ODataBatchReaderState.ChangesetEnd:
                        break;

                    case ODataBatchReaderState.Operation:
                        ODataBatchOperationResponseMessage operationResponse = batchReader.CreateOperationResponseMessage();

                        using (var operationResponseReader = new ODataMessageReader(operationResponse, readerSettings, Model))
                        {
                            if (batchOperationId == 0)
                            {
                                // the first response message is a feed
                                var feedReader = operationResponseReader.CreateODataResourceSetReader();

                                Assert.AreEqual(200, operationResponse.StatusCode);
                                List <ODataResource> pis = new List <ODataResource>();
                                while (feedReader.Read())
                                {
                                    switch (feedReader.State)
                                    {
                                    case ODataReaderState.ResourceEnd:
                                        ODataResource entry = feedReader.Item as ODataResource;
                                        Assert.IsNotNull(entry);
                                        pis.Add(entry);
                                        break;
                                    }
                                }
                                Assert.AreEqual(ODataReaderState.Completed, feedReader.State);
                                Assert.AreEqual(3, pis.Count);
                            }
                            else if (batchOperationId == 1)
                            {
                                // the second response message is a creation response
                                var entryReader = operationResponseReader.CreateODataResourceReader();

                                Assert.AreEqual(201, operationResponse.StatusCode);
                                List <ODataResource> pis = new List <ODataResource>();
                                while (entryReader.Read())
                                {
                                    switch (entryReader.State)
                                    {
                                    case ODataReaderState.ResourceEnd:
                                        ODataResource entry = entryReader.Item as ODataResource;
                                        Assert.IsNotNull(entry);
                                        pis.Add(entry);
                                        break;
                                    }
                                }
                                Assert.AreEqual(ODataReaderState.Completed, entryReader.State);
                                Assert.AreEqual(1, pis.Count);
                                Assert.AreEqual(102910, pis[0].Properties.Single(p => p.Name == "PaymentInstrumentID").Value);
                            }
                            else if (batchOperationId == 2)
                            {
                                // the third response message is an entry
                                var entryReader = operationResponseReader.CreateODataResourceReader();

                                Assert.AreEqual(200, operationResponse.StatusCode);
                                List <ODataResource> statements = new List <ODataResource>();
                                while (entryReader.Read())
                                {
                                    switch (entryReader.State)
                                    {
                                    case ODataReaderState.ResourceEnd:
                                        ODataResource entry = entryReader.Item as ODataResource;
                                        Assert.IsNotNull(entry);
                                        statements.Add(entry);
                                        break;
                                    }
                                }
                                Assert.AreEqual(ODataReaderState.Completed, entryReader.State);
                                Assert.AreEqual(1, statements.Count);
                                Assert.AreEqual(103901001, statements[0].Properties.Single(p => p.Name == "StatementID").Value);
                            }
                        }
                        batchOperationId++;
                        break;
                    }
                }
                Assert.AreEqual(ODataBatchReaderState.Completed, batchReader.State);
            }
        }
Ejemplo n.º 25
0
        public void AsyncBatchRequestTest()
        {
            var writerSettings = new ODataMessageWriterSettings();

            writerSettings.BaseUri = ServiceBaseUri;
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            #region send a batch request with respond-async preference

            var accountType                = Model.FindDeclaredType(NameSpacePrefix + "Account") as IEdmEntityType;
            var accountSet                 = Model.EntityContainer.FindEntitySet("Accounts");
            var paymentInstrumentType      = Model.FindDeclaredType(NameSpacePrefix + "PaymentInstrument") as IEdmEntityType;
            IEdmNavigationProperty navProp = accountType.FindProperty("MyPaymentInstruments") as IEdmNavigationProperty;
            var myPaymentInstrumentSet     = accountSet.FindNavigationTarget(navProp);

            var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "$batch"));
            requestMessage.SetHeader("Content-Type", "multipart/mixed;boundary=batch_01AD6766-4A45-47CC-9463-94D4591D8DA9");
            requestMessage.SetHeader("OData-Version", "4.0");
            requestMessage.PreferHeader().RespondAsync = true; //Request the service to process asynchronously.
            requestMessage.Method = "POST";

            using (var messageWriter = new ODataMessageWriter(requestMessage, writerSettings, Model))
            {
                var batchWriter = messageWriter.CreateODataBatchWriter();

                //Batch start.
                batchWriter.WriteStartBatch();

                //A Get request.

                var batchOperation1 = batchWriter.CreateOperationRequestMessage("GET", new Uri(ServiceBaseUri + "Accounts(101)/MyPaymentInstruments"), null);
                batchOperation1.SetHeader("Accept", "application/json;odata.metadata=full");
                //Get request ends.

                //Changeset start.
                batchWriter.WriteStartChangeset();

                //The first operation in changeset is a Create request.

                ODataBatchOperationRequestMessage batchChangesetOperation1 = batchWriter.CreateOperationRequestMessage("POST", new Uri(ServiceBaseUri + "Accounts(102)/MyPaymentInstruments"), "1");
                batchChangesetOperation1.SetHeader("Content-Type", "application/json;odata.metadata=full");
                batchChangesetOperation1.SetHeader("Accept", "application/json;odata.metadata=full");
                var paymentInstrumentEntry = new ODataResource()
                {
                    TypeName = NameSpacePrefix + "PaymentInstrument"
                };
                var paymentInstrumentEntryP1 = new ODataProperty {
                    Name = "PaymentInstrumentID", Value = 102910
                };
                var paymentInstrumentEntryP2 = new ODataProperty {
                    Name = "FriendlyName", Value = "102 batch new PI"
                };
                var paymentInstrumentEntryP3 = new ODataProperty {
                    Name = "CreatedDate", Value = new DateTimeOffset(new DateTime(2013, 12, 29, 11, 11, 57))
                };
                paymentInstrumentEntry.Properties = new[] { paymentInstrumentEntryP1, paymentInstrumentEntryP2, paymentInstrumentEntryP3 };

                using (var entryMessageWriter = new ODataMessageWriter(batchChangesetOperation1, writerSettings, Model))
                {
                    var odataEntryWriter = entryMessageWriter.CreateODataResourceWriter(myPaymentInstrumentSet, paymentInstrumentType);
                    odataEntryWriter.WriteStart(paymentInstrumentEntry);
                    odataEntryWriter.WriteEnd();
                }

                //Changeset end.
                batchWriter.WriteEndChangeset();

                //Another Get request.

                var batchOperation2 = batchWriter.CreateOperationRequestMessage("GET", new Uri(ServiceBaseUri + "Accounts(103)/MyPaymentInstruments(103901)/BillingStatements(103901001)"), null);
                batchOperation2.SetHeader("Accept", "application/json;odata.metadata=full");

                //Batch end.
                batchWriter.WriteEndBatch();
            }

            var responseMessage = requestMessage.GetResponse();

            #endregion

            #region request the status monitor resource

            Assert.Equal(202, responseMessage.StatusCode);
            string monitorResource = responseMessage.GetHeader("Location");
            Assert.False(string.IsNullOrWhiteSpace(monitorResource));

            var statusCheckRequest1  = new HttpWebRequestMessage(new Uri(monitorResource));
            var statusCheckResponse1 = statusCheckRequest1.GetResponse();
            Assert.Equal(202, statusCheckResponse1.StatusCode);
            monitorResource = statusCheckResponse1.GetHeader("Location");
            Assert.False(string.IsNullOrWhiteSpace(monitorResource));

            //The request takes 5 seconds to finish in service, so we wait for 6 seconds.
            Thread.Sleep(6000);
            var statusCheckRequest2  = new HttpWebRequestMessage(new Uri(monitorResource));
            var statusCheckResponse2 = statusCheckRequest2.GetResponse();
            Assert.Equal(200, statusCheckResponse2.StatusCode);

            #endregion

            #region read and verify the response

            using (var messageReader = new ODataMessageReader(statusCheckResponse2, readerSettings, Model))
            {
                var asyncReader  = messageReader.CreateODataAsynchronousReader();
                var innerMessage = asyncReader.CreateResponseMessage();

                Assert.Equal(200, innerMessage.StatusCode);
                using (var innerMessageReader = new ODataMessageReader(innerMessage, readerSettings, Model))
                {
                    var batchReader = innerMessageReader.CreateODataBatchReader();

                    int batchOperationId = 0;
                    while (batchReader.Read())
                    {
                        switch (batchReader.State)
                        {
                        case ODataBatchReaderState.Initial:
                            break;

                        case ODataBatchReaderState.ChangesetStart:
                            break;

                        case ODataBatchReaderState.ChangesetEnd:
                            break;

                        case ODataBatchReaderState.Operation:
                            ODataBatchOperationResponseMessage operationResponse = batchReader.CreateOperationResponseMessage();

                            using (var operationResponseReader = new ODataMessageReader(operationResponse, readerSettings, Model))
                            {
                                if (batchOperationId == 0)
                                {
                                    // the first response message is a feed
                                    var feedReader = operationResponseReader.CreateODataResourceSetReader();

                                    Assert.Equal(200, operationResponse.StatusCode);
                                    List <ODataResource> pis = new List <ODataResource>();
                                    while (feedReader.Read())
                                    {
                                        switch (feedReader.State)
                                        {
                                        case ODataReaderState.ResourceEnd:
                                            ODataResource entry = feedReader.Item as ODataResource;
                                            Assert.NotNull(entry);
                                            pis.Add(entry);
                                            break;
                                        }
                                    }
                                    Assert.Equal(ODataReaderState.Completed, feedReader.State);
                                    Assert.Equal(3, pis.Count);
                                }
                                else if (batchOperationId == 1)
                                {
                                    // the second response message is a creation response
                                    var entryReader = operationResponseReader.CreateODataResourceReader();

                                    Assert.Equal(201, operationResponse.StatusCode);
                                    List <ODataResource> pis = new List <ODataResource>();
                                    while (entryReader.Read())
                                    {
                                        switch (entryReader.State)
                                        {
                                        case ODataReaderState.ResourceEnd:
                                            ODataResource entry = entryReader.Item as ODataResource;
                                            Assert.NotNull(entry);
                                            pis.Add(entry);
                                            break;
                                        }
                                    }
                                    Assert.Equal(ODataReaderState.Completed, entryReader.State);
                                    Assert.Single(pis);
                                    Assert.Equal(102910, pis[0].Properties.Single(p => p.Name == "PaymentInstrumentID").Value);
                                }
                                else if (batchOperationId == 2)
                                {
                                    // the third response message is an entry
                                    var entryReader = operationResponseReader.CreateODataResourceReader();

                                    Assert.Equal(200, operationResponse.StatusCode);
                                    List <ODataResource> statements = new List <ODataResource>();
                                    while (entryReader.Read())
                                    {
                                        switch (entryReader.State)
                                        {
                                        case ODataReaderState.ResourceEnd:
                                            ODataResource entry = entryReader.Item as ODataResource;
                                            Assert.NotNull(entry);
                                            statements.Add(entry);
                                            break;
                                        }
                                    }
                                    Assert.Equal(ODataReaderState.Completed, entryReader.State);
                                    Assert.Single(statements);
                                    Assert.Equal(103901001, statements[0].Properties.Single(p => p.Name == "StatementID").Value);
                                }
                            }
                            batchOperationId++;
                            break;
                        }
                    }
                    Assert.Equal(ODataBatchReaderState.Completed, batchReader.State);
                }
            }

            #endregion
        }
Ejemplo n.º 26
0
        public IEnumerable <JObject> ReadOpenType(Stream response, Type baseEntityType)
        {
            IODataRequestMessage responseMessage = new OeInMemoryMessage(response, null);
            var settings = new ODataMessageReaderSettings()
            {
                Validations = ValidationKinds.None, EnableMessageStreamDisposal = false
            };
            var messageReader = new ODataMessageReader(responseMessage, settings, _edmModel);

            IEdmEntitySet entitySet = _edmModel.EntityContainer.EntitySets().Single(e => e.Type.AsElementType().FullTypeName() == baseEntityType.FullName);
            ODataReader   reader    = messageReader.CreateODataResourceSetReader(entitySet, entitySet.EntityType());

            StackItem stackItem;
            var       stack = new Stack <StackItem>();

            while (reader.Read())
            {
                switch (reader.State)
                {
                case ODataReaderState.ResourceSetStart:
                    stack.Push(new StackItem((ODataResourceSet)reader.Item));
                    break;

                case ODataReaderState.ResourceSetEnd:
                    stackItem = stack.Pop();
                    if (stack.Count == 0)
                    {
                        if (stackItem.Value != null)
                        {
                            foreach (StackItem entry in (IList)stackItem.Value)
                            {
                                yield return((JObject)CreateOpenTypeEntity(entry));
                            }
                        }
                    }
                    else
                    {
                        var entries = (IList)CreateOpenTypeEntity(stackItem);
                        stack.Peek().AddEntry(entries);
                    }
                    break;

                case ODataReaderState.ResourceStart:
                    stack.Push(new StackItem((ODataResource)reader.Item));
                    break;

                case ODataReaderState.ResourceEnd:
                    stackItem = stack.Pop();
                    if (stack.Count == 0)
                    {
                        yield return((JObject)CreateOpenTypeEntity(stackItem));
                    }
                    else
                    {
                        stack.Peek().AddEntry(stackItem);
                    }
                    break;

                case ODataReaderState.NestedResourceInfoStart:
                    stack.Push(new StackItem((ODataNestedResourceInfo)reader.Item));
                    break;

                case ODataReaderState.NestedResourceInfoEnd:
                    StackItem item = stack.Pop();
                    stack.Peek().AddLink((ODataNestedResourceInfo)item.Item, item.Value);
                    break;
                }
            }
        }
Ejemplo n.º 27
0
        public void AsyncQueryRequestTest()
        {
            ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings()
            {
                BaseUri = ServiceBaseUri
            };

            foreach (var mimeType in mimeTypes)
            {
                var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri.AbsoluteUri + "People", UriKind.Absolute));
                requestMessage.SetHeader("Accept", mimeType);
                requestMessage.PreferHeader().RespondAsync = true; //Request the service to process asynchronously.
                var responseMessage = requestMessage.GetResponse();
                Assert.AreEqual(202, responseMessage.StatusCode);
                string monitorResource = responseMessage.GetHeader("Location");
                Assert.IsFalse(string.IsNullOrWhiteSpace(monitorResource));

                var statusCheckRequest1  = new HttpWebRequestMessage(new Uri(monitorResource));
                var statusCheckResponse1 = statusCheckRequest1.GetResponse();
                Assert.AreEqual(202, statusCheckResponse1.StatusCode);
                monitorResource = statusCheckResponse1.GetHeader("Location");
                Assert.IsFalse(string.IsNullOrWhiteSpace(monitorResource));

                //The request takes 5 seconds to finish in service, so we wait for 6 seconds.
                Thread.Sleep(6000);
                var statusCheckRequest2  = new HttpWebRequestMessage(new Uri(monitorResource));
                var statusCheckResponse2 = statusCheckRequest2.GetResponse();
                Assert.AreEqual(200, statusCheckResponse2.StatusCode);

                if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata))
                {
                    using (var messageReader = new ODataMessageReader(statusCheckResponse2, readerSettings, Model))
                    {
                        var asyncReader  = messageReader.CreateODataAsynchronousReader();
                        var innerMessage = asyncReader.CreateResponseMessage();

                        Assert.AreEqual(200, innerMessage.StatusCode);
                        using (var innerMessageReader = new ODataMessageReader(innerMessage, readerSettings, Model))
                        {
                            List <ODataResource> entries = new List <ODataResource>();
                            var feedReader = innerMessageReader.CreateODataResourceSetReader();

                            while (feedReader.Read())
                            {
                                if (feedReader.State == ODataReaderState.ResourceEnd)
                                {
                                    ODataResource entry = feedReader.Item as ODataResource;
                                    if (entry != null && entry.Id != null)
                                    {
                                        entries.Add(entry);
                                    }
                                }
                                else if (feedReader.State == ODataReaderState.ResourceSetEnd)
                                {
                                    Assert.IsNotNull(feedReader.Item as ODataResourceSet);
                                }
                            }

                            Assert.AreEqual(ODataReaderState.Completed, feedReader.State);
                            Assert.AreEqual(5, entries.Count);

                            Assert.AreEqual("Bob", entries[0].Properties.Single(p => p.Name == "FirstName").Value);
                            Assert.AreEqual("Peter", entries[4].Properties.Single(p => p.Name == "FirstName").Value);
                        }
                    }
                }
            }
        }
Ejemplo n.º 28
0
        protected IEnumerable Read(Stream response, Db.OeEntitySetAdapter entitySetMetaAdatpter)
        {
            ResourceSet = null;
            NavigationProperties.Clear();
            NavigationInfoEntities.Clear();

            IODataResponseMessage responseMessage = new Infrastructure.OeInMemoryMessage(response, null, _serviceProvider);
            var settings = new ODataMessageReaderSettings()
            {
                EnableMessageStreamDisposal = false, Validations = ValidationKinds.None
            };

            using (var messageReader = new ODataMessageReader(responseMessage, settings, EdmModel))
            {
                IEdmEntitySet entitySet = OeEdmClrHelper.GetEntitySet(EdmModel, entitySetMetaAdatpter.EntitySetName);
                ODataReader   reader    = messageReader.CreateODataResourceSetReader(entitySet, entitySet.EntityType());

                var stack = new Stack <StackItem>();
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                    case ODataReaderState.ResourceSetStart:
                        if (stack.Count == 0)
                        {
                            ResourceSet = (ODataResourceSetBase)reader.Item;
                        }
                        else
                        {
                            stack.Peek().ResourceSet = (ODataResourceSetBase)reader.Item;
                        }
                        break;

                    case ODataReaderState.ResourceStart:
                        stack.Push(new StackItem((ODataResource)reader.Item));
                        break;

                    case ODataReaderState.ResourceEnd:
                        StackItem stackItem = stack.Pop();

                        if (reader.Item != null)
                        {
                            if (stack.Count == 0)
                            {
                                yield return(CreateRootEntity((ODataResource)stackItem.Item, stackItem.NavigationProperties, entitySetMetaAdatpter.EntityType));
                            }
                            else
                            {
                                stack.Peek().AddEntry(CreateEntity((ODataResource)stackItem.Item, stackItem.NavigationProperties));
                            }
                        }
                        break;

                    case ODataReaderState.NestedResourceInfoStart:
                        stack.Push(new StackItem((ODataNestedResourceInfo)reader.Item));
                        break;

                    case ODataReaderState.NestedResourceInfoEnd:
                        StackItem item = stack.Pop();
                        stack.Peek().AddLink((ODataNestedResourceInfo)item.Item, item.Value, item.ResourceSet);
                        break;
                    }
                }
            }
        }
        public void ShouldBeAbleToReadCustomInstanceAnnotationFromFeedAndEntry(string payload, string contentType)
        {
            var stream         = new MemoryStream(Encoding.UTF8.GetBytes(payload));
            var readerSettings = new ODataMessageReaderSettings {
                EnableMessageStreamDisposal = true
            };

            IODataResponseMessage messageToRead = new InMemoryMessage {
                StatusCode = 200, Stream = stream
            };

            messageToRead.SetHeader("Content-Type", contentType);

            // Enable reading custom instance annotations.
            messageToRead.PreferenceAppliedHeader().AnnotationFilter = "Custom.*";

            Stack <ODataItem> odataItems = new Stack <ODataItem>(4);

            using (var messageReader = new ODataMessageReader(messageToRead, readerSettings, Model))
            {
                var odataReader = messageReader.CreateODataResourceSetReader(EntitySet, EntityType);
                ICollection <ODataInstanceAnnotation> instanceAnnotations = null;
                while (odataReader.Read())
                {
                    switch (odataReader.State)
                    {
                    case ODataReaderState.ResourceSetStart:
                        odataItems.Push(odataReader.Item);
                        instanceAnnotations = (odataItems.Peek() as ODataResourceSet).InstanceAnnotations;

                        // TODO: We only support instance annotation at the top level feed at the moment. Will remove the if statement when support on inline feed is added.
                        if (odataItems.Count == 1)
                        {
                            // Note that in streaming mode, the collection should be populated with instance annotations read so far before the beginning of the first entry.
                            // We are currently in non-streaming mode. The reader will buffer the payload and read ahead till the
                            // end of the feed to read all instance annotations.
                            Assert.Single(instanceAnnotations);
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.ResourceSetStartAnnotation").Value);
                        }
                        else
                        {
                            Assert.Empty(instanceAnnotations);
                        }

                        break;

                    case ODataReaderState.ResourceSetEnd:
                        instanceAnnotations = (odataItems.Peek() as ODataResourceSet).InstanceAnnotations;

                        // TODO: We only support instance annotation at the top level feed at the moment. Will remove the if statement when support on inline feed is added.
                        if (odataItems.Count == 1)
                        {
                            Assert.Equal(2, instanceAnnotations.Count());
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.ResourceSetStartAnnotation").Value);
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.FeedEndAnnotation").Value);
                        }
                        else
                        {
                            Assert.Empty(instanceAnnotations);
                        }

                        odataItems.Pop();
                        break;

                    case ODataReaderState.NestedResourceInfoStart:
                        ODataNestedResourceInfo navigationLink = (ODataNestedResourceInfo)odataReader.Item;
                        if (navigationLink.Name == "ResourceSetNavigationProperty")
                        {
                            // The collection should be populated with instance annotations read so far before the "ResourceSetNavigationProperty".
                            instanceAnnotations = (odataItems.Peek() as ODataResource).InstanceAnnotations;
                            Assert.Equal(2, instanceAnnotations.Count());
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryStartAnnotation").Value);
                            TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryMiddleAnnotation").Value);
                        }

                        break;

                    case ODataReaderState.NestedResourceInfoEnd:
                        break;

                    case ODataReaderState.ResourceStart:
                        odataItems.Push(odataReader.Item);

                        // The collection should be populated with instance annotations read so far before the first navigation/association link or before the end of the entry.
                        instanceAnnotations = (odataItems.Peek() as ODataResource).InstanceAnnotations;
                        Assert.Single(instanceAnnotations);
                        TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryStartAnnotation").Value);
                        break;

                    case ODataReaderState.ResourceEnd:
                        instanceAnnotations = (odataItems.Peek() as ODataResource).InstanceAnnotations;
                        Assert.Equal(3, instanceAnnotations.Count());
                        TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryStartAnnotation").Value);
                        TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryMiddleAnnotation").Value);
                        TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(odataItems.Count), instanceAnnotations.Single(ia => ia.Name == "Custom.EntryEndAnnotation").Value);
                        odataItems.Pop();
                        break;
                    }
                }

                Assert.Equal(2, instanceAnnotations.Count());
                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.ResourceSetStartAnnotation").Value);
                TestUtils.AssertODataValueAreEqual(new ODataPrimitiveValue(1), instanceAnnotations.Single(ia => ia.Name == "Custom.FeedEndAnnotation").Value);
            }
        }
Ejemplo n.º 30
0
        public async Task CanReadDataInBatchUsingEndpointRouting()
        {
            // Arrange
            var requestUri = string.Format("{0}/odata/$batch", this.BaseAddress);
            Uri address    = new Uri(this.BaseAddress, UriKind.Absolute);

            string relativeToServiceRootUri = "EpCustomers";
            string relativeToHostUri        = address.LocalPath.TrimEnd(new char[] { '/' }) + "/odata/EpCustomers";
            string absoluteUri = this.BaseAddress + "/odata/EpCustomers";

            // Act
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, requestUri);

            request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json"));
            HttpContent content = new StringContent(@"
            {
                ""requests"":[
                    {
                    ""id"": ""2"",
                    ""method"": ""get"",
                    ""url"": """ + relativeToServiceRootUri + @""",
                    ""headers"": { ""Accept"": ""application/json""}
                    },
                    {
                    ""id"": ""3"",
                    ""method"": ""get"",
                    ""url"": """ + relativeToHostUri + @"""
                    },
                    {
                    ""id"": ""4"",
                    ""method"": ""get"",
                    ""url"": """ + absoluteUri + @""",
                    ""headers"": { ""Accept"": ""application/json""}
                    }
                ]
            }");

            content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
            request.Content             = content;
            HttpResponseMessage response = await Client.SendAsync(request);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType);

            var stream = await response.Content.ReadAsStreamAsync();

            IODataResponseMessage odataResponseMessage = new ODataMessageWrapper(stream, response.Content.Headers);
            int subResponseCount = 0;
            var model            = EdmModel;

            using (var messageReader = new ODataMessageReader(odataResponseMessage, new ODataMessageReaderSettings(), model))
            {
                var batchReader = messageReader.CreateODataBatchReader();
                while (batchReader.Read())
                {
                    switch (batchReader.State)
                    {
                    case ODataBatchReaderState.Operation:
                        var operationMessage = batchReader.CreateOperationResponseMessage();
                        subResponseCount++;
                        Assert.Equal(200, operationMessage.StatusCode);
                        Assert.Contains("application/json", operationMessage.Headers.Single(h => String.Equals(h.Key, "Content-Type", StringComparison.OrdinalIgnoreCase)).Value);
                        using (var innerMessageReader = new ODataMessageReader(operationMessage, new ODataMessageReaderSettings(), model))
                        {
                            var innerReader = innerMessageReader.CreateODataResourceSetReader();
                            while (innerReader.Read())
                            {
                                ;
                            }
                        }
                        break;
                    }
                }
            }

            Assert.Equal(3, subResponseCount);
        }