]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/librgw_file.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2015 Red Hat, Inc.
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
19 #include "include/rados/librgw.h"
20 #include "include/rados/rgw_file.h"
22 #include "gtest/gtest.h"
23 #include "common/ceph_argparse.h"
24 #include "common/debug.h"
25 #include "global/global_init.h"
27 #define dout_subsys ceph_subsys_rgw
30 librgw_t rgw
= nullptr;
31 string
uid("testuser");
32 string
access_key("");
33 string
secret_key("");
34 struct rgw_fs
*fs
= nullptr;
35 typedef std::tuple
<string
, uint64_t, struct rgw_file_handle
*> fid_type
; //in c++2014 can alias...
36 typedef std::tuple
<fid_type
, std::vector
<fid_type
>> bucket_type
;
38 std::vector
<fid_type
> fids1
;
39 std::vector
<bucket_type
> bucket_matrix
;
41 bool do_getattr
= false;
50 int ret
= librgw_create(&rgw
, saved_args
.argc
, saved_args
.argv
);
52 ASSERT_NE(rgw
, nullptr);
56 int ret
= rgw_mount(rgw
, uid
.c_str(), access_key
.c_str(), secret_key
.c_str(),
57 &fs
, RGW_MOUNT_FLAG_NONE
);
59 ASSERT_NE(fs
, nullptr);
62 TEST(LibRGW
, GETATTR_ROOT
) {
70 int ret
= rgw_getattr(fs
, fs
->root_fh
, &st
, RGW_GETATTR_FLAG_NONE
);
76 static bool r1_cb(const char* name
, void *arg
, uint64_t offset
,
78 // don't need arg--it would point to fids1
79 fids1
.push_back(fid_type(name
, offset
, nullptr /* handle */));
80 return true; /* XXX ? */
84 TEST(LibRGW
, LIST_BUCKETS
) {
85 /* list buckets via readdir in fs root */
93 int ret
= rgw_readdir(fs
, fs
->root_fh
, &offset
, r1_cb
, &fids1
, &eof
,
94 RGW_READDIR_FLAG_NONE
);
95 for (auto& fid
: fids1
) {
96 std::cout
<< "fname: " << get
<0>(fid
) << " fid: " << get
<1>(fid
)
98 /* push row for bucket into bucket_matrix */
99 bucket_matrix
.push_back(bucket_type(fid
, std::vector
<fid_type
>()));
104 TEST(LibRGW
, LOOKUP_BUCKETS
) {
110 for (auto& fid_row
: bucket_matrix
) {
111 auto& fid
= get
<0>(fid_row
);
112 // auto& obj_vector = get<1>(fid_row);
113 struct rgw_file_handle
*rgw_fh
= nullptr;
114 ASSERT_EQ(0, rgw_lookup(fs
, fs
->root_fh
, get
<0>(fid
).c_str(), &rgw_fh
,
116 get
<2>(fid
) = rgw_fh
;
117 ASSERT_NE(get
<2>(fid
), nullptr);
121 TEST(LibRGW
, GETATTR_BUCKETS
) {
130 for (auto& fid_row
: bucket_matrix
) {
131 auto& fid
= get
<0>(fid_row
);
132 struct rgw_file_handle
*rgw_fh
= get
<2>(fid
);
133 ASSERT_EQ(0, rgw_getattr(fs
, rgw_fh
, &st
, RGW_GETATTR_FLAG_NONE
));
139 static bool r2_cb(const char* name
, void *arg
, uint64_t offset
,
141 std::vector
<fid_type
>& obj_vector
= *(static_cast<std::vector
<fid_type
>*>(arg
));
142 obj_vector
.push_back(fid_type(name
, offset
, nullptr));
143 return true; /* XXX ? */
147 TEST(LibRGW
, LIST_OBJECTS
) {
148 /* list objects via readdir, bucketwise */
154 for (auto& fid_row
: bucket_matrix
) {
155 auto& fid
= get
<0>(fid_row
); // bucket
156 std::vector
<fid_type
>& obj_vector
= get
<1>(fid_row
); // objects in bucket
157 struct rgw_file_handle
*bucket_fh
= get
<2>(fid
);
159 ldout(g_ceph_context
, 0) << __func__
<< " readdir on bucket " << get
<0>(fid
)
164 int ret
= rgw_readdir(fs
, bucket_fh
, &offset
, r2_cb
, &obj_vector
, &eof
,
165 RGW_READDIR_FLAG_NONE
);
166 for (auto& obj
: obj_vector
) {
167 std::cout
<< "fname: " << get
<0>(obj
) << " fid: " << get
<1>(obj
)
174 extern bool global_stop
;
176 TEST(LibRGW
, GETATTR_OBJECTS
) {
184 for (auto& fid_row
: bucket_matrix
) {
185 auto& fid
= get
<0>(fid_row
); // bucket
186 std::vector
<fid_type
>& obj_vector
= get
<1>(fid_row
); // objects in bucket
187 struct rgw_file_handle
*bucket_fh
= get
<2>(fid
);
189 for (auto& obj
: obj_vector
) {
190 struct rgw_file_handle
*obj_fh
= nullptr;
191 std::string object_name
= get
<0>(obj
);
192 ret
= rgw_lookup(fs
, bucket_fh
, get
<0>(obj
).c_str(), &obj_fh
,
195 get
<2>(obj
) = obj_fh
; // stash obj_fh for cleanup
196 ASSERT_NE(get
<2>(obj
), nullptr);
197 ret
= rgw_getattr(fs
, obj_fh
, &st
,
198 RGW_GETATTR_FLAG_NONE
); // now, getattr
205 TEST(LibRGW
, CLEANUP
) {
209 /* release file handles */
210 for (auto& fid_row
: bucket_matrix
) {
211 auto& bucket
= get
<0>(fid_row
); // bucket
212 std::vector
<fid_type
>& obj_vector
= get
<1>(fid_row
); // objects in bucket
213 for (auto& obj
: obj_vector
) {
214 struct rgw_file_handle
*obj_fh
= get
<2>(obj
);
216 ret
= rgw_fh_rele(fs
, obj_fh
, 0 /* flags */);
221 struct rgw_file_handle
*bucket_fh
= get
<2>(bucket
);
223 ret
= rgw_fh_rele(fs
, bucket_fh
, 0 /* flags */);
229 TEST(LibRGW
, UMOUNT
) {
233 int ret
= rgw_umount(fs
, RGW_UMOUNT_FLAG_NONE
);
237 TEST(LibRGW
, SHUTDOWN
) {
238 librgw_shutdown(rgw
);
241 int main(int argc
, char *argv
[])
245 vector
<const char*> args
;
247 argv_to_vec(argc
, const_cast<const char**>(argv
), args
);
250 v
= getenv("AWS_ACCESS_KEY_ID");
255 v
= getenv("AWS_SECRET_ACCESS_KEY");
260 for (auto arg_iter
= args
.begin(); arg_iter
!= args
.end();) {
261 if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--access",
264 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--secret",
267 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--uid",
270 } else if (ceph_argparse_flag(args
, arg_iter
, "--getattr",
278 /* dont accidentally run as anonymous */
279 if ((access_key
== "") ||
280 (secret_key
== "")) {
281 std::cout
<< argv
[0] << " no AWS credentials, exiting" << std::endl
;
285 saved_args
.argc
= argc
;
286 saved_args
.argv
= argv
;
288 ::testing::InitGoogleTest(&argc
, argv
);
289 return RUN_ALL_TESTS();