|
35 | 35 | #include <libdm/dm.h>
|
36 | 36 | #include <libdm/loop_control.h>
|
37 | 37 | #include "test_util.h"
|
| 38 | +#include "utility.h" |
38 | 39 |
|
39 | 40 | using namespace std;
|
40 | 41 | using namespace std::chrono_literals;
|
@@ -617,3 +618,64 @@ TEST(libdm, GetParentBlockDeviceByPath) {
|
617 | 618 | auto sub_block_device = dm.GetParentBlockDeviceByPath(dev.path());
|
618 | 619 | ASSERT_EQ(loop.device(), *sub_block_device);
|
619 | 620 | }
|
| 621 | + |
| 622 | +TEST(libdm, DeleteDeviceDeferredNoReferences) { |
| 623 | + unique_fd tmp(CreateTempFile("file_1", 4096)); |
| 624 | + ASSERT_GE(tmp, 0); |
| 625 | + LoopDevice loop(tmp, 10s); |
| 626 | + ASSERT_TRUE(loop.valid()); |
| 627 | + |
| 628 | + DmTable table; |
| 629 | + ASSERT_TRUE(table.Emplace<DmTargetLinear>(0, 1, loop.device(), 0)); |
| 630 | + ASSERT_TRUE(table.valid()); |
| 631 | + TempDevice dev("libdm-test-dm-linear", table); |
| 632 | + ASSERT_TRUE(dev.valid()); |
| 633 | + |
| 634 | + DeviceMapper& dm = DeviceMapper::Instance(); |
| 635 | + |
| 636 | + std::string path; |
| 637 | + ASSERT_TRUE(dm.GetDmDevicePathByName("libdm-test-dm-linear", &path)); |
| 638 | + ASSERT_EQ(0, access(path.c_str(), F_OK)); |
| 639 | + |
| 640 | + ASSERT_TRUE(dm.DeleteDeviceDeferred("libdm-test-dm-linear")); |
| 641 | + |
| 642 | + ASSERT_TRUE(WaitForFileDeleted(path, 5s)); |
| 643 | + ASSERT_EQ(DmDeviceState::INVALID, dm.GetState("libdm-test-dm-linear")); |
| 644 | + ASSERT_NE(0, access(path.c_str(), F_OK)); |
| 645 | + ASSERT_EQ(ENOENT, errno); |
| 646 | +} |
| 647 | + |
| 648 | +TEST(libdm, DeleteDeviceDeferredWaitsForLastReference) { |
| 649 | + unique_fd tmp(CreateTempFile("file_1", 4096)); |
| 650 | + ASSERT_GE(tmp, 0); |
| 651 | + LoopDevice loop(tmp, 10s); |
| 652 | + ASSERT_TRUE(loop.valid()); |
| 653 | + |
| 654 | + DmTable table; |
| 655 | + ASSERT_TRUE(table.Emplace<DmTargetLinear>(0, 1, loop.device(), 0)); |
| 656 | + ASSERT_TRUE(table.valid()); |
| 657 | + TempDevice dev("libdm-test-dm-linear", table); |
| 658 | + ASSERT_TRUE(dev.valid()); |
| 659 | + |
| 660 | + DeviceMapper& dm = DeviceMapper::Instance(); |
| 661 | + |
| 662 | + std::string path; |
| 663 | + ASSERT_TRUE(dm.GetDmDevicePathByName("libdm-test-dm-linear", &path)); |
| 664 | + ASSERT_EQ(0, access(path.c_str(), F_OK)); |
| 665 | + |
| 666 | + { |
| 667 | + // Open a reference to block device. |
| 668 | + unique_fd fd(TEMP_FAILURE_RETRY(open(dev.path().c_str(), O_RDONLY | O_CLOEXEC))); |
| 669 | + ASSERT_GE(fd.get(), 0); |
| 670 | + |
| 671 | + ASSERT_TRUE(dm.DeleteDeviceDeferred("libdm-test-dm-linear")); |
| 672 | + |
| 673 | + ASSERT_EQ(0, access(path.c_str(), F_OK)); |
| 674 | + } |
| 675 | + |
| 676 | + // After release device will be removed. |
| 677 | + ASSERT_TRUE(WaitForFileDeleted(path, 5s)); |
| 678 | + ASSERT_EQ(DmDeviceState::INVALID, dm.GetState("libdm-test-dm-linear")); |
| 679 | + ASSERT_NE(0, access(path.c_str(), F_OK)); |
| 680 | + ASSERT_EQ(ENOENT, errno); |
| 681 | +} |
0 commit comments