A segunda parte dos testes exploratórios consiste na abordagem do ponto levantado nas entrevistas pelos participantes referente ao escopo da suíte do fórum SBTVD. Para alguns participantes da pesquisa, é evidente que a suíte não exercita todas as funcionalidades do Ginga. Para tentar investigar esse ponto, foi proposta a criação de um teste em NCL, fora do escopo da suíte do fórum SBTVD que tentasse exercitar partes não cobertas pelos testes automatizados. Para realizar tal teste, o primeiro passo é identificar, através do mapeamento de arquivos não cobertos, arquivos candidatos que podem não ter sido cobertos por falta de testes que exercitassem a sua funcionalidade. O mapeamento completo dos arquivos não cobertos pode ser visualizado no apêndice (C).
O arquivo UTCTimeIntervalAnchor.cpp foi escolhido pela facilidade com que seu nome se relacionava com uma funcionalidade conhecida do NCL e mencionada na norma ABNT NBR 15606-2. Como esse arquivo não foi coberto por nenhum teste automatizado dentro dos 2.812 casos de teste do fórum SBTVD e como ele tem o nome de uma funcionalidade conhecida do NCL de âncora temporal, essa funcionalidade foi selecionada para ser trabalhada na implementação um caso de teste em NCL que pudesse alcançar mais trechos do código fonte do Ginga relacionados ao seu funcionamento. A seção (5.2.1
revisará a teoria das âncoras de conteúdo antes de seguirmos com a implementação do teste.
5.2.1
Âncoras de conteúdo
Uma âncora de conteúdo define um trecho da mídia (intervalo de tempo, região no espaço ou ambos) como uma interface que poderá ser utilizada como ponto de ativação ou ação de elos. As âncoras de conteúdo são utilizadas geralmente para sincronizar mídias, bem como para delimitar a sua janela de interação. Uma âncora de conteúdo é definida como um elemento <area> dentro de um elemento <media> num arquivo NCL:
1 <media i d=’ v i d e o 1 ’ s r c=’ media / v i d e o 1 . mpg ’ d e s c r i p t o r=’ dVideo1 ’>
2 < !−− a n c o r a s de c o n t e u d o no v i d e o −−>
3 <a r e a i d=’ a1 ’ b e g i n=’ 5 s ’ end=’ 9 s ’ />
4 <a r e a i d=’ a2 ’ b e g i n=’ 10 s ’ end=’ 14 s ’ />
5 <a r e a i d=’ a3 ’ b e g i n=’ 15 s ’ end=’ 19 s ’ />
6 </ media>
Listing 5.2 – Definição de âncora de conteúdo em uma mídia do tipo vídeo
De um modo estrutural, as âncoras podem ser descritas como pontos de interfaces em um objeto de mídia.
A NCL define o seguinte atributo para uma âncora de conteúdo temporal:
• id: Identificador único, obrigatório.
• begin: Início da âncora de uma mídia contínua. Pode ser definido em segundos ou no formato UTC ("Y:M:D:H:m:S").
• end: Términdo da âncora de uma mídia contínua. Mesma regra do begin.
De modo que um exemplo de uma mídia com o tempo UTC seria como se segue:
1 <media i d=’ t i m e ’ t y p e=’ a p p l i c a t i o n /x−n c l −t i m e ’>
2 <a r e a i d=’ a1 ’ b e g i n=’ 2019 : 1 1 : 2 0 : 2 3 : 2 8 : 2 3 ’ end=’ 2019 : 1 1 : 2 0 : 2 3 : 2 8 : 4 5 ’ />
3 </ media>
Listing 5.3 – Definição de âncora de conteúdo em uma mídia do tipo time
Na listagem (5.3) vemos a definição de um elemento <media> com o id “time” e o tipo tempo. O elemento <area>, por sua vez, possui o id “a1” e tem o atributo de início no tempo UTC “2019:11:20:23:28:23” e o atributo fim no tempo UTC “2019:11:20:23:28:45”.
5.2.2
Implementação do teste NCL para âncora temporal UTC
Após verificar dentre os arquivos não cobertos que as âncoras de tempo UTC não estavam sendo exercitadas pelos testes de sistema do fórum SBTVD, foi realizada uma
busca dentro dos testes NCL existentes para comprovar que não existem realmente testes que estejam tentando exercitar as âncoras temporais. A busca foi realizada nos arquivos NCL pela palavra chave "application/x-ncl-time", que indica que existe algum nó <area> com o tipo relacionado a tempo.
Sabendo que não existem testes em NCL que exercitem essa funcionalidade e uma vez de posse do código fonte e do resultado da cobertura de código, era necessário descobrir o ponto no código onde a chamada para a criação dessa âncora era disparada. Foi realizada uma busca partindo do arquivo UTCTimeIntervalAnchor.cpp para descobrir quais outras funções estavam chamando ela. Foi descoberta que uma função no arquivo NclInterfacesConverter.cpp chamada createTemporalAnchor que faz o tratamento dos elementos begin e end dentro do arquivo NCL e caso o valor desses atributos seja o tempo em formato UTC, a função chama o construtor da classe UTCTimeIntervalAnchor na linha 197. O trecho de código referente a esse comportamento pode ser visto na figura 19. Figura 19 – Trecho da função createTeamporalAnchor mostrando a chamada da função
UTCTimeIntervalAnchor sem cobertura
Tendo essa informação, sabemos que existe uma implementação no código fonte para criar uma âncora temporal do tipo UTC que nunca é exercitada pois não existem testes escritos para tal finalidade. Para o caso do teste de âncora temporal utilizando o parâmetro UTC, basta criar um arquivo NCL com a área para uma mídia de tempo como mostrada na listagem (5.3). O teste criado pode ser visualizado no apêndice (G). O problema para esse teste é que ele só acontece uma única vez no tempo e não se repete. Para resolver esse problema e o teste poder ser incorporado à bateria e ao screen-tester, foi elaborado um script em python que sempre irá atualizar o arquivo NCL com o horário UTC para que o mesmo se adéque ao teste. O screen-tester possui uma funcionalidade que permite executar o script antes de qualquer outro comando. De maneira que o teste do screen-tester ficou configurado da seguinte maneira:
2NCL_BEFORE_RUN_COMMANDS=( \
3 ’ e v a l python3 $CURRENT_TEST_PATH/ r e p l a c e . py $CURRENT_TEST_PATH ’ \
4 ) 5COMMANDS=(\ 6 ’ s l e e p 30 s ’\ 7 ’ compare g o l d e n . png r e c t a n g l e 6 9 , 3 3 3 3 3 0 , 3 8 3 ; r e c t a n g l e 4 1 7 , 3 3 7 6 7 8 , 3 8 6 ’\ 8 )
Listing 5.4 – test.sh - teste de âncora temporal configurado para rodar no screen-tester
Na listagem (5.4) acima é possível observar que o screen-tester permite a exe- cução de comandos em bash script antes que os comandos do teste sejam efetivamente realizados. Isso pode ser evidenciado através das declarações dos arrays NCL-BEFORE- RUN-COMMANDS e COMMANDS, onde o primeiro permite que os comandos que forem executados dentro do seu escopo sejam executados antes do que vier dentro do escopo de COMMANDS. Isso permite que, no caso do teste de âncora temporal, o script em python replace.py seja chamado substituindo a hora em formato UTC timestamp no arquivo main.ncl, que é o caso de teste, por valores de tempo no futuro, possíveis de serem testados pelo processo do screen-tester.
5.2.3
Análise de cobertura de código para o teste de âncora temporal
Ao adicionar o teste de âncora temporal à suíte do fórum SBTVD e executar uma bateria em cima da branch inicial que foi realizada em Junho de 2019, agora com 2.813 testes, podemos extrair o relatório de cobertura e verificar não só se houve uma melhoria na métrica da cobertura de código de uma maneira geral como, mais importante, se as partes relacionadas como não cobertas no mapeamento derivado da análise de cobertura inicial, foram cobertas após a execução desse teste adicional. A tabela (7) mostra os arquivos alterados pelo teste de âncora temporal e a mudança relacionada nas sua respectivas coberturas.
Através do relatório de cobertura extraído com a inclusão do teste de âncora temporal, foi possível perceber que pelo menos 4(quatro) arquivos que antes não eram cobertos por nenhum teste, passaram a ter um nível de cobertura relevante relacionada ao teste. Como o teste implementado é um teste de sistema, sabemos que ele terá influência em vários arquivos do sistema sob teste. Ao todo foi possível identificar 19 arquivos que tiveram coberturas influenciadas pelo teste de âncora temporal. É possível identificar, dentre os demais arquivos que o arquivo selecionado UTCTimeIntervalAnchor.cpp foi exercitado, tendo 100% de linhas cobertas.
Para comprovar que a classe foi chamada, foi comparado o ponto no código onde o construtor da classe UTCTimeIntervalAnchor era chamado. A figura 20 mostra essa
Arquivo C.Inicial C.Final ../player/ITimeListener.h 0,00% 100,00% ../adapters/time/TimePlayerAdapter.cpp 0,00% 100,00% ../model/event/UTCIntervalAnchorEvent.cpp 0,00% 100,00% ../time/TimePlayer.cpp 0,00% 83,54% ../interfaces/UTCTimeIntervalAnchor.cpp 0,00% 38,46% ../interface/input/dfb/DFBGInputEvent.cpp 52,38% 59,46% ../telemidia-util-cpp/src/functions.cpp 59,74% 65,86% ../components/ContentNode.cpp 76,27% 79,66% ../model/event/ClipAnchorEvent.cpp 60,87% 63,04% ../model/components/CompositeExecutionObject.cpp 74,30% 75,30% ../adapters/PlayerAdapterManager.cpp 83,92% 84,80% ../gingacc-system/src/io/InputManager.cpp 82,65% 83,47% ../focus/FormatterFocusManager.cpp 61,72% 62,25% ../ncl30-converter/../NclInterfacesConverter.cpp 81,77% 82,27% ../adapters/FormatterPlayerAdapter.cpp 84,38% 84,79% ../ginga-cpp/src/main.cpp 38,38% 38,75% ../gingacc-player/src/Player.cpp 73,04% 73,35% ../emconverter/FormatterConverter.cpp 71,89% 72,03% ../gingancl-cpp/src/FormatterScheduler.cpp 81,50% 81,59% Tabela 7 – Arquivos afetados pelo teste de âncora temporal UTC Time
comparação.
Figura 20 – Trecho da função createTeamporalAnchor mostrando a chamada da função UTCTimeIntervalAnchor com cobertura
Através da figura 20 é possível ver que a âncora temporal UTC foi chamada na linha 197 duas vezes. Isso se deve ao fato do caso de teste estar desenhando duas mídias na tela, cada uma no tempo em formato UTC calculado pelo script em python. Dessa forma fica evidente que as duas chamadas dessa linha são derivadas do teste NCL criado.
5.2.4
Registro e correção de falha de segmentação
Ao executar a aplicação de âncora temporal em formato UTC, foi constatada uma falha de segmentação. Ao encerrar a aplicação, a mesma travava e um sinal SIGVERG era lançado na tela. A falha era devido ao destrutor da classe TimePlayerAdapter não estar devidamente implementado, fazendo com que em determinado momento, a aplicação solicitasse que ponteiros acessassem endereços de memória que não existiam mais. Essa falha só pôde ser descoberta através da execução de partes do código que nunca haviam sido exercitadas antes. A correção foi prontamente estabelecida e já integrada ao código do Ginga. Ressalta-se, finalmente, a importância de que esforços sejam realizados pela equipe de desenvolvimento para criar novas aplicações NCL que aumentem a cobertura dos testes do Ginga, uma vez que outros defeitos podem estar “adormecidos” no seu código fonte.