TEST_F(TestFileCache, WriteAndReadBack) { // Set up something for FileCache to read in. char data_fn[] = "/tmp/hhvm_unit_test-testdata.XXXXXX"; int data_fd = mkstemp(data_fn); ASSERT_GT(data_fd, 0); FILE* f = fdopen(data_fd, "w"); ASSERT_TRUE(f != nullptr); fprintf(f, "%s", kTestData); fclose(f); // Set up a cache and put this data file in it. FileCache fc; fc.write("_unit_test_one_", data_fn); fc.write("_unit_test_two_", false); fc.write("/__invalid__/path/with/directories", true); string temp_dir; ASSERT_TRUE(makeTempDir(&temp_dir)); string cache_fn(temp_dir); cache_fn.append("/cache.dump"); // Flush to disk. fc.save(cache_fn.c_str()); // Sniff around the on-disk temp file. FileCache ondisk; EXPECT_EQ(ondisk.getVersion(cache_fn.c_str()), 2); // Read back into another cache. FileCache fc2; fc2.loadMmap(cache_fn.c_str(), 1); EXPECT_TRUE(fc2.fileExists("_unit_test_one_")); int read_len; bool compressed = false; const char* read_data = fc2.read("_unit_test_one_", read_len, compressed); EXPECT_STREQ(kTestData, read_data); EXPECT_EQ(fc2.fileSize("_unit_test_one_", false), strlen(kTestData)); EXPECT_TRUE(fc2.fileExists("_unit_test_two_")); EXPECT_FALSE(fc2.fileExists("_unit_test_three_")); EXPECT_TRUE(fc2.dirExists("/__invalid__")); EXPECT_TRUE(fc2.dirExists("/__invalid__/path")); EXPECT_TRUE(fc2.dirExists("/__invalid__/path/with")); EXPECT_TRUE(fc2.fileExists("/__invalid__/path/with/directories")); // -1 is a magic value... here it means "it's a PHP file"... EXPECT_EQ(fc2.fileSize("unit_test_two_", false), -1); // ... and here it means "this thing does not exist". EXPECT_EQ(fc2.fileSize("unit_test_three_", false), -1); fc2.dump(); // Clean up the mess. ASSERT_EQ(unlink(cache_fn.c_str()), 0); ASSERT_EQ(rmdir(temp_dir.c_str()), 0); ASSERT_EQ(unlink(data_fn), 0); }