# vim:set ft= ts=4 sw=4 et: use Test::Nginx::Socket::Lua; use Cwd qw(cwd); repeat_each(2); plan tests => repeat_each() * (3 * blocks()); my $pwd = cwd(); our $HttpConfig = qq{ resolver \$TEST_NGINX_RESOLVER; lua_package_path "$pwd/lib/?.lua;$pwd/t/lib/?.lua;;"; lua_package_cpath "/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;"; }; $ENV{TEST_NGINX_RESOLVER} = '8.8.8.8'; $ENV{TEST_NGINX_MYSQL_PORT} ||= 3306; $ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1'; $ENV{TEST_NGINX_MYSQL_PATH} ||= '/var/run/mysql/mysql.sock'; #log_level 'warn'; no_long_string(); no_shuffle(); run_tests(); __DATA__ === TEST 1: send query w/o result set --- http_config eval: $::HttpConfig --- config location /t { content_by_lua ' local mysql = require "resty.mysql" local db = mysql:new() db:set_timeout(2000) -- 2 sec local ok, err, errno, sqlstate = db:connect{ compact_arrays = true, host = "$TEST_NGINX_MYSQL_HOST", port = $TEST_NGINX_MYSQL_PORT, database = "ngx_test", user = "ngx_test", password = "ngx_test"} if not ok then ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate) return end ngx.say("connected to mysql ", db:server_ver(), ".") local bytes, err = db:send_query("drop table if exists cats") if not bytes then ngx.say("failed to send query: ", err) end ngx.say("sent ", bytes, " bytes.") local res, err, errno, sqlstate = db:read_result() if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") end local ljson = require "ljson" ngx.say("result: ", ljson.encode(res)) local ok, err = db:close() if not ok then ngx.say("failed to close: ", err) return end '; } --- request GET /t --- response_body_like chop ^connected to mysql \d\.\S+\. sent 30 bytes\. result: (?:{"insert_id":0,"server_status":2,"warning_count":[01],"affected_rows":0}|{"affected_rows":0,"insert_id":0,"server_status":2,"warning_count":[01]})$ --- no_error_log [error] === TEST 2: select query with an non-empty result set --- http_config eval: $::HttpConfig --- config location /t { content_by_lua ' local ljson = require "ljson" local mysql = require "resty.mysql" local db = mysql:new() db:set_timeout(2000) -- 2 sec local ok, err, errno, sqlstate = db:connect{ compact_arrays = true, host = "$TEST_NGINX_MYSQL_HOST", port = $TEST_NGINX_MYSQL_PORT, database = "ngx_test", user = "ngx_test", password = "ngx_test"} if not ok then ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate) return end ngx.say("connected to mysql.") local res, err, errno, sqlstate = db:query("drop table if exists cats") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("table cats dropped.") res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("table cats created.") res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")") res, err, errno, sqlstate = db:query("select name, id from cats order by id asc") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("result: ", ljson.encode(res)) res, err, errno, sqlstate = db:query("select name, id from cats order by id desc") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("result: ", ljson.encode(res)) local ok, err = db:close() if not ok then ngx.say("failed to close: ", err) return end '; } --- request GET /t --- response_body connected to mysql. table cats dropped. table cats created. 3 rows inserted into table cats (last id: 1) result: [["Bob","1"],["","2"],[null,"3"]] result: [[null,"3"],["","2"],["Bob","1"]] --- no_error_log [error] === TEST 3: select query with an empty result set --- http_config eval: $::HttpConfig --- config location /t { content_by_lua ' local ljson = require "ljson" local mysql = require "resty.mysql" local db = mysql:new() db:set_timeout(1000) -- 1 sec local ok, err, errno, sqlstate = db:connect{ compact_arrays = true, host = "$TEST_NGINX_MYSQL_HOST", port = $TEST_NGINX_MYSQL_PORT, database = "ngx_test", user = "ngx_test", password = "ngx_test"} if not ok then ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate) return end ngx.say("connected to mysql.") local res, err, errno, sqlstate = db:query("drop table if exists cats") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("table cats dropped.") res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("table cats created.") res, err, errno, sqlstate = db:query("select * from cats order by id asc") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("result: ", ljson.encode(res)) res, err, errno, sqlstate = db:query("select * from cats order by id desc") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("result: ", ljson.encode(res)) local ok, err = db:close() if not ok then ngx.say("failed to close: ", err) return end '; } --- request GET /t --- response_body connected to mysql. table cats dropped. table cats created. result: [] result: [] --- no_error_log [error] === TEST 4: select query with an non-empty result set - set_compact_arrays --- http_config eval: $::HttpConfig --- config location /t { content_by_lua ' local ljson = require "ljson" local mysql = require "resty.mysql" local db = mysql:new() db:set_timeout(1000) -- 1 sec local ok, err, errno, sqlstate = db:connect{ host = "$TEST_NGINX_MYSQL_HOST", port = $TEST_NGINX_MYSQL_PORT, database = "ngx_test", user = "ngx_test", password = "ngx_test"} if not ok then ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate) return end ngx.say("connected to mysql.") local res, err, errno, sqlstate = db:query("drop table if exists cats") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("table cats dropped.") res, err, errno, sqlstate = db:query("create table cats (id serial primary key, name varchar(5))") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("table cats created.") res, err, errno, sqlstate = db:query("insert into cats (name) value (\'Bob\'),(\'\'),(null)") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say(res.affected_rows, " rows inserted into table cats (last id: ", res.insert_id, ")") db:set_compact_arrays(true) res, err, errno, sqlstate = db:query("select name, id from cats order by id asc") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("result: ", ljson.encode(res)) db:set_compact_arrays(false) res, err, errno, sqlstate = db:query("select name, id from cats order by id desc") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end ngx.say("result: ", ljson.encode(res)) local ok, err = db:close() if not ok then ngx.say("failed to close: ", err) return end '; } --- request GET /t --- response_body connected to mysql. table cats dropped. table cats created. 3 rows inserted into table cats (last id: 1) result: [["Bob","1"],["","2"],[null,"3"]] result: [{"id":"3","name":null},{"id":"2","name":""},{"id":"1","name":"Bob"}] --- no_error_log [error]