rabbitmq-server/deps/rabbitmq_stomp/test/util_SUITE.erl

242 lines
8.5 KiB
Erlang

%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2007-2024 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
%%
-module(util_SUITE).
-include_lib("eunit/include/eunit.hrl").
-include_lib("amqp_client/include/amqp_client.hrl").
-include_lib("amqp_client/include/rabbit_routing_prefixes.hrl").
-include("rabbit_stomp_frame.hrl").
-compile(export_all).
all() -> [
longstr_field,
message_properties,
message_headers,
minimal_message_headers_with_no_custom,
headers_post_process,
headers_post_process_noop_replyto,
headers_post_process_noop2,
negotiate_version_both_empty,
negotiate_version_no_common,
negotiate_version_simple_common,
negotiate_version_two_choice_common,
negotiate_version_two_choice_common_out_of_order,
negotiate_version_two_choice_big_common,
negotiate_version_choice_mismatched_length,
negotiate_version_choice_duplicates,
trim_headers,
ack_mode_auto,
ack_mode_auto_default,
ack_mode_client,
ack_mode_client_individual,
consumer_tag_id,
consumer_tag_destination,
consumer_tag_invalid,
parse_valid_message_id,
parse_invalid_message_id
].
%%--------------------------------------------------------------------
%% Header Processing Tests
%%--------------------------------------------------------------------
longstr_field(_) ->
{<<"ABC">>, longstr, <<"DEF">>} =
rabbit_stomp_util:longstr_field("ABC", "DEF").
message_properties(_) ->
Headers = [
{"content-type", "text/plain"},
{"content-encoding", "UTF-8"},
{"persistent", "true"},
{"priority", "1"},
{"correlation-id", "123"},
{"reply-to", "something"},
{"expiration", "my-expiration"},
{"amqp-message-id", "M123"},
{"timestamp", "123456"},
{"type", "freshly-squeezed"},
{"user-id", "joe"},
{"app-id", "joe's app"},
{"str", "foo"},
{"int", "123"}
],
#'P_basic'{
content_type = <<"text/plain">>,
content_encoding = <<"UTF-8">>,
delivery_mode = 2,
priority = 1,
correlation_id = <<"123">>,
reply_to = <<"something">>,
expiration = <<"my-expiration">>,
message_id = <<"M123">>,
timestamp = 123456,
type = <<"freshly-squeezed">>,
user_id = <<"joe">>,
app_id = <<"joe's app">>,
headers = [{<<"str">>, longstr, <<"foo">>},
{<<"int">>, longstr, <<"123">>}]
} =
rabbit_stomp_util:message_properties(#stomp_frame{headers = Headers}).
message_headers(_) ->
Properties = #'P_basic'{
headers = [{<<"str">>, longstr, <<"foo">>},
{<<"int">>, signedint, 123}],
content_type = <<"text/plain">>,
content_encoding = <<"UTF-8">>,
delivery_mode = 2,
priority = 1,
correlation_id = 123,
reply_to = <<"something">>,
message_id = <<"M123">>,
timestamp = 123456,
type = <<"freshly-squeezed">>,
user_id = <<"joe">>,
app_id = <<"joe's app">>},
Headers = rabbit_stomp_util:message_headers(Properties),
Expected = [
{"content-type", "text/plain"},
{"content-encoding", "UTF-8"},
{"persistent", "true"},
{"priority", "1"},
{"correlation-id", "123"},
{"reply-to", "something"},
{"expiration", "my-expiration"},
{"amqp-message-id", "M123"},
{"timestamp", "123456"},
{"type", "freshly-squeezed"},
{"user-id", "joe"},
{"app-id", "joe's app"},
{"str", "foo"},
{"int", "123"}
],
[] = lists:subtract(Headers, Expected).
minimal_message_headers_with_no_custom(_) ->
Properties = #'P_basic'{},
Headers = rabbit_stomp_util:message_headers(Properties),
Expected = [
{"content-type", "text/plain"},
{"content-encoding", "UTF-8"},
{"amqp-message-id", "M123"}
],
[] = lists:subtract(Headers, Expected).
headers_post_process(_) ->
Headers = [{"header1", "1"},
{"header2", "12"},
{"reply-to", "something"}],
Expected = [{"header1", "1"},
{"header2", "12"},
{"reply-to", "/reply-queue/something"}],
[] = lists:subtract(
rabbit_stomp_util:headers_post_process(Headers), Expected).
headers_post_process_noop_replyto(_) ->
[begin
Headers = [{"reply-to", Prefix ++ "/something"}],
Headers = rabbit_stomp_util:headers_post_process(Headers)
end || Prefix <- rabbit_routing_util:dest_prefixes()].
headers_post_process_noop2(_) ->
Headers = [{"header1", "1"},
{"header2", "12"}],
Expected = [{"header1", "1"},
{"header2", "12"}],
[] = lists:subtract(
rabbit_stomp_util:headers_post_process(Headers), Expected).
negotiate_version_both_empty(_) ->
{error, no_common_version} = rabbit_stomp_util:negotiate_version([],[]).
negotiate_version_no_common(_) ->
{error, no_common_version} =
rabbit_stomp_util:negotiate_version(["1.2"],["1.3"]).
negotiate_version_simple_common(_) ->
{ok, "1.2"} =
rabbit_stomp_util:negotiate_version(["1.2"],["1.2"]).
negotiate_version_two_choice_common(_) ->
{ok, "1.3"} =
rabbit_stomp_util:negotiate_version(["1.2", "1.3"],["1.2", "1.3"]).
negotiate_version_two_choice_common_out_of_order(_) ->
{ok, "1.3"} =
rabbit_stomp_util:negotiate_version(["1.3", "1.2"],["1.2", "1.3"]).
negotiate_version_two_choice_big_common(_) ->
{ok, "1.20.23"} =
rabbit_stomp_util:negotiate_version(["1.20.23", "1.30.456"],
["1.20.23", "1.30.457"]).
negotiate_version_choice_mismatched_length(_) ->
{ok, "1.2.3"} =
rabbit_stomp_util:negotiate_version(["1.2", "1.2.3"],
["1.2.3", "1.2"]).
negotiate_version_choice_duplicates(_) ->
{ok, "1.2"} =
rabbit_stomp_util:negotiate_version(["1.2", "1.2"],
["1.2", "1.2"]).
trim_headers(_) ->
#stomp_frame{headers = [{"one", "foo"}, {"two", "baz "}]} =
rabbit_stomp_util:trim_headers(
#stomp_frame{headers = [{"one", " foo"}, {"two", " baz "}]}).
%%--------------------------------------------------------------------
%% Frame Parsing Tests
%%--------------------------------------------------------------------
ack_mode_auto(_) ->
Frame = #stomp_frame{headers = [{"ack", "auto"}]},
{auto, _} = rabbit_stomp_util:ack_mode(Frame).
ack_mode_auto_default(_) ->
Frame = #stomp_frame{headers = []},
{auto, _} = rabbit_stomp_util:ack_mode(Frame).
ack_mode_client(_) ->
Frame = #stomp_frame{headers = [{"ack", "client"}]},
{client, true} = rabbit_stomp_util:ack_mode(Frame).
ack_mode_client_individual(_) ->
Frame = #stomp_frame{headers = [{"ack", "client-individual"}]},
{client, false} = rabbit_stomp_util:ack_mode(Frame).
consumer_tag_id(_) ->
Frame = #stomp_frame{headers = [{"id", "foo"}]},
{ok, <<"T_foo">>, _} = rabbit_stomp_util:consumer_tag(Frame).
consumer_tag_destination(_) ->
Frame = #stomp_frame{headers = [{"destination", "foo"}]},
{ok, <<"Q_foo">>, _} = rabbit_stomp_util:consumer_tag(Frame).
consumer_tag_invalid(_) ->
Frame = #stomp_frame{headers = []},
{error, missing_destination_header} = rabbit_stomp_util:consumer_tag(Frame).
%%--------------------------------------------------------------------
%% Message ID Parsing Tests
%%--------------------------------------------------------------------
parse_valid_message_id(_) ->
{ok, {<<"bar">>, "abc", 123}} =
rabbit_stomp_util:parse_message_id("bar@@abc@@123").
parse_invalid_message_id(_) ->
{error, invalid_message_id} =
rabbit_stomp_util:parse_message_id("blah").