Skip to content

Commit

Permalink
fix #203. An empty minidump file is ignored during adding of a crash
Browse files Browse the repository at this point in the history
  • Loading branch information
Kirill Yakovenko committed Jul 25, 2016
1 parent 4056a61 commit 729627d
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 11 deletions.
23 changes: 13 additions & 10 deletions omaha_server/crash/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,17 +52,20 @@ def clean_archive(self):
def clean_upload_file_minidump(self):
file = self.cleaned_data["upload_file_minidump"]

if file.name.endswith('.tar'):
t_file = BytesIO(file.read())
t_file = tarfile.open(fileobj=t_file, mode='r')
self.cleaned_data['archive_file'] = file
dump_name = filter(lambda i: i.endswith('.dmp'), t_file.getnames())
if file and file.name.endswith('.tar'):
try:
file_name = next(dump_name)
file = t_file.extractfile(file_name)
file = SimpleUploadedFile(file_name, file.read())
except StopIteration:
return None
t_file = BytesIO(file.read())
t_file = tarfile.open(fileobj=t_file, mode='r')
self.cleaned_data['archive_file'] = file
dump_name = filter(lambda i: i.endswith('.dmp'), t_file.getnames())
try:
file_name = next(dump_name)
file = t_file.extractfile(file_name)
file = SimpleUploadedFile(file_name, file.read())
except StopIteration:
return None
except tarfile.TarError as err:
raise forms.ValidationError('The tar file is broken, error: {0}'.format(err.message))
return file

def clean_minidump_size(self):
Expand Down
37 changes: 36 additions & 1 deletion omaha_server/crash/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"""

import os
import string
import random

from django.test import TestCase
from django.core.files.uploadedfile import SimpleUploadedFile
Expand All @@ -32,6 +34,10 @@
TAR_FILE = os.path.join(TEST_DATA_DIR, 'foo.tar')


def string_generator(size, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))


class SymbolsAdminFormTest(TestCase):
def test_form(self):
form_data = {}
Expand Down Expand Up @@ -78,4 +84,33 @@ def test_form_tar_file(self):
self.assertEqual(form.cleaned_data['upload_file_minidump'].name, '7b05e196-7e23-416b-bd13-99287924e214.dmp')
self.assertEqual(form.cleaned_data['archive'].name, 'foo.tar')
self.assertEqual(form.cleaned_data['archive_size'], 85504)
self.assertEqual(form.cleaned_data['minidump_size'], 14606)
self.assertEqual(form.cleaned_data['minidump_size'], 14606)

def test_invalid_data(self):
with open(TAR_FILE, 'rb') as f:
form_file_data = dict(upload_file_minidump=SimpleUploadedFile(
"foo.tar", f.read(100)))
form_data = dict(
appid=string_generator(40),
userid=string_generator(40),
meta=string_generator(40),
stacktrace=string_generator(40),
stacktrace_json=string_generator(40),
signature=string_generator(256),
ip=string_generator(40),
groupid=string_generator(40),
eventid=string_generator(40),
)

form = CrashFrom(form_data, form_file_data)
self.assertFalse(form.is_valid())
self.assertIn('upload_file_minidump', form.errors)
self.assertIn('appid', form.errors)
self.assertIn('userid', form.errors)
self.assertIn('meta', form.errors)
self.assertNotIn('stacktrace', form.errors)
self.assertIn('stacktrace_json', form.errors)
self.assertIn('signature', form.errors)
self.assertIn('ip', form.errors)
self.assertIn('groupid', form.errors)
self.assertIn('eventid', form.errors)

0 comments on commit 729627d

Please sign in to comment.