diff --git a/test/integration/blob/blob_gb18030_test.rb b/test/integration/blob/blob_gb18030_test.rb new file mode 100644 index 0000000000..6ab11a924d --- /dev/null +++ b/test/integration/blob/blob_gb18030_test.rb @@ -0,0 +1,202 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# 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. +#-------------------------------------------------------------------------- +require "integration/test_helper" +require "azure/blob/blob_service" + +describe 'Blob GB-18030' do + subject { Azure::Blob::BlobService.new } + after { ContainerNameHelper.clean } + + let(:container_name) { ContainerNameHelper.name } + let(:blob_name) { "blobname" } + let(:length) { 1024 } + + before { + subject.create_container container_name + subject.create_page_blob container_name, blob_name, length + } + + it 'Read/Write Blob Container Name UTF-8' do + # Expected results: Failure, because the Blob + # container name can only contain ASCII + # characters, per the Blob Service spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_container container_name + v.encode("UTF-8") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read/Write Blob Container Name GB-18030' do + # Expected results: Failure, because the Blob + # container name can only contain ASCII + # characters, per the Blob Service spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_container container_name + v.encode("GB18030") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read/Write Blob Name UTF-8' do + container_name = ContainerNameHelper.name + subject.create_container container_name + GB18030TestStrings.get.each { |k,v| + # The Blob service does not support characters from extended plains. + if k != 'ChineseExtB' then + test_name = container_name + v.encode("UTF-8") + subject.create_block_blob container_name, test_name, "hi" + blobs = subject.list_blobs container_name + blobs.each { |v| + v.name.must_equal test_name + } + subject.delete_blob container_name, test_name + end + } + end + + # Fails because of https://github.com/appfog/azure-sdk-for-ruby/issues/293 + it 'Read/Write Blob Name GB18030' do + container_name = ContainerNameHelper.name + subject.create_container container_name + GB18030TestStrings.get.each { |k,v| + # The Blob service does not support characters from extended plains. + if k != 'ChineseExtB' then + test_name = container_name + v.encode("GB18030") + subject.create_block_blob container_name, test_name, "hi" + blobs = subject.list_blobs container_name + blobs.each { |v| + v.name.encode("UTF-8").must_equal test_name.encode("UTF-8") + } + subject.delete_blob container_name, test_name + end + } + end + + it 'Read/Write Blob Metadata UTF-8 key' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" + v.encode("UTF-8") => "CustomMetadataValue" } + subject.set_blob_metadata container_name, blob_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write Blob Metadata GB-18030 key' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" + v.encode("GB18030") => "CustomMetadataValue" } + subject.set_blob_metadata container_name, blob_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write Blob Metadata UTF-8 value' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" => "CustomMetadataValue" + v.encode("UTF-8")} + subject.set_blob_metadata container_name, blob_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + # TODO: Error should really be 400 + error.status_code.must_equal 403 + end + } + end + + it 'Read/Write Blob Metadata GB-18030 value' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" => "CustomMetadataValue" + v.encode("GB18030")} + subject.set_blob_metadata container_name, blob_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + # TODO: Error should really be 400 + error.status_code.must_equal 403 + end + } + end + + it 'Read/Write Blob Block Content UTF-8' do + GB18030TestStrings.get.each { |k,v| + blob_name = 'Read/Write Block Blob Content UTF-8 for ' + k + content = v.encode("UTF-8") + # The :content_encoding can be removed if feature in + # https://github.com/appfog/azure-sdk-for-ruby/issues/294 + # is added. + options = { :content_encoding=>"UTF-8" } + subject.create_block_blob container_name, blob_name, content, options + blob, returned_content = subject.get_blob container_name, blob_name + returned_content.force_encoding(blob.properties[:content_encoding]) + returned_content.must_equal content + } + end + + it 'Read/Write Blob Block Content GB18030' do + GB18030TestStrings.get.each { |k,v| + blob_name = 'Read/Write Block Blob Content GB18030 for ' + k + content = v.encode("GB18030") + options = { :content_encoding=>"GB18030" } + subject.create_block_blob container_name, blob_name, content, options + blob, returned_content = subject.get_blob container_name, blob_name + returned_content.force_encoding(blob.properties[:content_encoding]) + returned_content.must_equal content + } + end + + it 'Read/Write Blob Page Content UTF-8' do + GB18030TestStrings.get.each { |k,v| + blob_name = 'Read/Write Page Blob Content UTF-8 for ' + k + options = { :content_encoding=>"UTF-8" } + content = v.encode("UTF-8") + while content.bytesize < 512 do + content << "X" + end + subject.create_page_blob container_name, blob_name, 512, options + subject.create_blob_pages container_name, blob_name, 0, 511, content + blob, returned_content = subject.get_blob container_name, blob_name + returned_content.force_encoding(blob.properties[:content_encoding]) + returned_content.must_equal content + } + end + + it 'Read/Write Blob Page Content GB18030' do + GB18030TestStrings.get.each { |k,v| + blob_name = 'Read/Write Page Blob Content GB18030 for ' + k + options = { :content_encoding=>"GB18030" } + content = v.encode("GB18030") + while content.bytesize < 512 do + content << "X" + end + subject.create_page_blob container_name, blob_name, 512, options + subject.create_blob_pages container_name, blob_name, 0, 511, content + blob, returned_content = subject.get_blob container_name, blob_name + returned_content.force_encoding(blob.properties[:content_encoding]) + returned_content.must_equal content + } + end +end diff --git a/test/integration/queue/queue_gb18030_test.rb b/test/integration/queue/queue_gb18030_test.rb new file mode 100644 index 0000000000..124c7ace3e --- /dev/null +++ b/test/integration/queue/queue_gb18030_test.rb @@ -0,0 +1,131 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# 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. +#-------------------------------------------------------------------------- +require "integration/test_helper" +require "azure/blob/blob_service" + +describe 'Queue GB-18030' do + subject { Azure::Queue::QueueService.new } + + let(:queue_name){ QueueNameHelper.name } + + before { + subject.create_queue queue_name + } + + it 'Read/Write Queue Name UTF-8' do + # Expected results: Failure, because the Queue + # name can only contain ASCII + # characters, per the Queue Service spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_queue queue_name + v.encode("UTF-8") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read/Write Queue Name GB-18030' do + # Expected results: Failure, because the Queue + # name can only contain ASCII + # characters, per the Queue Service spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_queue queue_name + v.encode("GB18030") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read/Write Queue Metadata UTF-8 key' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" + v.encode("UTF-8") => "CustomMetadataValue" } + subject.set_queue_metadata queue_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write Queue Metadata GB-18030 key' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" + v.encode("GB18030") => "CustomMetadataValue" } + subject.set_queue_metadata queue_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write Queue Metadata UTF-8 value' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" => "CustomMetadataValue" + v.encode("UTF-8")} + subject.set_queue_metadata queue_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + # TODO: Error should really be 400 + error.status_code.must_equal 403 + end + } + end + + it 'Read/Write Queue Metadata GB-18030 value' do + GB18030TestStrings.get.each { |k,v| + begin + metadata = {"custommetadata" => "CustomMetadataValue" + v.encode("GB18030")} + subject.set_queue_metadata queue_name, metadata + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + # TODO: Error should really be 400 + error.status_code.must_equal 403 + end + } + end + + it 'Read/Write Queue Content UTF-8' do + GB18030TestStrings.get.each { |k,v| + content = v.encode("UTF-8") + subject.create_message queue_name, content + messages = subject.list_messages queue_name, 500 + message = messages.first + returned_content = message.message_text + returned_content.must_equal content + subject.delete_message queue_name, message.id, message.pop_receipt + } + end + + # Fails because of + # https://github.com/appfog/azure-sdk-for-ruby/issues/295 + it 'Read/Write Queue Content GB18030' do + GB18030TestStrings.get.each { |k,v| + content = v.encode("GB18030") + subject.create_message queue_name, content + messages = subject.list_messages queue_name, 500 + message = messages.first + returned_content = message.message_text + returned_content.encode("UTF-8").must_equal content.encode("UTF-8") + subject.delete_message queue_name, message.id, message.pop_receipt + } + end + +end diff --git a/test/integration/service_bus/sb_queue_gb18030_test.rb b/test/integration/service_bus/sb_queue_gb18030_test.rb new file mode 100644 index 0000000000..ae49dbd1a7 --- /dev/null +++ b/test/integration/service_bus/sb_queue_gb18030_test.rb @@ -0,0 +1,186 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# 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. +#-------------------------------------------------------------------------- +require "integration/test_helper" +require "azure/blob/blob_service" + +describe 'Service Bus Queue GB-18030' do + subject { Azure::ServiceBus::ServiceBusService.new } + let(:queue_name) { ServiceBusQueueNameHelper.name } + + before { subject.create_queue queue_name } + after { ServiceBusQueueNameHelper.clean } + + it 'Read/Write SB Queue Name UTF-8' do + # Expected results: Failure, because the Queue + # name can only contain ASCII + # characters, per the Service Bus Queue spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_queue queue_name + v.encode("UTF-8") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read/Write SB Queue Name GB-18030' do + # Expected results: Failure, because the Queue + # name can only contain ASCII + # characters, per the Service Bus Queue spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_queue queue_name + v.encode("GB18030") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read/Write SB Queue Metadata UTF-8' do + GB18030TestStrings.get.each { |k,v| + begin + subject.create_queue queue_name, { + :dead_lettering_on_message_expiration => v.encode("UTF-8"), + } + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write SB Queue Metadata GB18030' do + GB18030TestStrings.get.each { |k,v| + begin + subject.create_queue queue_name, { + :dead_lettering_on_message_expiration => v.encode("GB18030"), + } + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write SB Queue message UTF-8' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new(v.encode("UTF-8")) + subject.send_queue_message queue_name, msg + retrieved = subject.read_delete_queue_message queue_name + retrieved.body.force_encoding("UTF-8").must_equal v.encode("UTF-8") + } + end + + it 'Read/Write SB Queue message GB18030' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new(v.encode("GB18030")) + subject.send_queue_message queue_name, msg + retrieved = subject.read_delete_queue_message queue_name + retrieved.body.force_encoding("GB18030").must_equal v.encode("GB18030") + } + end + + it 'Read/Write SB Queue message Metadata UTF-8' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new("some text") do |m| + m.to = v.encode("UTF-8") + end + begin + subject.send_queue_message queue_name, msg + # Do not flunk here; the service appears to let some + # "bad" strings go through + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 500 + end + } + end + + it 'Read/Write SB Queue message Metadata GB18030' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new("some text") do |m| + m.to = v.encode("GB18030") + end + begin + subject.send_queue_message queue_name, msg + # Do not flunk here; the service appears to let some + # "bad" strings go through + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 500 + end + } + end + + it 'Read/Write SB Queue Custom Property Key UTF-8' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new("some text", { + "key" + v.encode("UTF-8") => "CustomStringProperty" + }) + begin + subject.send_queue_message queue_name, msg + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write SB Queue Custom Property Key GB18030' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new("some text", { + "key" + v.encode("GB18030") => "CustomStringProperty" + }) + begin + subject.send_queue_message queue_name, msg + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 400 + end + } + end + + it 'Read/Write SB Queue Custom Property Value UTF-8' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new("some text", { + "key" => "value" + v.encode("UTF-8") + }) + begin + subject.send_queue_message queue_name, msg + retrieved = subject.read_delete_queue_message queue_name + # Do not flunk here; the service appears to let some + # "bad" strings go through + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 500 + end + } + end + + it 'Read/Write SB Queue Custom Property Value GB18030' do + GB18030TestStrings.get.each { |k,v| + msg = Azure::ServiceBus::BrokeredMessage.new("some text", { + "key" => "value" + v.encode("GB18030") + }) + begin + subject.send_queue_message queue_name, msg + retrieved = subject.read_delete_queue_message queue_name + # Do not flunk here; the service appears to let some + # "bad" strings go through + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 500 + end + } + end +end diff --git a/test/integration/table/table_gb18030_test.rb b/test/integration/table/table_gb18030_test.rb new file mode 100644 index 0000000000..e5cd98c318 --- /dev/null +++ b/test/integration/table/table_gb18030_test.rb @@ -0,0 +1,372 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# 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. +#-------------------------------------------------------------------------- +require "integration/test_helper" +require "azure/blob/blob_service" + +describe 'Table GB-18030' do + subject { Azure::Table::TableService.new } + + let(:table_name){ TableNameHelper.name } + + before { + subject.create_table table_name + } + after { TableNameHelper.clean } + + it 'Read/Write Table Name UTF-8' do + # Expected results: Failure, because the Table + # name can only contain ASCII characters, per + # the Table Service spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_table table_name + v.encode("UTF-8") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read/Write Table Name GB-18030' do + # Expected results: Failure, because the Table + # name can only contain ASCII characters, per + # the Table Service spec. + GB18030TestStrings.get.each { |k,v| + begin + subject.create_table table_name + v.encode("GB18030") + flunk "No exception" + rescue + # Add validation? + end + } + end + + it 'Read, Write, and Query Property Names UTF-8' do + counter = 1 + GB18030TestStrings.get_xml_10_fourth_ed_identifiers.each { |k,v| + prop = "prop" + v.encode("UTF-8") + counter = counter + 1; + entity_properties = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s, + prop => "value", + } + entity_properties2 = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s + "2", + prop => "value2", + } + result = subject.insert_entity table_name, entity_properties + subject.insert_entity table_name, entity_properties2 + result.properties[prop].must_equal "value" + if (k != "Chinese_2B5" && k != "Tibetan") then + filter = prop + " eq 'value'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties[prop].must_equal "value" + end + } + end + + # Fails because of + # https://github.com/appfog/azure-sdk-for-ruby/issues/297 + # https://github.com/appfog/azure-sdk-for-ruby/issues/298 + it 'Read, Write, and Query Property Names GB18030' do + counter = 1 + GB18030TestStrings.get_xml_10_fourth_ed_identifiers.each { |k,v| + prop = "prop" + v.encode("GB18030") + counter = counter + 1; + entity_properties = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s, + prop => "value", + } + entity_properties2 = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s + "2", + prop => "value2", + } + result = subject.insert_entity table_name, entity_properties + subject.insert_entity table_name, entity_properties2 + result.properties[prop2].must_equal "value" + if (k != "Chinese_2B5" && k != "Tibetan") then + filter = prop + " eq 'value'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties[prop].must_equal "value" + end + } + end + + it 'Read, Write, and Query Property Values UTF-8' do + counter = 1 + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("UTF-8") + counter = counter + 1; + entity_properties = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s, + "Value" => value, + } + entity_properties2 = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s + "2", + "Value" => value + "2" + } + result = subject.insert_entity table_name, entity_properties + subject.insert_entity table_name, entity_properties2 + result.properties["Value"].must_equal value + filter = "Value eq '" + value + "'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties["Value"].must_equal value + } + end + + # Fails because of + # https://github.com/appfog/azure-sdk-for-ruby/issues/297 + # https://github.com/appfog/azure-sdk-for-ruby/issues/298 + it 'Read, Write, and Query Property Values GB18030' do + counter = 1 + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("GB18030") + counter = counter + 1; + entity_properties = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s, + "Value" => value, + } + entity_properties2 = { + "PartitionKey" => "x", + "RowKey" => k + counter.to_s + "2", + "Value" => value + "2" + } + result = subject.insert_entity table_name, entity_properties + subject.insert_entity table_name, entity_properties2 + result.properties["Value"].encode("UTF-8").must_equal value.encode("UTF-8") + filter = "Value eq '" + value + "'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties["Value"].encode("UTF-8").must_equal value.encode("UTF-8") + } + end + + it 'Read, Write, and Query Key Values UTF-8' do + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("UTF-8") + entity_properties = { + "PartitionKey" => value, + "RowKey" => value, + } + result = subject.insert_entity table_name, entity_properties + result.properties["PartitionKey"].must_equal value + result.properties["RowKey"].must_equal value + if k != 'ChineseExtB' then + # Service does not support surrogates in key in URL + result = subject.get_entity(table_name, value, value) + result.properties["PartitionKey"].must_equal value + result.properties["RowKey"].must_equal value + subject.delete_entity(table_name, value, value) + begin + # Expect error because the entity should be gone + result = subject.get_entity(table_name, value, value) + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 404 + end + end + } + end + + # Fails because of + # https://github.com/appfog/azure-sdk-for-ruby/issues/297 + # https://github.com/appfog/azure-sdk-for-ruby/issues/299 + it 'Read, Write, and Query Key Values GB18030' do + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("GB18030") + entity_properties = { + "PartitionKey" => value.encode("UTF-8"), + "RowKey" => value.encode("UTF-8") + } + result = subject.insert_entity table_name, entity_properties + result.properties["PartitionKey"].encode("UTF-8").must_equal value.encode("UTF-8") + result.properties["RowKey"].encode("UTF-8").must_equal value.encode("UTF-8") + if k != 'ChineseExtB' then + result = subject.get_entity(table_name, value, value) + result.properties["PartitionKey"].encode("UTF-8").must_equal value.encode("UTF-8") + result.properties["RowKey"].encode("UTF-8").must_equal value.encode("UTF-8") + subject.delete_entity(table_name, value, value) + begin + # Expect error because the entity should be gone + result = subject.get_entity(table_name, value, value) + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 404 + end + end + } + end + + # Batch + + it 'Batch Property Names UTF-8' do + counter = 1 + GB18030TestStrings.get_xml_10_fourth_ed_identifiers.each { |k,v| + counter = counter + 1; + prop = "prop" + v.encode("UTF-8") + batch = Azure::Table::Batch.new table_name, "x" + batch.insert k + counter.to_s, { prop => "value" } + batch.insert k + counter.to_s + "2", { prop => "value2" } + results = subject.execute_batch batch + results[0].properties[prop].must_equal "value" + if (k != "Chinese_2B5" && k != "Tibetan") then + filter = prop + " eq 'value'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties[prop.encode("UTF-8")].must_equal "value" + end + } + end + + # Fails because of + # https://github.com/appfog/azure-sdk-for-ruby/issues/297 + # https://github.com/appfog/azure-sdk-for-ruby/issues/298 + it 'Batch Property Names GB18030' do + counter = 1 + GB18030TestStrings.get_xml_10_fourth_ed_identifiers.each { |k,v| + counter = counter + 1; + prop = "prop" + v.encode("GB18030") + batch = Azure::Table::Batch.new table_name, "x" + batch.insert k + counter.to_s, { prop => "value" } + batch.insert k + counter.to_s + "2", { prop => "value2" } + results = subject.execute_batch batch + results[0].properties[prop].must_equal "value" + if (k != "Chinese_2B5" && k != "Tibetan") then + filter = prop + " eq 'value'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties[prop.encode("UTF-8")].must_equal "value" + end + } + end + + it 'Batch Property Values UTF-8' do + counter = 1 + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("UTF-8") + counter = counter + 1; + batch = Azure::Table::Batch.new table_name, "x" + batch.insert k + counter.to_s, { "key" => value } + batch.insert k + counter.to_s + "2", { "key" => value + "2" } + results = subject.execute_batch batch + results[0].properties["key"].must_equal value + filter = "key eq '" + value + "'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties["key"].encode("UTF-8").must_equal value.encode("UTF-8") + } + end + + # Fails because of + # https://github.com/appfog/azure-sdk-for-ruby/issues/297 + # https://github.com/appfog/azure-sdk-for-ruby/issues/298 + it 'Batch Property Values GB18030' do + counter = 1 + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("GB18030") + counter = counter + 1; + batch = Azure::Table::Batch.new table_name, "x" + batch.insert k + counter.to_s, { "key" => value } + batch.insert k + counter.to_s + "2", { "key" => value + "2" } + results = subject.execute_batch batch + results[0].properties["key"].must_equal value + filter = "key eq '" + value + "'" + result = subject.query_entities table_name, { :filter => filter } + result.length.must_equal 1 + result.first.properties["key"].encode("UTF-8").must_equal value.encode("UTF-8") + } + end + + it 'Batch Key Values UTF-8' do + counter = 1 + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("UTF-8") + counter = counter + 1; + batch = Azure::Table::Batch.new table_name, value + batch.insert value, { } + batch.insert value + "2", { } + results = subject.execute_batch batch + results[0].properties["PartitionKey"].encode("UTF-8").must_equal value.encode("UTF-8") + results[0].properties["RowKey"].encode("UTF-8").must_equal value.encode("UTF-8") + if k != 'ChineseExtB' then + # Service does not support surrogates in key in URL + result = subject.get_entity(table_name, value, value) + result.properties["PartitionKey"].encode("UTF-8").must_equal value.encode("UTF-8") + result.properties["RowKey"].encode("UTF-8").must_equal value.encode("UTF-8") + end + batch = Azure::Table::Batch.new table_name, value + batch.delete value + batch.delete value + "2" + results = subject.execute_batch batch + if k != 'ChineseExtB' then + # Service does not support surrogates in key in URL + begin + # Expect error because the entity should be gone + result = subject.get_entity(table_name, value, value) + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 404 + end + end + } + end + + # Fails because of + # https://github.com/appfog/azure-sdk-for-ruby/issues/297 + # https://github.com/appfog/azure-sdk-for-ruby/issues/298 + it 'Batch Key Values GB18030' do + counter = 1 + GB18030TestStrings.get.each { |k,v| + value = "value" + v.encode("GB18030") + counter = counter + 1; + batch = Azure::Table::Batch.new table_name, value + batch.insert value, { } + batch.insert value + "2", { } + results = subject.execute_batch batch + results[0].properties["PartitionKey"].encode("UTF-8").must_equal value.encode("UTF-8") + results[0].properties["RowKey"].encode("UTF-8").must_equal value.encode("UTF-8") + if k != 'ChineseExtB' then + # Service does not support surrogates in key in URL + result = subject.get_entity(table_name, value, value) + result.properties["PartitionKey"].encode("UTF-8").must_equal value.encode("UTF-8") + result.properties["RowKey"].encode("UTF-8").must_equal value.encode("UTF-8") + end + batch = Azure::Table::Batch.new table_name, value + batch.delete k + counter.to_s + batch.delete k + counter.to_s + "2" + results = subject.execute_batch batch + if k != 'ChineseExtB' then + # Service does not support surrogates in key in URL + begin + # Expect error because the entity should be gone + result = subject.get_entity(table_name, value, value) + flunk "No exception" + rescue Azure::Core::Http::HTTPError => error + error.status_code.must_equal 404 + end + end + } + end +end diff --git a/test/support/name_generator.rb b/test/support/name_generator.rb index b22710bf4c..2b5bdc795b 100644 --- a/test/support/name_generator.rb +++ b/test/support/name_generator.rb @@ -72,3 +72,82 @@ def clean rescue end end + +class GB18030TestStringsClass + def get + { + "Chinese2B1" => [0x2488, 0x2460, 0x216B, + 0x3128, 0x3129].pack('U*'), + "Chinese2B2" => [0x554A, 0x963F, 0x9F3E, + 0x9F44].pack('U*'), + "Chinese2B3" => [0x4E02, 0x4E04, 0x72DA, + 0x72DB].pack('U*'), + "Chinese2B4" => [0x72DC, 0x72DD, 0xFA28, + 0xFA29].pack('U*'), + "Chinese2B5" => [0x02CA, 0x02CB, 0x02D9, + 0x2013, 0xE7F3, 0x3007].pack('U*'), + "Chinese4BExtA" => [0x3400, 0x3401, 0x4DB4, + 0x4DB5].pack('U*'), + "ChineseExtB" => [0x020000, 0x020001, + 0x02A6D5, 0x02A6D6].pack('U*'), + "Tibetan" => [0x0F56, 0x0F7C, 0x0F51, + 0x0F0B, 0x0F61, 0x0F72, 0x0F42, 0x0020, 0x0020, + 0x0020, 0x0F00, 0x0F01, 0x0F02, 0x0F03, 0x0F04, + 0x0F05, 0x0FA2, 0x0FA3, 0x0FA4, 0x0FA5].pack('U*'), + "Uyghur" => [0x0626, 0x06C7, 0x064A, + 0x063A, 0x06C7, 0x0631, 0x0020, 0x062A, 0x0649, + 0x0644, 0x0649, 0x0020, 0x0020, 0x0020, 0x003B, + 0x060B, 0x0020, 0x060C, 0x0020, 0x060D, 0x0020, + 0x060E, 0x0020, 0x060F, 0x0610, 0x0020, 0x0020, + 0x0020, 0xFEF2, 0x0020, 0xFEF3, 0x0020, 0xFEF4, + 0x0020, 0xFEF5, 0x0020, 0xFEF6, 0x0020, 0xFEF7, + 0x0020, 0xFEF8, 0x0020, 0xFEF9, 0x0020, 0xFEFA, + 0x0020, 0xFEFB].pack('U*'), + "Mongolian" => [0x182E, 0x1823, 0x1829, + 0x182D, 0x1823, 0x182F, 0x0020, 0x0020, 0x1826, + 0x1830, 0x1826, 0x182D, 0x003B, 0x0020, 0x17F8, + 0x17F9, 0x0020, 0x188E, 0x188F, 0x1890, 0x1891, + 0x1892, 0x1893, 0x1894, 0x1895, 0x1896, 0x1897 + ].pack('U*'), + "Yi" => [0xA188, 0xA320, 0xA071, + 0xA0B7, 0x003B, 0xA000, 0xA001, 0xA002, 0xA003, + 0xA004, 0xA005, 0xA006, 0xA4C1, 0xA4C2, 0xA4C3, + 0xA4C4, 0xA4C5, 0xA4C6].pack('U*'), + "DehongDai" => [0x1958, 0x1963, 0x196D, + 0x1970, 0x0020, 0x1956, 0x196D, 0x1970, 0x0020, + 0x1956, 0x196C, 0x1972, 0x1951, 0x1968, 0x1952, + 0x1970].pack('U*'), + "XishuangbannaDai" => [0x198E, 0x19B7, 0x1991, + 0x19BA, 0x1996, 0x19BA, 0x19C8, 0x1989, 0x19B2, + 0x19C7, 0x1989, 0x19B8, 0x19C2, 0x1997, 0x19C3, + 0x1993, 0x19B1].pack('U*') + } + end + def get_xml_10_fourth_ed_identifiers + # No characters from the following sets are valid, + # according to the XML library that the service uses: + # * Chinese_4B_ExtA + # * Chinese_ExtB + # * Mongolian + # * Yi + # * Dehong_Dai + # * Xishuangbanna_Dai + { + 'Chinese_2B1' => [0x3128, 0x3129].pack('U*'), + 'Chinese_2B2' => [0x554A, 0x963F, 0x9F3E, 0x9F44 + ].pack('U*'), + 'Chinese_2B3' => [0x4E02, 0x4E04, 0x72DA, 0x72DB + ].pack('U*'), + 'Chinese_2B4' => [0x72DC, 0x72DD].pack('U*'), + 'Chinese_2B5' => [0x3007].pack('U*'), + 'Tibetan' => [0x0F56, 0x0F7C, 0x0F51, 0x0F61, + 0x0F72, 0x0F42, 0x0FA2, 0x0FA3, 0x0FA4, 0x0FA5 + ].pack('U*'), + 'Uyghur' => [0x0626, 0x06C7, 0x064A, 0x063A, + 0x06C7, 0x0631, 0x062A, 0x0649, 0x0644, 0x0649 + ].pack('U*'), + } + end +end + +GB18030TestStrings = GB18030TestStringsClass.new