| #!/usr/bin/env perl -w |
| # |
| # 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. |
| # |
| |
| use Test::More qw(no_plan); |
| use Test::Exception; |
| |
| require 'utils.pm'; |
| |
| # verify that qpid is available |
| BEGIN { use_ok( 'qpid' ); } |
| require_ok ('qpid' ); |
| |
| # Create a new message |
| my $message = new qpid::messaging::Message(); |
| isa_ok($message, 'qpid::messaging::Message'); |
| |
| # reply to |
| # rejects an null address |
| dies_ok (sub {$message->set_reply_to(undef);}, |
| "Reply to cannot be null."); |
| |
| # can handle a string address |
| $message->set_reply_to("test"); |
| ok ($message->get_reply_to()->str() eq "test", |
| "Reply to can be set"); |
| |
| # subject |
| # cannot have an null subject |
| dies_ok (sub {$message->set_subject(undef);}, |
| "Subject cannot be null"); |
| |
| # can have an empty subject |
| $message->set_subject(""); |
| ok ($message->get_subject() eq "", |
| "Subject can be empty"); |
| |
| # can have a subject |
| my $subject = random_string(16); |
| $message->set_subject($subject); |
| ok ($message->get_subject() eq $subject, |
| "Subject can be set."); |
| |
| # content type |
| # cannot have an null content type |
| dies_ok (sub {$message->set_content_type(undef);}, |
| "Content type must be defined."); |
| |
| # can an empty content type |
| $message->set_content_type(""); |
| ok ($message->get_content_type() eq "", |
| "Content type can be empty"); |
| |
| # can have an arbitrary content type |
| my $content_type = random_string(10); |
| $message->set_content_type($content_type); |
| ok ($message->get_content_type() eq $content_type, |
| "Content type can be arbitrary"); |
| |
| # can be for a map |
| $content_type = "amqp/map"; |
| $message->set_content_type($content_type); |
| ok ($message->get_content_type() eq $content_type, |
| "Content type can be for a map"); |
| |
| # message id |
| # cannot be null |
| dies_ok (sub {$message->set_message_id(undef);}, |
| "Message id cannot be null"); |
| |
| # can be an empty string |
| $message->set_message_id(""); |
| ok ($message->get_message_id() eq "", |
| "Message id can be empty"); |
| |
| # can be an arbitrary string |
| my $id = random_string(32); |
| $message->set_message_id($id); |
| ok ($message->get_message_id() eq $id, |
| "Message id can be an arbitrary string"); |
| |
| # can be a UUID |
| $id = generate_uuid(); |
| $message->set_message_id($id); |
| ok ($message->get_message_id() eq $id, |
| "Message id can be a valid UUID"); |
| |
| # user id |
| # cannot be null |
| dies_ok (sub {$message->set_user_id(undef);}, |
| "User id cannot be null"); |
| |
| # can be an empty string |
| my $user_id = ""; |
| $message->set_user_id($user_id); |
| ok ($message->get_user_id() eq $user_id, |
| "User id can be empty"); |
| |
| # can be an arbitrary string |
| $id = random_string(65); |
| $message->set_user_id($user_id); |
| ok ($message->get_user_id() eq $user_id, |
| "User id can be an arbitrary string"); |
| |
| # correlation id |
| # cannot be null |
| dies_ok (sub {$message->set_correlation_id(undef);}, |
| "Correlation id cannot be null"); |
| |
| # can be empty |
| my $correlation_id = ""; |
| $message->set_correlation_id($correlation_id); |
| ok ($message->get_correlation_id() eq $correlation_id, |
| "Correlation id can be an empty string"); |
| |
| # can be an arbitrary string |
| $correlation_id = random_string(32); |
| $message->set_correlation_id($correlation_id); |
| ok ($message->get_correlation_id() eq $correlation_id, |
| "Correlation id can be an arbitrary string"); |
| |
| # priority |
| # cannot be nul |
| dies_ok (sub {$message->set_priority(undef);}, |
| "Priority cannot be null"); |
| |
| # cannot be negative |
| my $priority = 0 - (rand(2**8) + 1); |
| dies_ok (sub {$message->set_priority($priority);}, |
| "Priority cannot be negative"); |
| |
| # can be 0 |
| $message->set_priority(0); |
| ok ($message->get_priority() == 0, |
| "Priority can be zero"); |
| |
| # can be an arbitrary value |
| $priority = int(rand(2**8) + 1); |
| $message->set_priority($priority); |
| ok ($message->get_priority() == $priority, |
| "Priority can be any positive value"); |
| |
| # ttl |
| # cannot be null |
| dies_ok (sub {$message->set_ttl(undef);}, |
| "TTL cannot be null"); |
| |
| # can be a duration |
| $message->set_ttl(qpid::messaging::Duration::FOREVER); |
| ok ($message->get_ttl()->get_milliseconds() == qpid::messaging::Duration::FOREVER->get_milliseconds(), |
| "TTL can be a Duration"); |
| |
| # if numeric, is converted to a duration |
| my $duration = rand(65535); |
| $message->set_ttl($duration); |
| ok ($message->get_ttl()->get_milliseconds() == int($duration), |
| "TTL can be any arbitrary duration"); |
| |
| # if 0 it's converted to IMMEDIATE |
| $message->set_ttl(0); |
| ok ($message->get_ttl()->get_milliseconds() == qpid::messaging::Duration::IMMEDIATE->get_milliseconds(), |
| "TTL of 0 is converted to IMMEDIATE"); |
| |
| # if negative it's converted to FOREVER |
| $message->set_ttl(0 - (rand(65535) + 1)); |
| ok ($message->get_ttl()->get_milliseconds() == qpid::messaging::Duration::FOREVER->get_milliseconds(), |
| "TTL of <0 is converted to FOREVER"); |
| |
| # durable |
| # cannot be null |
| dies_ok (sub {$message->set_durable(undef);}, |
| "Durable cannot be null"); |
| |
| # can be set to true |
| $message->set_durable(1); |
| ok ($message->get_durable(), |
| "Durable can be true"); |
| |
| # can be set to false |
| $message->set_durable(0); |
| ok (!$message->get_durable(), |
| "Durable can be false"); |
| |
| # redelivered |
| # redelivered cannot be null |
| dies_ok (sub {$message->set_redelivered(undef);}, |
| "Redelivered cannot be null"); |
| |
| # can be set to true |
| $message->set_redelivered(1); |
| ok ($message->get_redelivered(), |
| "Redelivered can be true"); |
| |
| # can be set to false |
| $message->set_redelivered(0); |
| ok (!$message->get_redelivered(), |
| "Redelivered can be false"); |
| |
| # properties |
| # can retrieve all properties |
| my $properties = $message->get_properties(); |
| ok (UNIVERSAL::isa($properties, 'HASH'), |
| "Returns the properties as a hash map"); |
| |
| # property |
| # setting a property using a null key fails |
| dies_ok (sub {$message->set_property(undef, "bar");}, |
| "Property cannot have a null key"); |
| |
| # setting a property with a null value succeeds |
| my $key = random_string(16); |
| $message->set_property($key, undef); |
| ok (!$message->get_properties()->{$key}, |
| "Properties can have null values"); |
| |
| # setting a property succeeds |
| my $value = random_string(255); |
| $message->set_property($key, $value); |
| ok ($message->get_properties()->{$key} eq $value, |
| "Messages can have arbitrary property values"); |
| |
| # content |
| # cannot be null |
| dies_ok (sub {$message->set_content(undef);}, |
| "Content cannot be null"); |
| |
| # can be an empty string |
| $message->set_content(""); |
| ok ($message->get_content() eq "", |
| "Content can be an empty string"); |
| |
| # can be an arbitrary string |
| my $content = random_string(255); |
| $message->set_content($content); |
| ok ($message->get_content() eq $content, |
| "Content can be an arbitrary string"); |
| |
| # Embedded nulls should be handled properly |
| $content = { id => 1234, name => "With\x00null" }; |
| qpid::messaging::encode($content, $message); |
| my $map = qpid::messaging::decode_map($message); |
| ok ($map->{name} eq "With\x00null", |
| "Nulls embedded in map values work."); |
| |
| # Unicode strings shouldn't be broken |
| $content = { id => 1234, name => "Euro=\x{20AC}" }; |
| qpid::messaging::encode($content, $message); |
| $map = qpid::messaging::decode_map($message); |
| ok ($map->{name} eq "Euro=\x{20AC}", |
| "Unicode strings encoded correctly."); |
| |
| # Setting the content as a hash automatically encodes it |
| ($content) = {"id" => "1234", "name" => "qpid"}; |
| $message->set_content($content); |
| ok ($message->get_content_type() eq "amqp/map", |
| "Hashes are automatically encoded correctly"); |
| |
| # Setting the content as a list automatically encodes it |
| my @acontent = (1, 2, 3, 4); |
| $message->set_content(\@acontent); |
| ok ($message->get_content_type() eq "amqp/list", |
| "Lists are automatically encoded correctly"); |
| |
| # content size |
| # content size is correct |
| my $content_size = int(rand(256)); |
| $content = random_string($content_size); |
| $message->set_content($content); |
| ok ($message->get_content_size() == $content_size, |
| "Content size is correct"); |