Resumo
- O novo teste configura um limite de um byte, força o item multipart para o disco e confere que
FileUpload.getBytes()devolve exatamente o conteúdo gravado. - Os nomes
organizations.xlsxecarta-ce.pdfescondem uma diferença importante: os corpos são sequências sintéticas, não uma planilha OOXML e um PDF completo. - A garantia correta preserva esse teste rápido e cria comprovantes distintos para estrutura de arquivo, regras eleitorais, autorização e limites operacionais.
O nome promete mais que o experimento
O método incluído no commit de 11 de setembro de 2026 chama-se wicketFileUploadGetBytesWorksForDiskBackedExcelAndPdf. Lido fora do código, o nome parece registrar que uploads de Excel e PDF funcionam quando o conteúdo vai para disco. O experimento faz algo mais estreito. Ele confirma que uma sequência de bytes atravessa a implementação de armazenamento do Commons FileUpload e o invólucro do Wicket sem ser alterada.
A construção é deliberada. A DiskFileItemFactory recebe o diretório temporário do JUnit e tamanho de buffer igual a 1. Como as amostras têm mais de um byte, elas não ficam apenas na memória. O teste abre a saída do item, grava o conteúdo, cria um FileUpload, chama getBytes(), compara o resultado com a origem e apaga o arquivo temporário num bloco finally. Se uma versão das bibliotecas quebrar a leitura de itens persistidos no disco, a asserção acusa exatamente essa fronteira.
As amostras, porém, não representam os formatos anunciados. A variável de planilha contém texto UTF-8: ORGID, quebra de linha e ALFA-001. Uma planilha .xlsx real é um pacote OOXML, com arquivos compactados, relações e XML. A variável de PDF contém %PDF-1.1, uma quebra, %carta e outra quebra. Ela oferece o prefixo, mas não os objetos, referências e término de um documento completo. Os nomes de arquivo são metadados atribuídos pelo teste; não transformam texto em Excel ou PDF.
Essa distinção protege o significado do resultado verde. A igualdade dos bytes é uma evidência forte para o transporte. Ela nada diz sobre a capacidade de um parser abrir o conteúdo, sobre a presença de colunas exigidas, sobre o direito do usuário ou sobre o efeito persistente de uma solicitação. Uma carga pode chegar intacta e ser rejeitada corretamente na etapa seguinte.
Os controles que aparecem nos fluxos reais
O repositório não trata todos os arquivos como nomes confiáveis. Na mesma classe de compatibilidade, um teste envia texto com o nome photo.jpg ao validador de fotos e espera uma rejeição por formato. Outro cria uma imagem PNG verdadeira, processa-a, exige saída JPEG e volta a decodificá-la para medir largura e altura máximas de 400 pixels. A diferença é instrutiva: nesses casos, o conteúdo precisa se comportar como imagem.
O fluxo de organizações também vai além da extensão. O validador da interface prossegue quando o nome termina em .xlsx ou quando o tipo MIME declarado é o de planilha OOXML. Esse filtro inicial usa sinais controlados pelo cliente, mas não é a decisão final. Arquivos de devedores e exclusões seguem para validação remota. Altas e atualizações passam por validação detalhada no envio.
Em ExcelUtils, os bytes são escritos num arquivo temporário. O código exige o MIME OOXML, cria um XSSFWorkbook do Apache POI, seleciona a primeira aba, interpreta cabeçalhos e percorre as linhas. A lista de devedores precisa de ORGID; a planilha de atualização precisa de um conjunto maior de campos. Valores obrigatórios, identificadores repetidos e outros erros geram respostas específicas. Antes de enfileirar uma alteração, o painel verifica se a operação pode ser aplicada à eleição. Se já houver processamento, uma segunda tarefa não é aberta.
Assim, o texto curto usado pelo teste de compatibilidade pode passar pela camada de bytes e falhar no XSSFWorkbook. Os dois comportamentos são coerentes. O primeiro preserva a integração Wicket–Commons; o segundo preserva a semântica do documento e da eleição.
O censo eleitoral tem separação parecida. O painel lê os bytes, chama a validação aplicável à eleição e só depois tenta enfileirar a atualização. O método novo reproduz a forma da leitura, mas não abre a planilha do censo, não confirma as colunas e não observa o que seria alterado.
Já as cartas de resultado usam um formulário multipart com teto de 10 MB. No envio, a página recarrega a eleição, reforça o controle de acesso e interrompe o processo se ela estiver encerrada. Os arquivos opcionais em espanhol, inglês e português são validados antes de os novos bytes serem salvos com o identificador administrativo e o endereço do cliente.
Nesse caminho, a função isPdf compara apenas os quatro primeiros bytes com %PDF. A amostra sintética satisfaz essa regra. Ela não prova que um leitor conseguiria abrir o arquivo nem que sua estrutura esteja íntegra. Isso não apaga o teto, a autorização e a verificação de estado; apenas impede que esses controles sejam confundidos com validação completa do documento.
Uma aceitação composta por cinco comprovantes
Um conjunto de testes mais legível separa as perguntas em vez de reuni-las na frase “upload funciona”.
O comprovante de transporte deve exercitar memória e disco, afirmar explicitamente qual caminho foi usado, comparar bytes, fechar fluxos e verificar limpeza. O teste novo é uma boa base. Seu nome poderia mencionar preservação de bytes por FileUpload.getBytes() num item mantido em disco. As extensões continuariam úteis como contexto, sem parecer prova de parser.
O comprovante de formato precisa de arquivos autênticos e contraprovas. Para OOXML, uma planilha mínima gerada pelo POI, contendo aba e cabeçalhos esperados; ao lado dela, um ZIP que não seja OOXML, um pacote truncado e arquivos protegidos conforme a política. Para PDF, um documento mínimo completo aceito pelo parser escolhido, um mero cabeçalho, uma versão cortada e formatos ambíguos relevantes. Extensão, MIME e assinatura são sinais; a estrutura é outra evidência.
O comprovante de domínio leva o arquivo real aos validadores. Ele distingue falha de leitura, coluna ausente, linha vazia, ORGID duplicado, país inválido e referência inexistente. Confere o relatório de erros e garante que uma rejeição não deixe trabalho agendado. No censo, o caso deve usar uma eleição conhecida, com as condições necessárias para provar tanto aceitação quanto recusa.
O comprovante de processo testa poder e efeito. Um administrador autorizado opera uma eleição aberta; um usuário sem acesso ou uma eleição encerrada não. Um arquivo válido cria exatamente uma tarefa e o resultado corresponde às linhas aceitas. Duas tentativas simultâneas encontram a trava de processamento. Nas cartas, uma falha em qualquer idioma deve ocorrer antes da aplicação das três alterações, evitando um estado parcial.
O comprovante de recursos mede limite de solicitação, memória, local temporário, remoção, tempo de análise e expansão compactada. A documentação do Commons FileUpload descreve o limiar entre memória e disco e os controles de tamanho. O Apache POI recomenda camadas extras porque arquivos externos podem provocar efeitos que o parser não consegue neutralizar por completo. ZipSecureFile oferece razão mínima de compactação e máximo de entrada descompactada. A OWASP recomenda combinar autorização, extensão permitida, tipo, assinatura e limites após descompressão.
Essas fontes são orientação geral, não prova de falha na LACNIC. O recorte também é um repositório público. O POM fixado declara Wicket 10.9.0, e o módulo WildFly aponta para POI OOXML 5.0.0. Isso não demonstra a versão implantada numa eleição real. Da mesma forma, a proximidade entre mudanças de dependência e o teste não permite atribuir causa ou afirmar que houve incidente.
O teste continua valendo
Seria um erro substituir uma prova rápida por um ensaio pesado que mistura todos os componentes. Quando um adaptador de multipart deixa de ler o arquivo temporário, o diagnóstico precisa acontecer antes do parser de planilha. A pequena asserção fornece justamente esse isolamento. A melhoria consiste em dizer, no nome e no registro da versão, qual isolamento ela garante.
Testes viram memória institucional. Numa revisão de lançamento, poucas pessoas reabrem o método; muitas leem uma lista de nomes. “Excel e PDF em disco” pode virar um atalho maior do que o código. “Identidade de bytes através do armazenamento em disco” é menos vistoso e mais útil: indica qual propriedade mudou, qual equipe deve investigar e quais outros comprovantes ainda precisam estar verdes.
Fontes
- Descrição do sistema eleitoral da LACNIC
- Commit fixado da LACNIC
- Teste de compatibilidade multipart
- Validador Excel de organizações
- Painel de resultados eleitorais
- Suporte às cartas de resultado
- Utilitários de planilha
- Painel de upload de organizações
- Painel de upload do censo
- Código de FileUpload no Wicket 10.9.0
- Documentação do Commons DiskFileItem
- Guia do Commons FileUpload
- Orientação de segurança do Apache POI
- Documentação do Apache POI ZipSecureFile
- Guia de upload de arquivos da OWASP
- POM do módulo administrativo da LACNIC
- Módulo POI OOXML da LACNIC
Briefing para membros
Contexto aprofundado do perfil
Faça login com o nível de assinatura correto para desbloquear o briefing completo e as notas das fontes.
Apenas para Strategic Circle
Strategic Circle
Aberto a todos os leitores. Desbloqueie Briefings de perfil após se inscrever e fazer login.
Junte-se ao Strategic CircleSomente para Leadership Alliance
Leadership Alliance
Para proprietários e gestores qualificados de ativos de PI; faça login para desbloquear os briefings da Leadership Alliance.
Junte-se ao Leadership Alliance
