public void RnValidarIntervalosPorSemaforoQuandoUmIntervaloDe8a22AfetarUmIntervaloExistentede10a20Test() { SemaforoPorIntervalo semaforoPorIntervalo = new SemaforoPorIntervalo(10, 20); List <SemaforoPorIntervalo> semaforosImpactadosExistentes = new List <SemaforoPorIntervalo>(); List <SemaforoPorIntervalo> semaforosImpactadosNovos = new List <SemaforoPorIntervalo>(); SemaforoPorIntervalo.VerificarSemaforosImpactados(ref semaforosImpactadosExistentes, ref semaforosImpactadosNovos, ref semaforosImpactadosExistentes, semaforoPorIntervalo, 8, 22); SemaforoPorIntervalo semaforo9a10 = semaforosImpactadosExistentes.FirstOrDefault(o => o.inicio == 8 && o.final == 9); SemaforoPorIntervalo semaforo21a22 = semaforosImpactadosExistentes.FirstOrDefault(o => o.inicio == 21 && o.final == 22); SemaforoPorIntervalo semaforo10a20 = semaforosImpactadosExistentes.FirstOrDefault(o => o.inicio == 10 && o.final == 20); Assert.AreEqual(3, semaforosImpactadosExistentes.Count, "Deveria ter 3 semáforos, pois deve criar 3 intervalos diferentes para serem esperarados."); Assert.IsNotNull(semaforo9a10, "Deveria ter criado um semáforo."); Assert.AreEqual(8, semaforo9a10.inicio, "O semáforo deveria ter como início do intervalo o valor 8."); Assert.AreEqual(9, semaforo9a10.final, "O semáforo deveria ter como início do intervalo o valor 10."); Assert.IsNotNull(semaforo21a22, "Deveria ter criado um semáforo."); Assert.AreEqual(21, semaforo21a22.inicio, "O semáforo deveria ter como início do intervalo o valor 20."); Assert.AreEqual(22, semaforo21a22.final, "O semáforo deveria ter como início do intervalo o valor 22."); Assert.IsNotNull(semaforo10a20, "Deveria ter criado um semáforo."); Assert.AreEqual(10, semaforo10a20.inicio, "O semáforo deveria ter como início do intervalo o valor 10."); Assert.AreEqual(20, semaforo10a20.final, "O semáforo deveria ter como início do intervalo o valor 20."); }
public void RnValidarIntervalosPorSemaforoQuandoUmIntervaloDe10a15AfetarUmIntervaloExistenteDe10a20Test() { SemaforoPorIntervalo semaforoPorIntervalo = new SemaforoPorIntervalo(10, 20); List <SemaforoPorIntervalo> semaforosImpactadosExistentes = new List <SemaforoPorIntervalo>(); List <SemaforoPorIntervalo> semaforosImpactadosNovos = new List <SemaforoPorIntervalo>(); SemaforoPorIntervalo.VerificarSemaforosImpactados(ref semaforosImpactadosExistentes, ref semaforosImpactadosNovos, ref semaforosImpactadosExistentes, semaforoPorIntervalo, 10, 15); SemaforoPorIntervalo semaforo10a20 = semaforosImpactadosExistentes.FirstOrDefault(o => o.inicio == 10 && o.final == 20); Assert.AreEqual(1, semaforosImpactadosExistentes.Count, "Deveria ter 1 semáforo, pois deve reaproveitar o que já existia."); Assert.IsNotNull(semaforo10a20, "Deveria ter criado um semáforo."); Assert.AreEqual(10, semaforo10a20.inicio, "O semáforo deveria ter como início do intervalo o valor 10."); Assert.AreEqual(20, semaforo10a20.final, "O semáforo deveria ter como início do intervalo o valor 20."); }
public void RnGeraIntervaloQuandoIntervalo1a10Test() { short inicio = 1; short final = 10; List <short> intervalo = new List <short> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; List <short> novoIntervalo = SemaforoPorIntervalo.CriarIntervalo(inicio, final); Assert.AreEqual(intervalo.Count, novoIntervalo.Count); Assert.AreEqual(0, intervalo.Except(novoIntervalo).Count()); IEnumerable <short> intervaloIntersect = intervalo.Intersect(novoIntervalo); Assert.AreEqual(10, intervaloIntersect.Count()); }
public void RnValidarIntervalosPorSemaforoQuandoUmIntervaloDe5a8UmDe1a5UmDe6a10AfetarUmIntervaloExistenteDe10a20Test() { SemaforoPorIntervalo semaforoPorIntervalo10a20 = new SemaforoPorIntervalo(10, 20); SemaforoPorIntervalo semaforoPorIntervalo5a8 = new SemaforoPorIntervalo(5, 8); SemaforoPorIntervalo semaforoPorIntervalo1a4 = new SemaforoPorIntervalo(1, 4); List <SemaforoPorIntervalo> semaforosImpactadosExistentes = new List <SemaforoPorIntervalo>(); List <SemaforoPorIntervalo> semaforosImpactadosParaAguardar = new List <SemaforoPorIntervalo>(); List <SemaforoPorIntervalo> semaforosImpactadosNovos = new List <SemaforoPorIntervalo>(); semaforosImpactadosExistentes.Add(semaforoPorIntervalo10a20); semaforosImpactadosExistentes.Add(semaforoPorIntervalo5a8); semaforosImpactadosExistentes.Add(semaforoPorIntervalo1a4); for (int i = 0; i < semaforosImpactadosExistentes.Count; i++) { SemaforoPorIntervalo.VerificarSemaforosImpactados(ref semaforosImpactadosParaAguardar, ref semaforosImpactadosNovos, ref semaforosImpactadosExistentes, semaforosImpactadosExistentes[i], 6, 10); } Assert.AreEqual(4, semaforosImpactadosExistentes.Count, "Deveria existir 4 semáforos."); }
public void RnValidarIntervalosPorSemaforoQuandoUmIntervaloDe20a25AfetarUmIntervaloExistenteDe10a20Test() { SemaforoPorIntervalo semaforoPorIntervalo = new SemaforoPorIntervalo(10, 20); List <SemaforoPorIntervalo> semaforosImpactadosParaAguardar = new List <SemaforoPorIntervalo>(); List <SemaforoPorIntervalo> semaforosImpactadosNovos = new List <SemaforoPorIntervalo>(); SemaforoPorIntervalo.VerificarSemaforosImpactados(ref semaforosImpactadosParaAguardar, ref semaforosImpactadosNovos, ref semaforosImpactadosParaAguardar, semaforoPorIntervalo, 20, 25); SemaforoPorIntervalo semaforo10a20 = semaforosImpactadosParaAguardar.FirstOrDefault(o => o.inicio == 10 && o.final == 20); SemaforoPorIntervalo semaforo20a25 = semaforosImpactadosParaAguardar.FirstOrDefault(o => o.inicio == 21 && o.final == 25); Assert.AreEqual(2, semaforosImpactadosParaAguardar.Count, "Deveria ter 2 semáforo, pois deve reaproveitar o que já existia e um novo semáforo com intervalo de 20 a 25."); Assert.IsNotNull(semaforo10a20, "Deveria ter criado um semáforo."); Assert.AreEqual(10, semaforo10a20.inicio, "O semáforo deveria ter como início do intervalo o valor 10."); Assert.AreEqual(20, semaforo10a20.final, "O semáforo deveria ter como início do intervalo o valor 20."); Assert.IsNotNull(semaforo20a25, "Deveria ter criado um semáforo."); Assert.AreEqual(21, semaforo20a25.inicio, "O semáforo deveria ter como início do intervalo o valor 10."); Assert.AreEqual(25, semaforo20a25.final, "O semáforo deveria ter como início do intervalo o valor 20."); }
public void OrdenarSemaforosTest() { List <SemaforoPorIntervalo> semaforosNovos = new List <SemaforoPorIntervalo>(); List <SemaforoPorIntervalo> semaforosParaAguardar = new List <SemaforoPorIntervalo>(); SemaforoPorIntervalo semaforo1 = new SemaforoPorIntervalo(1, 5); SemaforoPorIntervalo semaforo2 = new SemaforoPorIntervalo(6, 10); SemaforoPorIntervalo semaforo3 = new SemaforoPorIntervalo(11, 15); SemaforoPorIntervalo semaforo4 = new SemaforoPorIntervalo(16, 20); SemaforoPorIntervalo semaforo5 = new SemaforoPorIntervalo(20, 25); semaforosNovos.Add(semaforo2); semaforosNovos.Add(semaforo4); semaforosNovos.Add(semaforo1); semaforosParaAguardar.Add(semaforo3); semaforosParaAguardar.Add(semaforo5); List <SemaforoPorIntervalo> semaforosOrdenados = SemaforoPorIntervalo.OrdenarSemaforos(semaforosParaAguardar, semaforosNovos); Assert.IsNotNull(semaforosOrdenados, "Deveria conter os semáforos ordenados."); Assert.AreEqual(semaforo1, semaforosOrdenados[0], "Deveria ser o 1 semáforo."); Assert.AreEqual(semaforo5, semaforosOrdenados[4], "Deveria ser o 5 semáforo."); }
public void ConsultarSemaforosImpactadosPorCronogramaQuandoExistiremVariosConflitantesTest() { #region contexto //semáforo já existente SemaforoPorIntervalo semaforoIntervalo1 = new SemaforoPorIntervalo(10, 20); //semáforo já existente no cronograma SemaforoSingleton.SemaforosControle semaforoPorCronogramaC1 = new SemaforoSingleton.SemaforosControle() { lockerSemaforos = new ReaderWriterLockSlim(), semaforos = new List <SemaforoPorIntervalo>() }; semaforoPorCronogramaC1.semaforos.Add(semaforoIntervalo1); //mockando o método que realiza a liberação de um semáforo. Mock <SemaforoSingletonMock> mockSemaforo = new Mock <SemaforoSingletonMock>() { CallBase = true }; SemaforoSingletonMock.SetInstancia(mockSemaforo.Object); SemaforoSingletonMock.cronogramaSemaforosMock.Clear(); SemaforoSingleton.semaforosPorCronograma.Add(cronogramas[0].Oid, semaforoPorCronogramaC1); cronogramaIntervalo cronoIntervalo1 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 5, final = 8, tempoDeEspera = 0 }; cronogramaIntervalo cronoIntervalo2 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 1, final = 5, tempoDeEspera = 6000 }; cronogramaIntervalo cronoIntervalo3 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 6, final = 10, tempoDeEspera = 8000 }; cronogramaIntervalo cronoIntervalo4 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 2, final = 5, tempoDeEspera = 1000 }; cronogramaIntervalo cronoIntervalo5 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 2, final = 4, tempoDeEspera = 2000 }; cronogramaIntervalo cronoIntervalo6 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 1, final = 6, tempoDeEspera = 3000 }; Thread thread1 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Highest, Name = "Thread 1", }; Thread thread2 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Normal, Name = "Thread 2" }; Thread thread3 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Normal, Name = "Thread 3" }; Thread thread4 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Normal, Name = "Thread 4" }; Thread thread5 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Normal, Name = "Thread 5" }; Thread thread6 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Normal, Name = "Thread 6" }; #endregion thread1.Start(cronoIntervalo1); thread2.Start(cronoIntervalo2); thread3.Start(cronoIntervalo3); thread4.Start(cronoIntervalo4); thread5.Start(cronoIntervalo5); thread6.Start(cronoIntervalo6); ControleDeEsperaUtil.AguardarAte(() => { return(thread1.ThreadState == System.Threading.ThreadState.Stopped && thread2.ThreadState == System.Threading.ThreadState.Stopped && thread3.ThreadState == System.Threading.ThreadState.Stopped && thread4.ThreadState == System.Threading.ThreadState.Stopped && thread5.ThreadState == System.Threading.ThreadState.Stopped && thread6.ThreadState == System.Threading.ThreadState.Stopped); }, 180); Assert.AreEqual(System.Threading.ThreadState.Stopped, thread1.ThreadState, "A thread deveria estar com o processo finalizado, pois não depende de nenhuma outra, ou seja, não impacta nenhuma outra."); Assert.AreEqual(System.Threading.ThreadState.Stopped, thread2.ThreadState, "A thread deveria estar com o processo finalizado, pois não depende de nenhuma outra, ou seja, não impacta nenhuma outra."); Assert.AreEqual(1, SemaforoSingleton.semaforosPorCronograma.Count, "Deveria existir um índice no dicionário de cronograma, pois 2 threads de cronogramas iguais efetuaram o processo."); Assert.AreEqual(5, SemaforoSingleton.semaforosPorCronograma[cronogramas[0].Oid].semaforos.Count, "Deveria existir uma lista contendo 3 semáforos criados."); }
public void ConsultarSemaforosImpactadosPorCronogramaQuandoIntervaloAbrangerOutrosIntervalosTest() { //semáforo já existente SemaforoPorIntervalo semaforoIntervalo1 = new SemaforoPorIntervalo(10, 20); //semáforo já existente no cronograma SemaforoSingleton.SemaforosControle semaforoPorCronogramaC1 = new SemaforoSingleton.SemaforosControle() { lockerSemaforos = new ReaderWriterLockSlim(), semaforos = new List <SemaforoPorIntervalo>() }; semaforoPorCronogramaC1.semaforos.Add(semaforoIntervalo1); //mockando o método que realiza a liberação de um semáforo. Mock <SemaforoSingletonMock> mockSemaforo = new Mock <SemaforoSingletonMock>() { CallBase = true }; SemaforoSingletonMock.SetInstancia(mockSemaforo.Object); SemaforoSingletonMock.cronogramaSemaforosMock.Clear(); SemaforoSingleton.semaforosPorCronograma.Add(cronogramas[0].Oid, semaforoPorCronogramaC1); cronogramaIntervalo cronoIntervalo1 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 5, final = 15, tempoDeEspera = 0 }; cronogramaIntervalo cronoIntervalo2 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 8, final = 22, tempoDeEspera = 5000 }; Thread thread1 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Highest, Name = "Thread 1", }; Thread thread2 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Normal, Name = "Thread 2" }; thread1.Start(cronoIntervalo1); thread2.Start(cronoIntervalo2); ControleDeEsperaUtil.AguardarAte(() => { return(thread1.ThreadState == System.Threading.ThreadState.Stopped && thread2.ThreadState == System.Threading.ThreadState.Stopped); }, 60); Assert.AreEqual(System.Threading.ThreadState.Stopped, thread1.ThreadState, "A thread deveria estar com o processo finalizado, pois não depende de nenhuma outra, ou seja, não impacta nenhuma outra."); Assert.AreEqual(System.Threading.ThreadState.Stopped, thread2.ThreadState, "A thread deveria estar com o processo finalizado, pois não depende de nenhuma outra, ou seja, não impacta nenhuma outra."); Assert.AreEqual(1, SemaforoSingleton.semaforosPorCronograma.Count, "Deveria existir um índice no dicionário de cronograma, pois 2 threads de cronogramas iguais efetuaram o processo."); Assert.AreEqual(3, SemaforoSingleton.semaforosPorCronograma[cronogramas[0].Oid].semaforos.Count, "Deveria existir uma lista contendo 3 semáforos criados."); List <SemaforoPorIntervalo> semaforosCriados = SemaforoSingleton.semaforosPorCronograma[cronogramas[0].Oid].semaforos; Assert.IsNotNull(semaforosCriados.Where(o => o.inicio == semaforoIntervalo1.inicio && o.final == semaforoIntervalo1.final), "Deveria existir o semáforo, pois já estava criado."); Assert.IsNotNull(semaforosCriados.Where(o => o.inicio == 5 && o.final == 9), "Deveria existir o semáforo, pois a thread 1 criou."); Assert.IsNotNull(semaforosCriados.Where(o => o.inicio == 21 && o.final == 22), "Deveria existir o semáforo, pois a thread 2 criou."); }
public void ConsultarSemaforosImpactadosPorCronogramaQuandoThreadsAcessaremSimultanementeDeCronogramasDiferentesTest() { SemaforoPorIntervalo semaforoIntervalo1 = new SemaforoPorIntervalo(80, 100); SemaforoPorIntervalo semaforoIntervalo2 = new SemaforoPorIntervalo(80, 100); SemaforoSingleton.SemaforosControle semaforoPorCronogramaC1 = new SemaforoSingleton.SemaforosControle() { lockerSemaforos = new ReaderWriterLockSlim(), semaforos = new List <SemaforoPorIntervalo>() }; SemaforoSingleton.SemaforosControle semaforoPorCronogramaC2 = new SemaforoSingleton.SemaforosControle() { lockerSemaforos = new ReaderWriterLockSlim(), semaforos = new List <SemaforoPorIntervalo>() }; semaforoPorCronogramaC1.semaforos.Add(semaforoIntervalo1); semaforoPorCronogramaC2.semaforos.Add(semaforoIntervalo2); //mockando o método que realiza a liberação de um semáforo. Mock <SemaforoSingletonMock> mockSemaforo = new Mock <SemaforoSingletonMock>() { CallBase = true }; mockSemaforo.Setup(o => o.LiberarEscritaSemaforos(It.IsAny <Guid>())); SemaforoSingletonMock.SetInstancia(mockSemaforo.Object); SemaforoSingletonMock.cronogramaSemaforosMock.Clear(); SemaforoSingleton.semaforosPorCronograma.Add(cronogramas[1].Oid, semaforoPorCronogramaC2); SemaforoSingleton.semaforosPorCronograma.Add(cronogramas[0].Oid, semaforoPorCronogramaC1); cronogramaIntervalo cronoIntervalo1 = new cronogramaIntervalo() { oidCronograma = cronogramas[0].Oid, inicio = 5, final = 10, tempoDeEspera = 0 }; cronogramaIntervalo cronoIntervalo2 = new cronogramaIntervalo() { oidCronograma = cronogramas[1].Oid, inicio = 8, final = 15, tempoDeEspera = 0 }; Thread thread1 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Highest, Name = "Thread 1", }; Thread thread2 = new Thread(AcionarConsultaSemaforosImpactadosPorCronograma) { Priority = ThreadPriority.Normal, Name = "Thread 2" }; thread1.Start(cronoIntervalo1); thread2.Start(cronoIntervalo2); ControleDeEsperaUtil.AguardarAte(() => { return(thread1.ThreadState == System.Threading.ThreadState.Stopped && thread2.ThreadState == System.Threading.ThreadState.Stopped); }, 60); Assert.AreEqual(System.Threading.ThreadState.Stopped, thread1.ThreadState, "A thread deveria estar com o processo finalizado, pois não depende de nenhuma outra, ou seja, não impacta nenhuma outra."); Assert.AreEqual(System.Threading.ThreadState.Stopped, thread2.ThreadState, "A thread deveria estar com o processo finalizado, pois não depende de nenhuma outra, ou seja, não impacta nenhuma outra."); Assert.AreEqual(2, SemaforoSingleton.semaforosPorCronograma.Count, "Deveria existir dois índices no dicionário de cronograma, pois 2 threads de cronogramas diferentes efetuaram o processo."); Assert.AreEqual(2, SemaforoSingleton.semaforosPorCronograma[cronogramas[0].Oid].semaforos.Count, "Deveria existir uma lista contendo 2 semáforos criados."); Assert.AreEqual(2, SemaforoSingleton.semaforosPorCronograma[cronogramas[1].Oid].semaforos.Count, "Deveria existir uma lista contendo 2 semáforos criados."); }
/// <summary> /// MOCK /// Método responsável por liberar recursos do semáforo criado que não possua mais ninguém em espera. /// </summary> /// <param name="semaforoIntervalo">Objeto SemaforoPorIntevalo</param> public static void DestruirSemaforo(SemaforoPorIntervalo semaforoPorIntervalo) { SemaforoPorIntervalo.DestruirSemaforo(semaforoPorIntervalo); }