/*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
*/
-#include "folly/FileUtil.h"
-#include "folly/detail/FileUtilDetail.h"
+#include <folly/FileUtil.h>
+#include <folly/detail/FileUtilDetail.h>
#include <deque>
#include <gflags/gflags.h>
#include <gtest/gtest.h>
-#include "folly/Benchmark.h"
-#include "folly/Range.h"
-#include "folly/String.h"
+#include <folly/Benchmark.h>
+#include <folly/Range.h>
+#include <folly/String.h>
namespace folly { namespace test {
using namespace fileutil_detail;
+using namespace std;
namespace {
return n;
}
-ssize_t Reader::operator()(int fd, void* buf, size_t count) {
+ssize_t Reader::operator()(int /* fd */, void* buf, size_t count) {
ssize_t n = nextSize();
if (n <= 0) {
return n;
}
- if (n > count) {
+ if (size_t(n) > count) {
throw std::runtime_error("requested count too small");
}
memcpy(buf, data_.data(), n);
return operator()(fd, buf, count);
}
-ssize_t Reader::operator()(int fd, const iovec* iov, int count) {
+ssize_t Reader::operator()(int /* fd */, const iovec* iov, int count) {
ssize_t n = nextSize();
if (n <= 0) {
return n;
for (auto& p : readers_) {
std::string out(in_.size(), '\0');
EXPECT_EQ(p.first, wrapFull(p.second, 0, &out[0], out.size()));
- if (p.first != -1) {
+ if (p.first != (typeof(p.first))(-1)) {
EXPECT_EQ(in_.substr(0, p.first), out.substr(0, p.first));
}
}
for (auto& p : readers_) {
std::string out(in_.size(), '\0');
EXPECT_EQ(p.first, wrapFull(p.second, 0, &out[0], out.size(), off_t(42)));
- if (p.first != -1) {
+ if (p.first != (typeof(p.first))(-1)) {
EXPECT_EQ(in_.substr(0, p.first), out.substr(0, p.first));
}
}
auto iov = buf.iov();
EXPECT_EQ(p.first, wrapvFull(p.second, 0, iov.data(), iov.size()));
- if (p.first != -1) {
+ if (p.first != (typeof(p.first))(-1)) {
EXPECT_EQ(in_.substr(0, p.first), buf.join().substr(0, p.first));
}
}
}
+#if FOLLY_HAVE_PREADV
TEST_F(FileUtilTest, preadv) {
for (auto& p : readers_) {
IovecBuffers buf({12, 19, 31});
auto iov = buf.iov();
EXPECT_EQ(p.first,
wrapvFull(p.second, 0, iov.data(), iov.size(), off_t(42)));
- if (p.first != -1) {
+ if (p.first != (typeof(p.first))(-1)) {
EXPECT_EQ(in_.substr(0, p.first), buf.join().substr(0, p.first));
}
}
}
-
+#endif
+
+TEST(String, readFile) {
+ srand(time(nullptr));
+ const string tmpPrefix = to<string>("/tmp/folly-file-util-test-",
+ getpid(), "-", rand(), "-");
+ const string afile = tmpPrefix + "myfile";
+ const string emptyFile = tmpPrefix + "myfile2";
+
+ SCOPE_EXIT {
+ unlink(afile.c_str());
+ unlink(emptyFile.c_str());
+ };
+
+ EXPECT_TRUE(writeFile(string(), emptyFile.c_str()));
+ EXPECT_TRUE(writeFile(StringPiece("bar"), afile.c_str()));
+
+ {
+ string contents;
+ EXPECT_TRUE(readFile(emptyFile.c_str(), contents));
+ EXPECT_EQ(contents, "");
+ EXPECT_TRUE(readFile(afile.c_str(), contents, 0));
+ EXPECT_EQ("", contents);
+ EXPECT_TRUE(readFile(afile.c_str(), contents, 2));
+ EXPECT_EQ("ba", contents);
+ EXPECT_TRUE(readFile(afile.c_str(), contents));
+ EXPECT_EQ("bar", contents);
+ }
+ {
+ vector<unsigned char> contents;
+ EXPECT_TRUE(readFile(emptyFile.c_str(), contents));
+ EXPECT_EQ(vector<unsigned char>(), contents);
+ EXPECT_TRUE(readFile(afile.c_str(), contents, 0));
+ EXPECT_EQ(vector<unsigned char>(), contents);
+ EXPECT_TRUE(readFile(afile.c_str(), contents, 2));
+ EXPECT_EQ(vector<unsigned char>({'b', 'a'}), contents);
+ EXPECT_TRUE(readFile(afile.c_str(), contents));
+ EXPECT_EQ(vector<unsigned char>({'b', 'a', 'r'}), contents);
+ }
+}
}} // namespaces
int main(int argc, char *argv[]) {
testing::InitGoogleTest(&argc, argv);
- google::ParseCommandLineFlags(&argc, &argv, true);
+ gflags::ParseCommandLineFlags(&argc, &argv, true);
return RUN_ALL_TESTS();
}
-