#if defined(USE_LEVELDB) && defined(USE_LMDB) && defined(USE_OPENCV)
#include
#include "boost/scoped_ptr.hpp"
#include "gtest/gtest.h"
#include "caffe/common.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/util/db.hpp"
#include "caffe/util/io.hpp"
#include "caffe/test/test_caffe_main.hpp"
namespace caffe {
using boost::scoped_ptr;
template
class DBTest : public ::testing::Test {
protected:
DBTest()
: backend_(TypeParam::backend),
root_images_(string(EXAMPLES_SOURCE_DIR) + string("images/")) {}
virtual void SetUp() {
MakeTempDir(&source_);
source_ += "/db";
string keys[] = {"cat.jpg", "fish-bike.jpg"};
LOG(INFO) source_, db::NEW);
scoped_ptr txn(db->NewTransaction());
for (int i = 0; i < 2; ++i) {
Datum datum;
ReadImageToDatum(root_images_ + keys[i], i, &datum);
string out;
CHECK(datum.SerializeToString(&out));
txn->Put(keys[i], out);
}
txn->Commit();
}
virtual ~DBTest() { }
DataParameter_DB backend_;
string source_;
string root_images_;
};
struct TypeLevelDB {
static DataParameter_DB backend;
};
DataParameter_DB TypeLevelDB::backend = DataParameter_DB_LEVELDB;
struct TypeLMDB {
static DataParameter_DB backend;
};
DataParameter_DB TypeLMDB::backend = DataParameter_DB_LMDB;
// typedef ::testing::Types TestTypes;
typedef ::testing::Types TestTypes;
TYPED_TEST_CASE(DBTest, TestTypes);
TYPED_TEST(DBTest, TestGetDB) {
scoped_ptr db(db::GetDB(TypeParam::backend));
}
TYPED_TEST(DBTest, TestNext) {
scoped_ptr db(db::GetDB(TypeParam::backend));
db->Open(this->source_, db::READ);
scoped_ptr cursor(db->NewCursor());
EXPECT_TRUE(cursor->valid());
cursor->Next();
EXPECT_TRUE(cursor->valid());
cursor->Next();
EXPECT_FALSE(cursor->valid());
}
TYPED_TEST(DBTest, TestSeekToFirst) {
scoped_ptr db(db::GetDB(TypeParam::backend));
db->Open(this->source_, db::READ);
scoped_ptr cursor(db->NewCursor());
cursor->Next();
cursor->SeekToFirst();
EXPECT_TRUE(cursor->valid());
string key = cursor->key();
Datum datum;
datum.ParseFromString(cursor->value());
EXPECT_EQ(key, "cat.jpg");
EXPECT_EQ(datum.channels(), 3);
EXPECT_EQ(datum.height(), 360);
EXPECT_EQ(datum.width(), 480);
}
TYPED_TEST(DBTest, TestKeyValue) {
scoped_ptr db(db::GetDB(TypeParam::backend));
db->Open(this->source_, db::READ);
scoped_ptr cursor(db->NewCursor());
EXPECT_TRUE(cursor->valid());
string key = cursor->key();
Datum datum;
datum.ParseFromString(cursor->value());
EXPECT_EQ(key, "cat.jpg");
EXPECT_EQ(datum.channels(), 3);
EXPECT_EQ(datum.height(), 360);
EXPECT_EQ(datum.width(), 480);
cursor->Next();
EXPECT_TRUE(cursor->valid());
key = cursor->key();
datum.ParseFromString(cursor->value());
EXPECT_EQ(key, "fish-bike.jpg");
EXPECT_EQ(datum.channels(), 3);
EXPECT_EQ(datum.height(), 323);
EXPECT_EQ(datum.width(), 481);
cursor->Next();
EXPECT_FALSE(cursor->valid());
}
TYPED_TEST(DBTest, TestWrite) {
scoped_ptr db(db::GetDB(TypeParam::backend));
db->Open(this->source_, db::WRITE);
scoped_ptr txn(db->NewTransaction());
Datum datum;
ReadFileToDatum(this->root_images_ + "cat.jpg", 0, &datum);
string out;
CHECK(datum.SerializeToString(&out));
txn->Put("cat.jpg", out);
ReadFileToDatum(this->root_images_ + "fish-bike.jpg", 1, &datum);
CHECK(datum.SerializeToString(&out));
txn->Put("fish-bike.jpg", out);
txn->Commit();
}
} // namespace caffe
#endif // USE_LEVELDB, USE_LMDB and USE_OPENCV