9.3 KiB
9.3 KiB
đ Test Coverage Summary
VisĂŁo Geral dos Testers
Este documento resume a cobertura de testes para cada exercĂcio preparatĂłrio do Philosophers.
đ ExercĂcio 1: Thread Basics
Arquivo: test_1_thread_basics.sh
Testes Implementados:
- â Execução bĂĄsica com 1 mensagem
- â MĂșltiplas mensagens (5)
- â NĂșmero grande de mensagens (10)
- â Verificação de memory leaks (valgrind)
O que Ă© verificado:
- Thread 1 e Thread 2 criam mensagens corretas
- NĂșmero correto de mensagens por thread
- Threads fazem join corretamente
đ ExercĂcio 2: Mutex Basics
Arquivo: test_2_mutex_basics.sh
Testes Implementados:
- â Valor do contador (deve ser 4000)
- â Teste de consistĂȘncia (5 execuçÔes)
- â Tempo de execução reportado
- â Detecção de data races (thread sanitizer)
- â Memory leaks
O que Ă© verificado:
- Mutex protege corretamente a variĂĄvel compartilhada
- Resultado Ă© sempre 4000 (sem race conditions)
- Thread sanitizer nĂŁo detecta problemas
â±ïž ExercĂcio 3: Precise Timing
Arquivo: test_3_precise_timing.sh
Testes Implementados:
- â Programa executa com sucesso
- â PrecisĂŁo do sleep (~100ms ±5ms)
- â ConsistĂȘncia atravĂ©s de 5 execuçÔes
- â Formato do output
- â Memory leaks
O que Ă© verificado:
- Sleep preciso de 100ms
- Margem de erro aceitĂĄvel (95-105ms)
- FunçÔes de timing funcionam corretamente
đĄ ExercĂcio 4: State Monitor
Arquivo: test_4_state_monitor.sh
Testes Implementados:
- â Execução do programa
- â TransiçÔes de estado (WORKING, RESTING, THINKING)
- â Timestamps presentes
- â 3 workers identificados
- â Duração de estados verificada
- â Monitor thread funcionando
- â Memory leaks
- â Data races
O que Ă© verificado:
- 3 workers + 1 monitor
- Estados mudam corretamente
- Monitor detecta workers travados
đ ExercĂcio 5: Producer-Consumer
Arquivo: test_5_producer_consumer.sh
Testes Implementados:
- â Programa completa execução
- â Produtores funcionando
- â Consumidores funcionando
- â Items 1-100 produzidos
- â GestĂŁo de buffer
- â Sem duplicação de consumo
- â Data races
- â Memory leaks
O que Ă© verificado:
- 2 produtores + 2 consumidores
- Buffer de 10 items funciona
- Todos os 100 items sĂŁo processados
- Sem race conditions
đŽ ExercĂcio 6: Deadlock Demo
Arquivo: test_6_deadlock_demo.sh
Testes Implementados:
- â Modo deadlock (deve travar)
- â Modo solução (deve completar)
- â Output da solução
- â Ambas threads completam
- â ConsistĂȘncia da solução (5 runs)
- â Uso de mutex
- â Handling de argumentos invĂĄlidos
- â Memory leaks
O que Ă© verificado:
- Deadlock Ă© demonstrado no modo 0
- Solução funciona no modo 1
- Ordem consistente de locks previne deadlock
đŻ ExercĂcio 7: Limited Resources
Arquivo: test_7_limited_resources.sh
Testes Implementados:
- â Programa completa
- â 10 estudantes presentes
- â Mensagens de chegada
- â Obtenção de computadores
- â Mensagens de saĂda
- â Limite de 3 recursos simultĂąneos
- â Fairness (nenhum starved)
- â Data races
- â Memory leaks
O que Ă© verificado:
- SemĂĄforo implementado com mutex
- MĂĄximo 3 usuĂĄrios simultĂąneos
- Todos os 10 estudantes usam o recurso
đœïž ExercĂcio 8: Simple Philosophers
Arquivo: test_8_simple_philosophers.sh
Testes Implementados:
- â Duração do programa (~10s)
- â 3 filĂłsofos presentes
- â AçÔes de pensar
- â AçÔes de comer
- â Timestamps
- â Todos os filĂłsofos comem
- â Sem mortes
- â Data races
- â Sem deadlock (3 runs)
- â Memory leaks
O que Ă© verificado:
- 3 filĂłsofos, 3 garfos
- Ciclo thinking â eating funciona
- Ordem de garfos previne deadlock
- Programa roda ~10 segundos
â ïž ExercĂcio 9: Death Monitor
Arquivo: test_9_death_monitor.sh
Testes Implementados:
- â Execução do programa
- â 4 workers presentes
- â Atividade dos workers
- â Monitor thread
- â Detecção de morte
- â Timestamps
- â Tracking de last_activity
- â Data races
- â ConsistĂȘncia (3 runs)
- â Memory leaks
O que Ă© verificado:
- Monitor verifica a cada 100ms
- Detecta "morte" apĂłs 3s de inatividade
- Mutex protege last_activity_time
đ ExercĂcio 10: Philosophers Args (Completo)
Arquivo: test_10_philosophers_args.sh
Testes Implementados:
- â Caso bĂĄsico (5 800 200 200) - sem mortes
- â CenĂĄrio de morte (4 310 200 100)
- â Limite de refeiçÔes (5 800 200 200 7)
- â FilĂłsofo sozinho (deve morrer)
- â Argumentos invĂĄlidos
- â IDs de filĂłsofos vĂĄlidos
- â Timestamps crescentes
- â Timing de detecção de morte
- â Data races
- â NĂșmero Ămpar de filĂłsofos
- â Memory leaks
O que Ă© verificado:
- Parsing completo de argumentos
- Detecção de morte funciona
- Limite de refeiçÔes funciona
- Casos edge (1 philo, timing apertado)
- Timestamps sĂŁo monotĂŽnicos
đ ExercĂcio 11: Race Detector
Arquivo: test_11_race_detector.sh
Testes Implementados:
- â Execução bĂĄsica
- â MĂșltiplas iteraçÔes
- â RelatĂłrio de estatĂsticas
- â Diferentes estratĂ©gias
- â Helgrind check
- â NĂșmero Ămpar de filĂłsofos
- â Timing apertado
- â MĂ©tricas de performance
- â Thread sanitizer
- â Memory leaks
O que Ă© verificado:
- Testa 100 iteraçÔes
- Compara estratégias A, B, C
- Reporta races, deaths, performance
- Helgrind/DRD detectam problemas
đ ExercĂcio 12: Philosophers Bonus
Arquivo: test_12_philosophers_bonus.sh
Testes Implementados:
- â Caso bĂĄsico com processos
- â Usa fork() (nĂŁo threads)
- â Usa semĂĄforos POSIX
- â CenĂĄrio de morte
- â Limite de refeiçÔes
- â FilĂłsofo sozinho
- â Argumentos invĂĄlidos
- â Cleanup de processos (no zombies)
- â Cleanup de semĂĄforos
- â EstatĂsticas finais
- â Helgrind no processo pai
O que Ă© verificado:
- Usa processos (fork) em vez de threads
- SemĂĄforos POSIX (sem_open, sem_wait, sem_post)
- Cleanup correto (sem_unlink)
- Signal handling (SIGINT, SIGTERM)
- Sem processos zombie
đŻ EstatĂsticas Gerais
Total de Testes:
- ExercĂcio 1: 4 testes
- ExercĂcio 2: 5 testes
- ExercĂcio 3: 5 testes
- ExercĂcio 4: 8 testes
- ExercĂcio 5: 8 testes
- ExercĂcio 6: 8 testes
- ExercĂcio 7: 9 testes
- ExercĂcio 8: 10 testes
- ExercĂcio 9: 10 testes
- ExercĂcio 10: 11 testes
- ExercĂcio 11: 10 testes
- ExercĂcio 12: 11 testes
TOTAL: ~99 testes automatizados
Categorias de Testes:
- â Funcionalidade bĂĄsica: 12/12 exercĂcios
- â Memory leaks (valgrind): 12/12 exercĂcios
- â Data races (sanitizer): 10/12 exercĂcios
- â Edge cases: 10/12 exercĂcios
- â ConsistĂȘncia: 8/12 exercĂcios
- â Performance: 2/12 exercĂcios
Ferramentas Utilizadas:
gcc- Compilação e thread sanitizervalgrind- Memory leak detectionhelgrind- Data race detection (avançado)timeout- Detecção de deadlocks/hangsgrep/sed/awk- Parsing de outputps- Verificação de processos zombie
đ Conceitos-Chave Testados
Threading:
- pthread_create
- pthread_join
- pthread_detach
- Thread arguments
- Multiple threads
Synchronization:
- pthread_mutex_init/destroy
- pthread_mutex_lock/unlock
- Critical sections
- Race conditions
- Deadlock prevention
Timing:
- gettimeofday
- Precise sleep
- Timestamp generation
- Time difference calculation
Processes (Bonus):
- fork()
- waitpid()
- kill()
- Signal handling
- Process cleanup
Semaphores (Bonus):
- sem_open
- sem_wait/sem_post
- sem_close/sem_unlink
- Named semaphores
Philosophers-Specific:
- Circular resource allocation
- Death detection
- Meal counting
- State transitions
- Monitor pattern
- Fork ordering (deadlock prevention)
đ NĂveis de Dificuldade
Iniciante (ExercĂcios 1-3):
- Thread Basics â
- Mutex Basics â
- Precise Timing ââ
IntermediĂĄrio (ExercĂcios 4-7):
- State Monitor ââ
- Producer-Consumer âââ
- Deadlock Demo ââ
- Limited Resources âââ
Avançado (ExercĂcios 8-10):
- Simple Philosophers ââââ
- Death Monitor ââââ
- Philosophers Args âââââ
Expert (ExercĂcios 11-12):
- Race Detector âââââ
- Philosophers Bonus âââââ
âš PrĂłximos Passos
Depois de completar todos os exercĂcios:
-
Revise conceitos:
- Data races e como evitĂĄ-los
- Deadlock e estratégias de prevenção
- Timing preciso e monitoramento
-
Pratique casos edge:
- 1 filĂłsofo
- 2 filĂłsofos
- NĂșmeros grandes (200+ filĂłsofos)
- Timing muito apertado
-
Otimize:
- Minimize tempo dentro de locks
- Balance entre precisĂŁo e performance
- Evite busy waiting
-
Teste rigorosamente:
valgrind --tool=helgrind ./philo 4 410 200 200 valgrind --leak-check=full ./philo 5 800 200 200 7 -
Prepare para o projeto real:
- Norminette
- Makefile correto
- Error handling robusto
- CĂłdigo limpo e documentado
Boa sorte! đ