Alex Roitman b55300b729 Lua scripting feature. (#224)
* Start on lua scripting

* Implement evalsha, script load, script exists, and script flush

* Type conversions from lua to resp/json.
Refactor to make luastate and luascripts persistent in the controller.

* Change controller.command and all underlying commands to return resp.Value.
Serialize only during the ouput.

* First stab at tile38 call from lua

* Change tile38 into tile38.call in Lua

* Property return errors from scripts

* Minor refactoring.  No locking on script run

* Cleanup/refactoring

* Create a pool of 5 lua states, allow for more as needed. Refactor.

* Use safe map for scripts.  Add a limit for max number of lua states.  Refactor.

* Refactor

* Refactor script commands into atomic, read-only, and non-atomic classes.
Proper locking for all three classes.
Add tests for scripts

* More tests for scripts

* Properly escape newlines in lua-produced errors

* Better test for readonly failure

* Correctly convert ok/err messages between lua and resp.
Add pcall, sha1hex, error_reply, status_reply functions to tile38 namespace in lua.

* Add pcall test. Change writeErr to work with string argument

* Make sure eval/evalsha never attempt to write AOF

* Add eval-set and eval-get to benchmarks

* Fix eval benchmark tests, add more

* Improve benchmarks

* Optimizations and refactoring.

* Add lua memtest

* Typo

* Add dependency

* golint fixes

* gofmt fixes

* Add scripting commands to the core/commands.json

* Use ARGV for args inside lua
2017-10-05 08:20:40 -07:00

137 lines
5.4 KiB
Lua

for i, v in ipairs({"hoge", {}, function() end, true, nil}) do
local ok, msg = pcall(function()
print(-v)
end)
assert(not ok and string.find(msg, "__unm undefined"))
end
assert(#"abc" == 3)
local tbl = {1,2,3}
setmetatable(tbl, {__len = function(self)
return 10
end})
assert(#tbl == 10)
setmetatable(tbl, nil)
assert(#tbl == 3)
local ok, msg = pcall(function()
return 1 < "hoge"
end)
assert(not ok and string.find(msg, "attempt to compare number with string"))
local ok, msg = pcall(function()
return {} < (function() end)
end)
assert(not ok and string.find(msg, "attempt to compare table with function"))
local ok, msg = pcall(function()
for n = nil,1 do
print(1)
end
end)
assert(not ok and string.find(msg, "for statement init must be a number"))
local ok, msg = pcall(function()
for n = 1,nil do
print(1)
end
end)
assert(not ok and string.find(msg, "for statement limit must be a number"))
local ok, msg = pcall(function()
for n = 1,10,nil do
print(1)
end
end)
assert(not ok and string.find(msg, "for statement step must be a number"))
local ok, msg = pcall(function()
return {} + (function() end)
end)
assert(not ok and string.find(msg, "cannot perform add operation between table and function"))
local ok, msg = pcall(function()
return {} .. (function() end)
end)
assert(not ok and string.find(msg, "cannot perform concat operation between table and function"))
-- test table with initial elements over 511
local bigtable = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,10}
assert(bigtable[601] == 10)
local ok, msg = loadstring([[
function main(
a1, a2, a3, a4, a5, a6, a7, a8,
a9, a10, a11, a12, a13, a14, a15, a16,
a17, a18, a19, a20, a21, a22, a23, a24,
a25, a26, a27, a28, a29, a30, a31, a32,
a33, a34, a35, a36, a37, a38, a39, a40,
a41, a42, a43, a44, a45, a46, a47, a48,
a49, a50, a51, a52, a53, a54, a55, a56,
a57, a58, a59, a60, a61, a62, a63, a64,
a65, a66, a67, a68, a69, a70, a71, a72,
a73, a74, a75, a76, a77, a78, a79, a80,
a81, a82, a83, a84, a85, a86, a87, a88,
a89, a90, a91, a92, a93, a94, a95, a96,
a97, a98, a99, a100, a101, a102, a103,
a104, a105, a106, a107, a108, a109, a110,
a111, a112, a113, a114, a115, a116, a117,
a118, a119, a120, a121, a122, a123, a124,
a125, a126, a127, a128, a129, a130, a131,
a132, a133, a134, a135, a136, a137, a138,
a139, a140, a141, a142, a143, a144, a145,
a146, a147, a148, a149, a150, a151, a152,
a153, a154, a155, a156, a157, a158, a159,
a160, a161, a162, a163, a164, a165, a166,
a167, a168, a169, a170, a171, a172, a173,
a174, a175, a176, a177, a178, a179, a180,
a181, a182, a183, a184, a185, a186, a187,
a188, a189, a190, a191, a192, a193, a194,
a195, a196, a197, a198, a199, a200, a201,
a202, a203, a204, a205, a206, a207, a208,
a209, a210, a211, a212, a213, a214, a215,
a216, a217, a218, a219, a220, a221, a222,
a223, a224, a225, a226, a227, a228, a229,
a230, a231, a232, a233, a234, a235, a236,
a237, a238, a239, a240, a241, a242, a243,
a244, a245, a246, a247, a248, a249, a250,
a251, a252, a253, a254, a255, a256, a257,
a258, a259, a260, a261, a262, a263, a264,
a265, a266, a267, a268, a269, a270, a271,
a272, a273, a274, a275, a276, a277, a278,
a279, a280, a281, a282, a283, a284, a285,
a286, a287, a288, a289, a290, a291, a292,
a293, a294, a295, a296, a297, a298, a299,
a300, a301, a302) end
]])
assert(not ok and string.find(msg, "register overflow"))
local ok, msg = loadstring([[
function main()
local a = {...}
end
]])
assert(not ok and string.find(msg, "cannot use '...' outside a vararg function"))