/** * Copyright Microsoft Corporation * * Licensed 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 com.microsoft.azure.storage.table; import com.microsoft.azure.storage.StorageException; import com.microsoft.azure.storage.TestRunners.CloudTests; import com.microsoft.azure.storage.TestRunners.DevFabricTests; import com.microsoft.azure.storage.TestRunners.DevStoreTests; import com.microsoft.azure.storage.table.TableTestHelper.Class1; import com.microsoft.azure.storage.table.TableTestHelper.ComplexEntity; import com.microsoft.azure.storage.table.TableTestHelper.IgnoreOnGetter; import com.microsoft.azure.storage.table.TableTestHelper.IgnoreOnGetterAndSetter; import com.microsoft.azure.storage.table.TableTestHelper.IgnoreOnSetter; import com.microsoft.azure.storage.table.TableTestHelper.InvalidStoreAsEntity; import com.microsoft.azure.storage.table.TableTestHelper.StoreAsEntity; import com.microsoft.azure.storage.table.TableTestHelper.StrangeDoubles; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import java.net.URISyntaxException; import java.util.UUID; import static org.junit.Assert.*; /** * Table Serializer Tests */ @Category({DevFabricTests.class, DevStoreTests.class, CloudTests.class}) public class TableSerializerTests { private CloudTable table; @Before public void tableSerializerTestMethodSetUp() throws URISyntaxException, StorageException { this.table = TableTestHelper.getRandomTableReference(); this.table.createIfNotExists(); } @After public void tableSerializerTestMethodTearDown() throws StorageException { this.table.deleteIfExists(); } @Test public void testIgnoreAnnotation() throws StorageException { // Ignore On Getter IgnoreOnGetter ignoreGetter = new IgnoreOnGetter(); ignoreGetter.setPartitionKey("jxscl_odata"); ignoreGetter.setRowKey(UUID.randomUUID().toString()); ignoreGetter.setIgnoreString("ignore data"); this.table.execute(TableOperation.insert(ignoreGetter)); TableResult res = this.table.execute(TableOperation.retrieve(ignoreGetter.getPartitionKey(), ignoreGetter.getRowKey(), IgnoreOnGetter.class)); IgnoreOnGetter retrievedIgnoreG = res.getResultAsType(); assertEquals(retrievedIgnoreG.getIgnoreString(), null); // Ignore On Setter IgnoreOnSetter ignoreSetter = new IgnoreOnSetter(); ignoreSetter.setPartitionKey("jxscl_odata"); ignoreSetter.setRowKey(UUID.randomUUID().toString()); ignoreSetter.setIgnoreString("ignore data"); this.table.execute(TableOperation.insert(ignoreSetter)); res = this.table.execute(TableOperation.retrieve(ignoreSetter.getPartitionKey(), ignoreSetter.getRowKey(), IgnoreOnSetter.class)); IgnoreOnSetter retrievedIgnoreS = res.getResultAsType(); assertEquals(retrievedIgnoreS.getIgnoreString(), null); // Ignore On Getter AndSetter IgnoreOnGetterAndSetter ignoreGetterSetter = new IgnoreOnGetterAndSetter(); ignoreGetterSetter.setPartitionKey("jxscl_odata"); ignoreGetterSetter.setRowKey(UUID.randomUUID().toString()); ignoreGetterSetter.setIgnoreString("ignore data"); this.table.execute(TableOperation.insert(ignoreGetterSetter)); res = this.table.execute(TableOperation.retrieve(ignoreGetterSetter.getPartitionKey(), ignoreGetterSetter.getRowKey(), IgnoreOnGetterAndSetter.class)); IgnoreOnGetterAndSetter retrievedIgnoreGS = res.getResultAsType(); assertEquals(retrievedIgnoreGS.getIgnoreString(), null); } @Test public void testStoreAsAnnotation() throws StorageException { StoreAsEntity ref = new StoreAsEntity(); ref.setPartitionKey("jxscl_odata"); ref.setRowKey(UUID.randomUUID().toString()); ref.setStoreAsString("StoreAsOverride Data"); ref.populateEntity(); this.table.execute(TableOperation.insert(ref)); TableResult res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), StoreAsEntity.class)); StoreAsEntity retrievedStoreAsRef = res.getResultAsType(); assertEquals(retrievedStoreAsRef.getStoreAsString(), ref.getStoreAsString()); // Same query with a class without the storeAs annotation res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class)); ComplexEntity retrievedComplexRef = res.getResultAsType(); assertEquals(retrievedComplexRef.getString(), ref.getStoreAsString()); this.table.execute(TableOperation.delete(retrievedComplexRef)); } @Test public void testInvalidStoreAsAnnotation() throws StorageException { InvalidStoreAsEntity ref = new InvalidStoreAsEntity(); ref.setPartitionKey("jxscl_odata"); ref.setRowKey(UUID.randomUUID().toString()); ref.setStoreAsString("StoreAsOverride Data"); ref.populateEntity(); this.table.execute(TableOperation.insert(ref)); TableResult res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), InvalidStoreAsEntity.class)); InvalidStoreAsEntity retrievedStoreAsRef = res.getResultAsType(); assertEquals(retrievedStoreAsRef.getStoreAsString(), null); } @Test public void testComplexEntityInsert() throws StorageException { TableRequestOptions options = new TableRequestOptions(); options.setTablePayloadFormat(TablePayloadFormat.JsonFullMetadata); testComplexEntityInsert(options, false); options.setTablePayloadFormat(TablePayloadFormat.Json); testComplexEntityInsert(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testComplexEntityInsert(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testComplexEntityInsert(options, true); } private void testComplexEntityInsert(TableRequestOptions options, boolean usePropertyResolver) throws StorageException { ComplexEntity ref = new ComplexEntity(); ref.setPartitionKey("jxscl_odata"); ref.setRowKey(UUID.randomUUID().toString()); ref.populateEntity(); if (usePropertyResolver) { options.setPropertyResolver(ref); } this.table.execute(TableOperation.insert(ref), options, null); TableResult res = this.table.execute( TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ComplexEntity retrievedComplexRef = res.getResultAsType(); ref.assertEquality(retrievedComplexRef); } @Test public void testDoubles() throws StorageException { TableRequestOptions options = new TableRequestOptions(); options.setTablePayloadFormat(TablePayloadFormat.JsonFullMetadata); testDoubles(options, false); options.setTablePayloadFormat(TablePayloadFormat.Json); testDoubles(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testDoubles(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testDoubles(options, true); } private void testDoubles(TableRequestOptions options, boolean usePropertyResolver) throws StorageException { StrangeDoubles ref = new StrangeDoubles(); ref.setPartitionKey("jxscl_odata"); ref.setRowKey(UUID.randomUUID().toString()); ref.populateEntity(); if (usePropertyResolver) { options.setPropertyResolver(ref); } // try with pojo this.table.execute(TableOperation.insert(ref), options, null); TableResult res = this.table.execute( TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), StrangeDoubles.class), options, null); StrangeDoubles retrievedComplexRef = res.getResultAsType(); ref.assertEquality(retrievedComplexRef); } @Test public void testWhitespaceTest() throws StorageException { TableRequestOptions options = new TableRequestOptions(); options.setTablePayloadFormat(TablePayloadFormat.JsonFullMetadata); testWhitespaceTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.Json); testWhitespaceTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testWhitespaceTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testWhitespaceTest(options, true); } private void testWhitespaceTest(TableRequestOptions options, boolean usePropertyResolver) throws StorageException { Class1 ref = new Class1(); ref.setA("B "); ref.setB(" A "); ref.setC(" "); ref.setD(new byte[] { 0, 1, 2 }); ref.setPartitionKey("jxscl_odata"); ref.setRowKey(UUID.randomUUID().toString()); if (usePropertyResolver) { options.setPropertyResolver(ref); } this.table.execute(TableOperation.insert(ref), options, null); TableResult res = this.table.execute( TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), Class1.class), options, null); assertEquals(((Class1) res.getResult()).getA(), ref.getA()); } @Test public void testWhitespaceOnEmptyKeysTest() throws StorageException{ TableRequestOptions options = new TableRequestOptions(); options.setTablePayloadFormat(TablePayloadFormat.JsonFullMetadata); testWhitespaceOnEmptyKeysTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.Json); testWhitespaceOnEmptyKeysTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testWhitespaceOnEmptyKeysTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testWhitespaceOnEmptyKeysTest(options, true); } private void testWhitespaceOnEmptyKeysTest(TableRequestOptions options, boolean usePropertyResolver) throws StorageException { Class1 ref = new Class1(); ref.setA("B "); ref.setB(" A "); ref.setC(" "); ref.setD(new byte[] { 0, 1, 2 }); ref.setPartitionKey(""); ref.setRowKey(""); if (usePropertyResolver) { options.setPropertyResolver(ref); } this.table.execute(TableOperation.insert(ref), options, null); TableResult res = this.table.execute( TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), Class1.class), options, null); assertEquals(((Class1) res.getResult()).getA(), ref.getA()); this.table.execute(TableOperation.delete(ref), options, null); } @Test public void testNewLineTest() throws StorageException { TableRequestOptions options = new TableRequestOptions(); options.setTablePayloadFormat(TablePayloadFormat.JsonFullMetadata); testNewLineTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.Json); testNewLineTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testNewLineTest(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testNewLineTest(options, true); } private void testNewLineTest(TableRequestOptions options, boolean usePropertyResolver) throws StorageException { Class1 ref = new Class1(); ref.setA("B "); ref.setB(" A "); ref.setC("\r\n"); ref.setD(new byte[] { 0, 1, 2 }); ref.setPartitionKey("jxscl_odata"); ref.setRowKey(UUID.randomUUID().toString()); if (usePropertyResolver) { options.setPropertyResolver(ref); } this.table.execute(TableOperation.insert(ref), options, null); TableResult res = this.table.execute( TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), Class1.class), options, null); assertEquals(((Class1) res.getResult()).getA(), ref.getA()); } @Test public void testNulls() throws StorageException { TableRequestOptions options = new TableRequestOptions(); options.setTablePayloadFormat(TablePayloadFormat.JsonFullMetadata); testNulls(options, false); options.setTablePayloadFormat(TablePayloadFormat.Json); testNulls(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testNulls(options, false); options.setTablePayloadFormat(TablePayloadFormat.JsonNoMetadata); testNulls(options, true); } private void testNulls(TableRequestOptions options, boolean usePropertyResolver) throws StorageException { ComplexEntity ref = new ComplexEntity(); ref.setPartitionKey("jxscl_odata"); ref.setRowKey(UUID.randomUUID().toString()); ref.populateEntity(); if (usePropertyResolver) { options.setPropertyResolver(ref); } // Binary object ref.setBinary(null); this.table.execute(TableOperation.insert(ref)); TableResult res = this.table.execute( TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("Binary should be null", ref.getBinary()); // Bool ref.setBool(null); this.table.execute(TableOperation.replace(ref), options, null); res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("Bool should be null", ref.getBool()); // Date ref.setDateTime(null); this.table.execute(TableOperation.replace(ref), options, null); res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("Date should be null", ref.getDateTime()); // Double ref.setDouble(null); this.table.execute(TableOperation.replace(ref), options, null); res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("Double should be null", ref.getDouble()); // UUID ref.setGuid(null); this.table.execute(TableOperation.replace(ref), options, null); res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("UUID should be null", ref.getGuid()); // Int32 ref.setInt32(null); this.table.execute(TableOperation.replace(ref), options, null); res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("Int32 should be null", ref.getInt32()); // Int64 ref.setInt64(null); this.table.execute(TableOperation.replace(ref), options, null); res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("Int64 should be null", ref.getInt64()); // String ref.setString(null); this.table.execute(TableOperation.replace(ref), options, null); res = this.table.execute(TableOperation.retrieve(ref.getPartitionKey(), ref.getRowKey(), ComplexEntity.class), options, null); ref = res.getResultAsType(); assertNull("String should be null", ref.getString()); } }