aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/devfs/filesystem.tests.cpp
blob: f8c4764d15478138ea6e8affd617ddf7eb680309 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "kernel/filesystem/devfs/filesystem.hpp"

#include "kernel/filesystem/filesystem.hpp"
#include "kernel/test_support/filesystem/storage_boot_module_fixture.hpp"

#include <catch2/catch_test_macros.hpp>

SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture,
                "Devfs filesystem lookup uses storage management devices", "[filesystem][devfs][filesystem]")
{
  GIVEN("a boot module registry with one module")
  {
    setup_modules(1);

    auto fs = kernel::filesystem::devfs::filesystem{};
    auto result = fs.mount(nullptr);

    THEN("mount succeeds")
    {
      REQUIRE(result == kernel::filesystem::filesystem::operation_result::success);
      REQUIRE(fs.root_inode() != nullptr);
    }

    THEN("lookup on root finds ram0 device inode")
    {
      auto inode = fs.lookup(fs.root_inode(), "ram0");
      REQUIRE(inode != nullptr);
      REQUIRE(inode->is_device());
    }

    THEN("lookup of an unknown device returns null")
    {
      auto inode = fs.lookup(fs.root_inode(), "ram99");
      REQUIRE(inode == nullptr);
    }

    THEN("lookup with wrong parent returns null")
    {
      auto other_fs = kernel::filesystem::devfs::filesystem{};
      other_fs.mount(nullptr);

      auto inode = fs.lookup(other_fs.root_inode(), "ram0");
      REQUIRE(inode == nullptr);
    }

    THEN("lookup with a non-directory parent returns null")
    {
      auto non_directory_inode = fs.lookup(fs.root_inode(), "ram0");
      REQUIRE(non_directory_inode != nullptr);
      REQUIRE(!non_directory_inode->is_directory());

      auto result = fs.lookup(non_directory_inode, "anything");
      REQUIRE(result == nullptr);
    }
  }

  GIVEN("a boot module registry with three modules")
  {
    setup_modules(3, 2048);

    auto fs = kernel::filesystem::devfs::filesystem{};
    auto result = fs.mount(nullptr);
    REQUIRE(result == kernel::filesystem::filesystem::operation_result::success);

    THEN("lookup finds all generated RAM devices")
    {
      REQUIRE(fs.lookup(fs.root_inode(), "ram0") != nullptr);
      REQUIRE(fs.lookup(fs.root_inode(), "ram16") != nullptr);
      REQUIRE(fs.lookup(fs.root_inode(), "ram32") != nullptr);
    }
  }
}