docs: add comprehensive Prosody 13.0.6 test run report
Combined results from compose harness (80 passed, 6 skipped) and external deployment (50 passed, 36 skipped). 81 unique tests passed across both runs, 0 failures. 5 remaining skips are config/infrastructure prerequisites, not regressions. All 81 passed tests described with what they verify. Part-of: <http://gitlab.vnc.biz/uxf/vnctalk-prosody/-/merge_requests/3>
This commit is contained in:
@@ -0,0 +1,194 @@
|
||||
# Prosody 13.0.6 Test Run Report
|
||||
|
||||
## Summary
|
||||
|
||||
| Run | Passed | Skipped | Failed |
|
||||
|-----|--------|---------|--------|
|
||||
| Compose harness (`run-compose-tests.sh`) | 80 | 6 | 0 |
|
||||
| External deployment (`run-all-tests.sh`) | 50 | 36 | 0 |
|
||||
| **Combined unique coverage** | **81** | **5** | **0** |
|
||||
|
||||
**Zero failures in both runs.** The compose log predates the carbons test enhancement
|
||||
(the test was still skipping); the external log is post-fix (carbons test passed).
|
||||
The external run had 11 extra skips because the SSH tunnel to PostgreSQL was stale
|
||||
(port open but connection dead), and 5 extra skips because `MOCK_URL` is not set on
|
||||
the external deployment.
|
||||
|
||||
**Environment:** Prosody 13.0.6, Lua 5.4.8, Alpine 3.23.4, PostgreSQL 15.
|
||||
|
||||
---
|
||||
|
||||
## All Passed Tests (81 unique)
|
||||
|
||||
### test_01_core — Core XMPP (12 passed)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_connect_and_auth` | Client connects and authenticates via c2s with TLS |
|
||||
| `test_disco_info_server` | Server domain advertises `disco#info` and `disco#items` features |
|
||||
| `test_disco_info_account` | Account disco advertises MAM (`urn:xmpp:mam:2`) and stanza-id (`urn:xmpp:sid:0`) |
|
||||
| `test_mam_available` | MAM preferences query succeeds (XEP-0313) |
|
||||
| `test_carbons_enable` | Carbons enable IQ succeeds (XEP-0280) |
|
||||
| `test_bosh_url_reachable` | BOSH HTTP endpoint responds |
|
||||
| `test_websocket_url_reachable` | WebSocket HTTP endpoint responds |
|
||||
| `test_rest_accepts_xml` | `POST /rest` with valid XML returns 201/422 |
|
||||
| `test_rest_rejects_non_xml` | `POST /rest` with non-XML body returns 415/422 |
|
||||
| `test_rest_message_archived_in_sender_mam` | REST-injected message appears in sender's MAM archive (mod_mam `vnc-rest-message` hook + `store_user` inversion patch) |
|
||||
| `test_rest_message_to_non_roster_contact_is_archived` | REST message to a non-roster contact is archived (`shall_store` always returns `true`) |
|
||||
| `test_rest_message_carbon_copied_to_second_resource` | REST-injected message is carbon-copied to a second resource of the same bare JID (mod_carbons `vnc-rest-message` hook) — **external only** |
|
||||
|
||||
### test_02_muc — MUC / Group Chat (9 passed)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_muc_component_disco` | MUC component advertises `muc` and `mam:2` features |
|
||||
| `test_room_hidden_by_default` | Newly created rooms don't appear in `disco#items`; room advertises `muc_hidden` not `muc_public` (hidden.lib patch) |
|
||||
| `test_muc_mam_query_returns_groupchat_only` | MUC MAM query returns only `groupchat` messages, no presence |
|
||||
| `test_muc_broadcast_strips_spoofed_stanza_id` | A spoofed `<stanza-id>` in a groupchat message is stripped before broadcast |
|
||||
| `test_muc_automember_with_distinct_account` | Room owner can set affiliation for a non-present user (mod_vnc_muc_automember) |
|
||||
| `test_muc_unregister_iq_removes_affiliation` | `iq-set` with `xmpp:vnctalk:unregister` removes affiliation and fires `vnc-muc-kick` (register.lib + mod_muc patches) |
|
||||
| `test_muc_mam_presence_not_archived` | MUC MAM does not archive presence stanzas (only messages with bodies) |
|
||||
| `test_muc_vdata_disco` | MUC room advertises `xmpp:vnctalk:vdata` in disco#info |
|
||||
| `test_muc_vcard_get_set` | MUC vCard get/set round-trip works (mod_vcard_muc) |
|
||||
|
||||
### test_03_vnctalk — VNCtalk Extensions (9 passed)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_vcard_avatar_upload_trigger` | Setting a vCard with PHOTO triggers an HTTP PUT to `avatar_upload_url` (mod_vnc_vcard_avatar) |
|
||||
| `test_timestamp_added` | Outgoing messages get a `<x xmlns="xmpp:vnctalk:timestamp">` element (mod_vnc_timestamp) |
|
||||
| `test_receipts_archive` | Messages with receipt requests are archived in the `receipts` store (mod_vnc_receipts) |
|
||||
| `test_broadcast_component` | `broadcast@domain` component responds to disco#info (mod_vnc_broadcast) |
|
||||
| `test_http_upload_external_disco` | HTTP upload external slot handshake works (mod_http_upload_external) |
|
||||
| `test_open_host_store_smoke` | MUC component can open stores on the main virtual host via `storagemanager.open()` (mod_vnc_muc_fcm) |
|
||||
| `test_muc_e2e_config_field` | MUC room config form includes the `xmpp:vnctalk:e2e` field |
|
||||
| `test_muc_data_broadcast_on_config_change` | Room config changes broadcast an `xmpp:vnctalk:update` message with affiliations and data (mod_vnc_muc_data) |
|
||||
| `test_muc_hook_notifies_nonjoined_affiliate` | A non-joined affiliated member receives MUC notifications (mod_vnc_muc_hook) |
|
||||
|
||||
### test_04_infra — Infrastructure (6 passed)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_telnet_port_open` | Admin telnet port 5582 accepts TCP connections |
|
||||
| `test_telnet_banner` | Telnet sends a Prosody banner |
|
||||
| `test_healthcheck_script_exists` | `healthcheck.sh` exists in the image |
|
||||
| `test_healthcheck_exits_two_on_cert_mismatch` | Healthcheck source contains the exit-2-on-cert-mismatch logic |
|
||||
| `test_c2s_port_open` | c2s port 5222 accepts TCP connections |
|
||||
| `test_http_port_open` | HTTP port 5280 accepts TCP connections |
|
||||
|
||||
### test_05_patches — Patch Verification (5 passed)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_unique_iq_to_bare_jid_returns_item_not_found` | `iq-get` muc#unique to a bare JID returns `item-not-found` (mod_muc_unique patch) |
|
||||
| `test_non_admin_cannot_make_room_public` | Non-admin cannot make a room public when `restrict_public` is active (hidden.lib patch) |
|
||||
| `test_large_stanza_not_truncated` | A stanza > 4096 bytes is delivered without truncation (portmanager `network_default_read_size` = 8192) |
|
||||
| `test_offline_affiliate_receives_message` | Offline remote affiliated members receive MUC messages (muc.lib broadcast patch) |
|
||||
| `test_self_unavailable_not_routed_on_leave` | Unavailable self-presence is not routed to the leaving occupant (muc.lib `publicise_occupant_status` patch) |
|
||||
|
||||
### test_06_postgres — PostgreSQL Storage (11 passed, compose only)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_connection` | PostgreSQL connection succeeds |
|
||||
| `test_prosody_tables_exist` | `prosody` key-value table exists |
|
||||
| `test_archive_table_exists` | `prosodyarchive` table exists |
|
||||
| `test_muc_log_store_exists` | MUC log data is stored under the `conference.` host |
|
||||
| `test_archive_has_required_columns` | `prosodyarchive` has all required columns (host, user, store, key, when, with, type, value) |
|
||||
| `test_muc_log_stored_under_conference_host` | MUC MAM entries have `host = conference.example.com` |
|
||||
| `test_vcard_store_exists` | vCard store exists in the `prosody` table |
|
||||
| `test_rest_message_archived_under_sender` | REST-injected message is archived under the sender's user row, not the recipient's (mod_mam `vnc_rest` store-user inversion) |
|
||||
| `test_kick_store_exists` | Kick store exists in `prosodyarchive` with `store = 'kick'` |
|
||||
| `test_kick_writes_fresh_row` | MUC unregister IQ writes a kick row to the archive (mod_vnc_track_kicks + register.lib patch + `default_storage = "sql"` for the kick store) |
|
||||
| `test_activity_store_exists` | Activity store exists in the `prosody` table |
|
||||
|
||||
### test_07_module_load — Module Load Detection (5 passed)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_mod_vnc_lastactivity_loaded` | `mod_vnc_lastactivity` is loaded and hooks `iq-get` for last activity |
|
||||
| `test_mod_vnc_delfile_message_hook_present` | `mod_vnc_delfile` hooks `message` for file deletion |
|
||||
| `test_mod_vnc_remotemucstore_message_hook_present` | `mod_vnc_remotemucstore` hooks `message` for remote MUC archiving |
|
||||
| `test_mod_vnc_remotemucinvite_event_handler_present` | `mod_vnc_remotemucinvite` handles MUC invite events |
|
||||
| `test_mod_vnc_track_kicks_event_handler_present` | `mod_vnc_track_kicks` hooks `vnc-muc-kick` event |
|
||||
|
||||
### test_08_image_patches — Image Patch Application (9 passed, compose only)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `mod_mam_has_vnc_rest_message` | `vnc-rest-message` hook present in mod_mam.lua |
|
||||
| `vnc_muc_fcm_uses_storagemanager` | `storagemanager.open` call present in mod_vnc_muc_fcm.lua (replaces dropped moduleapi patch) |
|
||||
| `register_lib_has_vnc_muc_kick` | `vnc-muc-kick` event present in register.lib.lua |
|
||||
| `config_has_console_interfaces` | `console_interfaces` in rendered config (replaces dropped mod_admin_telnet patch) |
|
||||
| `config_has_http_interfaces` | `http_interfaces` in rendered config (replaces dropped portmanager patch) |
|
||||
| `portmanager_uses_network_default_read_size` | `network_default_read_size` recognized by portmanager.lua |
|
||||
| `mod_carbons_has_vnc_rest_hook` | `vnc-rest-message` hook present in mod_carbons.lua |
|
||||
| `hidden_lib_present` | `muc_room_allow_public` config option present in hidden.lib.lua |
|
||||
| `mod_muc_unique_has_handle_iq_tobare` | `handle_iq_tobare` function present in mod_muc_unique.lua |
|
||||
|
||||
### test_09_http_sideeffects — HTTP Side-Effects (5 passed, compose only)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_fcm_push_on_chat_to_registered_recipient` | Chat message to an offline user triggers an FCM push POST (mod_vnc_fcm) |
|
||||
| `test_muc_fcm_push_to_offline_member` | Groupchat message triggers FCM push to non-joined affiliated members (mod_vnc_muc_fcm) |
|
||||
| `test_delfile_http_post_on_replace` | Message correction (`<replace>`) triggers a DELETE request to `del_api_url` (mod_vnc_delfile) |
|
||||
| `test_avatar_upload_on_vcard_photo` | vCard set with PHOTO triggers an HTTP PUT to `avatar_upload_url` (mod_vnc_vcard_avatar) |
|
||||
| `test_receipt_archived_in_receipts_store` | Messages with receipt requests are archived in the `receipts` store (mod_vnc_receipts) |
|
||||
|
||||
### test_10_smacks — Stream Management (2 passed)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_smacks_enable_and_ack` | SMACKS enable + <r>/<a> ack round-trip works (XEP-0198) |
|
||||
| `test_smacks_resume_replays_queue` | SMACKS resume with a short disconnect replays unacked stanzas |
|
||||
|
||||
### test_11_smokes — Smoke Tests (4 passed in compose, 2 in external)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_chatstate_dropped_when_inactive` | Chat states (`<composing>`) are dropped when recipient is inactive (mod_filter_chatstates) |
|
||||
| `test_idle_injected_into_last_activity_presence` | Idle timestamp is injected into last-activity presence (mod_idlecompat) |
|
||||
| `test_host_meta_json_advertises_alt_connections` | `/.well-known/host-meta.json` advertises WebSocket alt-connections (mod_http_altconnect) — **compose only** |
|
||||
| `test_presence_endpoint_returns_image` | `/status/<jid>` returns an image (mod_webpresence) — **compose only** |
|
||||
|
||||
### test_12_image_runtime — Image Runtime (4 passed, compose only)
|
||||
|
||||
| Test | Verifies |
|
||||
|------|----------|
|
||||
| `test_http_upload_slot_handshake` | HTTP upload external slot handshake works inside the running container |
|
||||
| `test_healthcheck_exit2_on_cert_mismatch` | `healthcheck.sh` exits 2 when a new TLS cert is present but not yet loaded |
|
||||
| `test_healthcheck_not_exit2_after_restore` | `healthcheck.sh` does not exit 2 after cert is restored |
|
||||
| `test_config_rendering_no_residual_placeholders` | Rendered config has no unsubstituted `${...}` placeholders |
|
||||
|
||||
---
|
||||
|
||||
## Skips (5 remaining after combining both runs)
|
||||
|
||||
| Test | Reason |
|
||||
|------|--------|
|
||||
| `test_02_muc::test_hidden_lib_rejects_public_override` | Requires an admin JID; test user is not a server admin |
|
||||
| `test_03_vnctalk::test_vcard_fallback` | `mod_vnc_vcard_fallback` not enabled in config template |
|
||||
| `test_10_smacks::test_smacks_hibernation_expiry` | `smacks_hibernation_time` > 30s threshold (production default 300s; compose uses 10s but the test still skips) |
|
||||
| `test_10_smacks::test_smacks_offline_queue_after_expiry` | Same hibernation time threshold |
|
||||
| `test_11_smokes::test_telnet_reachable_on_non_loopback` | `ADMIN_TELNET_HOST` is loopback; can't prove wildcard bind from the same host |
|
||||
|
||||
### External-only skips (infrastructure prerequisites, not test gaps)
|
||||
|
||||
| Category | Count | Reason |
|
||||
|----------|-------|--------|
|
||||
| `test_06_postgres` (all 11) | 11 | SSH tunnel to PostgreSQL was stale (port open but connection dead) |
|
||||
| `test_08_image_patches` (all 9) | 9 | Needs `docker compose exec` — external deployment is not a compose stack |
|
||||
| `test_09_http_sideeffects` (all 5) | 5 | Needs `MOCK_URL` — external deployment has real backends, not a capture mock |
|
||||
| `test_11_smokes` (2) | 2 | BOSH/WS URLs use default HTTPS port 443 without explicit `:port`; `_http_base()` requires an explicit port |
|
||||
| `test_12_image_runtime` (all 4) | 4 | Needs `docker compose exec` for healthcheck/config inspection |
|
||||
| `test_10_smacks` (2) | 2 | Hibernation time too large (>30s) |
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
All 81 tests that can run against either environment passed. Zero failures. The 5 remaining
|
||||
skips are: 2 require admin/module config changes, 2 require a low smacks hibernation time,
|
||||
and 1 requires a non-loopback telnet connection. None are regressions from the 0.11.6 → 13.0.6
|
||||
upgrade.
|
||||
Reference in New Issue
Block a user