@@ -183,7 +183,8 @@ rdbms_configs(_, _) ->
183
183
[].
184
184
185
185
cassandra_configs (true ) ->
186
- [cassandra ];
186
+ [cassandra ,
187
+ cassandra_eterm ];
187
188
cassandra_configs (_ ) ->
188
189
[].
189
190
@@ -309,6 +310,7 @@ mam_cases() ->
309
310
mam_service_discovery_to_different_client_bare_jid_results_in_error ,
310
311
archive_is_instrumented ,
311
312
easy_archive_request ,
313
+ easy_archive_request_old_xmlel_format ,
312
314
easy_archive_request_for_the_receiver ,
313
315
message_sent_to_yourself ,
314
316
range_archive_request ,
@@ -637,7 +639,7 @@ init_per_group(Group, ConfigIn) ->
637
639
C = configuration (Group ),
638
640
B = basic_group (Group ),
639
641
{ModulesToStart , Config0 } = required_modules_for_group (C , B , ConfigIn ),
640
- ct :pal (" Init per group ~p ; configuration ~p ; basic group ~p " , [Group , C , B ]),
642
+ ct :log (" Init per group ~p ; configuration ~p ; basic group ~p " , [Group , C , B ]),
641
643
Config01 = dynamic_modules :save_modules (host_type (), Config0 ),
642
644
dynamic_modules :ensure_modules (host_type (), ModulesToStart ),
643
645
Config1 = do_init_per_group (C , Config01 ),
@@ -648,6 +650,8 @@ do_init_per_group(C, ConfigIn) ->
648
650
case C of
649
651
cassandra ->
650
652
[{archive_wait , 1500 } | Config0 ];
653
+ cassandra_eterm ->
654
+ [{archive_wait , 1500 } | Config0 ];
651
655
elasticsearch ->
652
656
[{archive_wait , 2500 } | Config0 ];
653
657
_ ->
@@ -657,7 +661,8 @@ do_init_per_group(C, ConfigIn) ->
657
661
setup_meck (_ , elasticsearch ) ->
658
662
ok = rpc (mim (), meck , expect ,
659
663
[mongoose_elasticsearch , insert_document , 4 , {error , simulated }]);
660
- setup_meck (_ , cassandra ) ->
664
+ setup_meck (_ , Config ) when Config =:= cassandra_eterm ;
665
+ Config =:= cassandra ->
661
666
ok = rpc (mim (), meck , expect ,
662
667
[mongoose_cassandra , cql_write_async , 5 , {error , simulated }]);
663
668
setup_meck (drop_msg , Config ) when Config =:= rdbms_async_pool ;
@@ -753,21 +758,15 @@ maybe_set_wait(C, Types, Config) when C =:= rdbms_async_pool;
753
758
maybe_set_wait (_C , _ , Config ) ->
754
759
Config .
755
760
756
- mam_prefs_backend_module (rdbms , rdbms ) ->
757
- mod_mam_rdbms_prefs ;
758
- mam_prefs_backend_module (cassandra , cassandra ) ->
759
- mod_mam_cassandra_prefs ;
760
- mam_prefs_backend_module (_ , mnesia ) ->
761
- mod_mam_mnesia_prefs ;
762
- mam_prefs_backend_module (_ , _ ) ->
763
- {error , wrong_db }.
764
-
765
761
mam_opts_for_conf (elasticsearch ) ->
766
762
#{backend => elasticsearch ,
767
763
user_prefs_store => mnesia };
768
764
mam_opts_for_conf (cassandra ) ->
769
765
#{backend => cassandra ,
770
766
user_prefs_store => cassandra };
767
+ mam_opts_for_conf (cassandra_eterm ) ->
768
+ Opts = mam_opts_for_conf (cassandra ),
769
+ Opts #{db_message_format => mam_message_eterm };
771
770
mam_opts_for_conf (rdbms_easy ) ->
772
771
EasyOpts = #{db_jid_format => mam_jid_rfc ,
773
772
db_message_format => mam_message_xml },
@@ -881,24 +880,37 @@ maybe_skip(C, Config) when C =:= muc_light_failed_to_decode_message_in_database;
881
880
" elasticsearch does not support encodings" );
882
881
maybe_skip (C , Config ) when C =:= muc_light_sql_query_failed ;
883
882
C =:= pm_sql_query_failed ->
884
- skip_if ( ? config (configuration , Config ) =:= elasticsearch orelse
885
- ? config ( configuration , Config ) =:= cassandra ,
883
+ Configuration = ? config (configuration , Config ),
884
+ skip_if ( lists : member ( Configuration , [ elasticsearch , cassandra , cassandra_eterm ]) ,
886
885
" Not an SQL database" );
887
886
maybe_skip (C , Config ) when C =:= muc_light_include_groupchat_filter ;
888
887
C =:= muc_light_no_pm_stored_include_groupchat_filter ;
889
888
C =:= muc_light_include_groupchat_messages_by_default ->
890
- skip_if (? config (configuration , Config ) =:= cassandra ,
889
+ Configuration = ? config (configuration , Config ),
890
+ skip_if (lists :member (Configuration , [cassandra , cassandra_eterm ]),
891
891
" include_groupchat field is not supported for cassandra backend" );
892
892
maybe_skip (C , Config ) when C =:= easy_text_search_request ;
893
893
C =:= long_text_search_request ;
894
894
C =:= save_unicode_messages ;
895
895
C =:= muc_text_search_request ->
896
- skip_if (? config (configuration , Config ) =:= cassandra ,
896
+ Configuration = ? config (configuration , Config ),
897
+ skip_if (lists :member (Configuration , [cassandra , cassandra_eterm ]),
897
898
" full text search is not implemented for cassandra backend" );
898
899
maybe_skip (C , Config ) when C =:= muc_light_async_pools_batch_flush ;
899
900
C =:= async_pools_batch_flush ->
900
901
skip_if (? config (configuration , Config ) =/= rdbms_async_pool ,
901
902
" only for async pool" );
903
+ maybe_skip (C , Config ) when C =:= easy_archive_request_old_xmlel_format ->
904
+ MamOpts = ? config (mam_meta_opts , Config ),
905
+ MamBackend = maps :get (backend , MamOpts , rdbms ),
906
+ DefaultFormat = case MamBackend of
907
+ rdbms -> mam_message_compressed_eterm ;
908
+ _ -> mam_message_xml
909
+ end ,
910
+ MessageFormat = maps :get (db_message_format , MamOpts , DefaultFormat ),
911
+ PmMamOpts = maps :get (pm , MamOpts , #{}),
912
+ PmMessageFormat = maps :get (db_message_format , PmMamOpts , MessageFormat ),
913
+ skip_if (PmMessageFormat =:= mam_message_xml , " run only for eterm PM message format" );
902
914
maybe_skip (_C , _Config ) ->
903
915
ok .
904
916
@@ -1238,13 +1250,6 @@ message_dropped(Config) ->
1238
1250
easy_archive_request (Config ) ->
1239
1251
P = ? config (props , Config ),
1240
1252
F = fun (Alice , Bob ) ->
1241
- % % Alice sends "OH, HAI!" to Bob
1242
- % % {xmlel,<<"message">>,
1243
- % % [{<<"from">>,<<"alice@localhost/res1">>},
1244
- % % {<<"to">>,<<"bob@localhost/res1">>},
1245
- % % {<<"xml:lang">>,<<"en">>},
1246
- % % {<<"type">>,<<"chat">>}],
1247
- % % [{xmlel,<<"body">>,[],[{xmlcdata,<<"OH, HAI!">>}]}]}
1248
1253
escalus :send (Alice , escalus_stanza :chat_to (Bob , <<" OH, HAI!" >>)),
1249
1254
mam_helper :wait_for_archive_size (Alice , 1 ),
1250
1255
escalus :send (Alice , stanza_archive_request (P , <<" q1" >>)),
@@ -1271,6 +1276,49 @@ easy_archive_request_for_the_receiver(Config) ->
1271
1276
end ,
1272
1277
escalus_fresh :story (Config , [{alice , 1 }, {bob , 1 }], F ).
1273
1278
1279
+ easy_archive_request_old_xmlel_format (Config ) ->
1280
+ P = ? config (props , Config ),
1281
+ F = fun (Alice , Bob ) ->
1282
+ AArcId = rest_helper :make_arc_id (Alice ),
1283
+ {BobJid , _ , _ } = BArcId = rest_helper :make_arc_id (Bob ),
1284
+ DateTime = calendar :local_time (),
1285
+ Msg = mam_helper :generate_msg_for_date_user (AArcId , BArcId , DateTime , <<" OH, HAI!" >>),
1286
+ Packet = erlang :element (5 , Msg ),
1287
+ OldFormatPacket =
1288
+ {xmlel ,<<" message" >>,
1289
+ [{<<" to" >>, BobJid }, {<<" type" >>,<<" chat" >>}],
1290
+ [{xmlel ,<<" body" >>,[],[{xmlcdata ,<<" OH, HAI!" >>}]}]},
1291
+
1292
+ Msg1 = erlang :setelement (5 , Msg , OldFormatPacket ),
1293
+ ct :log (" Packet: ~p~n " , [Packet ]),
1294
+ ct :log (" OldFormatPacket: ~p~n " , [OldFormatPacket ]),
1295
+ mam_helper :put_msg (Msg1 ),
1296
+ mam_helper :wait_for_archive_size (Alice , 1 ),
1297
+ escalus :send (Alice , stanza_archive_request (P , <<" q1" >>)),
1298
+ Res = wait_archive_respond (Alice ),
1299
+ assert_lookup_event (mod_mam_pm_lookup , escalus_utils :get_jid (Alice )),
1300
+ assert_respond_size (1 , Res ),
1301
+ assert_respond_query_id (P , <<" q1" >>, parse_result_iq (Res )),
1302
+ [RespMessage ] = respond_messages (Res ),
1303
+ ct :log (" ResPacket: ~p~n " , [RespMessage ]),
1304
+
1305
+ ArchivedMsg = exml_query :path (RespMessage , [{element , <<" result" >>},
1306
+ {element , <<" forwarded" >>},
1307
+ {element , <<" message" >>}]),
1308
+ ct :log (" ArchivedMsg: ~p~n " , [ArchivedMsg ]),
1309
+ assert_msg_match (Packet , ArchivedMsg ),
1310
+ ok
1311
+ end ,
1312
+ escalus_fresh :story (Config , [{alice , 1 }, {bob , 1 }], F ).
1313
+
1314
+ assert_msg_match (Pattern , Msg ) ->
1315
+ # xmlel {attrs = PatternAttrs , children = PatternChildren } = Pattern ,
1316
+ # xmlel {attrs = MsgAttrs , children = MsgChildren } = Msg ,
1317
+ [? assertEqual (Value , maps :get (Name , MsgAttrs , undefined ),
1318
+ <<" attribute " , Name /binary >>)
1319
+ || Name := Value <- PatternAttrs ],
1320
+ ? assertEqual (PatternChildren , MsgChildren ).
1321
+
1274
1322
message_sent_to_yourself (Config ) ->
1275
1323
P = ? config (props , Config ),
1276
1324
F = fun (Alice ) ->
@@ -4106,7 +4154,8 @@ message_retraction_is_enabled(Config) ->
4106
4154
BasicGroup = ? config (basic_group , Config ),
4107
4155
BasicGroup =/= disabled_retraction andalso BasicGroup =/= muc_disabled_retraction .
4108
4156
4109
- check_include_groupchat_features (Stanza , cassandra , _BasicGroup ) ->
4157
+ check_include_groupchat_features (Stanza , Config , _BasicGroup ) when Config =:= cassandra_eterm ;
4158
+ Config =:= cassandra ->
4110
4159
? assertNot (escalus_pred :has_feature (groupchat_field_ns (), Stanza )),
4111
4160
? assertNot (escalus_pred :has_feature (groupchat_available_ns (), Stanza ));
4112
4161
check_include_groupchat_features (Stanza , _Configuration , muc_light ) ->
0 commit comments