You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/09/01 14:45:28 UTC

[26/31] olingo-odata4 git commit: [OLINGO-659] Removed v4 from package and class names

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/MediaEntityTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/MediaEntityTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/MediaEntityTestITCase.java
new file mode 100644
index 0000000..84de7eb
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/MediaEntityTestITCase.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.client.api.communication.request.cud.ODataEntityUpdateRequest;
+import org.apache.olingo.client.api.communication.request.cud.UpdateType;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataMediaRequest;
+import org.apache.olingo.client.api.communication.request.streamed.MediaEntityCreateStreamManager;
+import org.apache.olingo.client.api.communication.request.streamed.MediaEntityUpdateStreamManager;
+import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityCreateRequest;
+import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityUpdateRequest;
+import org.apache.olingo.client.api.communication.response.ODataEntityUpdateResponse;
+import org.apache.olingo.client.api.communication.response.ODataMediaEntityCreateResponse;
+import org.apache.olingo.client.api.communication.response.ODataMediaEntityUpdateResponse;
+import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
+import org.apache.olingo.client.api.domain.ClientEntity;
+import org.apache.olingo.client.api.domain.ClientValuable;
+import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.client.core.ODataClientFactory;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.http.HttpHeader;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.junit.Test;
+
+public class MediaEntityTestITCase extends AbstractTestITCase {
+
+  private void read(final ODataClient client, final ContentType contentType) throws IOException {
+    final URIBuilder builder = client.newURIBuilder(testDemoServiceRootURL).
+        appendEntitySetSegment("Advertisements").
+        appendKeySegment(UUID.fromString("f89dee73-af9f-4cd4-b330-db93c25ff3c7"));
+    final ODataEntityRequest<ClientEntity> entityReq =
+        client.getRetrieveRequestFactory().getEntityRequest(builder.build());
+    entityReq.setFormat(contentType);
+
+    final ClientEntity entity = entityReq.execute().getBody();
+    assertNotNull(entity);
+    assertTrue(entity.isMediaEntity());
+    // cast to workaround JDK 6 bug, fixed in JDK 7
+    assertEquals(EdmPrimitiveTypeKind.DateTimeOffset.getFullQualifiedName().toString(),
+        ((ClientValuable) entity.getProperty("AirDate")).getValue().getTypeName());
+
+    final ODataMediaRequest streamReq = client.getRetrieveRequestFactory().
+        getMediaRequest(entity.getMediaContentSource());
+    final ODataRetrieveResponse<InputStream> streamRes = streamReq.execute();
+    assertEquals(200, streamRes.getStatusCode());
+
+    final byte[] actual = new byte[Integer.parseInt(streamRes.getHeader("Content-Length").iterator().next())];
+    IOUtils.read(streamRes.getBody(), actual, 0, actual.length);
+  }
+
+  @Test
+  public void readAsAtom() throws IOException {
+    read(client, ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void readAsJSON() throws IOException {
+    read(ODataClientFactory.getEdmEnabledClient(testDemoServiceRootURL, ContentType.JSON), ContentType.JSON);
+  }
+
+  @Test
+  public void readAsJSONFull() throws IOException {
+    read(client, ContentType.JSON_FULL_METADATA);
+  }
+
+  private void create(final ContentType contentType) throws IOException {
+    final String random = RandomStringUtils.random(110);
+    final InputStream input = IOUtils.toInputStream(random);
+
+    final URI uri = client.newURIBuilder(testDemoServiceRootURL).appendEntitySetSegment("Advertisements").build();
+    final ODataMediaEntityCreateRequest<ClientEntity> createReq =
+        client.getCUDRequestFactory().getMediaEntityCreateRequest(uri, input);
+    final MediaEntityCreateStreamManager<ClientEntity> streamManager = createReq.payloadManager();
+
+    final ODataMediaEntityCreateResponse<ClientEntity> createRes = streamManager.getResponse();
+    assertEquals(201, createRes.getStatusCode());
+
+    final Collection<String> location = createRes.getHeader(HttpHeader.LOCATION);
+    assertNotNull(location);
+    final URI createdLocation = URI.create(location.iterator().next());
+
+    final ClientEntity changes = client.getObjectFactory().
+        newEntity(new FullQualifiedName("ODataDemo.Advertisement"));
+    changes.getProperties().add(client.getObjectFactory().newPrimitiveProperty("AirDate",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().
+        setType(EdmPrimitiveTypeKind.DateTimeOffset).setValue(Calendar.getInstance()).build()));
+
+    final ODataEntityUpdateRequest<ClientEntity> updateReq = getClient().getCUDRequestFactory().
+        getEntityUpdateRequest(createdLocation, UpdateType.PATCH, changes);
+    updateReq.setFormat(contentType);
+
+    final ODataEntityUpdateResponse<ClientEntity> updateRes = updateReq.execute();
+    assertEquals(204, updateRes.getStatusCode());
+
+    final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().
+        getMediaEntityRequest(client.newURIBuilder(createdLocation.toASCIIString()).build());
+    final ODataRetrieveResponse<InputStream> retrieveRes = retrieveReq.execute();
+    assertEquals(200, retrieveRes.getStatusCode());
+
+    final byte[] actual = new byte[Integer.parseInt(retrieveRes.getHeader("Content-Length").iterator().next())];
+    IOUtils.read(retrieveRes.getBody(), actual, 0, actual.length);
+    assertEquals(random, new String(actual));
+  }
+
+  @Test
+  public void createAsAtom() throws IOException {
+    create(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void createAsJSON() throws IOException {
+    create(ContentType.JSON);
+  }
+
+  private void update(final ContentType contentType) throws IOException, EdmPrimitiveTypeException {
+    final URI uri = client.newURIBuilder(testDemoServiceRootURL).
+        appendEntitySetSegment("Advertisements").
+        appendKeySegment(UUID.fromString("f89dee73-af9f-4cd4-b330-db93c25ff3c7")).build();
+
+    final String random = RandomStringUtils.random(124);
+
+    // 1. update providing media content
+    final ODataMediaEntityUpdateRequest<ClientEntity> updateReq = client.getCUDRequestFactory().
+        getMediaEntityUpdateRequest(uri, IOUtils.toInputStream(random));
+    updateReq.setFormat(contentType);
+
+    final MediaEntityUpdateStreamManager<ClientEntity> streamManager = updateReq.payloadManager();
+    final ODataMediaEntityUpdateResponse<ClientEntity> createRes = streamManager.getResponse();
+    assertEquals(204, createRes.getStatusCode());
+
+    // 2. check that media content was effectively uploaded
+    final ODataMediaRequest streamReq = client.getRetrieveRequestFactory().getMediaEntityRequest(uri);
+    final ODataRetrieveResponse<InputStream> streamRes = streamReq.execute();
+    assertEquals(200, streamRes.getStatusCode());
+
+    final byte[] actual = new byte[Integer.parseInt(streamRes.getHeader("Content-Length").iterator().next())];
+    IOUtils.read(streamRes.getBody(), actual, 0, actual.length);
+    assertEquals(random, new String(actual));
+  }
+
+  @Test
+  public void updateAsAtom() throws IOException, EdmPrimitiveTypeException {
+    update(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void updateAsJSON() throws IOException, EdmPrimitiveTypeException {
+    update(ContentType.JSON);
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
new file mode 100644
index 0000000..62906c8
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmAnnotation;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.EdmSchema;
+import org.apache.olingo.commons.api.edm.EdmTerm;
+import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.annotation.EdmRecord;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmBoolean;
+import org.junit.Test;
+
+public class MetadataTestITCase extends AbstractTestITCase {
+
+  @Test
+  public void retrieve() throws EdmPrimitiveTypeException {
+    final Edm edm = client.getRetrieveRequestFactory().getMetadataRequest(testStaticServiceRootURL).execute().getBody();
+    assertNotNull(edm);
+
+    final EdmEntityType order = edm.getEntityType(
+        new FullQualifiedName("Microsoft.Test.OData.Services.ODataWCFService", "Order"));
+    assertNotNull(order);
+
+    final EdmProperty orderDate = order.getStructuralProperty("OrderDate");
+    assertNotNull(orderDate);
+    assertEquals("Edm.DateTimeOffset", orderDate.getType().getFullQualifiedName().toString());
+
+    final EdmTerm isBoss = edm.getTerm(new FullQualifiedName(edm.getSchemas().get(0).getNamespace(), "IsBoss"));
+    assertNotNull(isBoss);
+    assertEquals(EdmBoolean.getInstance(), isBoss.getType());
+
+    final EdmEntitySet orders = edm.getSchemas().get(0).getEntityContainer().getEntitySet("Orders");
+    assertNotNull(orders);
+    assertFalse(orders.getAnnotations().isEmpty());
+    assertTrue(orders.getAnnotations().get(0).getExpression().isDynamic());
+    assertTrue(orders.getAnnotations().get(0).getExpression().asDynamic().isRecord());
+    final EdmRecord record = orders.getAnnotations().get(0).getExpression().asDynamic().asRecord();
+    assertNotNull(record);
+    assertEquals(3, record.getPropertyValues().size());
+    assertTrue(record.getPropertyValues().get(0).getValue().isConstant());
+    assertTrue((Boolean) record.getPropertyValues().get(0).getValue().asConstant().getValue().asPrimitive());
+    assertTrue(record.getPropertyValues().get(1).getValue().asDynamic().isCollection());
+    assertEquals(1, record.getPropertyValues().get(1).getValue().asDynamic().asCollection().getItems().size());
+    assertTrue(record.getPropertyValues().get(1).getValue().asDynamic().asCollection().getItems().get(0).isDynamic());
+    assertEquals("OrderID", record.getPropertyValues().get(1).getValue().asDynamic().asCollection().
+        getItems().get(0).asDynamic().asPropertyPath().getValue());
+  }
+
+  @Test
+  public void include() {
+    final Edm edm = client.getRetrieveRequestFactory().getMetadataRequest(testNorthwindRootURL).execute().getBody();
+    assertNotNull(edm);
+
+    final EdmEntityContainer container = edm.getEntityContainer(
+        new FullQualifiedName("ODataWebExperimental.Northwind.Model", "NorthwindEntities"));
+    assertNotNull(container);
+
+    final EdmEntitySet categories = container.getEntitySet("Categories");
+    assertNotNull(categories);
+    assertEquals("NorthwindModel", categories.getEntityType().getNamespace());
+  }
+
+  @Test
+  public void vocabularies() {
+    final Edm edm = client.getRetrieveRequestFactory().
+        getMetadataRequest(testVocabulariesServiceRootURL).execute().getBody();
+    assertNotNull(edm);
+
+    // 1. core
+    final EdmSchema core = edm.getSchema("Org.OData.Core.V1");
+    assertNotNull(core);
+    final EdmSchema coreAlias = edm.getSchema("Core");
+    assertEquals(core, coreAlias);
+
+    final EdmTerm descriptionTerm = edm.getTerm(new FullQualifiedName("Core.Description"));
+    assertNotNull(descriptionTerm);
+    assertEquals(descriptionTerm.getFullQualifiedName(),
+        edm.getTerm(new FullQualifiedName("Org.OData.Core.V1.Description")).getFullQualifiedName());
+
+    final EdmAnnotation description = core.getAnnotation(descriptionTerm);
+    assertNotNull(description);
+    // assertEquals("Core terms needed to write vocabularies",
+    // description.getExpression().asConstant().getValue().asPrimitive().getName());
+    assertEquals("Core terms needed to write vocabularies",
+        description.getExpression().asConstant().getValueAsString());
+
+    final EdmTerm isLanguageDependent = edm.getTerm(new FullQualifiedName("Core.IsLanguageDependent"));
+    assertNotNull(isLanguageDependent);
+    assertTrue(isLanguageDependent.getAppliesTo().contains(EdmProperty.class));
+    assertTrue(isLanguageDependent.getAppliesTo().contains(EdmTerm.class));
+    assertEquals(edm.getTypeDefinition(new FullQualifiedName("Core.Tag")), isLanguageDependent.getType());
+    assertEquals(EdmBoolean.getInstance(), ((EdmTypeDefinition) isLanguageDependent.getType()).getUnderlyingType());
+    assertNotNull(isLanguageDependent.getAnnotation(descriptionTerm));
+
+    final EdmTerm permissions = edm.getTerm(new FullQualifiedName("Core.Permissions"));
+    assertNotNull(permissions);
+    assertTrue(permissions.getType() instanceof EdmEnumType);
+
+    // 2. measures
+    final EdmSchema measures = edm.getSchema("UoM");
+    assertNotNull(measures);
+
+    final EdmTerm scale = edm.getTerm(new FullQualifiedName("UoM.Scale"));
+    assertNotNull(scale);
+
+    final EdmAnnotation requiresTypeInScale = edm.getAnnotation(
+        scale.getFullQualifiedName(), edm.getTerm(new FullQualifiedName("Core.RequiresType")));
+    assertNotNull(requiresTypeInScale);
+    assertEquals("Edm.Decimal", requiresTypeInScale.getExpression().asConstant().getValueAsString());
+
+    // 3. capabilities
+    final EdmTerm deleteRestrictions = edm.getTerm(new FullQualifiedName("Capabilities.DeleteRestrictions"));
+    assertNotNull(deleteRestrictions);
+    assertEquals(deleteRestrictions.getType().getFullQualifiedName(),
+        edm.getComplexType(new FullQualifiedName("Capabilities.DeleteRestrictionsType")).getFullQualifiedName());
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/OAuth2TestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/OAuth2TestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/OAuth2TestITCase.java
new file mode 100644
index 0000000..e5f2542
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/OAuth2TestITCase.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.olingo.client.api.EdmEnabledODataClient;
+import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
+import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
+import org.apache.olingo.client.api.domain.ClientEntity;
+import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.client.core.ODataClientFactory;
+import org.apache.olingo.client.core.http.DefaultHttpClientFactory;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.fit.CXFOAuth2HttpClientFactory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class OAuth2TestITCase extends AbstractTestITCase {
+
+  private static final URI OAUTH2_GRANT_SERVICE_URI =
+      URI.create("http://localhost:9080/stub/StaticService/oauth2/authorize");
+
+  private static final URI OAUTH2_TOKEN_SERVICE_URI =
+      URI.create("http://localhost:9080/stub/StaticService/oauth2/token");
+
+  private EdmEnabledODataClient _edmClient;
+
+  @BeforeClass
+  public static void enableOAuth2() {
+    client.getConfiguration().setHttpClientFactory(
+        new CXFOAuth2HttpClientFactory(OAUTH2_GRANT_SERVICE_URI, OAUTH2_TOKEN_SERVICE_URI));
+  }
+
+  @AfterClass
+  public static void disableOAuth2() {
+    client.getConfiguration().setHttpClientFactory(new DefaultHttpClientFactory());
+  }
+
+  protected ODataClient getLocalClient() {
+    ODataClient localClient = ODataClientFactory.getClient();
+    localClient.getConfiguration().setHttpClientFactory(
+        new CXFOAuth2HttpClientFactory(OAUTH2_GRANT_SERVICE_URI, OAUTH2_TOKEN_SERVICE_URI));
+    return localClient;
+  }
+
+  protected EdmEnabledODataClient getEdmClient() {
+    if (_edmClient == null) {
+      _edmClient = ODataClientFactory.getEdmEnabledClient(testOAuth2ServiceRootURL, ContentType.JSON);
+      _edmClient.getConfiguration().setHttpClientFactory(
+          new CXFOAuth2HttpClientFactory(OAUTH2_GRANT_SERVICE_URI, OAUTH2_TOKEN_SERVICE_URI));
+    }
+
+    return _edmClient;
+  }
+
+  private void read(final ODataClient client, final ContentType contentType) {
+    final URIBuilder uriBuilder =
+        client.newURIBuilder(testOAuth2ServiceRootURL).appendEntitySetSegment("Orders").appendKeySegment(8);
+
+    final ODataEntityRequest<ClientEntity> req =
+        client.getRetrieveRequestFactory().getEntityRequest(uriBuilder.build());
+    req.setFormat(contentType);
+
+    final ODataRetrieveResponse<ClientEntity> res = req.execute();
+    assertEquals(200, res.getStatusCode());
+
+    final String etag = res.getETag();
+    assertTrue(StringUtils.isNotBlank(etag));
+
+    final ClientEntity order = res.getBody();
+    assertEquals(etag, order.getETag());
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Order", order.getTypeName().toString());
+    assertEquals("Edm.Int32", order.getProperty("OrderID").getPrimitiveValue().getTypeName());
+    assertEquals("Edm.DateTimeOffset", order.getProperty("OrderDate").getPrimitiveValue().getTypeName());
+    assertEquals("Edm.Duration", order.getProperty("ShelfLife").getPrimitiveValue().getTypeName());
+    assertEquals("Collection(Edm.Duration)", order.getProperty("OrderShelfLifes").getCollectionValue().getTypeName());
+  }
+
+  @Test
+  public void testOAuth() {
+    try {
+      readAsAtom();
+    } catch (Exception e) {
+      System.out.println("failed for readAsAtom");
+    }
+
+    try {
+      readAsFullJSON();
+    } catch (Exception e) {
+      System.out.println("failed for readAsFullJSON");
+    }
+
+    try {
+      readAsJSON();
+    } catch (Exception e) {
+      System.out.println("failed for readAsJSON");
+    }
+
+    try {
+      createAndDelete();
+    } catch (Exception e) {
+      System.out.println("failed for createAndDelete");
+    }
+  }
+
+  public void readAsAtom() {
+    read(getLocalClient(), ContentType.APPLICATION_ATOM_XML);
+  }
+
+  public void readAsFullJSON() {
+    read(getLocalClient(), ContentType.JSON_FULL_METADATA);
+  }
+
+  public void readAsJSON() {
+    read(getEdmClient(), ContentType.JSON);
+  }
+
+  public void createAndDelete() {
+    createAndDeleteOrder(testOAuth2ServiceRootURL, ContentType.JSON, 1002);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/OpenTypeTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/OpenTypeTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/OpenTypeTestITCase.java
new file mode 100644
index 0000000..e5f213b
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/OpenTypeTestITCase.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Calendar;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.apache.olingo.client.api.communication.request.cud.ODataEntityCreateRequest;
+import org.apache.olingo.client.api.communication.response.ODataDeleteResponse;
+import org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
+import org.apache.olingo.client.api.domain.ClientComplexValue;
+import org.apache.olingo.client.api.domain.ClientEntity;
+import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.EdmSchema;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.junit.Test;
+
+public class OpenTypeTestITCase extends AbstractTestITCase {
+
+  @Test
+  public void checkOpenTypeEntityTypesExist() {
+    final Edm metadata = getClient().getRetrieveRequestFactory().
+        getMetadataRequest(testOpenTypeServiceRootURL).execute().getBody();
+
+    final EdmSchema schema = metadata.getSchemas().get(0);
+
+    assertTrue(metadata.getEntityType(new FullQualifiedName(schema.getNamespace(), "Row")).isOpenType());
+    assertTrue(metadata.getEntityType(new FullQualifiedName(schema.getNamespace(), "IndexedRow")).isOpenType());
+    assertTrue(metadata.getEntityType(new FullQualifiedName(schema.getNamespace(), "RowIndex")).isOpenType());
+  }
+
+  private ClientEntity readRow(final ContentType contentType, final String uuid) {
+    final URIBuilder builder = getClient().newURIBuilder(testOpenTypeServiceRootURL).
+        appendEntitySetSegment("Row").appendKeySegment(UUID.fromString(uuid));
+    return read(contentType, builder.build());
+  }
+
+  private void read(final ContentType contentType) {
+    ClientEntity row = readRow(contentType, "71f7d0dc-ede4-45eb-b421-555a2aa1e58f");
+    assertEquals(EdmPrimitiveTypeKind.Double, row.getProperty("Double").getPrimitiveValue().getTypeKind());
+    assertEquals(EdmPrimitiveTypeKind.Guid, row.getProperty("Id").getPrimitiveValue().getTypeKind());
+
+    row = readRow(contentType, "672b8250-1e6e-4785-80cf-b94b572e42b3");
+    assertEquals(EdmPrimitiveTypeKind.Decimal, row.getProperty("Decimal").getPrimitiveValue().getTypeKind());
+  }
+
+  @Test
+  public void readAsAtom() {
+    read(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void readAsJSON() {
+    read(ContentType.JSON_FULL_METADATA);
+  }
+
+  private void cud(final ContentType contentType) {
+    final Integer id = 1426;
+
+    ClientEntity rowIndex = getClient().getObjectFactory().newEntity(
+        new FullQualifiedName("Microsoft.Test.OData.Services.OpenTypesServiceV4.RowIndex"));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newPrimitiveProperty("Id",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(id)));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newPrimitiveProperty("aString",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("string")));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newPrimitiveProperty("aBoolean",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildBoolean(true)));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newPrimitiveProperty("aDouble",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().buildDouble(1.5D)));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newPrimitiveProperty("aByte",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.SByte).setValue(Byte.MAX_VALUE).
+            build()));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newPrimitiveProperty("aDate",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.DateTimeOffset).setValue(Calendar.getInstance()).
+            build()));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newPrimitiveProperty("aDate",
+            getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.DateTimeOffset).setValue(Calendar.getInstance()).
+            build()));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newEnumProperty("aColor", getClient().getObjectFactory().
+            newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.Color", "Blue")));
+
+    final ClientComplexValue contactDetails = getClient().getObjectFactory().newComplexValue(
+        "Microsoft.Test.OData.Services.OpenTypesServiceV4.ContactDetails");
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("FirstContacted",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildBinary("text".getBytes())));
+    Calendar dateTime = Calendar.getInstance(TimeZone.getTimeZone("GMT+00:01"));
+    dateTime.set(2014, 3, 5, 5, 5, 5);
+    dateTime.set(Calendar.MILLISECOND, 1);
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("LastContacted",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().
+        setType(EdmPrimitiveTypeKind.DateTimeOffset).setValue(dateTime).build()));
+    Calendar date = Calendar.getInstance();
+    date.set(2001, 3, 5);
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("Contacted",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().
+        setType(EdmPrimitiveTypeKind.Date).setValue(date).build()));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("GUID",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildGuid(UUID.randomUUID())));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("PreferedContactTime",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().
+        setType(EdmPrimitiveTypeKind.Duration).setValue(0).build()));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("Byte",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().
+        setType(EdmPrimitiveTypeKind.Byte).setValue(24).build()));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("SignedByte",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().
+        setType(EdmPrimitiveTypeKind.SByte).setValue(Byte.MAX_VALUE).build()));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("Double",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildDouble(Double.MAX_VALUE)));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("Single",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildSingle(Float.MAX_VALUE)));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("Short",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt16(Short.MAX_VALUE)));
+    contactDetails.add(getClient().getObjectFactory().newPrimitiveProperty("Int",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(Integer.MAX_VALUE)));
+    getClient().getBinder().add(rowIndex,
+        getClient().getObjectFactory().newComplexProperty("aContact", contactDetails));
+
+    final ODataEntityCreateRequest<ClientEntity> createReq = getClient().getCUDRequestFactory().
+        getEntityCreateRequest(getClient().newURIBuilder(testOpenTypeServiceRootURL).
+            appendEntitySetSegment("RowIndex").build(), rowIndex);
+    createReq.setFormat(contentType);
+    final ODataEntityCreateResponse<ClientEntity> createRes = createReq.execute();
+    assertEquals(201, createRes.getStatusCode());
+
+    final URIBuilder builder = getClient().newURIBuilder(testOpenTypeServiceRootURL).
+        appendEntitySetSegment("RowIndex").appendKeySegment(id);
+    rowIndex = read(contentType, builder.build());
+    assertNotNull(rowIndex);
+    assertEquals(EdmPrimitiveTypeKind.Int32, rowIndex.getProperty("Id").getPrimitiveValue().getTypeKind());
+    assertEquals(EdmPrimitiveTypeKind.String, rowIndex.getProperty("aString").getPrimitiveValue().getTypeKind());
+    assertEquals(EdmPrimitiveTypeKind.Boolean, rowIndex.getProperty("aBoolean").getPrimitiveValue().getTypeKind());
+    assertTrue(rowIndex.getProperty("aDouble").hasPrimitiveValue());
+    assertTrue(rowIndex.getProperty("aByte").hasPrimitiveValue());
+    assertTrue(rowIndex.getProperty("aDate").hasPrimitiveValue());
+    assertNotNull(rowIndex.getProperty("aColor"));
+    assertTrue(rowIndex.getProperty("aContact").hasComplexValue());
+    assertTrue(rowIndex.getProperty("aContact").getComplexValue().get("SignedByte").hasPrimitiveValue());
+
+    final ODataDeleteResponse deleteRes = getClient().getCUDRequestFactory().
+        getDeleteRequest(rowIndex.getEditLink()).execute();
+    assertEquals(204, deleteRes.getStatusCode());
+  }
+
+  @Test
+  public void cudAsAtom() {
+    cud(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void cudAsJSON() {
+    cud(ContentType.JSON_FULL_METADATA);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/OperationImportInvokeTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/OperationImportInvokeTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/OperationImportInvokeTestITCase.java
new file mode 100644
index 0000000..f083365
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/OperationImportInvokeTestITCase.java
@@ -0,0 +1,294 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.olingo.client.api.communication.request.invoke.ClientNoContent;
+import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
+import org.apache.olingo.client.api.domain.ClientCollectionValue;
+import org.apache.olingo.client.api.domain.ClientComplexValue;
+import org.apache.olingo.client.api.domain.ClientEntity;
+import org.apache.olingo.client.api.domain.ClientEntitySet;
+import org.apache.olingo.client.api.domain.ClientEnumValue;
+import org.apache.olingo.client.api.domain.ClientPrimitiveValue;
+import org.apache.olingo.client.api.domain.ClientProperty;
+import org.apache.olingo.client.api.domain.ClientValue;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.junit.Test;
+
+public class OperationImportInvokeTestITCase extends AbstractTestITCase {
+
+  private void functionImports(final ContentType contentType) throws EdmPrimitiveTypeException {
+    // GetDefaultColor
+    final ODataInvokeRequest<ClientProperty> defaultColorReq = getClient().getInvokeRequestFactory().
+        getFunctionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("GetDefaultColor").build(), ClientProperty.class);
+    defaultColorReq.setFormat(contentType);
+    final ClientProperty defaultColor = defaultColorReq.execute().getBody();
+    assertNotNull(defaultColor);
+    assertTrue(defaultColor.hasEnumValue());
+    assertEquals("Red", defaultColor.getEnumValue().getValue());
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Color", defaultColor.getEnumValue().getTypeName());
+
+    // GetPerson2
+    final ClientPrimitiveValue city = getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("London");
+
+    final ODataInvokeRequest<ClientEntity> person2Req = getClient().getInvokeRequestFactory().
+        getFunctionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("GetPerson2").build(), ClientEntity.class,
+            Collections.<String, ClientValue> singletonMap("city", city));
+    person2Req.setFormat(contentType);
+    final ClientEntity person2 = person2Req.execute().getBody();
+    assertNotNull(person2);
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Customer", person2.getTypeName().toString());
+    assertEquals(1, person2.getProperty("PersonID").getPrimitiveValue().toCastValue(Integer.class), 0);
+
+    // GetPerson
+    final ClientComplexValue address = getClient().getObjectFactory().
+        newComplexValue("Microsoft.Test.OData.Services.ODataWCFService.Address");
+    address.add(client.getObjectFactory().newPrimitiveProperty("Street",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("1 Microsoft Way")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("City",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("London")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("PostalCode",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("98052")));
+
+    final ODataInvokeRequest<ClientEntity> personReq = getClient().getInvokeRequestFactory().
+        getFunctionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("GetPerson").build(), ClientEntity.class,
+            Collections.<String, ClientValue> singletonMap("address", address));
+    personReq.setFormat(contentType);
+    final ClientEntity person = personReq.execute().getBody();
+    assertNotNull(person);
+    assertEquals(person2, person);
+
+    // GetAllProducts
+    final ODataInvokeRequest<ClientEntitySet> productsReq = getClient().getInvokeRequestFactory()
+        .getFunctionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("GetAllProducts").build(), ClientEntitySet.class);
+    productsReq.setFormat(contentType);
+    final ClientEntitySet products = productsReq.execute().getBody();
+    assertNotNull(products);
+    assertEquals(5, products.getEntities().size());
+
+    // GetProductsByAccessLevel
+    final ClientEnumValue accessLevel = getClient().getObjectFactory().
+        newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.AccessLevel", "None");
+
+    final ODataInvokeRequest<ClientProperty> prodByALReq = getClient().getInvokeRequestFactory().
+        getFunctionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("GetProductsByAccessLevel").build(), ClientProperty.class,
+            Collections.<String, ClientValue> singletonMap("accessLevel", accessLevel));
+    prodByALReq.setFormat(contentType);
+    final ClientProperty prodByAL = prodByALReq.execute().getBody();
+    assertNotNull(prodByAL);
+    assertTrue(prodByAL.hasCollectionValue());
+    assertEquals(5, prodByAL.getCollectionValue().size());
+    assertTrue(prodByAL.getCollectionValue().asJavaCollection().contains("Car"));
+  }
+
+  @Test
+  public void atomFunctionImports() throws EdmPrimitiveTypeException {
+    functionImports(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void jsonFunctionImports() throws EdmPrimitiveTypeException {
+    functionImports(ContentType.JSON_FULL_METADATA);
+  }
+
+  @Test
+  public void edmEnabledFunctionImports() throws EdmPrimitiveTypeException {
+    // GetDefaultColor
+    final ODataInvokeRequest<ClientProperty> defaultColorReq = edmClient.getInvokeRequestFactory().
+        getFunctionImportInvokeRequest("GetDefaultColor");
+    final ClientProperty defaultColor = defaultColorReq.execute().getBody();
+    assertNotNull(defaultColor);
+    assertTrue(defaultColor.hasEnumValue());
+    assertEquals("Red", defaultColor.getEnumValue().getValue());
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Color", defaultColor.getEnumValue().getTypeName());
+
+    // GetPerson2
+    final ClientPrimitiveValue city =
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("London");
+    final ODataInvokeRequest<ClientEntity> person2Req = edmClient.getInvokeRequestFactory().
+        getFunctionImportInvokeRequest(
+            "GetPerson2", Collections.<String, ClientValue> singletonMap("city", city));
+    final ClientEntity person2 = person2Req.execute().getBody();
+    assertNotNull(person2);
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Customer", person2.getTypeName().toString());
+    assertEquals(1, person2.getProperty("PersonID").getPrimitiveValue().toCastValue(Integer.class), 0);
+
+    // GetPerson
+    final ClientComplexValue address = getClient().getObjectFactory().
+        newComplexValue("Microsoft.Test.OData.Services.ODataWCFService.Address");
+    address.add(client.getObjectFactory().newPrimitiveProperty("Street",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("1 Microsoft Way")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("City",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("London")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("PostalCode",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("98052")));
+
+    final ODataInvokeRequest<ClientEntity> personReq = edmClient.getInvokeRequestFactory().
+        getFunctionImportInvokeRequest(
+            "GetPerson", Collections.<String, ClientValue> singletonMap("address", address));
+    final ClientEntity person = personReq.execute().getBody();
+    assertNotNull(person);
+    assertEquals(person2, person);
+
+    // GetAllProducts
+    final ODataInvokeRequest<ClientEntitySet> productsReq = edmClient.getInvokeRequestFactory().
+        getFunctionImportInvokeRequest("GetAllProducts");
+    final ClientEntitySet products = productsReq.execute().getBody();
+    assertNotNull(products);
+    assertEquals(5, products.getEntities().size());
+
+    // GetProductsByAccessLevel
+    final ClientEnumValue accessLevel = getClient().getObjectFactory().
+        newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.AccessLevel", "None");
+
+    final ODataInvokeRequest<ClientProperty> prodByALReq = edmClient.getInvokeRequestFactory().
+        getFunctionImportInvokeRequest(
+            "GetProductsByAccessLevel",
+            Collections.<String, ClientValue> singletonMap("accessLevel", accessLevel));
+    final ClientProperty prodByAL = prodByALReq.execute().getBody();
+    assertNotNull(prodByAL);
+    assertTrue(prodByAL.hasCollectionValue());
+    assertEquals(5, prodByAL.getCollectionValue().size());
+    assertTrue(prodByAL.getCollectionValue().asJavaCollection().contains("Car"));
+  }
+
+  private void actionImports(final ContentType contentType) {
+    // Discount
+    final ClientPrimitiveValue percentage = getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(22);
+    final ODataInvokeRequest<ClientNoContent> discountReq = getClient().getInvokeRequestFactory().
+        getActionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("Discount").build(), ClientNoContent.class,
+            Collections.<String, ClientValue> singletonMap("percentage", percentage));
+    discountReq.setFormat(contentType);
+    final ClientNoContent discount = discountReq.execute().getBody();
+    assertNotNull(discount);
+
+    // ResetBossAddress
+    final ClientComplexValue address = getClient().getObjectFactory().
+        newComplexValue("Microsoft.Test.OData.Services.ODataWCFService.Address");
+    address.add(client.getObjectFactory().newPrimitiveProperty("Street",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("Via Le Mani Dal Naso, 123")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("City",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("Tollo")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("PostalCode",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("66010")));
+
+    final ODataInvokeRequest<ClientProperty> resetBossAddressReq = getClient().getInvokeRequestFactory().
+        getActionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("ResetBossAddress").build(), ClientProperty.class,
+            Collections.<String, ClientValue> singletonMap("address", address));
+    resetBossAddressReq.setFormat(contentType);
+    final ClientProperty resetBossAddress = resetBossAddressReq.execute().getBody();
+    assertNotNull(resetBossAddress);
+    assertEquals(address, resetBossAddress.getComplexValue());
+  }
+
+  @Test
+  public void atomActionImports() {
+    actionImports(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void jsonActionImports() {
+    actionImports(ContentType.JSON_FULL_METADATA);
+  }
+
+  @Test
+  public void edmEnabledActionImports() {
+    // Discount
+    final ClientPrimitiveValue percentage = getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(22);
+    final ODataInvokeRequest<ClientNoContent> discountReq = edmClient.getInvokeRequestFactory().
+        getActionImportInvokeRequest(
+            "Discount", Collections.<String, ClientValue> singletonMap("percentage", percentage));
+    final ClientNoContent discount = discountReq.execute().getBody();
+    assertNotNull(discount);
+
+    // ResetBossAddress
+    final ClientComplexValue address = getClient().getObjectFactory().
+        newComplexValue("Microsoft.Test.OData.Services.ODataWCFService.Address");
+    address.add(client.getObjectFactory().newPrimitiveProperty("Street",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("Via Le Mani Dal Naso, 123")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("City",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("Tollo")));
+    address.add(client.getObjectFactory().newPrimitiveProperty("PostalCode",
+        client.getObjectFactory().newPrimitiveValueBuilder().buildString("66010")));
+
+    final ODataInvokeRequest<ClientProperty> resetBossAddressReq = edmClient.getInvokeRequestFactory().
+        getActionImportInvokeRequest(
+            "ResetBossAddress", Collections.<String, ClientValue> singletonMap("address", address));
+    final ClientProperty resetBossAddress = resetBossAddressReq.execute().getBody();
+    assertNotNull(resetBossAddress);
+    assertEquals(address.getTypeName(), resetBossAddress.getComplexValue().getTypeName());
+  }
+
+  private void bossEmails(final ContentType contentType) {
+    // ResetBossEmail
+    final ClientCollectionValue<ClientValue> emails =
+        getClient().getObjectFactory().newCollectionValue("Collection(Edm.String)");
+    emails.add(getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("first@olingo.apache.org"));
+    emails.add(getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("second@olingo.apache.org"));
+    ODataInvokeRequest<ClientProperty> bossEmailsReq = getClient().getInvokeRequestFactory().
+        getActionInvokeRequest(getClient().newURIBuilder(testStaticServiceRootURL).
+            appendOperationCallSegment("ResetBossEmail").build(), ClientProperty.class,
+            Collections.<String, ClientValue> singletonMap("emails", emails));
+    bossEmailsReq.setFormat(contentType);
+    final ClientProperty bossEmails = bossEmailsReq.execute().getBody();
+    assertNotNull(bossEmails);
+    assertTrue(bossEmails.hasCollectionValue());
+    assertEquals(2, bossEmails.getCollectionValue().size());
+
+    final Map<String, ClientValue> params = new LinkedHashMap<String, ClientValue>(2);
+    params.put("start", getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(0));
+    params.put("count", getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(100));
+    bossEmailsReq = getClient().getInvokeRequestFactory().getFunctionInvokeRequest(
+        getClient().newURIBuilder(testStaticServiceRootURL).
+        appendOperationCallSegment("GetBossEmails").build(), ClientProperty.class, params);
+    bossEmailsReq.setFormat(contentType);
+    final ClientProperty bossEmailsViaGET = bossEmailsReq.execute().getBody();
+    assertNotNull(bossEmailsViaGET);
+    assertTrue(bossEmailsViaGET.hasCollectionValue());
+    assertEquals(2, bossEmailsViaGET.getCollectionValue().size());
+    assertEquals(bossEmails.getCollectionValue().asJavaCollection(),
+        bossEmailsViaGET.getCollectionValue().asJavaCollection());
+  }
+
+  @Test
+  public void atomBossEmails() throws EdmPrimitiveTypeException {
+    bossEmails(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void jsonBossEmails() throws EdmPrimitiveTypeException {
+    bossEmails(ContentType.JSON_FULL_METADATA);
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/PropertyTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/PropertyTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/PropertyTestITCase.java
new file mode 100644
index 0000000..e16d9ea
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/PropertyTestITCase.java
@@ -0,0 +1,211 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+
+import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.client.api.communication.request.cud.ODataDeleteRequest;
+import org.apache.olingo.client.api.communication.request.cud.ODataEntityCreateRequest;
+import org.apache.olingo.client.api.communication.request.cud.ODataPropertyUpdateRequest;
+import org.apache.olingo.client.api.communication.request.cud.UpdateType;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
+import org.apache.olingo.client.api.communication.response.ODataDeleteResponse;
+import org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
+import org.apache.olingo.client.api.communication.response.ODataPropertyUpdateResponse;
+import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
+import org.apache.olingo.client.api.domain.ClientEntity;
+import org.apache.olingo.client.api.domain.ClientProperty;
+import org.apache.olingo.client.api.domain.ClientValuable;
+import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpMethod;
+import org.junit.Test;
+
+public class PropertyTestITCase extends AbstractTestITCase {
+
+  private void _enum(final ODataClient client, final ContentType contentType) {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Products").appendKeySegment(5).appendPropertySegment("CoverColors");
+    final ODataPropertyRequest<ClientProperty> req = client.getRetrieveRequestFactory().
+        getPropertyRequest(uriBuilder.build());
+    req.setFormat(contentType);
+
+    final ClientProperty prop = req.execute().getBody();
+    assertNotNull(prop);
+    // cast to workaround JDK 6 bug, fixed in JDK 7
+    assertEquals("Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)",
+        ((ClientValuable) prop).getValue().getTypeName());
+  }
+
+  @Test
+  public void enumFromXML() {
+    _enum(client, ContentType.APPLICATION_XML);
+  }
+
+  @Test
+  public void enumFromJSON() {
+    _enum(edmClient, ContentType.JSON);
+  }
+
+  @Test
+  public void enumFromFullJSON() {
+    _enum(client, ContentType.JSON_FULL_METADATA);
+  }
+
+  private void geospatial(final ODataClient client, final ContentType contentType) {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("Home");
+    final ODataPropertyRequest<ClientProperty> req = client.getRetrieveRequestFactory().
+        getPropertyRequest(uriBuilder.build());
+    req.setFormat(contentType);
+
+    final ClientProperty prop = req.execute().getBody();
+    assertNotNull(prop);
+    // cast to workaround JDK 6 bug, fixed in JDK 7
+    assertEquals("Edm.GeographyPoint", ((ClientValuable) prop).getValue().getTypeName());
+  }
+
+  @Test
+  public void geospatialFromXML() {
+    geospatial(client, ContentType.APPLICATION_XML);
+  }
+
+  @Test
+  public void geospatialFromJSON() {
+    geospatial(edmClient, ContentType.JSON);
+  }
+
+  @Test
+  public void geospatialFromFullJSON() {
+    geospatial(client, ContentType.JSON_FULL_METADATA);
+  }
+
+  private void complex(final ODataClient client, final ContentType contentType) {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Customers").appendKeySegment(2).appendPropertySegment("HomeAddress");
+    final ODataPropertyRequest<ClientProperty> req = client.getRetrieveRequestFactory().
+        getPropertyRequest(uriBuilder.build());
+    req.setFormat(contentType);
+
+    final ClientProperty prop = req.execute().getBody();
+    assertNotNull(prop);
+    // cast to workaround JDK 6 bug, fixed in JDK 7
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Address",
+        ((ClientValuable) prop).getValue().getTypeName());
+  }
+
+  @Test
+  public void complexFromXML() {
+    complex(client, ContentType.APPLICATION_XML);
+  }
+
+  @Test
+  public void complexFromJSON() {
+    complex(edmClient, ContentType.JSON);
+  }
+
+  @Test
+  public void complexFromFullJSON() {
+    complex(client, ContentType.JSON_FULL_METADATA);
+  }
+
+  private void updateComplexProperty(final ContentType contentType, final UpdateType type)
+          throws IOException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Customers").appendKeySegment(1).appendPropertySegment("HomeAddress");
+
+    ODataPropertyRequest<ClientProperty> retrieveReq =
+        client.getRetrieveRequestFactory().getPropertyRequest(uriBuilder.build());
+    retrieveReq.setFormat(contentType);
+
+    ODataRetrieveResponse<ClientProperty> retrieveRes = retrieveReq.execute();
+    assertEquals(200, retrieveRes.getStatusCode());
+    ClientProperty oldAddress = retrieveRes.getBody();
+
+    ClientProperty homeAddress = client.getObjectFactory().newComplexProperty("HomeAddress",
+        client.getObjectFactory().newComplexValue(retrieveRes.getBody().getComplexValue().getTypeName()));
+
+    final String cityName = "Pescara";
+    homeAddress.getComplexValue().add(client.getObjectFactory().
+        newPrimitiveProperty("City", client.getObjectFactory().newPrimitiveValueBuilder().buildString(cityName)));
+
+    final ODataPropertyUpdateRequest updateReq = client.getCUDRequestFactory().
+        getPropertyComplexValueUpdateRequest(uriBuilder.build(), type, homeAddress);
+    if (client.getConfiguration().isUseXHTTPMethod()) {
+      assertEquals(HttpMethod.POST, updateReq.getMethod());
+    } else {
+      assertEquals(type.getMethod(), updateReq.getMethod());
+    }
+    updateReq.setFormat(contentType);
+
+    final ODataPropertyUpdateResponse updateRes = updateReq.execute();
+    assertEquals(204, updateRes.getStatusCode());
+
+    retrieveReq = client.getRetrieveRequestFactory().getPropertyRequest(uriBuilder.build());
+    retrieveReq.setFormat(contentType);
+
+    retrieveRes = retrieveReq.execute();
+    assertEquals(200, retrieveRes.getStatusCode());
+
+    homeAddress = retrieveRes.getBody();
+    assertEquals(cityName, homeAddress.getComplexValue().get("City").getPrimitiveValue().toString());
+
+    //
+    final ODataPropertyUpdateRequest resetRequest = client.getCUDRequestFactory().
+            getPropertyComplexValueUpdateRequest(uriBuilder.build(), type, oldAddress);
+    assertEquals(204, resetRequest.execute().getStatusCode());
+  }
+
+  @Test
+  public void patchComplexPropertyAsJSON() throws IOException {
+    updateComplexProperty(ContentType.JSON_FULL_METADATA, UpdateType.PATCH);
+  }
+
+  @Test
+  public void createAndDelete() {
+    // 1. create
+    final ClientEntity category = client.getObjectFactory().newEntity(null);
+    category.setId(client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Categories").appendKeySegment(1).build());
+
+    final URIBuilder createBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Products").appendKeySegment(0).appendNavigationSegment("Categories").
+        appendRefSegment();
+    final ODataEntityCreateRequest<ClientEntity> createReq = client.getCUDRequestFactory().
+        getEntityCreateRequest(createBuilder.build(), category);
+
+    final ODataEntityCreateResponse<ClientEntity> createRes = createReq.execute();
+    assertEquals(204, createRes.getStatusCode());
+
+    // 2. delete
+    final URIBuilder deleteBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Products").appendKeySegment(0).appendNavigationSegment("Categories").
+        appendKeySegment(1).appendRefSegment();
+    final ODataDeleteRequest deleteReq = client.getCUDRequestFactory().
+        getDeleteRequest(deleteBuilder.build());
+
+    final ODataDeleteResponse deleteRes = deleteReq.execute();
+    assertEquals(204, deleteRes.getStatusCode());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/PropertyValueTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/PropertyValueTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/PropertyValueTestITCase.java
new file mode 100644
index 0000000..12bc827
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/PropertyValueTestITCase.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.olingo.client.api.communication.ODataClientErrorException;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataValueRequest;
+import org.apache.olingo.client.api.domain.ClientPrimitiveValue;
+import org.apache.olingo.client.api.domain.ClientProperty;
+import org.apache.olingo.client.api.domain.ClientValuable;
+import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.junit.Test;
+
+public class PropertyValueTestITCase extends AbstractTestITCase {
+
+  @Test
+  public void retrieveIntPropertyValueTest() throws EdmPrimitiveTypeException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("PersonID");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setFormat(ContentType.TEXT_PLAIN);
+    assertEquals("5", req.execute().getBody().toString());
+  }
+
+  @Test
+  public void retrieveBooleanPropertyValueTest() throws EdmPrimitiveTypeException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("IsRegistered");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setFormat(ContentType.TEXT_PLAIN);
+    assertEquals("true", req.execute().getBody().toString());
+  }
+
+  @Test
+  public void retrieveStringPropertyValueTest() throws EdmPrimitiveTypeException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("FirstName");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setFormat(ContentType.TEXT_PLAIN);
+    assertEquals("Peter", req.execute().getBody().toString());
+  }
+
+  @Test
+  public void retrieveDatePropertyValueTest() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Orders").appendKeySegment(8).appendPropertySegment("OrderDate");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setFormat(ContentType.TEXT_PLAIN);
+    final ClientPrimitiveValue property = req.execute().getBody();
+    assertEquals("2011-03-04T16:03:57Z", property.toString());
+  }
+
+  @Test
+  public void retrieveDecimalPropertyValueTest() throws EdmPrimitiveTypeException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("Height");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setFormat(ContentType.TEXT_PLAIN);
+    final ClientPrimitiveValue property = req.execute().getBody();
+    assertEquals("179", property.toString());
+  }
+
+  @Test
+  public void retrieveBinaryPropertyValueTest() throws IOException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("PDC");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setFormat(ContentType.TEXT_PLAIN);
+    final ClientPrimitiveValue property = req.execute().getBody();
+    assertEquals("fi653p3+MklA/LdoBlhWgnMTUUEo8tEgtbMXnF0a3CUNL9BZxXpSRiD9ebTnmNR0zWPjJ"
+        + "VIDx4tdmCnq55XrJh+RW9aI/b34wAogK3kcORw=", property.toString());
+  }
+
+  @Test(expected = ODataClientErrorException.class)
+  public void retrieveBinaryPropertyValueTestWithAtom() throws IOException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("PDC");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setAccept(ContentType.APPLICATION_ATOM_XML.toContentTypeString());
+    req.execute().getBody();
+  }
+
+  @Test(expected = ODataClientErrorException.class)
+  public void retrieveBinaryPropertyValueTestWithXML() throws IOException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("PDC");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setAccept(ContentType.APPLICATION_XML.toContentTypeString());
+    req.execute().getBody();
+  }
+
+  @Test
+  public void retrieveCollectionPropertyValueTest() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("Numbers");
+    final ODataPropertyRequest<ClientProperty> req = client.getRetrieveRequestFactory().
+        getPropertyRequest(uriBuilder.build());
+    req.setFormat(ContentType.APPLICATION_XML);
+    final ClientProperty property = req.execute().getBody();
+    // cast to workaround JDK 6 bug, fixed in JDK 7
+    assertTrue(((ClientValuable) property).getValue().isCollection());
+    assertEquals("555-555-5555", property.getCollectionValue().iterator().next().asPrimitive().toString());
+  }
+
+  @Test
+  public void retrieveNullPropertyValueTest() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("HomeAddress");
+    final ODataValueRequest req = client.getRetrieveRequestFactory().getPropertyValueRequest(uriBuilder.build());
+    req.setFormat(ContentType.TEXT_PLAIN);
+    final ClientPrimitiveValue property = req.execute().getBody();
+    assertTrue(StringUtils.isBlank(property.toString()));
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/QueryOptionsTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/QueryOptionsTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/QueryOptionsTestITCase.java
new file mode 100644
index 0000000..cd937ab
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/QueryOptionsTestITCase.java
@@ -0,0 +1,246 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataEntitySetRequest;
+import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
+import org.apache.olingo.client.api.domain.ClientEntity;
+import org.apache.olingo.client.api.domain.ClientEntitySet;
+import org.apache.olingo.client.api.domain.ClientInlineEntitySet;
+import org.apache.olingo.client.api.uri.QueryOption;
+import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.junit.Test;
+
+/**
+ * This is the unit test class to check for query options.
+ */
+public class QueryOptionsTestITCase extends AbstractTestITCase {
+
+  /**
+   * Test <tt>$expand</tt>.
+   */
+  public void expand() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Customers").appendKeySegment(1).expand("Orders");
+
+    final ODataEntityRequest<ClientEntity> req =
+        client.getRetrieveRequestFactory().getEntityRequest(uriBuilder.build());
+
+    final ClientEntity customer = req.execute().getBody();
+    assertTrue(customer.getNavigationLink("Orders") instanceof ClientInlineEntitySet);
+  }
+
+  @Test
+  public void expandWithFilter() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Customers").appendKeySegment(1).
+        expandWithOptions("Orders", Collections.<QueryOption, Object> singletonMap(
+            QueryOption.FILTER, getClient().getFilterFactory().gt("OrderID", 7).build()));
+
+    final ODataEntityRequest<ClientEntity> req =
+        client.getRetrieveRequestFactory().getEntityRequest(uriBuilder.build());
+
+    final ClientEntity customer = req.execute().getBody();
+    assertTrue(customer.getNavigationLink("Orders") instanceof ClientInlineEntitySet);
+  }
+
+  /**
+   * Test <tt>$filter</tt> and <tt>$orderby</tt>.
+   *
+   * @see org.apache.olingo.fit.base.FilterFactoryTestITCase for more tests.
+   */
+  @Test
+  public void filterOrderby() throws EdmPrimitiveTypeException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").filter("(PersonID lt 3)");
+
+    // 1. check that filtered entity set looks as expected
+    ODataEntitySetRequest<ClientEntitySet> req =
+        client.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
+
+    ClientEntitySet feed = req.execute().getBody();
+    assertNotNull(feed);
+    assertEquals(2, feed.getEntities().size());
+
+    // 2. extract PersonID values - sorted ASC by default
+    final List<Integer> former = new ArrayList<Integer>(2);
+    for (ClientEntity entity : feed.getEntities()) {
+      final Integer personID = entity.getProperty("PersonID").getPrimitiveValue().toCastValue(Integer.class);
+      assertTrue(personID < 3);
+      former.add(personID);
+    }
+
+    // 3. add orderby clause to filter above
+    req = client.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.orderBy("PersonID desc").build());
+
+    feed = req.execute().getBody();
+    assertNotNull(feed);
+    assertEquals(2, feed.getEntities().size());
+
+    // 4. extract again VIN value - now they were required to be sorted DESC
+    final List<Integer> latter = new ArrayList<Integer>(2);
+    for (ClientEntity entity : feed.getEntities()) {
+      final Integer personID = entity.getProperty("PersonID").getPrimitiveValue().toCastValue(Integer.class);
+      assertTrue(personID < 3);
+      latter.add(personID);
+    }
+
+    // 5. reverse latter and expect to be equal to former
+    Collections.reverse(latter);
+    assertEquals(former, latter);
+  }
+
+  /**
+   * Test <tt>$format</tt>.
+   */
+  @Test
+  public void format() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Customers").appendKeySegment(1).format("json");
+
+    final ODataEntityRequest<ClientEntity> req =
+        client.getRetrieveRequestFactory().getEntityRequest(uriBuilder.build());
+    req.setFormat(ContentType.APPLICATION_ATOM_XML);
+
+    final ODataRetrieveResponse<ClientEntity> res = req.execute();
+    assertNotNull(res);
+    assertTrue(res.getContentType().replaceAll(" ", "").
+        startsWith(ContentType.JSON.toContentTypeString()));
+  }
+
+  /**
+   * Test <tt>$skip</tt>.
+   */
+  public void skip() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("People");
+
+    // 1. check that filtered entity set looks as expected
+    final ODataEntitySetRequest<ClientEntitySet> req =
+        client.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.skip(2).build());
+
+    final ClientEntitySet feed = req.execute().getBody();
+    assertEquals(3, feed.getEntities().size());
+  }
+
+  /**
+   * Test <tt>$top</tt>.
+   */
+  public void top() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("People");
+
+    // 1. check that filtered entity set looks as expected
+    final ODataEntitySetRequest<ClientEntitySet> req = client.getRetrieveRequestFactory().
+        getEntitySetRequest(uriBuilder.top(2).build());
+
+    final ClientEntitySet feed = req.execute().getBody();
+    assertEquals(2, feed.getEntities().size());
+  }
+
+  /**
+   * Test <tt>$skiptoken</tt>.
+   */
+  @Test
+  public void skiptoken() throws EdmPrimitiveTypeException {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL);
+    uriBuilder.appendEntitySetSegment("People").skipToken("5");
+
+    final ODataEntitySetRequest<ClientEntitySet> req =
+        client.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
+
+    final ClientEntitySet feed = req.execute().getBody();
+    assertNotNull(feed);
+    assertEquals(1, feed.getEntities().size());
+
+    for (ClientEntity entity : feed.getEntities()) {
+      assertTrue(entity.getProperty("PersonID").getPrimitiveValue().toCastValue(Integer.class) > 5);
+    }
+  }
+
+  /**
+   * Test <tt>$inlinecount</tt>.
+   */
+  @Test
+  public void count() {
+    final URIBuilder uriBuilder =
+        client.newURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Customers").count(true);
+
+    final ODataEntitySetRequest<ClientEntitySet> req =
+        client.getRetrieveRequestFactory().getEntitySetRequest(uriBuilder.build());
+
+    final ClientEntitySet feed = req.execute().getBody();
+    assertNotNull(feed);
+    assertEquals(Integer.valueOf(feed.getEntities().size()), feed.getCount());
+  }
+
+  /**
+   * Test <tt>$select</tt>.
+   */
+  @Test
+  public void select() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("Customers").appendKeySegment(1).select("PersonID,Orders").expand("Orders");
+
+    final ODataEntityRequest<ClientEntity> req =
+        client.getRetrieveRequestFactory().getEntityRequest(uriBuilder.build());
+
+    final ClientEntity customer = req.execute().getBody();
+    assertEquals(1, customer.getProperties().size());
+    assertEquals(1, customer.getNavigationLinks().size());
+    assertTrue((customer.getNavigationLinks().get(0) instanceof ClientInlineEntitySet));
+  }
+
+  @Test
+  public void issue253() {
+    final URIBuilder uriBuilder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("relatedEntitySelect").appendEntitySetSegment("Customers").appendKeySegment(1).
+        expandWithSelect("Orders", "OrderID", "OrderDetails");
+
+    final ODataEntityRequest<ClientEntity> req =
+        client.getRetrieveRequestFactory().getEntityRequest(uriBuilder.build());
+
+    final ODataRetrieveResponse<ClientEntity> res = req.execute();
+    assertEquals(200, res.getStatusCode());
+  }
+
+  @Test
+  public void search() {
+    final URIBuilder builder = client.newURIBuilder(testStaticServiceRootURL).
+        appendEntitySetSegment("People").search(client.getSearchFactory().
+            or(client.getSearchFactory().literal("Bob"), client.getSearchFactory().literal("Jill")));
+
+    final ODataEntitySetRequest<ClientEntitySet> req =
+        client.getRetrieveRequestFactory().getEntitySetRequest(builder.build());
+
+    final ODataRetrieveResponse<ClientEntitySet> res = req.execute();
+    assertEquals(200, res.getStatusCode());
+    assertFalse(res.getBody().getEntities().isEmpty());
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/ServiceDocumentTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/ServiceDocumentTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/ServiceDocumentTestITCase.java
new file mode 100644
index 0000000..10beb8b
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/ServiceDocumentTestITCase.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+
+import java.net.URI;
+
+import org.apache.olingo.client.api.communication.request.retrieve.ODataServiceDocumentRequest;
+import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
+import org.apache.olingo.client.api.domain.ClientServiceDocument;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.junit.Test;
+
+public class ServiceDocumentTestITCase extends AbstractTestITCase {
+
+  private void retrieveServiceDocument(final ContentType contentType) {
+    final ODataServiceDocumentRequest req =
+        client.getRetrieveRequestFactory().getServiceDocumentRequest(testStaticServiceRootURL);
+    req.setFormat(contentType);
+
+    final ODataRetrieveResponse<ClientServiceDocument> res = req.execute();
+    assertEquals(200, res.getStatusCode());
+
+    final ClientServiceDocument serviceDocument = res.getBody();
+    assertEquals(12, serviceDocument.getEntitySets().size());
+    assertEquals(6, serviceDocument.getSingletons().size());
+    assertEquals(6, serviceDocument.getFunctionImports().size());
+
+    assertEquals(URI.create(testStaticServiceRootURL + "/ProductDetails"),
+        serviceDocument.getEntitySetURI("ProductDetails"));
+    assertEquals(URI.create(testStaticServiceRootURL + "/Boss"),
+        serviceDocument.getSingletonURI("Boss"));
+    assertEquals(URI.create(testStaticServiceRootURL + "/GetPerson"),
+        serviceDocument.getFunctionImportURI("GetPerson"));
+  }
+
+  @Test
+  public void retrieveServiceDocumentAsXML() {
+    retrieveServiceDocument(ContentType.APPLICATION_XML);
+  }
+
+  @Test
+  public void retrieveServiceDocumentAsJSON() {
+    retrieveServiceDocument(ContentType.JSON);
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/78a9539e/fit/src/test/java/org/apache/olingo/fit/base/SingletonTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/base/SingletonTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/base/SingletonTestITCase.java
new file mode 100644
index 0000000..8a0ee72
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/base/SingletonTestITCase.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+
+import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.client.api.communication.request.cud.ODataEntityUpdateRequest;
+import org.apache.olingo.client.api.communication.request.cud.UpdateType;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
+import org.apache.olingo.client.api.communication.response.ODataEntityUpdateResponse;
+import org.apache.olingo.client.api.domain.ClientAnnotation;
+import org.apache.olingo.client.api.domain.ClientSingleton;
+import org.apache.olingo.client.api.domain.ClientValuable;
+import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.junit.Test;
+
+public class SingletonTestITCase extends AbstractTestITCase {
+
+  private void read(final ODataClient client, final ContentType contentType) throws EdmPrimitiveTypeException {
+    final URIBuilder builder = client.newURIBuilder(testStaticServiceRootURL).appendSingletonSegment("Company");
+    final ODataEntityRequest<ClientSingleton> singleton =
+        client.getRetrieveRequestFactory().getSingletonRequest(builder.build());
+    singleton.setFormat(contentType);
+    final ClientSingleton company = singleton.execute().getBody();
+    assertNotNull(company);
+
+    assertEquals(0, company.getProperty("CompanyID").getPrimitiveValue().toCastValue(Integer.class), 0);
+    // cast to workaround JDK 6 bug, fixed in JDK 7
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.CompanyCategory",
+        ((ClientValuable) company.getProperty("CompanyCategory")).getValue().getTypeName());
+    assertTrue(company.getProperty("CompanyCategory").hasEnumValue());
+  }
+
+  @Test
+  public void readFromAtom() throws EdmPrimitiveTypeException {
+    read(client, ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void readFromJSON() throws EdmPrimitiveTypeException {
+    read(edmClient, ContentType.JSON);
+  }
+
+  @Test
+  public void readfromJSONFull() throws EdmPrimitiveTypeException {
+    read(client, ContentType.JSON_FULL_METADATA);
+  }
+
+  private void readWithAnnotations(final ODataClient client, final ContentType contentType)
+      throws EdmPrimitiveTypeException {
+
+    final URIBuilder builder = client.newURIBuilder(testStaticServiceRootURL).appendSingletonSegment("Boss");
+    final ODataEntityRequest<ClientSingleton> singleton =
+        client.getRetrieveRequestFactory().getSingletonRequest(builder.build());
+    singleton.setFormat(contentType);
+    singleton.setPrefer(client.newPreferences().includeAnnotations("*"));
+    final ClientSingleton boss = singleton.execute().getBody();
+    assertNotNull(boss);
+
+    assertFalse(boss.getAnnotations().isEmpty());
+    final ClientAnnotation isBoss = boss.getAnnotations().get(0);
+    assertTrue(isBoss.getPrimitiveValue().toCastValue(Boolean.class));
+  }
+
+  @Test
+  public void readWithAnnotationsFromAtom() throws EdmPrimitiveTypeException {
+    readWithAnnotations(client, ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void readWithAnnotationsFromJSON() throws EdmPrimitiveTypeException {
+    readWithAnnotations(edmClient, ContentType.JSON);
+  }
+
+  @Test
+  public void readWithAnnotationsFromJSONFull() throws EdmPrimitiveTypeException {
+    readWithAnnotations(client, ContentType.JSON_FULL_METADATA);
+  }
+
+  private void update(final ContentType contentType) throws EdmPrimitiveTypeException {
+    final ClientSingleton changes = getClient().getObjectFactory().newSingleton(
+        new FullQualifiedName("Microsoft.Test.OData.Services.ODataWCFService.Company"));
+    changes.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("Revenue",
+        getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt64(132520L)));
+
+    final URI uri = client.newURIBuilder(testStaticServiceRootURL).appendSingletonSegment("Company").build();
+    final ODataEntityUpdateRequest<ClientSingleton> req = getClient().getCUDRequestFactory().
+        getSingletonUpdateRequest(uri, UpdateType.PATCH, changes);
+    req.setFormat(contentType);
+
+    final ODataEntityUpdateResponse<ClientSingleton> res = req.execute();
+    assertEquals(204, res.getStatusCode());
+
+    final ClientSingleton updated =
+        getClient().getRetrieveRequestFactory().getSingletonRequest(uri).execute().getBody();
+    assertNotNull(updated);
+    assertEquals(132520, updated.getProperty("Revenue").getPrimitiveValue().toCastValue(Integer.class), 0);
+  }
+
+  @Test
+  public void atomUpdate() throws EdmPrimitiveTypeException {
+    update(ContentType.APPLICATION_ATOM_XML);
+  }
+
+  @Test
+  public void jsonUpdate() throws EdmPrimitiveTypeException {
+    update(ContentType.JSON);
+  }
+
+}