Просмотр исходного кода

fix: Fix tests when running with Rust normalizer (#11835)

* wip

* test: Fix some tests when running with rust normalizer

* fix: Fix more tests in test_validate_data

* fix: Fix some test_event_manager tests

* fix: Fix bug in api event serializer

* build: Disallow failures

* build: Run snuba tests with rust

* fix: Fix django search tests

* fix: Ignore errors in errorpage test

* fix: Undo accidental changes from rebase

* fix: Revert more accidental changes

* ref: Rename create_event_endtoend to store_event

* fix: Fix onboarding tests

* fix: Fix event_manager tests

* fix: Fix more tests

* fix: Fix remaining serializer tests

* fix: Dont run snuba tests for now

* fix: Wrong comment on snuba build

* fix: Comment

* fix: Bump semaphore

* fix: Port project_user_reports test to new store_event
Markus Unterwaditzer 6 лет назад
Родитель
Сommit
beed96b588

+ 1 - 6
.travis.yml

@@ -206,7 +206,7 @@ matrix:
       before_script:
         - psql -c 'create database sentry;' -U postgres
 
-    # snuba in testing - allowed to fail
+    # snuba in testing
     - python: 2.7
       env: TEST_SUITE=snuba SENTRY_TAGSTORE=sentry.tagstore.snuba.SnubaTagStorage SENTRY_ZOOKEEPER_HOSTS=localhost:2181 SENTRY_KAFKA_HOSTS=localhost:9092
       services:
@@ -252,11 +252,6 @@ matrix:
     - language: node_js
       env: STORYBOOK_BUILD=1
 
-    - language: python
-      env:
-        - TEST_SUITE=postgres DB=postgres
-        - SENTRY_USE_RUST_NORMALIZER=true
-
 notifications:
   webhooks:
     urls:

+ 1 - 1
requirements-base.txt

@@ -55,7 +55,7 @@ redis>=2.10.3,<2.10.6
 requests-oauthlib==0.3.3
 requests[security]>=2.20.0,<2.21.0
 selenium==3.11.0
-semaphore>=0.4.6,<0.5.0
+semaphore>=0.4.11,<0.5.0
 sentry-sdk>=0.7.0
 setproctitle>=1.1.7,<1.2.0
 simplejson>=3.2.0,<3.9.0

+ 27 - 8
src/sentry/testutils/fixtures.py

@@ -466,6 +466,7 @@ class Fixtures(object):
         return useremail
 
     def create_event(self, event_id=None, normalize=True, **kwargs):
+        # XXX: Do not use this method for new tests! Prefer `store_event`.
         if event_id is None:
             event_id = uuid4().hex
         if 'group' not in kwargs:
@@ -498,7 +499,7 @@ class Fixtures(object):
         # parameter just like our API would
         if 'logentry' not in kwargs['data']:
             kwargs['data']['logentry'] = {
-                'message': kwargs.get('message') or '<unlabeled event>',
+                'message': kwargs['message'] or '<unlabeled event>',
             }
 
         if normalize:
@@ -508,9 +509,6 @@ class Fixtures(object):
             kwargs['data'] = manager.get_data()
             kwargs['message'] = manager.get_search_message()
 
-        else:
-            assert 'message' not in kwargs, 'do not pass message this way'
-
         event = Event(event_id=event_id, **kwargs)
         EventMapping.objects.create(
             project_id=event.project.id,
@@ -522,15 +520,28 @@ class Fixtures(object):
         event.save()
         return event
 
+    def store_event(self, data, project_id, assert_no_errors=True):
+        # Like `create_event`, but closer to how events are actually
+        # ingested. Prefer to use this method over `create_event`
+        manager = EventManager(data)
+        manager.normalize()
+        if assert_no_errors:
+            errors = manager.get_data().get('errors')
+            assert not errors, errors
+
+        event = manager.save(project_id)
+        event.group.save()
+        return event
+
     def create_full_event(self, event_id='a', **kwargs):
         payload = """
             {
-                "id": "f5dd88e612bc406ba89dfebd09120769",
+                "event_id": "f5dd88e612bc406ba89dfebd09120769",
                 "project": 11276,
                 "release": "e1b5d1900526feaf20fe2bc9cad83d392136030a",
                 "platform": "javascript",
                 "culprit": "app/components/events/eventEntries in map",
-                "message": "TypeError: Cannot read property '1' of null",
+                "logentry": {"formatted": "TypeError: Cannot read property '1' of null"},
                 "tags": [
                     ["environment", "prod"],
                     ["sentry_version", "e1b5d1900526feaf20fe2bc9cad83d392136030a"],
@@ -610,8 +621,16 @@ class Fixtures(object):
                 }
             }"""
 
-        return self.create_event(event_id=event_id, platform='javascript',
-                                 data=json.loads(payload))
+        event = self.create_event(
+            event_id=event_id, platform='javascript',
+            data=json.loads(payload),
+
+            # This payload already went through sourcemap
+            # processing, normalizing it would remove
+            # frame.data (orig_filename, etc)
+            normalize=False
+        )
+        return event
 
     def create_group(self, project=None, checksum=None, **kwargs):
         if checksum:

+ 8 - 10
tests/sentry/api/endpoints/test_project_group_index.py

@@ -219,23 +219,21 @@ class GroupListTest(APITestCase):
         project = self.project
         project.update_option('sentry:resolve_age', 1)
         self.create_environment(name="test", project=project)
-        group = self.create_group(checksum='a' * 32)
-        self.create_group(checksum='b' * 32)
-        event_id = 'c' * 32
-        event = self.create_event(
+        event = self.store_event(
+            data={
+                'environment': 'test',
+            },
             project_id=self.project.id,
-            group=group,
-            event_id=event_id,
-            tags={
-                'environment': 'test'})
+        )
+
         self.login_as(user=self.user)
 
         response = self.client.get(
             u'{}?query={}&environment=test'.format(
-                self.path, 'c' * 32), format='json')
+                self.path, event.event_id), format='json')
         assert response.status_code == 200
         assert len(response.data) == 1
-        assert response.data[0]['id'] == six.text_type(group.id)
+        assert response.data[0]['id'] == six.text_type(event.group.id)
         assert response.data[0]['matchingEventId'] == event.id
         assert response.data[0]['matchingEventEnvironment'] == 'test'
 

+ 38 - 35
tests/sentry/api/endpoints/test_project_user_reports.py

@@ -121,12 +121,12 @@ class CreateProjectUserReportTest(APITestCase):
         self.login_as(user=self.user)
 
         project = self.create_project()
-        group = self.create_group(project=project)
         environment = self.make_environment(project)
-        event = self.create_event(
-            group=group,
-            tags={'environment': environment.name},
-            datetime=timezone.now(),
+        event = self.store_event(
+            data={
+                'tags': {'environment': environment.name}
+            },
+            project_id=project.id
         )
 
         url = u'/api/0/projects/{}/{}/user-feedback/'.format(
@@ -150,7 +150,7 @@ class CreateProjectUserReportTest(APITestCase):
             id=response.data['id'],
         )
         assert report.project == project
-        assert report.group == group
+        assert report.group == event.group
         assert report.email == 'foo@example.com'
         assert report.name == 'Foo Bar'
         assert report.comments == 'It broke!'
@@ -158,12 +158,12 @@ class CreateProjectUserReportTest(APITestCase):
     def test_with_dsn_auth(self):
         project = self.create_project()
         project_key = self.create_project_key(project=project)
-        group = self.create_group(project=project)
         environment = self.make_environment(project)
-        event = self.create_event(
-            group=group,
-            tags={'environment': environment.name},
-            datetime=timezone.now(),
+        event = self.store_event(
+            data={
+                'environment': environment.name
+            },
+            project_id=project.id
         )
 
         url = u'/api/0/projects/{}/{}/user-feedback/'.format(
@@ -209,18 +209,17 @@ class CreateProjectUserReportTest(APITestCase):
 
     def test_already_present(self):
         self.login_as(user=self.user)
-
         project = self.create_project()
-        group = self.create_group(project=project)
         environment = self.make_environment(project)
-        event = self.create_event(
-            group=group,
-            tags={'environment': environment.name},
-            datetime=timezone.now(),
+        event = self.store_event(
+            data={
+                'environment': environment.name
+            },
+            project_id=project.id
         )
 
         UserReport.objects.create(
-            group=group,
+            group=event.group,
             project=project,
             event_id=event.event_id,
             name='foo',
@@ -249,7 +248,7 @@ class CreateProjectUserReportTest(APITestCase):
             id=response.data['id'],
         )
         assert report.project == project
-        assert report.group == group
+        assert report.group == event.group
         assert report.email == 'foo@example.com'
         assert report.name == 'Foo Bar'
         assert report.comments == 'It broke!'
@@ -258,23 +257,24 @@ class CreateProjectUserReportTest(APITestCase):
         self.login_as(user=self.user)
 
         project = self.create_project()
-        group = self.create_group(project=project)
         environment = self.make_environment(project)
         event = self.create_event(
-            group=group,
-            tags={
-                'sentry:user': 'email:foo@example.com',
-                'environment': environment.name,
+            data={
+                'tags': {
+                    'sentry:user': 'email:foo@example.com',
+                    'environment': environment.name,
+                }
             },
-            datetime=timezone.now(),
+            project_id=project.id
         )
+
         euser = EventUser.objects.create(
             project_id=project.id,
             name='',
             email='foo@example.com',
         )
         UserReport.objects.create(
-            group=group,
+            group=event.group,
             project=project,
             event_id=event.event_id,
             name='foo',
@@ -303,7 +303,7 @@ class CreateProjectUserReportTest(APITestCase):
             id=response.data['id'],
         )
         assert report.project == project
-        assert report.group == group
+        assert report.group == event.group
         assert report.email == 'foo@example.com'
         assert report.name == 'Foo Bar'
         assert report.comments == 'It broke!'
@@ -316,13 +316,18 @@ class CreateProjectUserReportTest(APITestCase):
         self.login_as(user=self.user)
 
         project = self.create_project()
-        group = self.create_group(project=project)
         environment = self.make_environment(project)
-        event = self.create_event(group=group, tags={
-            'environment': environment.name})
+        event = self.create_event(
+            data={
+                'tags': {
+                    'environment': environment.name
+                }
+            },
+            project_id=project.id
+        )
 
         UserReport.objects.create(
-            group=group,
+            group=event.group,
             project=project,
             event_id=event.event_id,
             name='foo',
@@ -406,8 +411,7 @@ class ProjectUserReportByEnvironmentsTest(UserReportEnvironmentTestCase):
         manager = EventManager(
             self.make_event(
                 environment=self.env1.name,
-                event_id=event_id,
-                group=self.group))
+                event_id=event_id))
         manager.normalize()
         manager.save(self.project.id)
 
@@ -441,8 +445,7 @@ class ProjectUserReportByEnvironmentsTest(UserReportEnvironmentTestCase):
         manager = EventManager(
             self.make_event(
                 environment=self.env1.name,
-                event_id=event_id,
-                group=self.group))
+                event_id=event_id))
         manager.normalize()
         manager.save(self.project.id)
         assert response.status_code == 200, response.content

+ 7 - 8
tests/sentry/api/serializers/test_event.py

@@ -55,7 +55,7 @@ class EventSerializerTest(TestCase):
         event = self.create_event(
             data={
                 'extra': {'extra': True},
-                'modules': {'modules': True},
+                'modules': {'modules': 'foobar'},
                 '_meta': {
                     'extra': {'': {'err': ['extra error']}},
                     'modules': {'': {'err': ['modules error']}},
@@ -66,7 +66,7 @@ class EventSerializerTest(TestCase):
         result = serialize(event)
         assert result['context'] == {'extra': True}
         assert result['_meta']['context'] == {'': {'err': ['extra error']}}
-        assert result['packages'] == {'modules': True}
+        assert result['packages'] == {'modules': 'foobar'}
         assert result['_meta']['packages'] == {'': {'err': ['modules error']}}
 
     def test_message_interface(self):
@@ -137,12 +137,11 @@ class EventSerializerTest(TestCase):
     def test_tags_dict(self):
         event = self.create_event(
             data={
-                # Sentry normalizes this internally, it is actually passed in as
-                # object {"foo": "foo", "bar": "bar"}
-                'tags': [
-                    ['foo', 'foo'],
-                    ['bar', 'bar'],
-                ],
+                # Sentry normalizes this internally
+                'tags': {
+                    'foo': 'foo',
+                    'bar': 'bar',
+                },
                 '_meta': {
                     'tags': {
                         'foo': {'': {'err': ['foo error']}},

+ 9 - 9
tests/sentry/event_manager/test_event_manager.py

@@ -31,7 +31,6 @@ def make_event(**kwargs):
     result = {
         'event_id': 'a' * 32,
         'message': 'foo',
-        'timestamp': 1403007314.570599,
         'level': logging.ERROR,
         'logger': 'default',
         'tags': [],
@@ -980,24 +979,25 @@ class EventManagerTest(TransactionTestCase):
             name='production',
         )
         environment.add_project(project)
+
         event_id = 'a' * 32
 
-        group = self.create_group(project=project)
         UserReport.objects.create(
-            group=group,
             project=project,
             event_id=event_id,
             name='foo',
             email='bar@example.com',
             comments='It Broke!!!',
         )
-        manager = EventManager(
-            make_event(
+
+        self.store_event(
+            data=make_event(
                 environment=environment.name,
-                event_id=event_id,
-                group=group))
-        manager.normalize()
-        manager.save(project.id)
+                event_id=event_id
+            ),
+            project_id=project.id
+        )
+
         assert UserReport.objects.get(event_id=event_id).environment == environment
 
     def test_default_event_type(self):

+ 3 - 3
tests/sentry/event_manager/test_normalization.py

@@ -268,13 +268,13 @@ def test_bad_interfaces_no_exception():
 def test_event_pii():
     manager = EventManager(
         make_event(
-            message='foo bar',
-            _meta={'message': {'': {'err': ['invalid']}}},
+            user={"id": None},
+            _meta={'user': {"id": {'': {'err': ['invalid']}}}},
         )
     )
     manager.normalize()
     data = manager.get_data()
-    assert data['_meta']['message'] == {'': {'err': ['invalid']}}
+    assert data['_meta']['user']['id'] == {'': {'err': ['invalid']}}
 
 
 def test_event_id_lowercase():

+ 15 - 12
tests/sentry/models/test_event.py

@@ -88,13 +88,15 @@ class EventTest(TestCase):
             '$shortID - ${tag:environment}@${tag:release} $$ $title ${tag:invalid} $invalid'
         )
 
-        event1 = self.create_event(
-            event_id='a' * 32,
-            group=self.group,
-            tags={'level': 'info',
-                  'environment': 'production',
-                  'sentry:release': '0'},
-            message='baz',
+        event1 = self.store_event(
+            data={
+                'event_id': 'a' * 32,
+                'environment': 'production',
+                'level': 'info',
+                'release': '0',
+                'message': 'baz',
+            },
+            project_id=self.project.id
         )
 
         assert event1.get_email_subject() == 'BAR-1 - production@0 $ baz ${tag:invalid} $invalid'
@@ -115,13 +117,14 @@ class EventTest(TestCase):
 
     def test_get_environment(self):
         environment = Environment.get_or_create(self.project, 'production')
-        event = self.create_event(
-            data={'tags': [
-                ('environment', 'production'),
-            ]}
+        event = self.store_event(
+            data={
+                'environment': 'production'
+            },
+            project_id=self.project.id
         )
 
-        event.get_environment() == environment
+        assert event.get_environment() == environment
 
         with self.assertNumQueries(0):
             event.get_environment() == environment

+ 6 - 5
tests/sentry/rules/conditions/test_event_attribute.py

@@ -8,13 +8,12 @@ class EventAttributeConditionTest(RuleTestCase):
     rule_cls = EventAttributeCondition
 
     def get_event(self):
-        event = self.create_event(
-            platform='php',
+        event = self.store_event(
             data={
                 'message': 'hello world',
                 'request': {
                     'method': 'GET',
-                    'url': 'http://example.com',
+                    'url': 'http://example.com/',
                 },
                 'user': {
                     'id': '1',
@@ -46,8 +45,10 @@ class EventAttributeConditionTest(RuleTestCase):
                     },
                     'biz': ['baz'],
                     'bar': 'foo',
-                }
+                },
+                'platform': 'php',
             },
+            project_id=self.project.id
         )
         return event
 
@@ -227,7 +228,7 @@ class EventAttributeConditionTest(RuleTestCase):
         rule = self.get_rule(data={
             'match': MatchType.EQUAL,
             'attribute': 'http.url',
-            'value': 'http://example.com',
+            'value': 'http://example.com/',
         })
         self.assertPasses(rule, event)
 

Некоторые файлы не были показаны из-за большого количества измененных файлов