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); } } }
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()); } }
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())); } } }
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)); } }
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)); } }
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)); } }
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); } } } }
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); } } } } }
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); } } } }
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); } } } }
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); } } } }
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); } } } }
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")); } } } }
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)); }
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); } } } }
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; } } } }
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); } }
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 }
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; } } }
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); } } } } }
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); } }
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); }