zulip/zerver/tests
Mateusz Mandera f95dd628bd email: Fix race conditions with concurrent ScheduledEmail handling.
The main race conditions, which actually happened in production was with
concurrent execution of deliver_email and clear_scheduled_emails.
clear_scheduled_emails could delete all email.users in the middle of
deliver_email execution, causing it to pass empty to_user_ids list to
send_email. We mitigate this by getting the list of user ids in a single
query and moving forward with that snapshot, not having to worry about
database data being mutated anymore.

clear_scheduled_emails had potential race conditions with concurrent
execution of itself due to not locking the appropriate rows upon
selecting them for the purpose of potentially deleting them. FOR UPDATE
locks need to be acquired to prevent simultaneous mutation.

Tested manually with some print+sleep debugging to make some races
happen.

fixes #zulip-2k (sentry)
2020-09-09 15:59:01 -07:00
..
fixtures docs: Fix spelling errors caught by codespell. 2020-08-11 10:23:06 -07:00
images emoji: Only resize custom emoji that need it. 2019-01-29 10:33:50 -08:00
__init__.py
test_alert_words.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_archive.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_attachments.py models: Change attachment.size to not be nullable. 2020-06-20 13:15:02 -07:00
test_audit_log.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_auth_backends.py python: Use standard secrets module to generate random tokens. 2020-09-09 15:52:57 -07:00
test_bots.py python: Simplify away various unnecessary lists and list comprehensions. 2020-09-02 11:15:41 -07:00
test_cache.py test_cache: Use assertLogs to avoid spam in test-backend output. 2020-07-26 16:14:17 -07:00
test_camo.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_compatibility.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_create_video_call.py python: Use standard secrets module to generate random tokens. 2020-09-09 15:52:57 -07:00
test_custom_profile_data.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_decorators.py decorator test: Dedent some assertions. 2020-09-03 10:44:39 -07:00
test_digest.py Revert "digest: Support digest of web public streams for guest users." 2020-07-29 21:05:59 -07:00
test_docs.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_drafts.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_email_change.py emails: Add a custom header specifying the organization when possible. 2020-06-28 13:33:02 -07:00
test_email_log.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_email_mirror.py python: Pre-fix a few spots for better Black formatting. 2020-09-03 17:51:09 -07:00
test_email_notifications.py test: Use variable instead of hard coded value. 2020-09-02 17:58:19 -07:00
test_embedded_bot_system.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_event_queue.py tests: Check JSON serializability of test data with mock_queue_publish. 2020-09-03 17:34:31 -07:00
test_event_system.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_events.py python: Replace list literal concatenation with * unpacking. 2020-09-02 11:15:41 -07:00
test_external.py rate_limiter: Fix flakiness of tests in test_external. 2020-08-24 16:22:04 -07:00
test_gitter_importer.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_hipchat_importer.py test_hipchat_importer: Fix a type: ignore issue. 2020-06-30 18:58:23 -07:00
test_home.py python: Replace unnecessary intermediate lists with generators. 2020-09-02 11:15:41 -07:00
test_hotspots.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_i18n.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_import_export.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_integrations_dev_panel.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_integrations.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_internet.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_legacy_subject.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_link_embed.py tests: Check JSON serializability of test data with mock_queue_publish. 2020-09-03 17:34:31 -07:00
test_logging_handlers.py tests: Add more tests around exception handling. 2020-09-03 17:34:31 -07:00
test_management_commands.py tests: Use real path when getting commands in TestCommandsCanStart. 2020-09-01 10:55:07 -07:00
test_markdown.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_mattermost_importer.py python: Prefer kwargs form of dict.update. 2020-09-03 17:51:09 -07:00
test_message_dict.py docs: Capitalize Markdown consistently. 2020-08-11 10:23:06 -07:00
test_message_edit_notifications.py tests: Check JSON serializability of test data with mock_queue_publish. 2020-09-03 17:34:31 -07:00
test_message_edit.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_message_fetch.py python: Prefer kwargs form of dict.update. 2020-09-03 17:51:09 -07:00
test_message_flags.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_message_send.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_message_topics.py topic_history: Allow anonymous access in web-public streams. 2020-09-04 10:17:56 -07:00
test_messages.py tests: Move test_near_pm_message_url to test_message_fetch.py. 2020-07-08 14:00:05 -07:00
test_middleware.py refactor: Rename bugdown words to markdown in stats related functions. 2020-06-26 17:20:40 -07:00
test_migrations.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_mirror_users.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_muting.py mypy: Use tuples for muted_topics. 2020-06-24 15:01:57 -07:00
test_new_users.py python: Convert more percent formatting to Python 3.6 f-strings. 2020-06-14 23:27:22 -07:00
test_onboarding.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_openapi.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_outgoing_webhook_interfaces.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_outgoing_webhook_system.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_populate_db.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_presence.py test_presence: Switch data setup from pointer to message flags. 2020-06-27 16:44:38 -07:00
test_push_notifications.py tests: Check JSON serializability of test data with mock_queue_publish. 2020-09-03 17:34:31 -07:00
test_queue_worker.py tests: Check JSON serializability of test data with mock_queue_publish. 2020-09-03 17:34:31 -07:00
test_queue.py test_queue: Use assertLogs to verify warning in test_queue_error_json. 2020-07-27 11:02:17 -07:00
test_rate_limiter.py python: Use standard secrets module to generate random tokens. 2020-09-09 15:52:57 -07:00
test_reactions.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_realm_domains.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_realm_emoji.py database: Remove short_name from UserProfile. 2020-07-17 11:15:15 -07:00
test_realm_export.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_realm_filters.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_realm.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_redis_utils.py python: Use standard secrets module to generate random tokens. 2020-09-09 15:52:57 -07:00
test_report.py tests: Check JSON serializability of test data with mock_queue_publish. 2020-09-03 17:34:31 -07:00
test_retention.py python: Pre-fix a few spots for better Black formatting. 2020-09-03 17:51:09 -07:00
test_service_bot_system.py tests: Extract a helper to run tests for each bot type. 2020-09-03 17:34:31 -07:00
test_sessions.py test_sessions: Use assertLogs to avoid spam in test-backend output. 2020-07-27 11:02:17 -07:00
test_settings.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_signup.py python: Prefer kwargs form of dict.update. 2020-09-03 17:51:09 -07:00
test_slack_importer.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_slack_message_conversion.py python: Pre-fix a few spots for better Black formatting. 2020-09-03 17:51:09 -07:00
test_soft_deactivation.py python: Tweak some magic trailing commas to avoid Black bugs. 2020-09-03 17:51:09 -07:00
test_subdomains.py tests: Make all tests inherit ZulipTestCase. 2020-07-01 10:48:12 -07:00
test_submessage.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
test_subs.py python: Pre-fix a few spots for better Black formatting. 2020-09-03 17:51:09 -07:00
test_templates.py docs: Capitalize Markdown consistently. 2020-08-11 10:23:06 -07:00
test_thumbnail.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_timestamp.py timestamp: Remove datetime_to_precise_timestamp for datetime.timestamp. 2020-07-31 22:10:14 -07:00
test_tornado.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_transfer.py tests: Add an explicit order_by to prevent flakes. 2020-08-18 11:15:35 -04:00
test_tutorial.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_type_debug.py tests: Make all tests inherit ZulipTestCase. 2020-07-01 10:48:12 -07:00
test_typing.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_upload.py attachments: Add is_web_public field. 2020-08-12 17:26:03 -07:00
test_urls.py message_fetch: Allow access to web-public msgs for unauth users. 2020-08-12 16:39:02 -07:00
test_user_groups.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00
test_user_status.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_users.py email: Fix race conditions with concurrent ScheduledEmail handling. 2020-09-09 15:59:01 -07:00
test_webhooks_common.py decorator: Fix type of signature-changing decorators. 2020-06-23 11:29:54 -07:00
test_widgets.py python: Rewrite dict() as {}. 2020-09-02 11:15:41 -07:00
test_zcommand.py settings: Add automatic theme detection feature. 2020-06-21 01:09:01 -07:00
test_zephyr.py python: Replace ujson with orjson. 2020-08-11 10:55:12 -07:00