bpo-31479: Always reset the signal alarm in tests (GH-3588) (GH-7314)

* bpo-31479: Always reset the signal alarm in tests

Use "try: ... finally: signal.signal(0)" pattern to make sure that
tests don't "leak" a pending fatal signal alarm.

* Move two more alarm() calls into the try block

Fix also typo: replace signal.signal(0) with signal.alarm(0)

* Move another signal.alarm() into the try block

(cherry picked from commit 9abee722d448c1c00c7d4e11ce242ec7b13e5c49)
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 5cff13a..5f4f579 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -138,6 +138,8 @@
         else:
             self.fail("pause returned of its own accord, and the signal"
                       " didn't arrive after another second.")
+        finally:
+            signal.alarm(0)
 
     # Issue 3864. Unknown if this affects earlier versions of freebsd also.
     @unittest.skipIf(sys.platform=='freebsd6',
@@ -246,11 +248,15 @@
         import select
 
         signal.alarm(1)
-        before_time = time.time()
-        # We attempt to get a signal during the sleep,
-        # before select is called
-        time.sleep(self.TIMEOUT_FULL)
-        mid_time = time.time()
+        try:
+            before_time = time.time()
+            # We attempt to get a signal during the sleep,
+            # before select is called
+            time.sleep(self.TIMEOUT_FULL)
+            mid_time = time.time()
+        finally:
+            signal.alarm(0)
+
         self.assertTrue(mid_time - before_time < self.TIMEOUT_HALF)
         select.select([self.read], [], [], self.TIMEOUT_FULL)
         after_time = time.time()
@@ -260,11 +266,15 @@
         import select
 
         signal.alarm(1)
-        before_time = time.time()
-        # We attempt to get a signal during the select call
-        self.assertRaises(select.error, select.select,
-            [self.read], [], [], self.TIMEOUT_FULL)
-        after_time = time.time()
+        try:
+            before_time = time.time()
+            # We attempt to get a signal during the select call
+            self.assertRaises(select.error, select.select,
+                [self.read], [], [], self.TIMEOUT_FULL)
+            after_time = time.time()
+        finally:
+            signal.alarm(0)
+
         self.assertTrue(after_time - before_time < self.TIMEOUT_HALF)
 
     def setUp(self):