foxcpp/go-mockdns

GitHub: foxcpp/go-mockdns

一个 Go 语言的 DNS 查询模拟库,通过可注入 resolver 或直接 patch 标准库的方式帮助开发者在单元测试中控制 net.Lookup* 的返回结果。

Stars: 50 | Forks: 11

# go-mockdns [![参考](https://godoc.org/github.com/foxcpp/go-mockdns?status.svg)](https://godoc.org/github.com/foxcpp/go-mockdns) 用于测试涉及 DNS 查询代码的样板代码,包括 ~~非神圣的~~ 用于重定向 `net.Lookup*` 调用的 hack。 ## 示例 简单的 mock resolver,适用于被测代码支持自定义 resolver 的情况: ``` r := mockdns.Resolver{ Zones: map[string]mockdns.Zone{ "example.org.": { A: []string{"1.2.3.4"}, }, }, } addrs, err := r.LookupHost(context.Background(), "example.org") fmt.Println(addrs, err) // Output: // [1.2.3.4] ``` 适用于不支持自定义 resolver 情况的 ~~非神圣~~ hack: ``` srv, _ := mockdns.NewServer(map[string]mockdns.Zone{ "example.org.": { A: []string{"1.2.3.4"}, }, }, false) defer srv.Close() srv.PatchNet(net.DefaultResolver) defer mockdns.UnpatchNet(net.DefaultResolver) addrs, err := net.LookupHost("example.org") fmt.Println(addrs, err) // Output: // [1.2.3.4] ``` 请注意,如果你需要替换 net.Dial 调用,且被测代码支持自定义 net.Dial,请修改其内部的 resolver 对象,而不是 net.DefaultResolver。 如果被测代码支持类似 Dialer 的对象 —— 请直接使用 Resolver 本身,它 实现了 Dial 和 DialContext 方法。
标签:EVTX分析, 日志审计