1: %%==============================================================================
    2: %% Copyright 2012 Erlang Solutions Ltd.
    3: %%
    4: %% Licensed under the Apache License, Version 2.0 (the "License");
    5: %% you may not use this file except in compliance with the License.
    6: %% You may obtain a copy of the License at
    7: %%
    8: %% http://www.apache.org/licenses/LICENSE-2.0
    9: %%
   10: %% Unless required by applicable law or agreed to in writing, software
   11: %% distributed under the License is distributed on an "AS IS" BASIS,
   12: %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   13: %% See the License for the specific language governing permissions and
   14: %% limitations under the License.
   15: %%==============================================================================
   16: 
   17: -module(websockets_SUITE).
   18: -compile([export_all, nowarn_export_all]).
   19: 
   20: -include_lib("escalus/include/escalus.hrl").
   21: -include_lib("common_test/include/ct.hrl").
   22: 
   23: %%--------------------------------------------------------------------
   24: %% Suite configuration
   25: %%--------------------------------------------------------------------
   26: 
   27: -define(REGISTRATION_TIMEOUT, 2).  %% seconds
   28: 
   29: all() ->
   30:     [metrics_test,
   31:      {group, ws_chat},
   32:      {group, wss_chat}].
   33: 
   34: groups() ->
   35:     [{ws_chat, [sequence], test_cases()},
   36:      {wss_chat, [sequence], test_cases()}].
   37: 
   38: test_cases() ->
   39:     [chat_msg,
   40:      escape_chat_msg,
   41:      escape_attrs].
   42: 
   43: suite() ->
   44:     escalus:suite().
   45: 
   46: %%--------------------------------------------------------------------
   47: %% Init & teardown
   48: %%--------------------------------------------------------------------
   49: 
   50: init_per_suite(Config) ->
   51:     Config1 = escalus:init_per_suite(Config),
   52:     escalus:create_users(Config1, escalus:get_users([alice, geralt, geralt_s, carol])).
   53: 
   54: end_per_suite(Config) ->
   55:     Config1 = escalus:delete_users(Config, escalus:get_users([alice, geralt, geralt_s, carol])),
   56:     escalus:end_per_suite(Config1).
   57: 
   58: init_per_group(GroupName, Config) ->
   59:     case GroupName of
   60:         wss_chat ->
   61:             [{user, geralt_s} | Config];
   62:         _ ->
   63:             [{user, geralt} | Config]
   64:     end.
   65: 
   66: 
   67: end_per_group(_GroupName, _Config) ->
   68:     ok.
   69: 
   70: init_per_testcase(CaseName, Config) ->
   71:     escalus:init_per_testcase(CaseName, Config).
   72: 
   73: end_per_testcase(CaseName, Config) ->
   74:     escalus:end_per_testcase(CaseName, Config).
   75: 
   76: %%--------------------------------------------------------------------
   77: %% Message tests
   78: %%--------------------------------------------------------------------
   79: 
   80: metrics_test(Config) ->
   81:     MongooseMetrics = [{[global, data, xmpp, received, xml_stanza_size], changed},
   82:                        {[global, data, xmpp, sent, xml_stanza_size], changed},
   83:                        {[global, data, xmpp, received, c2s, websocket], changed},
   84:                        {[global, data, xmpp, sent, c2s, websocket], changed},
   85:                        {[global, data, xmpp, received, c2s, tcp], 0},
   86:                        {[global, data, xmpp, sent, c2s, tcp], 0}],
   87:     escalus:story([{mongoose_metrics, MongooseMetrics} | Config],
   88:                   [{geralt, 1}, {geralt_s, 1}],
   89:                   fun(Geralt, GeraltS) ->
   90: 
   91:         escalus_client:send(GeraltS, escalus_stanza:chat_to(Geralt, <<"Hi!">>)),
   92:         escalus:assert(is_chat_message, [<<"Hi!">>], escalus_client:wait_for_stanza(Geralt)),
   93: 
   94:         escalus_client:send(Geralt, escalus_stanza:chat_to(GeraltS, <<"Hello!">>)),
   95:         escalus:assert(is_chat_message, [<<"Hello!">>], escalus_client:wait_for_stanza(GeraltS))
   96: 
   97:         end).
   98: 
   99: chat_msg(Config) ->
  100:     escalus:story(Config, [{alice, 1}, {?config(user, Config), 1}, {carol, 1}],
  101:                   fun(Alice, Geralt, Carol) ->
  102: 
  103:         escalus_client:send(Alice, escalus_stanza:chat_to(Geralt, <<"Hi!">>)),
  104:         FromAlice = escalus_client:wait_for_stanza(Geralt),
  105:         escalus:assert(is_chat_message, [<<"Hi!">>], FromAlice),
  106:         escalus:assert(has_ns, [<<"jabber:client">>], FromAlice),
  107: 
  108:         escalus_client:send(Geralt, escalus_stanza:chat_to(Alice, <<"Hello!">>)),
  109:         escalus:assert(is_chat_message, [<<"Hello!">>], escalus_client:wait_for_stanza(Alice)),
  110: 
  111:         escalus_client:send(Geralt, escalus_stanza:chat_to(Carol, <<"Hey!">>)),
  112:         escalus_assert:is_chat_message(<<"Hey!">>, escalus_client:wait_for_stanza(Carol))
  113: 
  114:         end).
  115: 
  116: escape_chat_msg(Config) ->
  117:     escalus:story(Config, [{alice, 1}, {?config(user, Config), 1}, {carol, 1}],
  118:                   fun(Alice, Geralt, Carol) ->
  119:         special_chars_helper:check_cdata_from_to(Alice, Geralt, <<"Hi! & < >">>),
  120:         special_chars_helper:check_cdata_from_to(Geralt, Alice, <<"Hello! & < >">>),
  121:         special_chars_helper:check_cdata_from_to(Geralt, Carol, <<"Hey! & < >">>)
  122: 
  123:     end).
  124: 
  125: escape_attrs(Config) ->
  126:     escalus:story(Config, [{alice, 1}, {?config(user, Config), 1}, {carol, 1}],
  127:                   fun(Alice, Geralt, Carol) ->
  128:         special_chars_helper:check_attr_from_to(Alice, Geralt),
  129:         special_chars_helper:check_attr_from_to(Geralt, Alice),
  130:         special_chars_helper:check_attr_from_to(Geralt, Carol)
  131: 
  132:     end).