2121 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2222 * SOFTWARE.
2323 * */
24+ #include < utime.h>
2425#include " cmn/path_base.h"
2526#include " space/space_manager.h"
27+ #include " file/file.h"
2628
2729class UCSpaceManagerTest : public UC ::PathBase {};
2830
@@ -88,4 +90,36 @@ TEST_F(UCSpaceManagerTest, IterAllBlockFile)
8890 count = 0 ;
8991 while (!layout->NextDataFilePath (iter).empty ()) { count++; }
9092 ASSERT_EQ (count, 3 );
93+ }
94+
95+ TEST_F (UCSpaceManagerTest, NewBlockReuseIfActiveAccessedLongAgo)
96+ {
97+ UC::SpaceManager spaceMgr;
98+ constexpr size_t blockSize = 1024 * 1024 ;
99+ constexpr size_t capacity = blockSize * 1024 ;
100+ ASSERT_EQ (spaceMgr.Setup ({this ->Path ()}, blockSize, false , capacity), UC::Status::OK ());
101+ const auto * layout = spaceMgr.GetSpaceLayout ();
102+ ASSERT_NE (layout, nullptr );
103+
104+ const std::string block1 = " a1b2c3d4e5f6789012345678901234ab" ;
105+ auto parent = UC::File::Make (layout->DataFileParent (block1, /* activated=*/ true ));
106+ ASSERT_NE (parent, nullptr );
107+ ASSERT_EQ (parent->MkDir (), UC::Status::OK ());
108+
109+ const auto activePath = layout->DataFilePath (block1, /* activated=*/ true );
110+ auto activeFile = UC::File::Make (activePath);
111+ ASSERT_NE (activeFile, nullptr );
112+ ASSERT_EQ (activeFile->Open (UC::IFile::OpenFlag::CREATE | UC::IFile::OpenFlag::READ_WRITE), UC::Status::OK ());
113+ activeFile->Close ();
114+
115+ // NewBlock should return DuplicateKey because the file is recent
116+ ASSERT_EQ (spaceMgr.NewBlock (block1), UC::Status::DuplicateKey ());
117+
118+ // Set atime to 10 minutes ago so it is not considered recent
119+ struct utimbuf newTime;
120+ auto tp = time (nullptr ) - 600 ;
121+ newTime.modtime = tp;
122+ newTime.actime = tp;
123+ utime (activePath.c_str (), &newTime);
124+ ASSERT_EQ (spaceMgr.NewBlock (block1), UC::Status::OK ());
91125}
0 commit comments