Ejemplo n.º 1
0
        public static void PerClassCleanUp()
        {
            OpenWebDataServiceHelper.ForceVerboseErrors = false;
            if (web != null)
            {
                web.StopService();
            }

            if (changeScope != null)
            {
                changeScope.Dispose();
            }
        }
Ejemplo n.º 2
0
        public void AllowRedefiningConcurrencyTokenOnDerivedType()
        {
            var metadataProvider = new DSPMetadata("DefaultContainer", "Default");

            var entityType = metadataProvider.AddEntityType("EntityType", null, null, false /*isAbstract*/);

            metadataProvider.AddKeyProperty(entityType, "ID", typeof(int));
            metadataProvider.AddPrimitiveProperty(entityType, "LastUpdatedAuthor", typeof(string), true /*eTag*/);

            var derivedType = metadataProvider.AddEntityType("DerivedType", null, entityType, false /*isAbstract*/);

            metadataProvider.AddPrimitiveProperty(derivedType, "LastModifiedAuthor", typeof(string), true /*eTag*/);

            metadataProvider.AddResourceSet("Customers", entityType);

            var wrapper = new DataServiceMetadataProviderWrapper(metadataProvider);

            DSPResource baseTypeInstance = new DSPResource(entityType);

            baseTypeInstance.SetValue("ID", 1);
            baseTypeInstance.SetValue("LastUpdatedAuthor", "Phani");

            DSPResource derivedTypeInstance = new DSPResource(derivedType);

            derivedTypeInstance.SetValue("ID", 1);
            derivedTypeInstance.SetValue("LastModifiedAuthor", "Raj");

            DSPContext dataContext = new DSPContext();
            var        entities    = dataContext.GetResourceSetEntities("Customers");

            entities.AddRange(new object[] { baseTypeInstance, derivedTypeInstance });

            var service = new DSPUnitTestServiceDefinition(metadataProvider, DSPDataProviderKind.Reflection, dataContext);

            using (TestWebRequest request = service.CreateForInProcess())
            {
                try
                {
                    request.StartService();
                    request.RequestUriString = "/$metadata";
                    request.SendRequestAndCheckResponse();
                }
                finally
                {
                    request.StopService();
                }
            }
        }
Ejemplo n.º 3
0
        public void MetadataProviderContainerNameAndNamespaceCalledOnlyOnceDuringSerialization()
        {
            CallCountMetadataProvider metadataProvider;
            DSPServiceDefinition      service;

            CreateCallCounterService(out metadataProvider, out service);

            using (TestWebRequest request = service.CreateForInProcess())
            {
                try
                {
                    request.StartService();
                    request.RequestUriString = "/$metadata";
                    request.SendRequestAndCheckResponse();
                }
                finally
                {
                    request.StopService();
                }
            }

            Assert.AreEqual(1, metadataProvider.ContainerNameCallCount, "ContainerName called more than once");
            Assert.AreEqual(1, metadataProvider.ContainerNamespaceCallCount, "ContainerNamespace called more than once");
        }
Ejemplo n.º 4
0
        public void OperationDescriptorsShouldBeUpdatedForEachRequest()
        {
            #region Response payload
            var response = @"HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 2011
Date: Thu, 06 Jun 2013 22:07:07 GMT
Content-Type: application/atom+xml;type=entry;charset=utf-8
Server: Microsoft-IIS/7.5
Cache-Control: no-cache
X-Content-Type-Options: nosniff
OData-Version: 4.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

<?xml version='1.0' encoding='utf-8'?>
<entry xml:base='http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/' xmlns='http://www.w3.org/2005/Atom' xmlns:d='http://docs.oasis-open.org/odata/ns/data' xmlns:m='http://docs.oasis-open.org/odata/ns/metadata' xmlns:georss='http://www.georss.org/georss' xmlns:gml='http://www.opengis.net/gml'>
    <id>http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/Products(0)</id>
    <category term='ODataDemo.Product' scheme='http://docs.oasis-open.org/odata/ns/scheme' />
    <link rel='edit' title='Product' href='Products(0)' />
    <link rel='http://docs.oasis-open.org/odata/ns/related/Category' type='application/atom+xml;type=entry' title='Category' href='Products(0)/Category' />
    <link rel='http://docs.oasis-open.org/odata/ns/related/Supplier' type='application/atom+xml;type=entry' title='Supplier' href='Products(0)/Supplier' />
    <title type='text'>Bread</title>
    <summary type='text'>Whole grain bread</summary>
    <updated>2013-06-06T22:07:08Z</updated>
    <author>
        <name />
    </author>
    <link rel='http://docs.oasis-open.org/odata/ns/relatedlinks/OrderDetails' type='application/xml' title='OrderDetails' href='Products(0)/OrderDetails/$ref' />
    <m:action metadata='http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/$metadata#DemoService.{0}' title='{0}' target='http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/Products(0)/{0}' />
    <content type='application/xml'>
        <m:properties>
            <d:ID m:type='Edm.Int32'>0</d:ID>
            <d:ProductName m:type='Edm.String'>Demo Product</d:ProductName>
            <d:Discontinued m:type='Edm.Boolean'>false</d:Discontinued>
        </m:properties>
    </content>
</entry>
";

            #endregion

            // Consider two actions that an entity Product supports, and they are mutually exclusive, i.e. only one action
            // is returned in the response
            string action1 = "Discount";
            string action2 = "Discount1234";

            // Create two responses with each of above actions
            var response1 = string.Format(response, action1);
            var response2 = string.Format(response, action2);

            PlaybackServiceDefinition playbackService = new PlaybackServiceDefinition();
            using (TestWebRequest request = playbackService.CreateForInProcessWcf())
            {
                request.ServiceType        = typeof(PlaybackService);
                request.ForceVerboseErrors = true;
                request.StartService();
                DataServiceContext ctx = new DataServiceContext(request.ServiceRoot, ODataProtocolVersion.V4);
                ctx.EnableAtom = true;

                try
                {
                    for (int i = 0; i < 2; i++)
                    {
                        playbackService.OverridingPlayback = (i % 2 == 0) ? response1 : response2;

                        Product product = ctx.Execute <Product>(new Uri("Products(0)", UriKind.Relative)).First();

                        EntityDescriptor descriptor = ctx.GetEntityDescriptor(product);

                        descriptor.OperationDescriptors.Count.Should().Be(1);

                        var actionName = descriptor.OperationDescriptors.First().Title;

                        if (i % 2 == 0)
                        {
                            actionName.Should().Be(action1);
                        }
                        else
                        {
                            actionName.Should().Be(action2);
                        }
                    }
                }
                finally
                {
                    request.StopService();
                }
            }
        }
Ejemplo n.º 5
0
        public void PrimitiveTypes_Generated_WithIncorrectNullability()
        {
            string orderPayloadWithNullableProperties = @"HTTP/1.1 200 OK
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Content-Length: 2542
Via: 1.1 TK5-PRXY-08
Expires: Wed, 04 Jan 2012 23:39:02 GMT
Date: Wed, 04 Jan 2012 23:38:02 GMT
Content-Type: application/atom+xml;charset=utf-8
Server: Microsoft-IIS/7.5
Cache-Control: private
Vary: *
OData-Version: 4.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<feed xml:base='http://services.odata.org/Northwind/Northwind.svc/' xmlns:d='http://docs.oasis-open.org/odata/ns/data' xmlns:m='http://docs.oasis-open.org/odata/ns/metadata' xmlns='http://www.w3.org/2005/Atom'>
  <title type='text'>OrderDetails</title>
  <id>http://services.odata.org/Northwind/Northwind.svc/OrderDetails</id>
  <updated>2012-01-04T23:32:26Z</updated>
  <link rel='self' title='OrderDetails' href='OrderDetails' />
  <entry>
    <id>http://services.odata.org/Northwind/Northwind.svc/OrderDetails(10248)</id>
    <title type='text'></title>
    <updated>2012-01-04T23:32:26Z</updated>
    <author>
      <name />
    </author>
    <link rel='edit' title='OrderDetail' href='OrderDetails(10248)' />
    <link rel='http://docs.oasis-open.org/odata/ns/related/Customer' type='application/atom+xml;type=entry' title='Customer' href='OrderDetails(10248)/Customer' />
    <link rel='http://docs.oasis-open.org/odata/ns/related/Employee' type='application/atom+xml;type=entry' title='Employee' href='OrderDetails(10248)/Employee' />
    <link rel='http://docs.oasis-open.org/odata/ns/related/OrderDetail_Details' type='application/atom+xml;type=feed' title='OrderDetail_Details' href='OrderDetails(10248)/OrderDetail_Details' />
    <link rel='http://docs.oasis-open.org/odata/ns/related/Shipper' type='application/atom+xml;type=entry' title='Shipper' href='OrderDetails(10248)/Shipper' />
    <category term='NorthwindModel.OrderDetail' scheme='http://docs.oasis-open.org/odata/ns/scheme' />
    <content type='application/xml'>
      <m:properties>
        <d:OrderID m:type='Edm.Int32'>10248</d:OrderID>
        <d:ProductID m:type='Edm.Int32'>10248</d:ProductID>
        <d:UnitPrice m:null='true'/>
        <d:Quantity m:null='true'/> 
      </m:properties>
    </content>
  </entry>
</feed>";


            PlaybackServiceDefinition playbackService = new PlaybackServiceDefinition();

            using (TestWebRequest request = playbackService.CreateForInProcessWcf())
            {
                request.ServiceType        = typeof(PlaybackService);
                request.ForceVerboseErrors = true;
                request.StartService();
                DataServiceContext ctx = new DataServiceContext(request.ServiceRoot);
                ctx.EnableAtom = true;
                playbackService.OverridingPlayback = orderPayloadWithNullableProperties;
                InvalidOperationException nullAssignmentError = null;
                try
                {
                    foreach (var orderDetail in ctx.CreateQuery <OrderDetail>("OrderDetails"))
                    {
                    }
                }
                catch (InvalidOperationException ioException)
                {
                    nullAssignmentError = ioException;
                }
                finally
                {
                    request.StopService();
                }

                Assert.IsNotNull(nullAssignmentError, "Client library should not allow assignment of null values to non-nullable properties");
                Assert.AreEqual(ODataLibResourceUtil.GetString("ReaderValidationUtils_NullNamedValueForNonNullableType", "UnitPrice", "Edm.Double"), nullAssignmentError.Message);
            }
        }