Chrono Mock
Ngôn ngữTiếng Việt

libfaketime cho Windows

Trả lời ngắn: libfaketime không chạy được trên Windows, và không thể - nó được xây trên LD_PRELOAD, thứ mà Windows không có. Chrono Mock là cùng một ý tưởng, được xây theo cách Windows cho phép.

Vì sao không thể đơn giản chuyển nó sang

libfaketime hoạt động bằng cách để trình nạp động đặt một thư viện nhỏ phía trước thư viện C, để các lệnh gọi time() của chương trình đến bản thay thế trước. Cái móc đó là LD_PRELOAD trên Linux và DYLD_INSERT_LIBRARIES trên macOS. README của chính nó liệt kê đúng hai nền tảng ấy.

Windows không có thứ tương đương, và đồng hồ của nó dù sao cũng không nằm sau một hàm duy nhất. Các ứng dụng đọc giờ qua API Win32, qua API native bên dưới nó, và qua bất cứ thứ gì runtime của chúng bọc quanh cả hai - nên phiên bản Windows của ý tưởng này là một thư viện được chèn vào tiến trình mục tiêu, chuyển hướng một tập các hàm được xuất ra, chứ không phải một ký hiệu duy nhất.

Các tùy chọn, được ánh xạ sang nhau

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 mặc định ở đây - xem bên dưới
LD_PRELOAD=libfaketime.so.1 không cần đặt gì - công cụ tự chèn mã

Vậy hai phía của cùng một bài kiểm thử trông như thế này:

# 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

Chỗ hai công cụ thực sự khác nhau

Đồng hồ đơn điệu bị đảo ngược. libfaketime làm giả chúng theo mặc định và cho bạn FAKETIME_DONT_FAKE_MONOTONIC để dừng việc đó. Ở đây bộ đếm độ phân giải cao mặc định vẫn là thật, vì nhân tỷ lệ nó làm mất ổn định việc kết xuất khi kiểm thử, và --scale-qpc bật nó lên. Công tắc đó là thứ khiến monotonic của Python 3.13+, Stopwatch của .NET và nanoTime của Java theo đồng hồ phiên.

Windows có nhiều chỗ để chặn hơn. Ngoài đồng hồ treo tường còn có múi giờ, trục thời gian đã trôi, bốn họ bộ hẹn giờ, các hàm sleep và chờ, và việc tạo tiến trình - tổng cộng 44 kênh. Trong số đó, 30 kênh được dịch chuyển, và 14 kênh còn lại, trong đó có kết nối mạng, được đếm.

Công cụ này báo cáo độ bao phủ của chính nó. Mỗi phiên kết thúc bằng một kết luận, các kênh mà ứng dụng thực sự đã đọc kèm số đếm của từng kênh, và các kênh bị bỏ sót. Đó là phần không có thứ tương đương trên cả hai nền tảng.

libfaketime lâu đời hơn và rộng hơn trên sân nhà của nó. Nó có nhiều năm sử dụng phía sau, bao phủ một dải rộng các điểm vào của thư viện C, và trên Linux nó là công cụ phù hợp. Không gì ở đây thay thế nó ở đó.

Nếu bạn thực sự muốn chính libfaketime

Hai hướng trung thực, cả hai đều chuyển chương trình được kiểm thử sang Linux:

  • WSL - dựng và chạy libfaketime bên trong hệ thống con Linux. Ổn khi thứ được kiểm thử là một chương trình Linux mà bạn tình cờ phát triển trên Windows.
  • Một container - cùng ý tưởng, dễ tái lập hơn.

Không cách nào giúp được với một ứng dụng Windows, là trường hợp mà công cụ này tồn tại để phục vụ.

Dùng thử