# # 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. # package t::APISIX; use lib 'lib'; use Cwd qw(cwd); use Test::Nginx::Socket::Lua::Stream -Base; repeat_each(1); log_level('info'); no_long_string(); no_shuffle(); worker_connections(128); my $pwd = cwd(); sub read_file($) { my $infile = shift; open my $in, $infile or die "cannot open $infile for reading: $!"; my $cert = do { local $/; <$in> }; close $in; $cert; } my $yaml_config = read_file("conf/config.yaml"); my $ssl_crt = read_file("conf/cert/apisix.crt"); my $ssl_key = read_file("conf/cert/apisix.key"); $yaml_config =~ s/node_listen: 9080/node_listen: 1984/; $yaml_config =~ s/enable_heartbeat: true/enable_heartbeat: false/; add_block_preprocessor(sub { my ($block) = @_; my $wait_etcd_sync = $block->wait_etcd_sync // 0.1; my $main_config = $block->main_config // <<_EOC_; worker_rlimit_core 500M; working_directory $pwd; _EOC_ $block->set_value("main_config", $main_config); my $stream_enable = $block->stream_enable; my $stream_config = $block->stream_config // <<_EOC_; lua_package_path "$pwd/deps/share/lua/5.1/?.lua;$pwd/lua/?.lua;$pwd/t/?.lua;/usr/share/lua/5.1/?.lua;;"; lua_package_cpath "$pwd/deps/lib/lua/5.1/?.so;$pwd/deps/lib64/lua/5.1/?.so;/usr/lib64/lua/5.1/?.so;;"; lua_socket_log_errors off; upstream apisix_backend { server 127.0.0.1:1900; balancer_by_lua_block { apisix.stream_balancer_phase() } } init_by_lua_block { -- if os.getenv("APISIX_ENABLE_LUACOV") == "1" then -- require("luacov.runner")("t/apisix.luacov") -- jit.off() -- end require "resty.core" apisix = require("apisix") apisix.stream_init() } init_worker_by_lua_block { apisix.stream_init_worker() } # fake server, only for test server { listen 1995; content_by_lua_block { local sock = ngx.req.socket() local data = sock:receive("1") ngx.say("hello world") } } _EOC_ if (defined $stream_enable) { $block->set_value("stream_config", $stream_config); } my $stream_server_config = $block->stream_server_config // <<_EOC_; preread_by_lua_block { -- wait for etcd sync ngx.sleep($wait_etcd_sync) apisix.stream_preread_phase() } proxy_pass apisix_backend; log_by_lua_block { apisix.stream_log_phase() } _EOC_ if (defined $stream_enable) { $block->set_value("stream_server_config", $stream_server_config); } my $init_by_lua_block = $block->init_by_lua_block // <<_EOC_; if os.getenv("APISIX_ENABLE_LUACOV") == "1" then require("luacov.runner")("t/apisix.luacov") jit.off() end require "resty.core" apisix = require("apisix") apisix.http_init() _EOC_ my $http_config = $block->http_config // ''; $http_config .= <<_EOC_; lua_package_path "$pwd/deps/share/lua/5.1/?.lua;$pwd/lua/?.lua;$pwd/t/?.lua;/usr/share/lua/5.1/?.lua;;"; lua_package_cpath "$pwd/deps/lib/lua/5.1/?.so;$pwd/deps/lib64/lua/5.1/?.so;/usr/lib64/lua/5.1/?.so;;"; lua_shared_dict plugin-limit-req 10m; lua_shared_dict plugin-limit-count 10m; lua_shared_dict plugin-limit-conn 10m; lua_shared_dict prometheus-metrics 10m; lua_shared_dict upstream-healthcheck 32m; lua_shared_dict worker-events 10m; resolver 8.8.8.8 114.114.114.114 ipv6=off; resolver_timeout 5; underscores_in_headers on; lua_socket_log_errors off; upstream apisix_backend { server 0.0.0.1; balancer_by_lua_block { apisix.http_balancer_phase() } keepalive 32; } init_by_lua_block { $init_by_lua_block } init_worker_by_lua_block { require("apisix").http_init_worker() } # fake server, only for test server { listen 1980; listen 1981; listen 1982; _EOC_ my $ipv6_fake_server = ""; if (defined $block->listen_ipv6) { $ipv6_fake_server = "listen \[::1\]:1980;"; } $http_config .= <<_EOC_; $ipv6_fake_server server_tokens off; location / { content_by_lua_block { require("lib.server").go() } more_clear_headers Date; } } server { listen 1983 ssl; ssl_certificate cert/apisix.crt; ssl_certificate_key cert/apisix.key; lua_ssl_trusted_certificate cert/apisix.crt; server_tokens off; location / { content_by_lua_block { require("lib.server").go() } more_clear_headers Date; } } _EOC_ $block->set_value("http_config", $http_config); my $TEST_NGINX_HTML_DIR = $ENV{TEST_NGINX_HTML_DIR} ||= html_dir(); my $ipv6_listen_conf = ''; if (defined $block->listen_ipv6) { $ipv6_listen_conf = "listen \[::1\]:12345;" } my $config = $block->config // ''; $config .= <<_EOC_; $ipv6_listen_conf ssl_certificate cert/apisix.crt; ssl_certificate_key cert/apisix.key; lua_ssl_trusted_certificate cert/apisix.crt; ssl_certificate_by_lua_block { apisix.http_ssl_phase() } location = /apisix/nginx_status { allow 127.0.0.0/24; access_log off; stub_status; } location /apisix/admin { content_by_lua_block { apisix.http_admin() } } location / { set \$upstream_scheme 'http'; set \$upstream_host \$host; set \$upstream_upgrade ''; set \$upstream_connection ''; set \$upstream_uri ''; access_by_lua_block { -- wait for etcd sync ngx.sleep($wait_etcd_sync) apisix.http_access_phase() } proxy_http_version 1.1; proxy_set_header Host \$upstream_host; proxy_set_header Upgrade \$upstream_upgrade; proxy_set_header Connection \$upstream_connection; proxy_set_header X-Real-IP \$remote_addr; proxy_pass_header Server; proxy_pass_header Date; proxy_pass \$upstream_scheme://apisix_backend\$upstream_uri; header_filter_by_lua_block { apisix.http_header_filter_phase() } body_filter_by_lua_block { apisix.http_body_filter_phase() } log_by_lua_block { apisix.http_log_phase() } } location \@grpc_pass { access_by_lua_block { apisix.grpc_access_phase() } grpc_set_header Content-Type application/grpc; grpc_socket_keepalive on; grpc_pass grpc://apisix_backend; header_filter_by_lua_block { apisix.http_header_filter_phase() } body_filter_by_lua_block { apisix.http_body_filter_phase() } log_by_lua_block { apisix.http_log_phase() } } _EOC_ $block->set_value("config", $config); my $user_apisix_yaml = $block->apisix_yaml // ""; if ($user_apisix_yaml) { $user_apisix_yaml = <<_EOC_; >>> ../conf/apisix.yaml $user_apisix_yaml _EOC_ } my $user_yaml_config = $block->yaml_config // $yaml_config; my $user_debug_config = $block->debug_config // ""; my $user_files = $block->user_files; $user_files .= <<_EOC_; >>> ../conf/debug.yaml $user_debug_config >>> ../conf/config.yaml $user_yaml_config >>> ../conf/cert/apisix.crt $ssl_crt >>> ../conf/cert/apisix.key $ssl_key $user_apisix_yaml _EOC_ $block->set_value("user_files", $user_files); $block; }); 1;