diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-01-03 20:14:24 +0000 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-01-03 20:14:24 +0000 | 
| commit | 51a439106355a9de64f62c5356465685d8cbc5bf (patch) | |
| tree | 455693db0499298192c52b8c269f70a2f3540ce9 | |
| parent | Use std::atomic<>s for thread test, count failures, sleep inside loop (diff) | |
| download | netfs-51a439106355a9de64f62c5356465685d8cbc5bf.tar.bz2 netfs-51a439106355a9de64f62c5356465685d8cbc5bf.tar.xz netfs-51a439106355a9de64f62c5356465685d8cbc5bf.zip  | |
Fixup memory leaks and race conditions in testFuse
| -rw-r--r-- | netfs/unittests/testFuse.cpp | 46 | 
1 files changed, 39 insertions, 7 deletions
diff --git a/netfs/unittests/testFuse.cpp b/netfs/unittests/testFuse.cpp index 17095bb..1185a7f 100644 --- a/netfs/unittests/testFuse.cpp +++ b/netfs/unittests/testFuse.cpp @@ -18,30 +18,43 @@ class FuseMountPoint : public MockDaemonHost, public NetFS::FuseApp {  public:  	FuseMountPoint() :  		MockDaemonHost(::testEndpoint, {"--NetFSD.ConfigPath=" + (rootDir / "defaultDaemon.xml").string()}), -		NetFS::FuseApp({::testUri}) +		NetFS::FuseApp({::testUri}), fargs {}  	{ -		std::filesystem::remove(mntpnt); +		std::filesystem::remove_all(mntpnt);  		std::filesystem::create_directory(mntpnt); -		fuse_args fargs {};  		::fuse_opt_add_arg(&fargs, selfExe.c_str());  		::fuse_opt_add_arg(&fargs, "-onoauto_cache");  		::fuse_opt_add_arg(&fargs, "-oattr_timeout=0");  		::fuse_opt_add_arg(&fargs, "-oac_attr_timeout=0");  		fs = ::fuse_new(&fargs, &operations, sizeof(fuse_operations), this); -		::fuse_opt_free_args(&fargs);  		BOOST_REQUIRE(fs); +	} + +	void +	start() +	{ +		BOOST_REQUIRE(!th);  		BOOST_REQUIRE_EQUAL(0, ::fuse_mount(fs, mntpnt.c_str()));  		th = std::make_unique<std::thread>(::fuse_loop, fs); +		BOOST_REQUIRE(th);  	}  	~FuseMountPoint() override  	{ -		::fuse_unmount(fs); +		stop(); +		std::filesystem::remove(mntpnt); +		::fuse_destroy(fs); +		::fuse_opt_free_args(&fargs); +	} + +	void +	stop() +	{  		if (th) { +			::fuse_unmount(fs);  			th->join(); +			th.reset();  		} -		std::filesystem::remove(mntpnt); -		::fuse_destroy(fs);  	}  	SPECIAL_MEMBERS_DELETE(FuseMountPoint); @@ -69,6 +82,7 @@ public:  	}  	struct fuse * fs; +	struct fuse_args fargs;  	std::unique_ptr<std::thread> th;  }; @@ -100,13 +114,31 @@ get_lstat(const std::filesystem::path & p)  BOOST_FIXTURE_TEST_SUITE(fmp, FuseMountPoint); +class Run { +public: +	Run(FuseMountPoint * _p) : p {_p} +	{ +		p->start(); +	} +	~Run() +	{ +		p->stop(); +	} +	SPECIAL_MEMBERS_DELETE(Run); + +private: +	FuseMountPoint * p; +}; +  BOOST_AUTO_TEST_CASE(fuse, *boost::unit_test::timeout(5))  { +	Run r {this};  	BOOST_REQUIRE(std::filesystem::is_directory(mntpnt));  }  BOOST_AUTO_TEST_CASE(fuse_ls, *boost::unit_test::timeout(5))  { +	Run r {this};  	BOOST_REQUIRE(std::filesystem::is_directory(mntpnt));  	BOOST_REQUIRE(std::filesystem::is_empty(mntpnt));  	const auto rpath = mntpnt / "me";  | 
