// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab /* * Ceph - scalable distributed file system * * Copyright (C) 2015 Red Hat, Inc. * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software * Foundation. See file COPYING. * */ #include #include #include #include "include/rados/librgw.h" #include "include/rados/rgw_file.h" #include "gtest/gtest.h" #include "common/ceph_argparse.h" #include "common/debug.h" #include "global/global_init.h" #define dout_subsys ceph_subsys_rgw namespace { librgw_t rgw = nullptr; string userid("testuser"); string access_key(""); string secret_key(""); struct rgw_fs *fs = nullptr; uint32_t owner_uid = 867; uint32_t owner_gid = 5309; uint32_t create_mask = RGW_SETATTR_UID | RGW_SETATTR_GID | RGW_SETATTR_MODE; bool do_create = false; bool do_delete = false; bool do_multi = false; int multi_cnt = 10; string bucket_name = "sorry_dave"; struct { int argc; char **argv; } saved_args; } TEST(LibRGW, INIT) { int ret = librgw_create(&rgw, saved_args.argc, saved_args.argv); ASSERT_EQ(ret, 0); ASSERT_NE(rgw, nullptr); } TEST(LibRGW, MOUNT) { int ret = rgw_mount2(rgw, userid.c_str(), access_key.c_str(), secret_key.c_str(), "/", &fs, RGW_MOUNT_FLAG_NONE); ASSERT_EQ(ret, 0); ASSERT_NE(fs, nullptr); } TEST(LibRGW, CREATE_BUCKET) { if (do_create) { struct stat st; struct rgw_file_handle *fh; st.st_uid = owner_uid; st.st_gid = owner_gid; st.st_mode = 755; int ret = rgw_mkdir(fs, fs->root_fh, bucket_name.c_str(), &st, create_mask, &fh, RGW_MKDIR_FLAG_NONE); ASSERT_EQ(ret, 0); } } TEST(LibRGW, DELETE_BUCKET) { if (do_delete) { int ret = rgw_unlink(fs, fs->root_fh, bucket_name.c_str(), RGW_UNLINK_FLAG_NONE); ASSERT_EQ(ret, 0); } } TEST(LibRGW, CREATE_BUCKET_MULTI) { if (do_multi) { int ret; struct stat st; struct rgw_file_handle *fh; st.st_uid = owner_uid; st.st_gid = owner_gid; st.st_mode = 755; for (int ix = 0; ix < multi_cnt; ++ix) { string bn = bucket_name; bn += to_string(ix); ret = rgw_mkdir(fs, fs->root_fh, bn.c_str(), &st, create_mask, &fh, RGW_MKDIR_FLAG_NONE); ASSERT_EQ(ret, 0); std::cout << "created: " << bn << std::endl; } } } TEST(LibRGW, DELETE_BUCKET_MULTI) { if (do_multi) { for (int ix = 0; ix < multi_cnt; ++ix) { string bn = bucket_name; bn += to_string(ix); int ret = rgw_unlink(fs, fs->root_fh, bn.c_str(), RGW_UNLINK_FLAG_NONE); ASSERT_EQ(ret, 0); } } } TEST(LibRGW, CLEANUP) { // do nothing } TEST(LibRGW, UMOUNT) { if (! fs) return; int ret = rgw_umount(fs, RGW_UMOUNT_FLAG_NONE); ASSERT_EQ(ret, 0); } TEST(LibRGW, SHUTDOWN) { librgw_shutdown(rgw); } int main(int argc, char *argv[]) { char *v{nullptr}; string val; vector args; argv_to_vec(argc, const_cast(argv), args); env_to_vec(args); v = getenv("AWS_ACCESS_KEY_ID"); if (v) { access_key = v; } v = getenv("AWS_SECRET_ACCESS_KEY"); if (v) { secret_key = v; } for (auto arg_iter = args.begin(); arg_iter != args.end();) { if (ceph_argparse_witharg(args, arg_iter, &val, "--access", (char*) nullptr)) { access_key = val; } else if (ceph_argparse_witharg(args, arg_iter, &val, "--secret", (char*) nullptr)) { secret_key = val; } else if (ceph_argparse_witharg(args, arg_iter, &val, "--userid", (char*) nullptr)) { userid = val; } else if (ceph_argparse_witharg(args, arg_iter, &val, "--bn", (char*) nullptr)) { bucket_name = val; } else if (ceph_argparse_witharg(args, arg_iter, &val, "--uid", (char*) nullptr)) { owner_uid = std::stoi(val); } else if (ceph_argparse_witharg(args, arg_iter, &val, "--gid", (char*) nullptr)) { owner_gid = std::stoi(val); } else if (ceph_argparse_flag(args, arg_iter, "--create", (char*) nullptr)) { do_create = true; } else if (ceph_argparse_flag(args, arg_iter, "--delete", (char*) nullptr)) { do_delete = true; } else if (ceph_argparse_flag(args, arg_iter, "--multi", (char*) nullptr)) { do_multi = true; } else { ++arg_iter; } } /* don't accidentally run as anonymous */ if ((access_key == "") || (secret_key == "")) { std::cout << argv[0] << " no AWS credentials, exiting" << std::endl; return EPERM; } saved_args.argc = argc; saved_args.argv = argv; ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }