[3.6] bpo-29960 _random.Random corrupted on exception in setstate(). … (#1287)

(cherry picked from commit 9616a82e7802241a4b74cf7ae38d43c37bf66e48)
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index 5b6a4f0..03adc0a 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -427,6 +427,7 @@
         self.assertRaises(ValueError, self.gen.setstate, (1, None, None))
 
     def test_setstate_middle_arg(self):
+        start_state = self.gen.getstate()
         # Wrong type, s/b tuple
         self.assertRaises(TypeError, self.gen.setstate, (2, None, None))
         # Wrong length, s/b 625
@@ -440,6 +441,10 @@
             self.gen.setstate((2, (1,)*624+(625,), None))
         with self.assertRaises((ValueError, OverflowError)):
             self.gen.setstate((2, (1,)*624+(-1,), None))
+        # Failed calls to setstate() should not have changed the state.
+        bits100 = self.gen.getrandbits(100)
+        self.gen.setstate(start_state)
+        self.assertEqual(self.gen.getrandbits(100), bits100)
 
         # Little trick to make "tuple(x % (2**32) for x in internalstate)"
         # raise ValueError. I cannot think of a simple way to achieve this, so