]>
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_mount2(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
) {
68 int ret
= rgw_getattr(fs
, fs
->root_fh
, &st
, RGW_GETATTR_FLAG_NONE
);
74 static bool r1_cb(const char* name
, void *arg
, uint64_t offset
,
76 // don't need arg--it would point to fids1
77 fids1
.push_back(fid_type(name
, offset
, nullptr /* handle */));
78 return true; /* XXX ? */
82 TEST(LibRGW
, LIST_BUCKETS
) {
83 /* list buckets via readdir in fs root */
91 int ret
= rgw_readdir(fs
, fs
->root_fh
, &offset
, r1_cb
, &fids1
, &eof
,
92 RGW_READDIR_FLAG_NONE
);
93 for (auto& fid
: fids1
) {
94 std::cout
<< "fname: " << get
<0>(fid
) << " fid: " << get
<1>(fid
)
96 /* push row for bucket into bucket_matrix */
97 bucket_matrix
.push_back(bucket_type(fid
, std::vector
<fid_type
>()));
102 TEST(LibRGW
, LOOKUP_BUCKETS
) {
108 for (auto& fid_row
: bucket_matrix
) {
109 auto& fid
= get
<0>(fid_row
);
110 // auto& obj_vector = get<1>(fid_row);
111 struct rgw_file_handle
*rgw_fh
= nullptr;
112 ASSERT_EQ(0, rgw_lookup(fs
, fs
->root_fh
, get
<0>(fid
).c_str(), &rgw_fh
,
114 get
<2>(fid
) = rgw_fh
;
115 ASSERT_NE(get
<2>(fid
), nullptr);
119 TEST(LibRGW
, GETATTR_BUCKETS
) {
128 for (auto& fid_row
: bucket_matrix
) {
129 auto& fid
= get
<0>(fid_row
);
130 struct rgw_file_handle
*rgw_fh
= get
<2>(fid
);
131 ASSERT_EQ(0, rgw_getattr(fs
, rgw_fh
, &st
, RGW_GETATTR_FLAG_NONE
));
137 static bool r2_cb(const char* name
, void *arg
, uint64_t offset
,
139 std::vector
<fid_type
>& obj_vector
= *(static_cast<std::vector
<fid_type
>*>(arg
));
140 obj_vector
.push_back(fid_type(name
, offset
, nullptr));
141 return true; /* XXX ? */
145 TEST(LibRGW
, LIST_OBJECTS
) {
146 /* list objects via readdir, bucketwise */
152 for (auto& fid_row
: bucket_matrix
) {
153 auto& fid
= get
<0>(fid_row
); // bucket
154 std::vector
<fid_type
>& obj_vector
= get
<1>(fid_row
); // objects in bucket
155 struct rgw_file_handle
*bucket_fh
= get
<2>(fid
);
157 ldout(g_ceph_context
, 0) << __func__
<< " readdir on bucket " << get
<0>(fid
)
162 int ret
= rgw_readdir(fs
, bucket_fh
, &offset
, r2_cb
, &obj_vector
, &eof
,
163 RGW_READDIR_FLAG_NONE
);
164 for (auto& obj
: obj_vector
) {
165 std::cout
<< "fname: " << get
<0>(obj
) << " fid: " << get
<1>(obj
)
172 extern bool global_stop
;
174 TEST(LibRGW
, GETATTR_OBJECTS
) {
182 for (auto& fid_row
: bucket_matrix
) {
183 auto& fid
= get
<0>(fid_row
); // bucket
184 std::vector
<fid_type
>& obj_vector
= get
<1>(fid_row
); // objects in bucket
185 struct rgw_file_handle
*bucket_fh
= get
<2>(fid
);
187 for (auto& obj
: obj_vector
) {
188 struct rgw_file_handle
*obj_fh
= nullptr;
189 std::string object_name
= get
<0>(obj
);
190 ret
= rgw_lookup(fs
, bucket_fh
, get
<0>(obj
).c_str(), &obj_fh
,
193 get
<2>(obj
) = obj_fh
; // stash obj_fh for cleanup
194 ASSERT_NE(get
<2>(obj
), nullptr);
195 ret
= rgw_getattr(fs
, obj_fh
, &st
,
196 RGW_GETATTR_FLAG_NONE
); // now, getattr
203 TEST(LibRGW
, CLEANUP
) {
207 /* release file handles */
208 for (auto& fid_row
: bucket_matrix
) {
209 auto& bucket
= get
<0>(fid_row
); // bucket
210 std::vector
<fid_type
>& obj_vector
= get
<1>(fid_row
); // objects in bucket
211 for (auto& obj
: obj_vector
) {
212 struct rgw_file_handle
*obj_fh
= get
<2>(obj
);
214 ret
= rgw_fh_rele(fs
, obj_fh
, 0 /* flags */);
219 struct rgw_file_handle
*bucket_fh
= get
<2>(bucket
);
221 ret
= rgw_fh_rele(fs
, bucket_fh
, 0 /* flags */);
227 TEST(LibRGW
, UMOUNT
) {
231 int ret
= rgw_umount(fs
, RGW_UMOUNT_FLAG_NONE
);
235 TEST(LibRGW
, SHUTDOWN
) {
236 librgw_shutdown(rgw
);
239 int main(int argc
, char *argv
[])
243 vector
<const char*> args
;
245 argv_to_vec(argc
, const_cast<const char**>(argv
), args
);
248 v
= getenv("AWS_ACCESS_KEY_ID");
253 v
= getenv("AWS_SECRET_ACCESS_KEY");
258 for (auto arg_iter
= args
.begin(); arg_iter
!= args
.end();) {
259 if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--access",
262 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--secret",
265 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--uid",
268 } else if (ceph_argparse_flag(args
, arg_iter
, "--getattr",
276 /* don't accidentally run as anonymous */
277 if ((access_key
== "") ||
278 (secret_key
== "")) {
279 std::cout
<< argv
[0] << " no AWS credentials, exiting" << std::endl
;
283 saved_args
.argc
= argc
;
284 saved_args
.argv
= argv
;
286 ::testing::InitGoogleTest(&argc
, argv
);
287 return RUN_ALL_TESTS();