Merge branch 'main' into avm99963-monorail

Merged commit 34d8229ae2b51fb1a15bd208e6fe6185c94f6266

GitOrigin-RevId: 7ee0917f93a577e475f8e09526dd144d245593f4
diff --git a/services/test/spam_svc_test.py b/services/test/spam_svc_test.py
index 351ec62..156269c 100644
--- a/services/test/spam_svc_test.py
+++ b/services/test/spam_svc_test.py
@@ -1,7 +1,6 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 """Tests for the spam service."""
 from __future__ import print_function
@@ -9,6 +8,8 @@
 from __future__ import absolute_import
 
 import mock
+import six
+import time
 import unittest
 
 try:
@@ -21,8 +22,9 @@
 import settings
 from framework import sql
 from framework import framework_constants
-from proto import user_pb2
-from proto import tracker_pb2
+from infra_libs import ts_mon
+from mrproto import user_pb2
+from mrproto import tracker_pb2
 from services import spam_svc
 from testing import fake
 from mock import Mock
@@ -51,6 +53,9 @@
 
     self.spam_service.report_tbl.Delete = Mock()
     self.spam_service.verdict_tbl.Delete = Mock()
+    self.now = int(time.time())
+
+    ts_mon.reset_for_unittest()
 
   def tearDown(self):
     self.testbed.deactivate()
@@ -84,7 +89,7 @@
     issue_reporters, comment_reporters = (
         self.spam_service.LookupIssueFlaggers(self.cnxn, 234))
     self.mox.VerifyAll()
-    self.assertItemsEqual([111], issue_reporters)
+    six.assertCountEqual(self, [111], issue_reporters)
     self.assertEqual({1: [222]}, comment_reporters)
 
   def testFlagIssues_overThresh(self):
@@ -96,7 +101,9 @@
         summary='sum',
         status='Live',
         issue_id=78901,
-        project_name='proj')
+        project_name='proj',
+        migration_modified_timestamp=1234567,
+        is_spam=False)
     issue.assume_stale = False  # We will store this issue.
 
     self.mock_report_tbl.InsertRows(self.cnxn,
@@ -118,6 +125,8 @@
         self.cnxn, self.issue_service, [issue], 111, True)
     self.mox.VerifyAll()
     self.assertIn(issue, self.issue_service.updated_issues)
+    self.assertEqual(issue.migration_modified_timestamp, self.now)
+    self.assertEqual(issue.is_spam, True)
 
     self.assertEqual(
         1,
@@ -137,7 +146,9 @@
         summary='sum',
         status='Live',
         issue_id=78901,
-        project_name='proj')
+        project_name='proj',
+        migration_modified_timestamp=1234567,
+        is_spam=False)
 
     self.mock_report_tbl.InsertRows(self.cnxn,
         ['issue_id', 'reported_user_id', 'user_id'],
@@ -157,6 +168,8 @@
     self.mox.VerifyAll()
 
     self.assertNotIn(issue, self.issue_service.updated_issues)
+    self.assertEqual(issue.migration_modified_timestamp, 1234567)
+    self.assertEqual(issue.is_spam, False)
     self.assertIsNone(
         self.spam_service.issue_actions.get(
             fields={
@@ -167,8 +180,15 @@
 
   def testUnflagIssue_overThresh(self):
     issue = fake.MakeTestIssue(
-        project_id=789, local_id=1, reporter_id=111, owner_id=456,
-        summary='sum', status='Live', issue_id=78901, is_spam=True)
+        project_id=789,
+        local_id=1,
+        reporter_id=111,
+        owner_id=456,
+        summary='sum',
+        status='Live',
+        issue_id=78901,
+        migration_modified_timestamp=1234567,
+        is_spam=True)
     self.mock_report_tbl.Delete(self.cnxn, issue_id=[issue.issue_id],
         comment_id=None, user_id=111)
     self.mock_report_tbl.Select(self.cnxn,
@@ -185,15 +205,23 @@
     self.mox.VerifyAll()
 
     self.assertNotIn(issue, self.issue_service.updated_issues)
-    self.assertEqual(True, issue.is_spam)
+    self.assertEqual(issue.migration_modified_timestamp, 1234567)
+    self.assertEqual(issue.is_spam, True)
 
   def testUnflagIssue_underThresh(self):
     """A non-member un-flagging an issue as spam should not be able
     to overturn the verdict to ham. This is different from previous
     behavior. See https://crbug.com/monorail/2232 for details."""
     issue = fake.MakeTestIssue(
-        project_id=789, local_id=1, reporter_id=111, owner_id=456,
-        summary='sum', status='Live', issue_id=78901, is_spam=True)
+        project_id=789,
+        local_id=1,
+        reporter_id=111,
+        owner_id=456,
+        summary='sum',
+        status='Live',
+        issue_id=78901,
+        migration_modified_timestamp=1234567,
+        is_spam=True)
     issue.assume_stale = False  # We will store this issue.
     self.mock_report_tbl.Delete(self.cnxn, issue_id=[issue.issue_id],
         comment_id=None, user_id=111)
@@ -211,12 +239,20 @@
     self.mox.VerifyAll()
 
     self.assertNotIn(issue, self.issue_service.updated_issues)
-    self.assertEqual(True, issue.is_spam)
+    self.assertEqual(issue.migration_modified_timestamp, 1234567)
+    self.assertEqual(issue.is_spam, True)
 
   def testUnflagIssue_underThreshNoManualOverride(self):
     issue = fake.MakeTestIssue(
-        project_id=789, local_id=1, reporter_id=111, owner_id=456,
-        summary='sum', status='Live', issue_id=78901, is_spam=True)
+        project_id=789,
+        local_id=1,
+        reporter_id=111,
+        owner_id=456,
+        summary='sum',
+        status='Live',
+        issue_id=78901,
+        migration_modified_timestamp=1234567,
+        is_spam=True)
     self.mock_report_tbl.Delete(self.cnxn, issue_id=[issue.issue_id],
         comment_id=None, user_id=111)
     self.mock_report_tbl.Select(self.cnxn,
@@ -234,7 +270,8 @@
     self.mox.VerifyAll()
 
     self.assertNotIn(issue, self.issue_service.updated_issues)
-    self.assertEqual(True, issue.is_spam)
+    self.assertEqual(issue.migration_modified_timestamp, 1234567)
+    self.assertEqual(issue.is_spam, True)
 
   def testIsExempt_RegularUser(self):
     author = user_pb2.MakeUser(111, email='test@example.com')