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.");
        }
Exemple #7
0
        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.");
        }
Exemple #8
0
        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.");
        }
Exemple #9
0
        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);
 }