TestLibCoreFilePermissionsMask.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright (c) 2021, Xavier Defrang <xavier.defrang@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCore/FilePermissionsMask.h>
  7. #include <LibTest/TestCase.h>
  8. TEST_CASE(file_permission_mask_from_symbolic_notation)
  9. {
  10. auto mask = Core::FilePermissionsMask::from_symbolic_notation(""sv);
  11. EXPECT(!mask.is_error());
  12. EXPECT_EQ(mask.value().clear_mask(), 0);
  13. EXPECT_EQ(mask.value().write_mask(), 0);
  14. EXPECT_EQ(mask.value().apply(0), 0);
  15. EXPECT_EQ(mask.value().apply(0664), 0664);
  16. mask = Core::FilePermissionsMask::from_symbolic_notation("u+rwx"sv);
  17. EXPECT(!mask.is_error());
  18. EXPECT_EQ(mask.value().clear_mask(), 0);
  19. EXPECT_EQ(mask.value().write_mask(), 0700);
  20. EXPECT_EQ(mask.value().apply(0), 0700);
  21. EXPECT_EQ(mask.value().apply(0664), 0764);
  22. mask = Core::FilePermissionsMask::from_symbolic_notation("g+rwx"sv);
  23. EXPECT(!mask.is_error());
  24. EXPECT_EQ(mask.value().clear_mask(), 0);
  25. EXPECT_EQ(mask.value().write_mask(), 0070);
  26. EXPECT_EQ(mask.value().apply(0), 0070);
  27. EXPECT_EQ(mask.value().apply(0664), 0674);
  28. mask = Core::FilePermissionsMask::from_symbolic_notation("o+rwx"sv);
  29. EXPECT(!mask.is_error());
  30. EXPECT_EQ(mask.value().clear_mask(), 0);
  31. EXPECT_EQ(mask.value().write_mask(), 0007);
  32. EXPECT_EQ(mask.value().apply(0), 0007);
  33. EXPECT_EQ(mask.value().apply(0664), 0667);
  34. mask = Core::FilePermissionsMask::from_symbolic_notation("a=rx"sv);
  35. EXPECT(!mask.is_error());
  36. EXPECT_EQ(mask.value().clear_mask(), 0777);
  37. EXPECT_EQ(mask.value().write_mask(), 0555);
  38. EXPECT_EQ(mask.value().apply(0), 0555);
  39. EXPECT_EQ(mask.value().apply(0664), 0555);
  40. mask = Core::FilePermissionsMask::from_symbolic_notation("ugo=rx"sv);
  41. EXPECT(!mask.is_error());
  42. EXPECT_EQ(mask.value().clear_mask(), 0777);
  43. EXPECT_EQ(mask.value().write_mask(), 0555);
  44. EXPECT_EQ(mask.value().apply(0), 0555);
  45. EXPECT_EQ(mask.value().apply(0664), 0555);
  46. mask = Core::FilePermissionsMask::from_symbolic_notation("u+rw,g=rx,o-rwx"sv);
  47. EXPECT(!mask.is_error());
  48. EXPECT_EQ(mask.value().clear_mask(), 0077);
  49. EXPECT_EQ(mask.value().write_mask(), 0650);
  50. EXPECT_EQ(mask.value().apply(0), 0650);
  51. EXPECT_EQ(mask.value().apply(0177), 0750);
  52. mask = Core::FilePermissionsMask::from_symbolic_notation("+r"sv);
  53. EXPECT(!mask.is_error());
  54. EXPECT_EQ(mask.value().clear_mask(), 0);
  55. EXPECT_EQ(mask.value().write_mask(), 0444);
  56. EXPECT_EQ(mask.value().apply(0), 0444);
  57. EXPECT_EQ(mask.value().apply(0123), 0567);
  58. mask = Core::FilePermissionsMask::from_symbolic_notation("=rx"sv);
  59. EXPECT(!mask.is_error());
  60. EXPECT_EQ(mask.value().clear_mask(), 0777);
  61. EXPECT_EQ(mask.value().write_mask(), 0555);
  62. EXPECT_EQ(mask.value().apply(0), 0555);
  63. EXPECT_EQ(mask.value().apply(0664), 0555);
  64. mask = Core::FilePermissionsMask::from_symbolic_notation("a+X"sv);
  65. EXPECT(!mask.is_error());
  66. EXPECT_EQ(mask.value().clear_mask(), 0);
  67. EXPECT_EQ(mask.value().write_mask(), 0);
  68. EXPECT_EQ(mask.value().directory_or_executable_mask().clear_mask(), 0);
  69. EXPECT_EQ(mask.value().directory_or_executable_mask().write_mask(), 0111);
  70. EXPECT_EQ(mask.value().apply(0), 0);
  71. EXPECT_EQ(mask.value().apply(0100), 0111);
  72. EXPECT_EQ(mask.value().apply(S_IFDIR | 0), S_IFDIR | 0111);
  73. mask = Core::FilePermissionsMask::from_symbolic_notation("z+rw"sv);
  74. EXPECT(mask.is_error());
  75. EXPECT(mask.error().string_literal().starts_with("invalid class"sv));
  76. mask = Core::FilePermissionsMask::from_symbolic_notation("u*rw"sv);
  77. EXPECT(mask.is_error());
  78. EXPECT(mask.error().string_literal().starts_with("invalid operation"sv));
  79. mask = Core::FilePermissionsMask::from_symbolic_notation("u+rz"sv);
  80. EXPECT(mask.is_error());
  81. EXPECT(mask.error().string_literal().starts_with("invalid symbolic permission"sv));
  82. mask = Core::FilePermissionsMask::from_symbolic_notation("u+rw;g+rw"sv);
  83. EXPECT(mask.is_error());
  84. EXPECT(mask.error().string_literal().starts_with("invalid symbolic permission"sv));
  85. }
  86. TEST_CASE(file_permission_mask_parse)
  87. {
  88. auto numeric_mask = Core::FilePermissionsMask::parse("750"sv);
  89. auto symbolic_mask = Core::FilePermissionsMask::parse("u=rwx,g=rx,o-rwx"sv);
  90. EXPECT_EQ(numeric_mask.value().apply(0), 0750);
  91. EXPECT_EQ(symbolic_mask.value().apply(0), 0750);
  92. EXPECT_EQ(numeric_mask.value().clear_mask(), symbolic_mask.value().clear_mask());
  93. EXPECT_EQ(numeric_mask.value().write_mask(), symbolic_mask.value().write_mask());
  94. auto mask = Core::FilePermissionsMask::parse("888"sv);
  95. EXPECT(mask.is_error());
  96. mask = Core::FilePermissionsMask::parse("z+rw"sv);
  97. EXPECT(mask.is_error());
  98. }
  99. TEST_CASE(numeric_mask_special_bits)
  100. {
  101. {
  102. auto mask = Core::FilePermissionsMask::parse("750"sv);
  103. EXPECT(!mask.is_error());
  104. EXPECT_EQ(mask.value().apply(07000), 07750);
  105. }
  106. {
  107. auto mask = Core::FilePermissionsMask::parse("7750"sv);
  108. EXPECT(!mask.is_error());
  109. EXPECT_EQ(mask.value().apply(0), 07750);
  110. }
  111. {
  112. auto mask = Core::FilePermissionsMask::parse("0750"sv);
  113. EXPECT(!mask.is_error());
  114. EXPECT_EQ(mask.value().apply(07000), 0750);
  115. }
  116. }