2323import numpy as np
2424import tensorflow as tf
2525
26+ from google .protobuf import message
27+
2628from tensorboard import dataclass_compat
2729from tensorboard .backend .event_processing import event_file_loader
2830from tensorboard .compat .proto import event_pb2
3941from tensorboard .util import tensor_util
4042from tensorboard .util import test_util
4143
44+ try :
45+ # python version >= 3.3
46+ from unittest import mock
47+ except ImportError :
48+ import mock # pylint: disable=unused-import
49+
4250
4351class MigrateEventTest (tf .test .TestCase ):
4452 """Tests for `migrate_event`."""
@@ -254,14 +262,16 @@ def test_graph_def_experimental_filter_graph(self):
254262 self .assertProtoEquals (expected_graph_def , new_graph_def )
255263
256264 def test_graph_def_experimental_filter_graph_corrupt (self ):
257- # Simulate legacy graph event with an unparseable graph
265+ # Simulate legacy graph event with an unparseable graph.
266+ # We can't be sure whether this will produce `DecodeError` or
267+ # `RuntimeWarning`, so we also check both cases below.
258268 old_event = event_pb2 .Event ()
259269 old_event .step = 0
260270 old_event .wall_time = 456.75
261271 # Careful: some proto parsers choke on byte arrays filled with 0, but
262272 # others don't (silently producing an empty proto, I guess).
263273 # Thus `old_event.graph_def = bytes(1024)` is an unreliable example.
264- old_event .graph_def = b"bogus "
274+ old_event .graph_def = b"<malformed> "
265275
266276 new_events = self ._migrate_event (
267277 old_event , experimental_filter_graph = True
@@ -271,6 +281,50 @@ def test_graph_def_experimental_filter_graph_corrupt(self):
271281 self .assertLen (new_events , 1 )
272282 self .assertProtoEquals (new_events [0 ], old_event )
273283
284+ def test_graph_def_experimental_filter_graph_DecodeError (self ):
285+ # Simulate raising DecodeError when parsing a graph event
286+ old_event = event_pb2 .Event ()
287+ old_event .step = 0
288+ old_event .wall_time = 456.75
289+ old_event .graph_def = b"<malformed>"
290+
291+ with mock .patch (
292+ "tensorboard.compat.proto.graph_pb2.GraphDef"
293+ ) as mockGraphDef :
294+ instance = mockGraphDef .return_value
295+ instance .FromString .side_effect = message .DecodeError
296+
297+ new_events = self ._migrate_event (
298+ old_event , experimental_filter_graph = True
299+ )
300+
301+ # _migrate_event emits both the original event and the migrated event,
302+ # but here there is no migrated event becasue the graph was unparseable.
303+ self .assertLen (new_events , 1 )
304+ self .assertProtoEquals (new_events [0 ], old_event )
305+
306+ def test_graph_def_experimental_filter_graph_RuntimeWarning (self ):
307+ # Simulate raising RuntimeWarning when parsing a graph event
308+ old_event = event_pb2 .Event ()
309+ old_event .step = 0
310+ old_event .wall_time = 456.75
311+ old_event .graph_def = b"<malformed>"
312+
313+ with mock .patch (
314+ "tensorboard.compat.proto.graph_pb2.GraphDef"
315+ ) as mockGraphDef :
316+ instance = mockGraphDef .return_value
317+ instance .FromString .side_effect = RuntimeWarning
318+
319+ new_events = self ._migrate_event (
320+ old_event , experimental_filter_graph = True
321+ )
322+
323+ # _migrate_event emits both the original event and the migrated event,
324+ # but here there is no migrated event becasue the graph was unparseable.
325+ self .assertLen (new_events , 1 )
326+ self .assertProtoEquals (new_events [0 ], old_event )
327+
274328
275329if __name__ == "__main__" :
276330 tf .test .main ()
0 commit comments