import unittest import cityflow import time class TestArchive(unittest.TestCase): config_file = "./examples/config.json" period = 100 @staticmethod def run_steps(engine, steps): for i in range(steps): engine.next_step() def run_and_check(self, engine, record): self.run_steps(engine, self.period) new_record = self.get_record(engine) self.assertEqual(new_record, record) @staticmethod def get_record(engine): return engine.get_lane_vehicle_count(), engine.get_average_travel_time() def test_save_and_load(self): """Single save and single load with single threading engine""" engine = cityflow.Engine(config_file=self.config_file, thread_num=1) self.run_steps(engine, self.period) start_time = time.time() archive = engine.snapshot() save_time = time.time() - start_time self.run_steps(engine, self.period) record0 = self.get_record(engine) start_time = time.time() engine.load(archive) load_time = time.time() - start_time self.run_and_check(engine, record0) del engine print("\nsave: %.4fs load: %.4fs" % (save_time, load_time)) def test_save_and_load_multithread(self): """Single save and single load with multi-threading engine""" engine = cityflow.Engine(config_file=self.config_file, thread_num=4) self.run_steps(engine, self.period) archive = engine.snapshot() self.run_steps(engine, self.period) record0 = self.get_record(engine) engine.load(archive) self.run_and_check(engine, record0) del engine def test_save_and_multi_load(self): """Multiple saves and multiple loads with multi-threading engine""" engine = cityflow.Engine(config_file=self.config_file, thread_num=4) self.run_steps(engine, self.period) archive = engine.snapshot() self.run_steps(engine, self.period) record0 = self.get_record(engine) repeats = 2 for i in range(repeats): engine.load(archive) self.run_and_check(engine, record0) del engine def test_multi_save_and_multi_load(self): """ Multiple save and multiple loads with multi-threading engine") """ engine = cityflow.Engine(config_file=self.config_file, thread_num=4) archives, records = [], [] repeats = 5 for i in range(repeats + 1): archives.append(engine.snapshot()) records.append(self.get_record(engine)) self.run_steps(engine, self.period) for i in range(repeats): for j in range(repeats): engine.load(archives[j]) self.run_and_check(engine, records[j + 1]) del engine def test_save_to_file(self): """ Disk IO test """ engine = cityflow.Engine(config_file=self.config_file, thread_num=4) self.run_steps(engine, self.period) engine.snapshot().dump("save.json") self.run_steps(engine, self.period) record = self.get_record(engine) engine.load_from_file("save.json") self.run_and_check(engine, record) del engine def test_multi_save_to_file(self): """ Disk IO test 2""" engine = cityflow.Engine(config_file=self.config_file, thread_num=4) for i in range(2): self.run_steps(engine, self.period) engine.snapshot().dump("save.json") self.run_steps(engine, self.period) record = self.get_record(engine) for j in range(2): engine.load_from_file("save.json") self.run_and_check(engine, record) del engine if __name__ == '__main__': unittest.main(verbosity=2)