Esempio n. 1
0
class Simulador():
  
  def __init__(self, geradorDeChegadasDeEntidades,
                     geradorDeTempoEntreFalhasServidorUm,
                     geradorDeTempoEntreFalhasServidorDois,
                     geradorDeTempoDeFalhaServidorUm,
                     geradorDeTempoDeFalhaServidorDois,
                     geradorDeTempoDeServicoServidorUm, 
                     geradorDeTempoDeServicoServidorDois,
                     filaDoServidorUm,
                     filaDoServidorDois, 
                     loglist):
    
    init_sistema.iniciarContadores(self)
    init_sistema.iniciarCalculadoresDeMedia(self)
    init_sistema.iniciarSomadoresDeTempoTotal(self)
    init_sistema.iniciarComponentesDosServidores(self, filaDoServidorUm, filaDoServidorDois)
    self._relogio = Relogio()   
    self._listaDeEventosFuturos = ListaDeEventosFuturos()
    self._historicoDeChegadaDeEntidades = []
    self._historicoDeSaidaDeEntidades = []
    self._tempoRestanteDeSimulacao = 0

    self._geradorDeChegadasDeEntidades = geradorDeChegadasDeEntidades
    self._geradorDeTempoEntreFalhasServidorUm = geradorDeTempoEntreFalhasServidorUm
    self._geradorDeTempoEntreFalhasServidorDois = geradorDeTempoEntreFalhasServidorDois
    
    self._geradorDeTempoDeServicoServidorUm = geradorDeTempoDeServicoServidorUm
    self._geradorDeTempoDeServicoServidorDois = geradorDeTempoDeServicoServidorDois
    
    self._geradorDeTempoDeFalhaServidorUm   = geradorDeTempoDeFalhaServidorUm
    self._geradorDeTempoDeFalhaServidorDois = geradorDeTempoDeFalhaServidorDois
    self._loglist = loglist
    self._simulacaoAcabou = True
    self._tempoTotalDeSimulacao = 0
    
  def iniciarSimulacao(self, tempoTotalDeSimulacao):
    listaDeChegadas = self._geradorDeChegadasDeEntidades.obterListaDeChegadasDasEntidades(tempoTotalDeSimulacao, 0)
    self._simulacaoAcabou = False
    
    while (listaDeChegadas.possuiEvento()):
      evento = listaDeChegadas.obterProximoEvento()
      self._listaDeEventosFuturos.adcionarEvento(evento)
    
    self._tempoRestanteDeSimulacao += tempoTotalDeSimulacao
    self._tempoTotalDeSimulacao += tempoTotalDeSimulacao
    self.simulaUmPasso()
      
  def simulaUmPasso(self):
    if(self._simulacaoAcabou):
      return False
    
    proximoEvento = self._listaDeEventosFuturos.obterProximoEvento()    
    avancoDeTempo = 0
    
    if(proximoEvento != None):
      if(proximoEvento.obterTempoQueOcorre() > self._relogio.obterEmMinutos()):
        avancoDeTempo = proximoEvento.obterTempoQueOcorre() - self._relogio.obterEmMinutos()
    
    
    checa_servidores.checarSeServidorUmEntraEmFalha(self, avancoDeTempo)
    checa_servidores.checarSeServidorDoisEntraEmFalha(self, avancoDeTempo)
    checa_servidores.checarSeAlgumServidorSaiDaFalha(self, avancoDeTempo)
 
    checa_servidores.checarSeServidorUmTerminouOServico(self, avancoDeTempo)
    checa_servidores.checarSeServidorDoisTerminouOServico(self, avancoDeTempo)
    
    if(proximoEvento != None):
      if(proximoEvento.obterTipo() == TipoDoEvento.ENTRADA):
        self._historicoDeChegadaDeEntidades.append(proximoEvento)
        trata_eventos.tratarEventoDeEntrada(self, proximoEvento)
    
      elif(proximoEvento.obterTipo() == TipoDoEvento.SAIDA):
        trata_eventos.tratarEventoDeSaida(self, proximoEvento)
      
      elif(proximoEvento.obterTipo() == TipoDoEvento.FIM_DA_SIMULACAO):
        self._relogio.adiantarMinutos(avancoDeTempo)
        self._loglist.append(self._obterTempoFormatado() + 'Simulacao terminou.')
        self._simulacaoAcabou = True
        
      
    self._relogio.adiantarMinutos(avancoDeTempo)
    if(proximoEvento == None):
      self._tempoRestanteDeSimulacao -= 1
    
    self._tempoRestanteDeSimulacao -= avancoDeTempo
    if(self._tempoRestanteDeSimulacao < 0):
      self._listaDeEventosFuturos.adcionarEvento(Evento(TipoDoEvento.FIM_DA_SIMULACAO, self._relogio.obterEmMinutos()))  
    
    self._amostrasEntidadesEsperandoNaFilaUm.append(self._filaDoServidorUm.obterQuantasEntidadesPossui())
    self._amostrasEntidadesEsperandoNaFilaDois.append(self._filaDoServidorDois.obterQuantasEntidadesPossui())
    
    return True
     
     
  def _obterTempoFormatado(self):
    return 'Tempo no relogio: '+ str(self._relogio.obterEmMinutos()) + ' min '
  
  def gerarRelatorioDaSimulacao(self, nomeDoArquivoDoRelatorio):
    relatorio_sistema.gerarRelatorio(self, nomeDoArquivoDoRelatorio)

  def gerarRelatorioParcialDaSimulacao(self, nomeDoArquivoDoRelatorio):
    relatorio_sistema.gerarRelatorioParcial(self, nomeDoArquivoDoRelatorio)
class TesteListaDeEventosFuturos(unittest.TestCase):
    def setUp(self):
        self.listaVazia = ListaDeEventosFuturos()
        self.eventoNoTempoCinco = Evento(TipoDoEvento.SAIDA, 5)
        self.eventoNoTempoDez = Evento(TipoDoEvento.ENTRADA, 10)
        self.eventoNoTempoQuinze = Evento(TipoDoEvento.SAIDA, 15)
        self.eventoNoTempoVinte = Evento(TipoDoEvento.ENTRADA, 20)

    def testSabeQualEventoOcorrePrimeiroIndependenteDaOrdemQueOsEventosSaoInseridos(self):
        self.listaVazia.adcionarEvento(self.eventoNoTempoQuinze)
        self.listaVazia.adcionarEvento(self.eventoNoTempoDez)
        self.listaVazia.adcionarEvento(self.eventoNoTempoCinco)
        self.listaVazia.adcionarEvento(self.eventoNoTempoVinte)

        self.assertEqual(self.eventoNoTempoCinco, self.listaVazia.obterProximoEvento())
        self.assertEqual(self.eventoNoTempoDez, self.listaVazia.obterProximoEvento())
        self.assertEqual(self.eventoNoTempoQuinze, self.listaVazia.obterProximoEvento())
        self.assertEqual(self.eventoNoTempoVinte, self.listaVazia.obterProximoEvento())

    def testSabeQualEventoOcorrePrimeiroIndependenteDeQuandoOsEventosSaoInseridos(self):
        self.listaVazia.adcionarEvento(self.eventoNoTempoQuinze)
        self.listaVazia.adcionarEvento(self.eventoNoTempoDez)

        self.assertEqual(self.eventoNoTempoDez, self.listaVazia.obterProximoEvento())

        self.listaVazia.adcionarEvento(self.eventoNoTempoVinte)
        self.listaVazia.adcionarEvento(self.eventoNoTempoCinco)

        self.assertEqual(self.eventoNoTempoCinco, self.listaVazia.obterProximoEvento())
        self.assertEqual(self.eventoNoTempoQuinze, self.listaVazia.obterProximoEvento())
        self.assertEqual(self.eventoNoTempoVinte, self.listaVazia.obterProximoEvento())

    def testSabeSePossuiEventos(self):
        self.listaVazia.adcionarEvento(self.eventoNoTempoQuinze)
        self.assertTrue(self.listaVazia.possuiEvento())

    def testSabeSeNaoPossuiEventos(self):
        self.assertFalse(self.listaVazia.possuiEvento())

    def testAposPossuirEventosSabeQuandoNaoPossuiMaisEventos(self):
        self.listaVazia.adcionarEvento(self.eventoNoTempoQuinze)
        self.listaVazia.adcionarEvento(self.eventoNoTempoCinco)
        self.assertTrue(self.listaVazia.possuiEvento())
        self.listaVazia.obterProximoEvento()
        self.listaVazia.obterProximoEvento()
        self.assertFalse(self.listaVazia.possuiEvento())

    def testSeNaoPossuiEventosRetornaNone(self):
        self.assertEqual(None, self.listaVazia.obterProximoEvento())

    def testSabeQuantosEventosAindaIraoOcorrer(self):
        self.listaVazia.adcionarEvento(self.eventoNoTempoQuinze)
        self.listaVazia.adcionarEvento(self.eventoNoTempoCinco)

        self.assertEqual(2, self.listaVazia.obterQuantosEventosRestam())
        self.listaVazia.obterProximoEvento()
        self.assertEqual(1, self.listaVazia.obterQuantosEventosRestam())
        self.listaVazia.obterProximoEvento()
        self.assertEqual(0, self.listaVazia.obterQuantosEventosRestam())

    def testSomenteEventosPodemSerInseridos(self):
        self.listaVazia.adcionarEvento(777)
        self.listaVazia.adcionarEvento("Nao sou um evento")

        self.assertEqual(0, self.listaVazia.obterQuantosEventosRestam())
        self.assertEqual(None, self.listaVazia.obterProximoEvento())