Skip to content

Commit 3a8fe7c

Browse files
committed
Added sentinel test framework
1 parent 71b00e0 commit 3a8fe7c

File tree

1 file changed

+142
-9
lines changed

1 file changed

+142
-9
lines changed

Makefile

Lines changed: 142 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,151 @@
1-
OPENRESTY_PREFIX=/usr/local/openresty-debug
1+
SHELL := /bin/bash # Cheat by using bash :)
22

3-
PREFIX ?= /usr/local
3+
OPENRESTY_PREFIX = /usr/local/openresty-debug
4+
5+
TEST_FILE ?= t
6+
SENTINEL_TEST_FILE ?= $(TEST_FILE)/sentinel
7+
8+
REDIS_CMD = redis-server
9+
SENTINEL_CMD = $(REDIS_CMD) --sentinel
10+
11+
REDIS_SOCK = /redis.sock
12+
REDIS_PID = /redis.pid
13+
REDIS_LOG = /redis.log
14+
REDIS_PREFIX = /tmp/redis-
15+
16+
# Overrideable ledge test variables
17+
TEST_REDIS_PORTS ?= 6379 6380
18+
TEST_REDIS_DATABASE ?= 1
19+
20+
REDIS_FIRST_PORT := $(firstword $(TEST_REDIS_PORTS))
21+
REDIS_SLAVE_ARG := --slaveof 127.0.0.1 $(REDIS_FIRST_PORT)
22+
REDIS_CLI := redis-cli -p $(REDIS_FIRST_PORT) -n $(TEST_REDIS_DATABASE)
23+
24+
# Override socket for running make test on its own
25+
# (make test TEST_REDIS_SOCKET=/path/to/sock.sock)
26+
TEST_REDIS_SOCKET ?= $(REDIS_PREFIX)$(REDIS_FIRST_PORT)$(REDIS_SOCK)
27+
28+
# Overrideable ledge + sentinel test variables
29+
TEST_SENTINEL_PORTS ?= 6381 6382 6383
30+
TEST_SENTINEL_MASTER_NAME ?= mymaster
31+
TEST_SENTINEL_PROMOTION_TIME ?= 20
32+
33+
# Command line arguments for ledge tests
34+
TEST_REDIS_VARS = PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$(PATH) \
35+
TEST_REDIS_SOCKET=unix://$(TEST_REDIS_SOCKET) \
36+
TEST_REDIS_DATABASE=$(TEST_REDIS_DATABASE) \
37+
TEST_NGINX_NO_SHUFFLE=1
38+
39+
# Command line arguments for sentinel tests
40+
TEST_SENTINEL_VARS = PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$(PATH) \
41+
TEST_SENTINEL_PORT=$(firstword $(TEST_SENTINEL_PORTS)) \
42+
TEST_SENTINEL_MASTER_NAME=$(TEST_SENTINEL_MASTER_NAME) \
43+
TEST_REDIS_DATABASE=$(TEST_REDIS_DATABASE) \
44+
TEST_NGINX_NO_SHUFFLE=1
45+
46+
# Sentinel configuration can only be set by a config file
47+
define TEST_SENTINEL_CONFIG
48+
sentinel monitor $(TEST_SENTINEL_MASTER_NAME) 127.0.0.1 $(REDIS_FIRST_PORT) 2
49+
sentinel down-after-milliseconds $(TEST_SENTINEL_MASTER_NAME) 2000
50+
sentinel failover-timeout $(TEST_SENTINEL_MASTER_NAME) 10000
51+
sentinel parallel-syncs $(TEST_SENTINEL_MASTER_NAME) 5
52+
endef
53+
54+
export TEST_SENTINEL_CONFIG
55+
56+
SENTINEL_CONFIG_FILE = /tmp/sentinel-test-config
57+
58+
59+
PREFIX ?= /usr/local
460
LUA_INCLUDE_DIR ?= $(PREFIX)/include
5-
LUA_LIB_DIR ?= $(PREFIX)/lib/lua/$(LUA_VERSION)
6-
INSTALL ?= install
61+
LUA_LIB_DIR ?= $(PREFIX)/lib/lua/$(LUA_VERSION)
62+
PROVE ?= prove -I ../test-nginx/lib
63+
INSTALL ?= install
764

8-
.PHONY: all test install
65+
.PHONY: all install test test_all start_redis_instances stop_redis_instances \
66+
start_redis_instance stop_redis_instance cleanup_redis_instance flush_db \
67+
create_sentinel_config delete_sentinel_config check_ports test_ledge \
68+
test_sentinel
969

1070
all: ;
1171

1272
install: all
13-
$(INSTALL) -d $(DESTDIR)/$(LUA_LIB_DIR)/resty
14-
$(INSTALL) lib/resty/*.lua $(DESTDIR)/$(LUA_LIB_DIR)/resty
73+
$(INSTALL) -d $(DESTDIR)/$(LUA_LIB_DIR)/ledge
74+
$(INSTALL) lib/ledge/*.lua $(DESTDIR)/$(LUA_LIB_DIR)/ledge
75+
76+
test: test_ledge
77+
test_all: start_redis_instances test_ledge test_sentinel stop_redis_instances
78+
79+
start_redis_instances: check_ports create_sentinel_config
80+
@$(foreach port,$(TEST_REDIS_PORTS), \
81+
[[ "$(port)" != "$(REDIS_FIRST_PORT)" ]] && \
82+
SLAVE="$(REDIS_SLAVE_ARG)" || \
83+
SLAVE="" && \
84+
$(MAKE) start_redis_instance args="$$SLAVE" port=$(port) \
85+
prefix=$(REDIS_PREFIX)$(port) && \
86+
) true
87+
88+
@$(foreach port,$(TEST_SENTINEL_PORTS), \
89+
$(MAKE) start_redis_instance \
90+
port=$(port) args="$(SENTINEL_CONFIG_FILE) --sentinel" \
91+
prefix=$(REDIS_PREFIX)$(port) && \
92+
) true
93+
94+
stop_redis_instances: delete_sentinel_config
95+
-@$(foreach port,$(TEST_REDIS_PORTS) $(TEST_SENTINEL_PORTS), \
96+
$(MAKE) stop_redis_instance cleanup_redis_instance port=$(port) \
97+
prefix=$(REDIS_PREFIX)$(port) && \
98+
) true 2>&1 > /dev/null
99+
100+
101+
start_redis_instance:
102+
-@echo "Starting redis on port $(port) with args: \"$(args)\""
103+
-@mkdir -p $(prefix)
104+
@$(REDIS_CMD) $(args) \
105+
--pidfile $(prefix)$(REDIS_PID) \
106+
--bind 127.0.0.1 --port $(port) \
107+
--unixsocket $(prefix)$(REDIS_SOCK) \
108+
--unixsocketperm 777 \
109+
--dir $(prefix) \
110+
--logfile $(prefix)$(REDIS_LOG) \
111+
--loglevel debug \
112+
--daemonize yes
113+
114+
stop_redis_instance:
115+
-@echo "Stopping redis on port $(port)"
116+
-@[[ -f "$(prefix)$(REDIS_PID)" ]] && kill -QUIT \
117+
`cat $(prefix)$(REDIS_PID)` 2>&1 > /dev/null || true
118+
119+
cleanup_redis_instance: stop_redis_instance
120+
-@echo "Cleaning up redis files in $(prefix)"
121+
-@rm -rf $(prefix)
122+
123+
flush_db:
124+
-@echo "Flushing Redis DB"
125+
@$(REDIS_CLI) flushdb
126+
127+
create_sentinel_config:
128+
-@echo "Creating $(SENTINEL_CONFIG_FILE)"
129+
@echo "$$TEST_SENTINEL_CONFIG" > $(SENTINEL_CONFIG_FILE)
130+
131+
delete_sentinel_config:
132+
-@echo "Removing $(SENTINEL_CONFIG_FILE)"
133+
@rm -f $(SENTINEL_CONFIG_FILE)
134+
135+
check_ports:
136+
-@echo "Checking ports $(REDIS_PORTS)"
137+
@$(foreach port,$(REDIS_PORTS),! lsof -i :$(port) &&) true 2>&1 > /dev/null
138+
139+
test_ledge: flush_db
140+
$(TEST_REDIS_VARS) $(PROVE) $(TEST_FILE)
141+
util/lua-releng
15142

16-
test: all
17-
PATH=$(OPENRESTY_PREFIX)/nginx/sbin:$$PATH prove -I../test-nginx/lib -r t
143+
test_sentinel: flush_db
144+
$(TEST_SENTINEL_VARS) $(PROVE) $(SENTINEL_TEST_FILE)/01-master_up.t
145+
$(REDIS_CLI) shutdown
146+
$(TEST_SENTINEL_VARS) $(PROVE) $(SENTINEL_TEST_FILE)/02-master_down.t
147+
sleep $(TEST_SENTINEL_PROMOTION_TIME)
148+
$(TEST_SENTINEL_VARS) $(PROVE) $(SENTINEL_TEST_FILE)/03-slave_promoted.t
18149

150+
test_leak: flush_db
151+
$(TEST_REDIS_VARS) TEST_NGINX_CHECK_LEAK=1 $(PROVE) $(TEST_FILE)

0 commit comments

Comments
 (0)