2 个版本
0.1.2 | 2022 年 7 月 28 日 |
---|---|
0.1.1 | 2022 年 7 月 23 日 |
0.1.0 |
|
#395 in 测试
33KB
577 代码行
IO check
一个 Rust crate,用于彻底检查 std::io::Read
和 std::io::Write
的使用。
关于
它们各自特质的 read
和 write
方法并不保证使用整个提供的缓冲区。正确应用必须处理这些情况。这通常是通过使用 read_exact
或 write_all
来实现的,但人们可能会忘记这些,或者有特殊的原因避免使用它们,但未能正确编写代码。
此 crate 提供了一个工具,可以自动测试此类实现,甚至找到未正确处理的调用位置!
用法
接口非常简单:有两个函数,一个用于读取测试,另一个用于写入测试。 test_read
接受应从 Read
返回的字节和一个实现测试的闭包。闭包接受一个读取器作为参数,应调用你的解码函数。然后你应该将解码值与预期值进行比较,如果不相等则 panic - 就像在测试中一样。同样,test_write
接受预期字节作为参数和一个实现测试的闭包。闭包接受一个写入器,需要将其写入数据。写入的数据与预期值内部进行比较。
如果你的代码由于不正确处理分割而存在错误,此 crate 将找到它,甚至找到未正确处理的调用位置。找到原因需要 backtrace
功能,该功能默认开启。
请注意,如果有多个此类错误,该 crate 一次只能找到一个 - 对应于输入最左侧部分的那个。一旦修复它,就可以重新运行测试,它会报告下一个错误。重复此过程,直到修复所有错误。
请注意,此 crate 应正常用作 dev-dependency。
它的工作原理
读取
首先使用逐字节返回数据的读取器调用关闭。如果存在导致依赖整个缓冲区读取的 read
的错误,除非代码非常特殊,否则这将触发它。然而,人们通常首先用零填充缓冲区,如果输入也包含零,则错误不会触发。为了避免这种情况,缓冲区未使用部分被混淆,以确保数据无效。
如果错误触发,则使用 catch_unwind
捕获恐慌并运行搜索以找到发生的确切位置。闭包多次被调用,每次调用都使用另一个将输入分成两部分的读取器。每次调用中两部分的大小都会变化一个单位。一旦调用恐慌,我们就可以知道问题在输入中的位置。
要找到实际函数调用,读取器在 read
调用提供与分割位置重叠的缓冲区时捕获堆栈跟踪。每次迭代中只有一个 read
调用可以触发此操作。如果闭包恐慌,捕获的堆栈跟踪将用于错误报告。
写入
与读取相反,写入可以实时检测错误,因此它可以更快地找到错误和可能的错误位置。然而,它可以报告错误的位置,因此计划是使其更像读取。有关更多信息,请参阅问题 #1。
除此之外,它与读取非常相似 - 在每个位置分割写入,如果写入的数据不匹配,则报告错误。堆栈跟踪捕获也与读取相似 - 捕获最后一个调用,如果当前调用写入意外的数据,则报告上一个调用为可能的罪魁祸首。
MSRV
1.41.1 无 backtrace
功能,1.48 有 backtrace
功能。
许可
MITNFA
依赖项
~2.5–3.5MB
~73K SLoC