diff options
Diffstat (limited to 'omaha_server/omaha/tests/test_tasks.py')
-rw-r--r-- | omaha_server/omaha/tests/test_tasks.py | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/omaha_server/omaha/tests/test_tasks.py b/omaha_server/omaha/tests/test_tasks.py new file mode 100644 index 0000000..b86530a --- /dev/null +++ b/omaha_server/omaha/tests/test_tasks.py @@ -0,0 +1,318 @@ +# coding: utf8 + +""" +This software is licensed under the Apache 2 license, quoted below. + +Copyright 2014 Crystalnix Limited + +Licensed under the Apache License, Version 2.0 (the "License"); you may not +use this file except in compliance with the License. You may obtain a copy of +the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations under +the License. +""" + +import uuid + +from django.test import TestCase + +from mock import patch +from freezegun import freeze_time + +from crash.models import Crash, Symbols +from crash.factories import CrashFactory, SymbolsFactory +from feedback.models import Feedback +from feedback.factories import FeedbackFactory +from omaha.dynamic_preferences_registry import global_preferences_manager as gpm +from omaha_server.utils import is_private +from omaha.models import Version +from omaha.factories import VersionFactory +from omaha.tasks import ( + auto_delete_duplicate_crashes, + auto_delete_older_than, + auto_delete_size_is_exceeded, + deferred_manual_cleanup +) +from omaha_server.utils import add_extra_to_log_message +from sparkle.models import SparkleVersion +from sparkle.factories import SparkleVersionFactory + +class DuplicatedCrashesTest(TestCase): + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_crashes(self, mocked_get_logger): + gpm['Crash__duplicate_number'] = 2 + crashes = CrashFactory.create_batch(10, signature='test') + deleted_crash = crashes[7] + self.assertEqual(Crash.objects.all().count(), 10) + + extra_meta = dict(count=8, reason='duplicated', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Crash', size=0.0) + log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta) + + extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"), + signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid, + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra) + + mocked_logger = mocked_get_logger.return_value + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + auto_delete_duplicate_crashes() + + self.assertEqual(mocked_logger.info.call_count, 9) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + +class OldObjectsTest(TestCase): + @patch('logging.getLogger') + @is_private() + def test_crashes(self, mocked_get_logger): + gpm['Crash__limit_storage_days'] = 2 + with freeze_time("2012-12-21 12:00:00"): + crashes = CrashFactory.create_batch(10, signature='test') + deleted_crash = crashes[-1] + self.assertEqual(Crash.objects.all().count(), 10) + + extra_meta = dict(count=10, reason='old', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Crash', size=0.0) + log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta) + + extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"), + signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid, + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra) + + mocked_logger = mocked_get_logger.return_value + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + auto_delete_older_than() + + self.assertEqual(mocked_logger.info.call_count, 11) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + @patch('logging.getLogger') + @is_private() + def test_feedbacks(self, mocked_get_logger): + gpm['Feedback__limit_storage_days'] = 2 + with freeze_time("2012-12-21 12:00:00"): + feedbacks = FeedbackFactory.create_batch(10) + deleted_feedback = feedbacks[-1] + self.assertEqual(Feedback.objects.all().count(), 10) + + extra_meta = dict(count=10, reason='old', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Feedback', size=0.0) + log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta) + + extra = dict(id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"), + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra) + + mocked_logger = mocked_get_logger.return_value + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + auto_delete_older_than() + + self.assertEqual(mocked_logger.info.call_count, 11) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + +class SizeExceedTest(TestCase): + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_crashes(self, mocked_get_logger): + gpm['Crash__limit_size'] = 1 + crash_size = 10*1024*1023 + crashes = CrashFactory.create_batch(200, archive_size=crash_size, minidump_size=0) + deleted_crash = crashes[97] + self.assertEqual(Crash.objects.all().count(), 200) + + extra_meta = dict(count=98, reason='size_is_exceeded', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Crash', size=979.04296875) + log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta) + + extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"), + signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid, + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra) + + mocked_logger = mocked_get_logger.return_value + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + auto_delete_size_is_exceeded() + + self.assertEqual(mocked_logger.info.call_count, 99) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_feedbacks(self, mocked_get_logger): + gpm['Feedback__limit_size'] = 1 + feedback_size = 10*1024*1023 + feedbacks = FeedbackFactory.create_batch(200, screenshot_size=feedback_size, system_logs_size=0, attached_file_size=0, + blackbox_size=0) + deleted_feedback = feedbacks[97] + self.assertEqual(Feedback.objects.all().count(), 200) + + extra_meta = dict(count=98, reason='size_is_exceeded', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Feedback', size=979.04296875) + log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta) + + extra = dict(id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"), + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra) + + mocked_logger = mocked_get_logger.return_value + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + auto_delete_size_is_exceeded() + self.assertEqual(mocked_logger.info.call_count, 99) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + +class ManualCleanupTest(TestCase): + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_crashes(self, mocked_get_logger): + gpm['Crash__duplicate_number'] = 2 + crashes = CrashFactory.create_batch(10, signature='test') + deleted_crash = crashes[7] + self.assertEqual(Crash.objects.count(), 10) + + extra_meta = dict(count=8, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Crash', limit_duplicated=2, limit_size=None, limit_days=None, size=0.0) + log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta) + + extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"), + signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid, + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra) + mocked_logger = mocked_get_logger.return_value + + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + deferred_manual_cleanup(['crash', 'Crash'], limit_duplicated=2) + + self.assertEqual(mocked_logger.info.call_count, 9) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_feedbacks(self, mocked_get_logger): + gpm['Feedback__limit_size'] = 1 + feedback_size = 100*1024*1023 + feedbacks = FeedbackFactory.create_batch(20, screenshot_size=feedback_size, system_logs_size=0, attached_file_size=0, + blackbox_size=0) + deleted_feedback = feedbacks[7] + self.assertEqual(Feedback.objects.count(), 20) + + extra_meta = dict(count=10, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Feedback', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375) + log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta) + + extra = dict(id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"), + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra) + mocked_logger = mocked_get_logger.return_value + + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + deferred_manual_cleanup(['feedback', 'Feedback'], limit_size=1) + self.assertEqual(mocked_logger.info.call_count, 11) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_symbols(self, mocked_get_logger): + gpm['Feedback__limit_size'] = 1 + symbols_size = 100*1024*1023 + symbols = SymbolsFactory.create_batch(20, file_size=symbols_size) + deleted_symbols = symbols[7] + self.assertEqual(Symbols.objects.count(), 20) + + extra_meta = dict(count=10, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Symbols', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375) + log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta) + + extra = dict(id=deleted_symbols.id, element_created=deleted_symbols.created.strftime("%d. %B %Y %I:%M%p"), + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra) + mocked_logger = mocked_get_logger.return_value + + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + deferred_manual_cleanup(['crash', 'Symbols'], limit_size=1) + self.assertEqual(mocked_logger.info.call_count, 11) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_omaha_versions(self, mocked_get_logger): + gpm['Version__limit_size'] = 1 + version_size = 1000*1024*1023 + versions = VersionFactory.create_batch(2, file_size=version_size) + deleted_version = versions[0] + self.assertEqual(Version.objects.count(), 2) + + extra_meta = dict(count=1, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='Version', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375) + log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta) + + extra = dict(id=deleted_version.id, element_created=deleted_version.created.strftime("%d. %B %Y %I:%M%p"), + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra) + mocked_logger = mocked_get_logger.return_value + + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + deferred_manual_cleanup(['omaha', 'Version'], limit_size=1) + self.assertEqual(mocked_logger.info.call_count, 2) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) + + @freeze_time("2012-12-21 12:00:00") + @patch('logging.getLogger') + @is_private() + def test_sparkle_versions(self, mocked_get_logger): + gpm['SparkleVersion__limit_size'] = 1 + version_size = 1000*1024*1023 + versions = SparkleVersionFactory.create_batch(2, file_size=version_size) + deleted_version = versions[0] + self.assertEqual(SparkleVersion.objects.count(), 2) + + extra_meta = dict(count=1, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00', + model='SparkleVersion', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375) + log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta) + + extra = dict(id=deleted_version.id, element_created=deleted_version.created.strftime("%d. %B %Y %I:%M%p"), + log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00') + log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra) + mocked_logger = mocked_get_logger.return_value + + with patch('uuid.uuid4') as mocked_uuid4: + mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100)) + deferred_manual_cleanup(['sparkle', 'SparkleVersion'], limit_size=1) + self.assertEqual(mocked_logger.info.call_count, 2) + mocked_logger.info.assert_any_call(log_extra_msg) + mocked_logger.info.assert_any_call(log_msg) |