static int IndexClosure(lua_State* L) {
const auto err = reinterpret_cast<const rgw_err*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "HTTPStatusCode") == 0) {
lua_pushinteger(L, err->http_ret);
static int NewIndexClosure(lua_State* L) {
auto err = reinterpret_cast<rgw_err*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -2));
- const char* index = lua_tostring(L, -2);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "HTTPStatusCode") == 0) {
- err->http_ret = lua_tointeger(L, -1);
+ err->http_ret = luaL_checkinteger(L, 3);
} else if (strcasecmp(index, "RGWCode") == 0) {
- err->ret = lua_tointeger(L, -1);
+ err->ret = luaL_checkinteger(L, 3);
} else if (strcasecmp(index, "HTTPStatus") == 0) {
- err->err_code.assign(lua_tostring(L, -1));
+ err->err_code.assign(luaL_checkstring(L, 3));
} else if (strcasecmp(index, "Message") == 0) {
- err->message.assign(lua_tostring(L, -1));
+ err->message.assign(luaL_checkstring(L, 3));
} else {
throw_unknown_field(index, TableName());
}
static int IndexClosure(lua_State* L) {
const auto info = reinterpret_cast<RGWQuotaInfo*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "MaxSize") == 0) {
lua_pushinteger(L, info->max_size);
static int IndexClosure(lua_State* L) {
const auto rule = reinterpret_cast<rgw_placement_rule*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Name") == 0) {
pushstring(L, rule->name);
static int IndexClosure(lua_State* L) {
const auto user = reinterpret_cast<const rgw_user*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Tenant") == 0) {
pushstring(L, user->tenant);
static int IndexClosure(lua_State* L) {
const auto owner = reinterpret_cast<ACLOwner*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "DisplayName") == 0) {
pushstring(L, owner->get_display_name());
static int IndexClosure(lua_State* L) {
const auto bucket = reinterpret_cast<Type*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Tenant") == 0) {
pushstring(L, bucket->get_tenant());
static int IndexClosure(lua_State* L) {
const auto obj = reinterpret_cast<const Type*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Name") == 0) {
pushstring(L, obj->get_name());
int StringMapWriteableNewIndex(lua_State* L) {
const auto map = reinterpret_cast<MapType*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- ceph_assert(lua_isstring(L, -2));
- const char* value = lua_tostring(L, -1);
- const char* index = lua_tostring(L, -2);
+ const char* index = luaL_checkstring(L, 2);
+ const char* value = luaL_checkstring(L, 3);
map->insert_or_assign(index, value);
return NO_RETURNVAL;
}
static int IndexClosure(lua_State* L) {
const auto map = reinterpret_cast<MapType*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
const auto it = map->find(std::string(index));
if (it == map->end()) {
if (lua_isnil(L, -1)) {
next_it = map->begin();
} else {
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
const auto it = map->find(std::string(index));
ceph_assert(it != map->end());
next_it = std::next(it);
static int IndexClosure(lua_State* L) {
const auto grant = reinterpret_cast<ACLGrant*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Type") == 0) {
lua_pushinteger(L, grant->get_type().get_type());
} else if (strcasecmp(index, "User") == 0) {
- rgw_user id;
- if (grant->get_id(id)) {
- create_metatable<UserMetaTable>(L, false, &id);
+ const auto id_ptr = grant->get_id();
+ if (id_ptr) {
+ create_metatable<UserMetaTable>(L, false, const_cast<rgw_user*>(id_ptr));
} else {
lua_pushnil(L);
}
static int IndexClosure(lua_State* L) {
const auto map = reinterpret_cast<ACLGrantMap*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
const auto it = map->find(std::string(index));
if (it == map->end()) {
if (lua_isnil(L, -1)) {
next_it = map->begin();
} else {
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
const auto it = map->find(std::string(index));
ceph_assert(it != map->end());
next_it = std::next(it);
static int IndexClosure(lua_State* L) {
const auto acl = reinterpret_cast<Type*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Owner") == 0) {
create_metatable<OwnerMetaTable>(L, false, &(acl->get_owner()));
static int IndexClosure(lua_State* L) {
const auto statements = reinterpret_cast<Type*>(lua_touserdata(L, lua_upvalueindex(1)));
- const auto index = lua_tointeger(L, -1);
+ const auto index = luaL_checkinteger(L, 2);
if (index >= (int)statements->size() || index < 0) {
lua_pushnil(L);
if (lua_isnil(L, -1)) {
next_it = 0;
} else {
- ceph_assert(lua_isinteger(L, -1));
- const auto it = lua_tointeger(L, -1);
+ const auto it = luaL_checkinteger(L, -1);
next_it = it+1;
}
static int IndexClosure(lua_State* L) {
const auto policy = reinterpret_cast<rgw::IAM::Policy*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Text") == 0) {
pushstring(L, policy->text);
static int IndexClosure(lua_State* L) {
const auto policies = reinterpret_cast<Type*>(lua_touserdata(L, lua_upvalueindex(1)));
- const auto index = lua_tointeger(L, -1);
+ const auto index = luaL_checkinteger(L, 2);
if (index >= (int)policies->size() || index < 0) {
lua_pushnil(L);
next_it = 0;
} else {
ceph_assert(lua_isinteger(L, -1));
- const auto it = lua_tointeger(L, -1);
+ const auto it = luaL_checkinteger(L, -1);
next_it = it+1;
}
static int IndexClosure(lua_State* L) {
const auto info = reinterpret_cast<req_info*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Parameters") == 0) {
create_metatable<StringMapMetaTable<>>(L, false, &(info->args.get_params()));
static int IndexClosure(lua_State* L) {
const auto s = reinterpret_cast<req_state*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Tenant") == 0) {
pushstring(L, s->src_tenant_name);
static int IndexClosure(lua_State* L) {
const auto s = reinterpret_cast<req_state*>(lua_touserdata(L, lua_upvalueindex(1)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "Name") == 0) {
pushstring(L, s->zonegroup_name);
const auto s = reinterpret_cast<req_state*>(lua_touserdata(L, lua_upvalueindex(1)));
const auto op_name = reinterpret_cast<const char*>(lua_touserdata(L, lua_upvalueindex(2)));
- ceph_assert(lua_isstring(L, -1));
- const char* index = lua_tostring(L, -1);
+ const char* index = luaL_checkstring(L, 2);
if (strcasecmp(index, "RGWOp") == 0) {
pushstring(L, op_name);
TEST(TestRGWLua, URI)
{
const std::string script = R"(
- msg = "URI is: " .. Request.DecodedURI
- RGWDebugLog(msg)
- print(msg)
+ RGWDebugLog(Request.DecodedURI)
+ assert(Request.DecodedURI == "http://hello.world/")
)";
DEFINE_REQ_STATE;
TEST(TestRGWLua, Response)
{
const std::string script = R"(
- print(Request.Response.Message)
- print(Request.Response.HTTPStatus)
- print(Request.Response.RGWCode)
- print(Request.Response.HTTPStatusCode)
+ assert(Request.Response.Message == "This is a bad request")
+ assert(Request.Response.HTTPStatus == "Bad Request")
+ assert(Request.Response.RGWCode == 4000)
+ assert(Request.Response.HTTPStatusCode == 400)
)";
DEFINE_REQ_STATE;
TEST(TestRGWLua, SetResponse)
{
const std::string script = R"(
- print(Request.Response.Message)
+ assert(Request.Response.Message == "this is a bad request")
Request.Response.Message = "this is a good request"
- print(Request.Response.Message)
+ assert(Request.Response.Message == "this is a good request")
)";
DEFINE_REQ_STATE;
TEST(TestRGWLua, SetRGWId)
{
const std::string script = R"(
- print(Request.RGWId)
+ assert(Request.RGWId == "foo")
Request.RGWId = "bar"
- print(Request.RGWId)
)";
DEFINE_REQ_STATE;
TEST(TestRGWLua, Bucket)
{
const std::string script = R"(
- if Request.Bucket then
- msg = "Bucket Id: " .. Request.Bucket.Id
- RGWDebugLog(msg)
- print(msg)
- print("Bucket Marker: " .. Request.Bucket.Marker)
- print("Bucket Name: " .. Request.Bucket.Name)
- print("Bucket Tenant: " .. Request.Bucket.Tenant)
- print("Bucket Count: " .. Request.Bucket.Count)
- print("Bucket Size: " .. Request.Bucket.Size)
- print("Bucket ZoneGroupId: " .. Request.Bucket.ZoneGroupId)
- print("Bucket Creation Time: " .. Request.Bucket.CreationTime)
- print("Bucket MTime: " .. Request.Bucket.MTime)
- print("Bucket Quota Max Size: " .. Request.Bucket.Quota.MaxSize)
- print("Bucket Quota Max Objects: " .. Request.Bucket.Quota.MaxObjects)
- print("Bucket Quota Enabled: " .. tostring(Request.Bucket.Quota.Enabled))
- print("Bucket Quota Rounded: " .. tostring(Request.Bucket.Quota.Rounded))
- print("Bucket User Id: " .. Request.Bucket.User.Id)
- print("Bucket User Tenant: " .. Request.Bucket.User.Tenant)
- else
- print("No bucket")
- end
+ assert(Request.Bucket)
+ RGWDebugLog("Bucket Id: " .. Request.Bucket.Id)
+ assert(Request.Bucket.Marker == "mymarker")
+ assert(Request.Bucket.Name == "myname")
+ assert(Request.Bucket.Tenant == "mytenant")
+ assert(Request.Bucket.Count == 0)
+ assert(Request.Bucket.Size == 0)
+ assert(Request.Bucket.ZoneGroupId)
+ assert(Request.Bucket.CreationTime)
+ assert(Request.Bucket.MTime)
+ assert(Request.Bucket.Quota.MaxSize == -1)
+ assert(Request.Bucket.Quota.MaxObjects == -1)
+ assert(tostring(Request.Bucket.Quota.Enabled))
+ assert(tostring(Request.Bucket.Quota.Rounded))
+ assert(Request.Bucket.User.Id)
+ assert(Request.Bucket.User.Tenant)
)";
DEFINE_REQ_STATE;
TEST(TestRGWLua, GenericAttributes)
{
const std::string script = R"(
- print("hello = " .. (Request.GenericAttributes["hello"] or "nil"))
- print("foo = " .. (Request.GenericAttributes["foo"] or "nil"))
- print("kaboom = " .. (Request.GenericAttributes["kaboom"] or "nil"))
- print("number of attributes is: " .. #Request.GenericAttributes)
+ assert(Request.GenericAttributes["hello"] == "world")
+ assert(Request.GenericAttributes["foo"] == "bar")
+ assert(Request.GenericAttributes["kaboom"] == nil)
+ assert(#Request.GenericAttributes == 4)
for k, v in pairs(Request.GenericAttributes) do
- print("key=" .. k .. ", " .. "value=" .. v)
+ assert(k)
+ assert(v)
end
)";
TEST(TestRGWLua, Environment)
{
const std::string script = R"(
- print("number of env entries is: " .. #Request.Environment)
- for k, v in pairs(Request.Environment) do
- print("key=" .. k .. ", " .. "value=" .. v)
- end
+ assert(Request.Environment[""] == "bar")
+ assert(Request.Environment["goodbye"] == "cruel world")
+ assert(Request.Environment["ka"] == "boom")
+ assert(#Request.Environment == 3, #Request.Environment)
+ for k, v in pairs(Request.Environment) do
+ assert(k)
+ assert(v)
+ end
)";
DEFINE_REQ_STATE;
TEST(TestRGWLua, Tags)
{
const std::string script = R"(
- print("number of tags is: " .. #Request.Tags)
+ assert(#Request.Tags == 4)
+ assert(Request.Tags["foo"] == "bar")
for k, v in pairs(Request.Tags) do
- print("key=" .. k .. ", " .. "value=" .. v)
+ assert(k)
+ assert(v)
end
)";
TEST(TestRGWLua, Metadata)
{
const std::string script = R"(
- print("number of metadata entries is: " .. #Request.HTTP.Metadata)
+ assert(#Request.HTTP.Metadata == 3)
for k, v in pairs(Request.HTTP.Metadata) do
- print("key=" .. k .. ", " .. "value=" .. v)
+ assert(k)
+ assert(v)
end
- print("value of 'hello' is:")
- print(Request.HTTP.Metadata["hello"])
- print("value of 'kaboom' is:")
- print(Request.HTTP.Metadata["kaboom"])
+ assert(Request.HTTP.Metadata["hello"] == "world")
+ assert(Request.HTTP.Metadata["kaboom"] == nil)
Request.HTTP.Metadata["hello"] = "goodbye"
Request.HTTP.Metadata["kaboom"] = "boom"
- print("new number of metadata entries is: " .. #Request.HTTP.Metadata)
- print("new value of 'hello' is:")
- print(Request.HTTP.Metadata["hello"])
- print("new value of 'kaboom' is:")
- print(Request.HTTP.Metadata["kaboom"])
+ assert(#Request.HTTP.Metadata == 4)
+ assert(Request.HTTP.Metadata["hello"] == "goodbye")
+ assert(Request.HTTP.Metadata["kaboom"] == "boom")
)";
DEFINE_REQ_STATE;
{
const std::string script = R"(
function print_grant(g)
- print("Type: " .. g.Type)
- print("GroupType: " .. g.GroupType)
- print("Permission: " .. g.Permission)
- print("Referer: " .. g.Referer)
+ print("Grant Type: " .. g.Type)
+ print("Grant Group Type: " .. g.GroupType)
+ print("Grant Referer: " .. g.Referer)
if (g.User) then
- print("User.Tenant: " .. g.User.Tenant)
- print("User.Id: " .. g.User.Id)
+ print("Grant User.Tenant: " .. g.User.Tenant)
+ print("Grant User.Id: " .. g.User.Id)
end
end
- print(Request.UserAcl.Owner.DisplayName)
- print(Request.UserAcl.Owner.User.Id)
- print(Request.UserAcl.Owner.User.Tenant)
- print("number of grants is: " .. #Request.UserAcl.Grants)
+ assert(Request.UserAcl.Owner.DisplayName == "jack black", Request.UserAcl.Owner.DisplayName)
+ assert(Request.UserAcl.Owner.User.Id == "black", Request.UserAcl.Owner.User.Id)
+ assert(Request.UserAcl.Owner.User.Tenant == "jack", Request.UserAcl.Owner.User.Tenant)
+ assert(#Request.UserAcl.Grants == 5)
+ print_grant(Request.UserAcl.Grants[""])
for k, v in pairs(Request.UserAcl.Grants) do
- print("grant key=" .. k)
- print("grant values=")
print_grant(v)
+ if k == "john$doe" then
+ assert(v.Permission == 4)
+ elseif k == "jane$doe" then
+ assert(v.Permission == 1)
+ else
+ assert(false)
+ end
end
)";
DEFINE_REQ_STATE;
ACLOwner owner;
- owner.set_id(rgw_user("john", "doe"));
- owner.set_name("john doe");
+ owner.set_id(rgw_user("jack", "black"));
+ owner.set_name("jack black");
s.user_acl.reset(new RGWAccessControlPolicy(cct));
s.user_acl->set_owner(owner);
ACLGrant grant1, grant2, grant3, grant4, grant5;
grant1.set_canon(rgw_user("jane", "doe"), "her grant", 1);
- grant2.set_referer("http://localhost/ref1", 2);
+ grant2.set_group(ACL_GROUP_ALL_USERS ,2);
grant3.set_referer("http://localhost/ref2", 3);
grant4.set_canon(rgw_user("john", "doe"), "his grant", 4);
grant5.set_group(ACL_GROUP_AUTHENTICATED_USERS, 5);
TEST(TestRGWLua, WithLib)
{
const std::string script = R"(
- print("bucket name split:")
- for i in string.gmatch(Request.Bucket.Name, "%a+") do
- print("lua print: part: " .. i)
+ expected_result = {"my", "bucket", "name", "is", "fish"}
+ i = 1
+ for p in string.gmatch(Request.Bucket.Name, "%a+") do
+ assert(p == expected_result[i])
+ i = i + 1
end
)";
#include <sys/socket.h>
#include <stdlib.h>
+bool unix_socket_client_ended_ok = false;
+
void unix_socket_client(const std::string& path) {
int fd;
// create the socket
return;
}
- std::cout << "unix socket connected to: " << path << std::endl;
char buff[256];
int rc;
while((rc=read(fd, buff, sizeof(buff))) > 0) {
std::cout << std::string(buff, rc);
+ unix_socket_client_ended_ok = true;
}
}
const std::string script = R"(
if Request.Response.HTTPStatusCode == 200 then
- print("request is good, just log to lua: " .. Request.Response.Message)
+ assert(Request.Response.Message == "Life is great")
else
- print("request is bad, use ops log:")
- if Request.Bucket then
- rc = Request.Log()
- print("ops log return code: " .. rc)
- else
- print("no bucket, ops log wasn't called")
- end
+ assert(Request.Bucket)
+ assert(Request.Log() == 0)
end
)";
EXPECT_EQ(rc, 0);
// give the socket client time to read
- std::this_thread::sleep_for(std::chrono::seconds(2));
- unix_socket_thread.detach();
+ std::this_thread::sleep_for(std::chrono::seconds(5));
+ unix_socket_thread.detach(); // read is stuck there, so we cannot join
+ EXPECT_TRUE(unix_socket_client_ended_ok);
}