Home | History | Annotate | Download | only in training
      1 # Copyright 2015 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 tensorflow.python.framework.tensorboard_logging."""
     16 
     17 from __future__ import absolute_import
     18 from __future__ import division
     19 from __future__ import print_function
     20 
     21 import glob
     22 import os
     23 import shutil
     24 import tempfile
     25 import time
     26 
     27 from tensorflow.core.util import event_pb2
     28 from tensorflow.python.platform import test
     29 from tensorflow.python.platform import tf_logging as logging
     30 from tensorflow.python.summary import summary_iterator
     31 from tensorflow.python.summary.writer import writer
     32 from tensorflow.python.training import tensorboard_logging
     33 
     34 
     35 class EventLoggingTest(test.TestCase):
     36 
     37   def setUp(self):
     38     self._work_dir = tempfile.mkdtemp(dir=self.get_temp_dir())
     39     self._sw = writer.FileWriter(self._work_dir)
     40     tensorboard_logging.set_summary_writer(self._sw)
     41     self.addCleanup(shutil.rmtree, self._work_dir)
     42 
     43     # Stop the clock to avoid test flakiness.
     44     now = time.time()
     45     time._real_time = time.time
     46     time.time = lambda: now
     47 
     48     # Mock out logging calls so we can verify that the right number of messages
     49     # get logged.
     50     self.logged_message_count = 0
     51     self._actual_log = logging.log
     52 
     53     def mockLog(*args, **kwargs):
     54       self.logged_message_count += 1
     55       self._actual_log(*args, **kwargs)
     56 
     57     logging.log = mockLog
     58 
     59   def tearDown(self):
     60     time.time = time._real_time
     61     logging.log = self._actual_log
     62 
     63   def assertLoggedMessagesAre(self, expected_messages):
     64     self._sw.close()
     65     event_paths = glob.glob(os.path.join(self._work_dir, "event*"))
     66     # If the tests runs multiple time in the same directory we can have
     67     # more than one matching event file.  We only want to read the last one.
     68     self.assertTrue(event_paths)
     69     event_reader = summary_iterator.summary_iterator(event_paths[-1])
     70     # Skip over the version event.
     71     next(event_reader)
     72 
     73     for level, message in expected_messages:
     74       event = next(event_reader)
     75       self.assertEqual(event.wall_time, time.time())
     76       self.assertEqual(event.log_message.level, level)
     77       self.assertEqual(event.log_message.message, message)
     78 
     79   def testBasic(self):
     80     tensorboard_logging.set_summary_writer(self._sw)
     81     tensorboard_logging.error("oh no!")
     82     tensorboard_logging.error("for%s", "mat")
     83 
     84     self.assertLoggedMessagesAre([(event_pb2.LogMessage.ERROR, "oh no!"),
     85                                   (event_pb2.LogMessage.ERROR, "format")])
     86     self.assertEqual(2, self.logged_message_count)
     87 
     88   def testVerbosity(self):
     89     tensorboard_logging.set_summary_writer(self._sw)
     90     tensorboard_logging.set_verbosity(tensorboard_logging.ERROR)
     91     tensorboard_logging.warn("warn")
     92     tensorboard_logging.error("error")
     93     tensorboard_logging.set_verbosity(tensorboard_logging.DEBUG)
     94     tensorboard_logging.debug("debug")
     95 
     96     self.assertLoggedMessagesAre([(event_pb2.LogMessage.ERROR, "error"),
     97                                   (event_pb2.LogMessage.DEBUGGING, "debug")])
     98     # All message should be logged because tensorboard_logging verbosity doesn't
     99     # affect logging verbosity.
    100     self.assertEqual(3, self.logged_message_count)
    101 
    102   def testBadVerbosity(self):
    103     with self.assertRaises(ValueError):
    104       tensorboard_logging.set_verbosity("failure")
    105 
    106     with self.assertRaises(ValueError):
    107       tensorboard_logging.log("bad", "dead")
    108 
    109   def testNoSummaryWriter(self):
    110     """Test that logging without a SummaryWriter succeeds."""
    111     tensorboard_logging.set_summary_writer(None)
    112     tensorboard_logging.warn("this should work")
    113     self.assertEqual(1, self.logged_message_count)
    114 
    115   def testSummaryWriterFailsAfterClear(self):
    116     tensorboard_logging._clear_summary_writer()
    117     with self.assertRaises(RuntimeError):
    118       tensorboard_logging.log(tensorboard_logging.ERROR, "failure")
    119 
    120 
    121 if __name__ == "__main__":
    122   test.main()
    123