Chrono Mock
IdiomaPortuguês (Brasil)

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

libfaketimeChrono 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.

Experimente