代码之家  ›  专栏  ›  技术社区  ›  bialix

为了测试C代码而模仿/伪造文件系统?

  •  4
  • bialix  · 技术社区  · 14 年前

    我正在寻找跨平台的方法来测试我的应用程序中的一些特性,这些特性需要访问文件系统(以写入和读取二进制数据)。在现实生活中,我的应用程序在Linux上运行,并将特殊数据存储在 /usr/local/etc 目录。但是应用程序的主要部分是跨平台库,它应该在Windows和Linux上进行测试。此外,我不希望我的测试直接向 /Urr/本地/等 因为在这种情况下,它将破坏测试隔离。

    所以我在考虑用文件系统的特殊仿真器替换对文件系统的真正访问。因此,每个需要访问文件系统的测试都可以创建vistual filesystem对象的新实例,我可以单独运行测试,并适当地支持Windows上的测试。

    我试图找到一些现有的开放/自由实现,但到目前为止还没有找到C代码的实现。有什么暗示吗?

    更新: 仅Linux解决方案 chroot 不是我的选择。

    3 回复  |  直到 14 年前
        1
  •  4
  •   psmears Touffy    14 年前

    我将使文件系统位置可配置——要么使用命令行选项,要么使用环境变量(这两种方法在Linux和Windows中都可以正常工作)。

    默认值可以是 /usr/local/etc/ ,但对于测试(或在Windows上),可以指定其他位置。如果您运行多个命令,那么环境变量方法工作得特别好,因为您可以设置一次变量,然后仅以使用默认存储位置时的运行方式运行命令。

    对于这两种方法,都值得考虑是否存在位置可配置的安全隐患-通常不会(可执行文件只能执行用户可能已经完成的操作),但如果运行可执行文件setuid,则可能需要更多的考虑。

        2
  •  1
  •   Rudi    14 年前

    在Linux下,您可以执行 fakeroot 诀窍: LD_PRELOAD 截取的图书馆 open , read write 呼叫并将它们重定向到您想做的任何事情。我不知道是否有一种等效的方法可以用这种方法将代码注入到Windows二进制文件中。

    chroot 是赋予测试程序自己的fs层次结构的另一种方法。您还可以尝试为fopen和朋友编写自己的libc存根,并将此lib链接到测试程序,但这不会截获其他库发出的调用。

    另一种方法可能是一个IO抽象层,比如openssl bio,在这里,可以通过替换抽象库轻松拦截IO调用。

        3
  •  1
  •   R.. GitHub STOP HELPING ICE    14 年前

    在QEMU下进行测试,并使用相同的预先编制好的文件系统映像开始每一次运行会怎么样?