Repository navigation
Expand file tree
/
Copy pathfile_lock_test.cpp
More file actions
153 lines (140 loc) · 4.03 KB
/
Copy pathfile_lock_test.cpp
File metadata and controls
153 lines (140 loc) · 4.03 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2004-2012. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/interprocess for documentation.
//
//////////////////////////////////////////////////////////////////////////////
#include <boost/interprocess/sync/file_lock.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/file_mapping.hpp>
#include "util.hpp"
#include "mutex_test_template.hpp"
#include "sharable_mutex_test_template.hpp"
#include "get_process_id_name.hpp"
#include <fstream>
#include <string>
#include <cstdio> //std::remove
using namespace boost::interprocess;
//This wrapper is necessary to have a default constructor
//in generic mutex_test_template functions
class file_lock_lock_test_wrapper
: public boost::interprocess::file_lock
{
public:
file_lock_lock_test_wrapper()
: boost::interprocess::file_lock(get_filename().c_str())
{}
};
//The open_or_create constructor must create the file if it does not exist and
//must open an already existing file without truncating it.
int test_open_or_create()
{
std::remove(get_filename().c_str());
//The file does not exist, so the open-only constructor must fail
try{
file_lock flock(get_filename().c_str());
return 1;
}
catch(interprocess_exception &){}
//...but the open_or_create constructor must create it
{
file_lock flock(open_or_create, get_filename().c_str());
scoped_lock<file_lock> sl(flock);
}
{
std::ifstream file(get_filename().c_str());
if(!file){
return 1;
}
}
//Write some data to check that opening an existing file does not truncate it
{
std::ofstream file(get_filename().c_str());
if(!file){
return 1;
}
file << "0123456789";
}
{
permissions perm;
perm.set_unrestricted();
file_lock flock(open_or_create, get_filename().c_str(), perm);
scoped_lock<file_lock> sl(flock, try_to_lock);
if(!sl){
return 1;
}
}
{
std::ifstream file(get_filename().c_str());
std::string contents;
if(!(file >> contents) || contents != "0123456789"){
return 1;
}
}
#if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES)
std::remove(get_filename().c_str());
{
file_lock flock(open_or_create, get_wfilename().c_str());
scoped_lock<file_lock> sl(flock);
}
{
std::ifstream file(get_filename().c_str());
if(!file){
return 1;
}
}
#endif
std::remove(get_filename().c_str());
return 0;
}
int main ()
{
if(test_open_or_create()){
return 1;
}
//Destroy and create file
{
std::remove(get_filename().c_str());
std::ofstream file(get_filename().c_str());
if(!file){
return 1;
}
{
file_lock flock(get_filename().c_str());
{
scoped_lock<file_lock> sl(flock);
}
{
scoped_lock<file_lock> sl(flock, try_to_lock);
}
{
scoped_lock<file_lock> sl(flock, test::ptime_delay_ms(1));
}
{
scoped_lock<file_lock> sl(flock, test::boost_systemclock_delay_ms(1));
}
{
scoped_lock<file_lock> sl(flock, test::std_systemclock_delay_ms(1));
}
}
#if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES)
file_lock flock(get_wfilename().c_str());
#endif
}
{
//Now test move semantics
file_lock mapping(get_filename().c_str());
file_lock move_ctor(boost::move(mapping));
file_lock move_assign;
move_assign = boost::move(move_ctor);
mapping.swap(move_assign);
}
test::test_all_lock<file_lock_lock_test_wrapper>();
//test::test_all_mutex<file_lock_lock_test_wrapper>();
//test::test_all_sharable_mutex<file_lock_lock_test_wrapper>();
std::remove(get_filename().c_str());
return 0;
}