1# Copyright 2018 The TensorFlow Authors. All Rights Reserved. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# ============================================================================== 15"""Tests for forward and backwards compatibility utilities.""" 16 17import datetime 18import os 19from tensorflow.python.compat import compat 20from tensorflow.python.platform import test 21 22 23class CompatTest(test.TestCase): 24 25 def _compatibility_date(self): 26 date = compat._FORWARD_COMPATIBILITY_HORIZON # pylint: disable=protected-access 27 return (date.year, date.month, date.day) 28 29 def _n_days_after(self, n): 30 date = compat._FORWARD_COMPATIBILITY_HORIZON + datetime.timedelta(days=n) # pylint: disable=protected-access 31 return (date.year, date.month, date.day) 32 33 def test_basic(self): 34 compatibility_date = self._compatibility_date() 35 one_day_before = self._n_days_after(-1) 36 self.assertTrue(compat.forward_compatible(*one_day_before)) 37 self.assertFalse(compat.forward_compatible(*compatibility_date)) 38 39 def test_past(self): 40 with compat.forward_compatibility_horizon(2018, 9, 18): 41 self.assertTrue(compat.forward_compatible(2020, 4, 4)) 42 43 def test_decorator(self): 44 compatibility_date = self._compatibility_date() 45 one_day_after = self._n_days_after(1) 46 with compat.forward_compatibility_horizon(*one_day_after): 47 self.assertTrue(compat.forward_compatible(*compatibility_date)) 48 self.assertFalse(compat.forward_compatible(*one_day_after)) 49 50 # After exiting context manager, value should be reset. 51 self.assertFalse(compat.forward_compatible(*compatibility_date)) 52 53 def test_decorator_with_failure(self): 54 compatibility_date = self._compatibility_date() 55 one_day_after = self._n_days_after(1) 56 57 class DummyError(Exception): 58 pass 59 60 try: 61 with compat.forward_compatibility_horizon(*one_day_after): 62 raise DummyError() 63 except DummyError: 64 pass # silence DummyError 65 66 # After exiting context manager, value should be reset. 67 self.assertFalse(compat.forward_compatible(*compatibility_date)) 68 69 def test_environment_override(self): 70 var_name = 'TF_FORWARD_COMPATIBILITY_DELTA_DAYS' 71 72 def remove_os_environment_var(): 73 try: 74 del os.environ[var_name] 75 except KeyError: 76 pass 77 78 self.addCleanup(remove_os_environment_var) 79 80 compatibility_date = self._compatibility_date() 81 one_day_before = self._n_days_after(-1) 82 one_day_after = self._n_days_after(1) 83 ten_days_after = self._n_days_after(10) 84 nine_days_after = self._n_days_after(9) 85 86 self.assertTrue(compat.forward_compatible(*one_day_before)) 87 self.assertFalse(compat.forward_compatible(*compatibility_date)) 88 self.assertFalse(compat.forward_compatible(*one_day_after)) 89 self.assertFalse(compat.forward_compatible(*nine_days_after)) 90 self.assertFalse(compat.forward_compatible(*ten_days_after)) 91 92 os.environ[var_name] = '10' 93 compat._update_forward_compatibility_date_number() 94 self.assertTrue(compat.forward_compatible(*one_day_before)) 95 self.assertTrue(compat.forward_compatible(*compatibility_date)) 96 self.assertTrue(compat.forward_compatible(*one_day_after)) 97 self.assertTrue(compat.forward_compatible(*nine_days_after)) 98 self.assertFalse(compat.forward_compatible(*ten_days_after)) 99 100 del os.environ[var_name] 101 compat._update_forward_compatibility_date_number() 102 self.assertTrue(compat.forward_compatible(*one_day_before)) 103 self.assertFalse(compat.forward_compatible(*compatibility_date)) 104 self.assertFalse(compat.forward_compatible(*one_day_after)) 105 self.assertFalse(compat.forward_compatible(*nine_days_after)) 106 self.assertFalse(compat.forward_compatible(*ten_days_after)) 107 108 # Now test interaction between environment variable and context func. 109 os.environ[var_name] = '10' 110 compat._update_forward_compatibility_date_number() 111 self.assertTrue(compat.forward_compatible(*one_day_after)) 112 with compat.forward_compatibility_horizon(*one_day_after): 113 self.assertTrue(compat.forward_compatible(*one_day_before)) 114 self.assertTrue(compat.forward_compatible(*compatibility_date)) 115 self.assertFalse(compat.forward_compatible(*one_day_after)) 116 self.assertFalse(compat.forward_compatible(*nine_days_after)) 117 self.assertFalse(compat.forward_compatible(*ten_days_after)) 118 self.assertTrue(compat.forward_compatible(*one_day_after)) 119 120 121if __name__ == '__main__': 122 test.main() 123