| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Unit tests for MountEntry. |
| |
| #include "secanomalyd/mount_entry.h" |
| #include "secanomalyd/system_context_mock.h" |
| |
| #include <gtest/gtest.h> |
| |
| namespace secanomalyd { |
| |
| TEST(MountEntryTest, RoRootFs) { |
| MountEntry e("/dev/root / ext2 ro,seclabel,relatime 0 0"); |
| ASSERT_FALSE(e.IsWX()); |
| } |
| |
| TEST(MountEntryTest, WNoExecStateful) { |
| MountEntry e( |
| "/dev/sda1 /mnt/stateful_partition ext4 " |
| "rw,seclabel,nosuid,nodev,noexec,noatime," |
| "resgid=20119,commit=600,data=ordered 0 0"); |
| ASSERT_FALSE(e.IsWX()); |
| } |
| |
| TEST(MountEntryTest, WXUsrLocal) { |
| MountEntry e( |
| "/dev/sda1 /usr/local ext4 " |
| "rw,seclabel,nodev,noatime,resgid=20119,commit=600,data=ordered 0 0"); |
| ASSERT_TRUE(e.IsWX()); |
| } |
| |
| TEST(MountEntryTest, MisplacedRW) { |
| MountEntry e("/dev/sda1 /pointless_path ext4 ro,nodev,somethingrw"); |
| ASSERT_FALSE(e.IsWX()); |
| } |
| |
| TEST(MountEntryTest, MisplacedNoExec) { |
| MountEntry e("/dev/sda1 /pointless_path ext4 rw,nodev,notreallynoexec"); |
| ASSERT_TRUE(e.IsWX()); |
| } |
| |
| TEST(MountEntryTest, UsbDrive) { |
| MountEntry e( |
| "/dev/sdb1 /media/removable/USB\040Drive ext2 " |
| "rw,dirsync,nosuid,nodev,noexec,seclabel,relatime,nosymfollow"); |
| ASSERT_TRUE(e.IsUsbDriveOrArchive()); |
| } |
| |
| TEST(MountEntryTest, ArchiveFileInDownloads) { |
| MountEntry e( |
| "fuse:/home/chronos/u-f0df208cd7759644d43f8d7c4c5900e4a4875275/MyFiles/" |
| "Downloads/sample.rar /media/archive/sample.rar fuse.rarfs " |
| "ro,dirsync,nosuid,nodev,noexec,relatime,nosymfollow," |
| "user_id=1000,group_id=1001,default_permissions,allow_other 0 0"); |
| ASSERT_TRUE(e.IsUsbDriveOrArchive()); |
| } |
| |
| TEST(MountEntryTest, UsrLocalIsUsrLocal) { |
| MountEntry e( |
| "/dev/sda1 /usr/local ext4 " |
| "rw,seclabel,nodev,noatime,resgid=20119,commit=600,data=ordered 0 0"); |
| ASSERT_TRUE(e.IsDestInUsrLocal()); |
| } |
| |
| TEST(MountEntryTest, UsrLocalBinIsInUsrLocal) { |
| MountEntry e( |
| "/dev/sda1 /usr/local/bin ext4 " |
| "rw,seclabel,nodev,noatime,resgid=20119,commit=600,data=ordered 0 0"); |
| ASSERT_TRUE(e.IsDestInUsrLocal()); |
| } |
| |
| TEST(MountEntryTest, UsrIsNotInUsrLocal) { |
| MountEntry e( |
| "/dev/sda1 /usr ext4 " |
| "rw,seclabel,nodev,noatime,resgid=20119,commit=600,data=ordered 0 0"); |
| ASSERT_FALSE(e.IsDestInUsrLocal()); |
| } |
| |
| TEST(MountEntryTest, Namespace) { |
| MountEntry e("nsfs /run/netns/connected_netns_0 nsfs rw 0 0"); |
| ASSERT_TRUE(e.IsNamespaceBindMount()); |
| } |
| |
| TEST(MountEntryTest, OtherTypesAreNotNamespaceMounts) { |
| MountEntry e("src /run/netns/connected_netns_0 msphs rw 0 0"); |
| ASSERT_FALSE(e.IsNamespaceBindMount()); |
| } |
| |
| TEST(MountEntryTest, HashReplacedSuccessfully) { |
| MountEntry e( |
| "/dev/mmcblk0p1 " |
| "/home/root/14894cd6a6ea7a741dd3b855cea5bf82c5a784f5/android-data/data " |
| "ext4 rw,seclabel,nodev,noatime 0 0"); |
| |
| ASSERT_EQ(e.dest().value(), "/home/root/<hash>/android-data/data"); |
| } |
| |
| TEST(MountEntryTest, IsKnownMountIncludesRunArcSharedMountsData) { |
| MountEntry e( |
| "/dev/mmcblk1p1 /run/arc/shared_mounts/data ext4 " |
| "rw,seclabel,nosuid,nodev"); |
| |
| SystemContextMock c_login_screen(/*logged_in=*/false); |
| SystemContextMock c_logged_in(/*logged_in=*/true); |
| |
| ASSERT_TRUE(e.IsKnownMount(c_login_screen)); |
| ASSERT_FALSE(e.IsKnownMount(c_logged_in)); |
| } |
| |
| TEST(MountEntryTest, RandomMountIsNotKnown) { |
| MountEntry e( |
| "/dev/mmcblk1p1 /some/random/location ext4 " |
| "rw,seclabel,nosuid,nodev"); |
| |
| SystemContextMock c(/*logged_in=*/false); |
| ASSERT_FALSE(e.IsKnownMount(c)); |
| } |
| |
| } // namespace secanomalyd |