409 lines
9.3 KiB
Markdown
409 lines
9.3 KiB
Markdown
# đ 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:
|
|
1. â
Execução båsica com 1 mensagem
|
|
2. â
MĂșltiplas mensagens (5)
|
|
3. â
NĂșmero grande de mensagens (10)
|
|
4. â
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:
|
|
1. â
Valor do contador (deve ser 4000)
|
|
2. â
Teste de consistĂȘncia (5 execuçÔes)
|
|
3. â
Tempo de execução reportado
|
|
4. â
Detecção de data races (thread sanitizer)
|
|
5. â
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:
|
|
1. â
Programa executa com sucesso
|
|
2. â
Precisão do sleep (~100ms ±5ms)
|
|
3. â
ConsistĂȘncia atravĂ©s de 5 execuçÔes
|
|
4. â
Formato do output
|
|
5. â
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:
|
|
1. â
Execução do programa
|
|
2. â
TransiçÔes de estado (WORKING, RESTING, THINKING)
|
|
3. â
Timestamps presentes
|
|
4. â
3 workers identificados
|
|
5. â
Duração de estados verificada
|
|
6. â
Monitor thread funcionando
|
|
7. â
Memory leaks
|
|
8. â
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:
|
|
1. â
Programa completa execução
|
|
2. â
Produtores funcionando
|
|
3. â
Consumidores funcionando
|
|
4. â
Items 1-100 produzidos
|
|
5. â
GestĂŁo de buffer
|
|
6. â
Sem duplicação de consumo
|
|
7. â
Data races
|
|
8. â
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:
|
|
1. â
Modo deadlock (deve travar)
|
|
2. â
Modo solução (deve completar)
|
|
3. â
Output da solução
|
|
4. â
Ambas threads completam
|
|
5. â
ConsistĂȘncia da solução (5 runs)
|
|
6. â
Uso de mutex
|
|
7. â
Handling de argumentos invĂĄlidos
|
|
8. â
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:
|
|
1. â
Programa completa
|
|
2. â
10 estudantes presentes
|
|
3. â
Mensagens de chegada
|
|
4. â
Obtenção de computadores
|
|
5. â
Mensagens de saĂda
|
|
6. â
Limite de 3 recursos simultĂąneos
|
|
7. â
Fairness (nenhum starved)
|
|
8. â
Data races
|
|
9. â
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:
|
|
1. â
Duração do programa (~10s)
|
|
2. â
3 filĂłsofos presentes
|
|
3. â
AçÔes de pensar
|
|
4. â
AçÔes de comer
|
|
5. â
Timestamps
|
|
6. â
Todos os filĂłsofos comem
|
|
7. â
Sem mortes
|
|
8. â
Data races
|
|
9. â
Sem deadlock (3 runs)
|
|
10. â
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:
|
|
1. â
Execução do programa
|
|
2. â
4 workers presentes
|
|
3. â
Atividade dos workers
|
|
4. â
Monitor thread
|
|
5. â
Detecção de morte
|
|
6. â
Timestamps
|
|
7. â
Tracking de last_activity
|
|
8. â
Data races
|
|
9. â
ConsistĂȘncia (3 runs)
|
|
10. â
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:
|
|
1. â
Caso bĂĄsico (5 800 200 200) - sem mortes
|
|
2. â
CenĂĄrio de morte (4 310 200 100)
|
|
3. â
Limite de refeiçÔes (5 800 200 200 7)
|
|
4. â
FilĂłsofo sozinho (deve morrer)
|
|
5. â
Argumentos invĂĄlidos
|
|
6. â
IDs de filĂłsofos vĂĄlidos
|
|
7. â
Timestamps crescentes
|
|
8. â
Timing de detecção de morte
|
|
9. â
Data races
|
|
10. â
NĂșmero Ămpar de filĂłsofos
|
|
11. â
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:
|
|
1. â
Execução båsica
|
|
2. â
MĂșltiplas iteraçÔes
|
|
3. â
RelatĂłrio de estatĂsticas
|
|
4. â
Diferentes estratégias
|
|
5. â
Helgrind check
|
|
6. â
NĂșmero Ămpar de filĂłsofos
|
|
7. â
Timing apertado
|
|
8. â
Métricas de performance
|
|
9. â
Thread sanitizer
|
|
10. â
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:
|
|
1. â
Caso bĂĄsico com processos
|
|
2. â
Usa fork() (nĂŁo threads)
|
|
3. â
Usa semĂĄforos POSIX
|
|
4. â
CenĂĄrio de morte
|
|
5. â
Limite de refeiçÔes
|
|
6. â
FilĂłsofo sozinho
|
|
7. â
Argumentos invĂĄlidos
|
|
8. â
Cleanup de processos (no zombies)
|
|
9. â
Cleanup de semĂĄforos
|
|
10. â
EstatĂsticas finais
|
|
11. â
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 sanitizer
|
|
- `valgrind` - Memory leak detection
|
|
- `helgrind` - Data race detection (avançado)
|
|
- `timeout` - Detecção de deadlocks/hangs
|
|
- `grep/sed/awk` - Parsing de output
|
|
- `ps` - Verificação de processos zombie
|
|
|
|
---
|
|
|
|
## đ Conceitos-Chave Testados
|
|
|
|
### Threading:
|
|
- [x] pthread_create
|
|
- [x] pthread_join
|
|
- [x] pthread_detach
|
|
- [x] Thread arguments
|
|
- [x] Multiple threads
|
|
|
|
### Synchronization:
|
|
- [x] pthread_mutex_init/destroy
|
|
- [x] pthread_mutex_lock/unlock
|
|
- [x] Critical sections
|
|
- [x] Race conditions
|
|
- [x] Deadlock prevention
|
|
|
|
### Timing:
|
|
- [x] gettimeofday
|
|
- [x] Precise sleep
|
|
- [x] Timestamp generation
|
|
- [x] Time difference calculation
|
|
|
|
### Processes (Bonus):
|
|
- [x] fork()
|
|
- [x] waitpid()
|
|
- [x] kill()
|
|
- [x] Signal handling
|
|
- [x] Process cleanup
|
|
|
|
### Semaphores (Bonus):
|
|
- [x] sem_open
|
|
- [x] sem_wait/sem_post
|
|
- [x] sem_close/sem_unlink
|
|
- [x] Named semaphores
|
|
|
|
### Philosophers-Specific:
|
|
- [x] Circular resource allocation
|
|
- [x] Death detection
|
|
- [x] Meal counting
|
|
- [x] State transitions
|
|
- [x] Monitor pattern
|
|
- [x] 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:
|
|
|
|
1. **Revise conceitos**:
|
|
- Data races e como evitĂĄ-los
|
|
- Deadlock e estratégias de prevenção
|
|
- Timing preciso e monitoramento
|
|
|
|
2. **Pratique casos edge**:
|
|
- 1 filĂłsofo
|
|
- 2 filĂłsofos
|
|
- NĂșmeros grandes (200+ filĂłsofos)
|
|
- Timing muito apertado
|
|
|
|
3. **Otimize**:
|
|
- Minimize tempo dentro de locks
|
|
- Balance entre precisĂŁo e performance
|
|
- Evite busy waiting
|
|
|
|
4. **Teste rigorosamente**:
|
|
```bash
|
|
valgrind --tool=helgrind ./philo 4 410 200 200
|
|
valgrind --leak-check=full ./philo 5 800 200 200 7
|
|
```
|
|
|
|
5. **Prepare para o projeto real**:
|
|
- Norminette
|
|
- Makefile correto
|
|
- Error handling robusto
|
|
- CĂłdigo limpo e documentado
|
|
|
|
Boa sorte! đ
|