code: def test_epoch_over_updates(self, a):
      config = self._get_config(max_updates=2, max_epochs=0.04)
      trainer = get_mmf_trainer(config=config)
      max_updates = trainer._calculate_max_updates()
      self.assertEqual(max_updates, 4)
  
      self.check_values(trainer, 0, 0, 0)
      trainer.training_loop()
      self.check_values(trainer, 4, 1, 4)
  
imports: import unittest
  from unittest.mock import MagicMock, patch
  import torch
  from mmf.common.registry import registry
  from mmf.utils.general import get_batch_size
  from tests.test_utils import SimpleModel, SimpleNaNLossModel
  from tests.trainers.test_trainer_mocks import TrainerTrainingLoopMock
  from tests.trainers.test_utils import add_model, add_optimizer, get_config_with_defaults, get_mmf_trainer
label_desc: Use image node_id 8 for calling the TestTrainingLoop obj's underlying member method code with example usage: obj.test_epoch_over_updates(a) without return types