libfaketime para Windows
Resposta curta: o libfaketime não roda no Windows, e não pode - ele é construído
sobre o LD_PRELOAD, que o Windows não tem. O Chrono Mock é a mesma ideia construída do
jeito que o Windows permite.
Por que não dá simplesmente para portar
O libfaketime funciona fazendo o carregador
dinâmico colocar uma pequena biblioteca na frente da biblioteca C, de modo que as chamadas de um
programa a time() cheguem primeiro ao substituto. Esse gancho é o
LD_PRELOAD no Linux e o DYLD_INSERT_LIBRARIES no macOS. O próprio README
dele lista exatamente essas duas plataformas.
O Windows não tem equivalente, e o relógio dele não fica atrás de uma única função de qualquer forma. Os aplicativos leem a hora pela API Win32, pela API nativa que fica abaixo dela e por tudo o que o ambiente de execução deles envolve em torno de uma ou da outra - então a versão Windows desta ideia é uma biblioteca injetada no processo alvo, redirecionando um conjunto de funções exportadas em vez de um único símbolo.
As opções, traduzidas uma a uma
| libfaketime | Chrono Mock |
|---|---|
FAKETIME="2020-12-24 20:30:00" |
--at 2020-12-24T20:30:00 |
FAKETIME="+14d" |
--at +14d |
FAKETIME="-10m" |
--at -10m |
FAKETIME="+0 x2" |
--mode x2 |
FAKETIME_DONT_FAKE_MONOTONIC=1 |
o padrão aqui - veja abaixo |
LD_PRELOAD=libfaketime.so.1 |
nada a definir - a ferramenta injeta |
Então os dois lados do mesmo teste ficam assim:
# Linux FAKETIME="2020-12-24 20:30:00" LD_PRELOAD=/usr/local/lib/libfaketime.so.1 ./test # Windows chrono run "C:\apps\test.exe" --at 2020-12-24T20:30:00
Onde os dois realmente diferem
Os relógios monotônicos são invertidos. O libfaketime os falsifica por padrão e
oferece FAKETIME_DONT_FAKE_MONOTONIC para impedir isso. Aqui o contador de alta
resolução permanece real por padrão, porque escalá-lo desestabilizou a renderização nos testes, e
--scale-qpc o ativa. Essa chave é o que faz Python 3.13+ monotonic,
.NET Stopwatch e Java nanoTime acompanharem o relógio da sessão.
O Windows tem mais lugares para interceptar. Além do relógio de parede, há o fuso horário, o eixo do tempo decorrido, quatro famílias de temporizadores, as funções de espera e de suspensão, e a criação de processos - 44 canais no total. Desses, 30 são deslocados, e os outros 14, entre eles as conexões de rede, são contados.
Esta ferramenta relata a própria cobertura. Toda sessão termina com um veredito, os canais que o aplicativo realmente leu, com uma contagem para cada um, e os canais que foram perdidos. Essa é a parte que não tem equivalente em nenhuma das duas plataformas.
O libfaketime é mais antigo e mais abrangente no seu próprio terreno. Tem anos de uso por trás, cobre uma ampla gama de pontos de entrada da biblioteca C, e no Linux é a ferramenta certa. Nada aqui o substitui lá.
Se o que você quer é o próprio libfaketime
Dois caminhos honestos, ambos movem o programa testado para o Linux:
- WSL - compilar e executar o libfaketime dentro do subsistema Linux. Serve quando o que está sendo testado é um programa Linux que você por acaso desenvolve no Windows.
- Um contêiner - a mesma ideia, mais reproduzível.
Nenhum dos dois ajuda com um aplicativo Windows, que é o caso para o qual esta ferramenta existe.