| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| use t::APISIX 'no_plan'; |
| |
| repeat_each(1); |
| no_long_string(); |
| no_root_location(); |
| log_level("info"); |
| |
| run_tests; |
| |
| __DATA__ |
| |
| === TEST 1: delete test data if exists |
| --- config |
| location /delete { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', ngx.HTTP_DELETE) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| --- request |
| GET /delete |
| --- ignore_response |
| |
| |
| |
| === TEST 2: (add + update + delete) *2 (same uri) |
| --- config |
| location /add { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', |
| ngx.HTTP_PUT, |
| [[{ |
| |
| "upstream": { |
| "nodes": { |
| "127.0.0.1:1980": 1 |
| }, |
| "type": "roundrobin" |
| }, |
| "host": "foo.com", |
| "uri": "/hello" |
| }]], |
| nil |
| ) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /update { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', |
| ngx.HTTP_PUT, |
| [[{ |
| "upstream": { |
| "nodes": { |
| "127.0.0.1:1980": 2 |
| }, |
| "type": "roundrobin" |
| }, |
| "host": "foo.com", |
| "uri": "/hello" |
| }]], |
| nil |
| ) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /delete { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', ngx.HTTP_DELETE) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| --- pipelined_requests eval |
| ["GET /add", "GET /hello", "GET /update", "GET /hello", "GET /delete", "GET /hello", |
| "GET /add", "GET /hello", "GET /update", "GET /hello", "GET /delete", "GET /hello"] |
| --- more_headers |
| Host: foo.com |
| --- error_code eval |
| [201, 200, 200, 200, 200, 404, 201, 200, 200, 200, 200, 404] |
| --- response_body eval |
| ["passed\n", "hello world\n", "passed\n", "hello world\n", "passed\n", "{\"error_msg\":\"404 Route Not Found\"}\n", |
| "passed\n", "hello world\n", "passed\n", "hello world\n", "passed\n", "{\"error_msg\":\"404 Route Not Found\"}\n"] |
| --- timeout: 5 |
| |
| |
| |
| === TEST 3: add + update + delete + add + update + delete (different uris) |
| --- config |
| location /add { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', |
| ngx.HTTP_PUT, |
| [[{ |
| |
| "upstream": { |
| "nodes": { |
| "127.0.0.1:1980": 1 |
| }, |
| "type": "roundrobin" |
| }, |
| "host": "foo.com", |
| "uri": "/hello" |
| }]], |
| nil |
| ) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /update { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', |
| ngx.HTTP_PUT, |
| [[{ |
| |
| "upstream": { |
| "nodes": { |
| "127.0.0.1:1980": 2 |
| }, |
| "type": "roundrobin" |
| }, |
| "host": "foo.com", |
| "uri": "/status" |
| }]], |
| nil |
| ) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /delete { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', ngx.HTTP_DELETE) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /add2 { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', |
| ngx.HTTP_PUT, |
| [[{ |
| |
| "upstream": { |
| "nodes": { |
| "127.0.0.1:1980": 1 |
| }, |
| "type": "roundrobin" |
| }, |
| "host": "foo.com", |
| "uri": "/hello_chunked" |
| }]], |
| nil |
| ) |
| ngx.sleep(1) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /update2 { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', |
| ngx.HTTP_PUT, |
| [[{ |
| |
| "upstream": { |
| "nodes": { |
| "127.0.0.1:1980": 2 |
| }, |
| "type": "roundrobin" |
| }, |
| "host": "foo.com", |
| "uri": "/hello1" |
| }]], |
| nil |
| ) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /delete2 { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local code, body = t('/apisix/admin/routes/1', ngx.HTTP_DELETE) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| --- pipelined_requests eval |
| ["GET /add", "GET /hello", "GET /update", "GET /hello", "GET /status", "GET /delete", "GET /status", |
| "GET /add2", "GET /hello_chunked", "GET /update2", "GET /hello_chunked", "GET /hello1", "GET /delete", "GET /hello1"] |
| --- more_headers |
| Host: foo.com |
| --- error_code eval |
| [201, 200, 200, 404, 200, 200, 404, 201, 200, 200, 404, 200, 200, 404] |
| --- response_body eval |
| ["passed\n", "hello world\n", "passed\n", "{\"error_msg\":\"404 Route Not Found\"}\n", "ok\n", "passed\n", "{\"error_msg\":\"404 Route Not Found\"}\n", |
| "passed\n", "hello world\n", "passed\n", "{\"error_msg\":\"404 Route Not Found\"}\n", "hello1 world\n", "passed\n", "{\"error_msg\":\"404 Route Not Found\"}\n"] |
| --- timeout: 5 |
| |
| |
| |
| === TEST 4: add*50 + update*50 + delete*50 |
| --- config |
| location /add { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local path = "" |
| local code, body |
| for i = 1, 25 do |
| path = '/apisix/admin/routes/' .. tostring(i) |
| code, body = t(path, |
| ngx.HTTP_PUT, |
| string.format('{"upstream": {"nodes": {"127.0.0.1:1980": 1},"type": "roundrobin"},"host": "foo.com","uri": "/print_uri_%s"}', tostring(i)), |
| nil |
| ) |
| end |
| ngx.sleep(2) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /add2 { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local path = "" |
| local code, body |
| for i = 26, 50 do |
| path = '/apisix/admin/routes/' .. tostring(i) |
| code, body = t(path, |
| ngx.HTTP_PUT, |
| string.format('{"upstream": {"nodes": {"127.0.0.1:1980": 1},"type": "roundrobin"},"host": "foo.com","uri": "/print_uri_%s"}', tostring(i)), |
| nil |
| ) |
| end |
| ngx.sleep(2) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /update { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local path = "" |
| local code, body |
| for i = 1, 25 do |
| path = '/apisix/admin/routes/' .. tostring(i) |
| code, body = t(path, |
| ngx.HTTP_PUT, |
| string.format('{"upstream": {"nodes": {"127.0.0.1:1980": 1},"type": "roundrobin"},"host": "foo.com","uri": "/print_uri_%s"}', tostring(i)), |
| nil |
| ) |
| end |
| ngx.sleep(2) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /update2 { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local path = "" |
| local code, body |
| for i = 26, 50 do |
| path = '/apisix/admin/routes/' .. tostring(i) |
| code, body = t(path, |
| ngx.HTTP_PUT, |
| string.format('{"upstream": {"nodes": {"127.0.0.1:1980": 1},"type": "roundrobin"},"host": "foo.com","uri": "/print_uri_%s"}', tostring(i)), |
| nil |
| ) |
| end |
| ngx.sleep(2) |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| location /delete { |
| content_by_lua_block { |
| local t = require("lib.test_admin").test |
| local path = "" |
| local code, body |
| for i = 1, 50 do |
| path = '/apisix/admin/routes/' .. tostring(i) |
| code, body = t(path, ngx.HTTP_DELETE) |
| end |
| ngx.status = code |
| ngx.say(body) |
| } |
| } |
| --- pipelined_requests eval |
| ["GET /add", "GET /print_uri_20", "GET /add2", "GET /print_uri_36", "GET /update", "GET /print_uri_12", "GET /delete", "GET /print_uri_12"] |
| --- more_headers |
| Host: foo.com |
| --- error_code eval |
| [201, 200, 201, 200, 200, 200, 200, 404] |
| --- response_body eval |
| ["passed\n", "/print_uri_20\n", "passed\n", "/print_uri_36\n", "passed\n", "/print_uri_12\n", "passed\n", "{\"error_msg\":\"404 Route Not Found\"}\n"] |
| --- timeout: 20 |
| |
| |
| |
| === TEST 5: get single |
| --- config |
| location /t { |
| content_by_lua_block { |
| local etcd = require("apisix.core.etcd") |
| assert(etcd.set("/ab", "ab")) |
| local res, err = etcd.get("/a") |
| ngx.status = res.status |
| } |
| } |
| --- request |
| GET /t |
| --- error_code: 404 |
| |
| |
| |
| === TEST 6: get prefix |
| --- config |
| location /t { |
| content_by_lua_block { |
| local etcd = require("apisix.core.etcd") |
| assert(etcd.set("/ab", "ab")) |
| local res, err = etcd.get("/a", true) |
| ngx.status = res.status |
| ngx.say(res.body.node.value) |
| } |
| } |
| --- request |
| GET /t |
| --- response_body |
| ab |
| |
| |
| |
| === TEST 7: run etcd in init phase |
| --- init_by_lua_block |
| local apisix = require("apisix") |
| apisix.http_init() |
| local etcd = require("apisix.core.etcd") |
| assert(etcd.set("/a", "ab")) |
| |
| local res, err = etcd.get("/a") |
| if not res then |
| ngx.log(ngx.ERR, err) |
| return |
| end |
| ngx.log(ngx.WARN, res.body.node.value) |
| |
| local res, err = etcd.delete("/a") |
| if not res then |
| ngx.log(ngx.ERR, err) |
| return |
| end |
| ngx.log(ngx.WARN, res.status) |
| |
| local res, err = etcd.get("/a") |
| if not res then |
| ngx.log(ngx.ERR, err) |
| return |
| end |
| ngx.log(ngx.WARN, res.status) |
| --- config |
| location /t { |
| return 200; |
| } |
| --- request |
| GET /t |
| --- grep_error_log eval |
| qr/init_by_lua.*: \S+/ |
| --- grep_error_log_out eval |
| qr{init_by_lua.* ab |
| init_by_lua.* 200 |
| init_by_lua.* 404} |