summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--test/ruby/hooks/config.ru7
-rw-r--r--test/ruby/hooks/eval.rb3
-rw-r--r--test/ruby/hooks/multiple.rb9
-rw-r--r--test/ruby/hooks/on_thread_boot.rb5
-rw-r--r--test/ruby/hooks/on_thread_shutdown.rb5
-rw-r--r--test/ruby/hooks/on_worker_boot.rb5
-rw-r--r--test/ruby/hooks/on_worker_shutdown.rb5
-rw-r--r--test/test_ruby_hooks.py98
-rw-r--r--test/unit/applications/lang/ruby.py24
-rw-r--r--test/unit/applications/proto.py16
-rw-r--r--test/unit/utils.py28
11 files changed, 183 insertions, 22 deletions
diff --git a/test/ruby/hooks/config.ru b/test/ruby/hooks/config.ru
new file mode 100644
index 00000000..f3069558
--- /dev/null
+++ b/test/ruby/hooks/config.ru
@@ -0,0 +1,7 @@
+app = Proc.new do |env|
+ ['200', {
+ 'Content-Length' => '0'
+ }, ['']]
+end
+
+run app
diff --git a/test/ruby/hooks/eval.rb b/test/ruby/hooks/eval.rb
new file mode 100644
index 00000000..ce7329c1
--- /dev/null
+++ b/test/ruby/hooks/eval.rb
@@ -0,0 +1,3 @@
+require 'securerandom'
+
+File.write("./cookie_eval.#{SecureRandom.hex}", "evaluated")
diff --git a/test/ruby/hooks/multiple.rb b/test/ruby/hooks/multiple.rb
new file mode 100644
index 00000000..295b46a9
--- /dev/null
+++ b/test/ruby/hooks/multiple.rb
@@ -0,0 +1,9 @@
+require 'securerandom'
+
+on_worker_boot do
+ File.write("./cookie_worker_boot.#{SecureRandom.hex}", "worker booted")
+end
+
+on_thread_boot do
+ File.write("./cookie_thread_boot.#{SecureRandom.hex}", "thread booted")
+end
diff --git a/test/ruby/hooks/on_thread_boot.rb b/test/ruby/hooks/on_thread_boot.rb
new file mode 100644
index 00000000..1e05e248
--- /dev/null
+++ b/test/ruby/hooks/on_thread_boot.rb
@@ -0,0 +1,5 @@
+require 'securerandom'
+
+on_thread_boot do
+ File.write("./cookie_thread_boot.#{SecureRandom.hex}", "booted")
+end
diff --git a/test/ruby/hooks/on_thread_shutdown.rb b/test/ruby/hooks/on_thread_shutdown.rb
new file mode 100644
index 00000000..e65c1b42
--- /dev/null
+++ b/test/ruby/hooks/on_thread_shutdown.rb
@@ -0,0 +1,5 @@
+require 'securerandom'
+
+on_thread_shutdown do
+ File.write("./cookie_thread_shutdown.#{SecureRandom.hex}", "shutdown")
+end
diff --git a/test/ruby/hooks/on_worker_boot.rb b/test/ruby/hooks/on_worker_boot.rb
new file mode 100644
index 00000000..b6529f60
--- /dev/null
+++ b/test/ruby/hooks/on_worker_boot.rb
@@ -0,0 +1,5 @@
+require 'securerandom'
+
+on_worker_boot do
+ File.write("./cookie_worker_boot.#{SecureRandom.hex}", "booted")
+end
diff --git a/test/ruby/hooks/on_worker_shutdown.rb b/test/ruby/hooks/on_worker_shutdown.rb
new file mode 100644
index 00000000..9ffaad93
--- /dev/null
+++ b/test/ruby/hooks/on_worker_shutdown.rb
@@ -0,0 +1,5 @@
+require 'securerandom'
+
+on_worker_shutdown do
+ File.write("./cookie_worker_shutdown.#{SecureRandom.hex}", "shutdown")
+end
diff --git a/test/test_ruby_hooks.py b/test/test_ruby_hooks.py
new file mode 100644
index 00000000..af8ce337
--- /dev/null
+++ b/test/test_ruby_hooks.py
@@ -0,0 +1,98 @@
+import os
+import time
+from pathlib import Path
+
+import pytest
+
+from conftest import unit_stop
+from unit.applications.lang.ruby import TestApplicationRuby
+from unit.option import option
+from unit.utils import waitforglob
+
+
+class TestRubyHooks(TestApplicationRuby):
+ prerequisites = {'modules': {'ruby': 'all'}}
+
+ def _wait_cookie(self, pattern, count):
+ return waitforglob(
+ option.temp_dir + '/ruby/hooks/cookie_' + pattern, count
+ )
+
+ def test_ruby_hooks_eval(self):
+ processes = 2
+
+ self.load('hooks', processes=processes, hooks='eval.rb')
+
+ hooked = self._wait_cookie('eval.*', processes)
+
+ assert hooked, 'hooks evaluated'
+
+ def test_ruby_hooks_on_worker_boot(self):
+ processes = 2
+
+ self.load('hooks', processes=processes, hooks='on_worker_boot.rb')
+
+ hooked = self._wait_cookie('worker_boot.*', processes)
+
+ assert hooked, 'on_worker_boot called'
+
+ def test_ruby_hooks_on_worker_shutdown(self):
+ processes = 2
+
+ self.load('hooks', processes=processes, hooks='on_worker_shutdown.rb')
+
+ assert self.get()['status'] == 200, 'app response'
+
+ self.load('empty')
+
+ hooked = self._wait_cookie('worker_shutdown.*', processes)
+
+ assert hooked, 'on_worker_shutdown called'
+
+ def test_ruby_hooks_on_thread_boot(self):
+ processes = 1
+ threads = 2
+
+ self.load(
+ 'hooks',
+ processes=processes,
+ threads=threads,
+ hooks='on_thread_boot.rb',
+ )
+
+ hooked = self._wait_cookie('thread_boot.*', processes * threads)
+
+ assert hooked, 'on_thread_boot called'
+
+ def test_ruby_hooks_on_thread_shutdown(self):
+ processes = 1
+ threads = 2
+
+ self.load(
+ 'hooks',
+ processes=processes,
+ threads=threads,
+ hooks='on_thread_shutdown.rb',
+ )
+
+ assert self.get()['status'] == 200, 'app response'
+
+ self.load('empty')
+
+ hooked = self._wait_cookie('thread_shutdown.*', processes * threads)
+
+ assert hooked, 'on_thread_shutdown called'
+
+ def test_ruby_hooks_multiple(self):
+ processes = 1
+ threads = 1
+
+ self.load(
+ 'hooks', processes=processes, threads=threads, hooks='multiple.rb',
+ )
+
+ hooked = self._wait_cookie('worker_boot.*', processes)
+ assert hooked, 'on_worker_boot called'
+
+ hooked = self._wait_cookie('thread_boot.*', threads)
+ assert hooked, 'on_thread_boot called'
diff --git a/test/unit/applications/lang/ruby.py b/test/unit/applications/lang/ruby.py
index d95d62b4..61d50558 100644
--- a/test/unit/applications/lang/ruby.py
+++ b/test/unit/applications/lang/ruby.py
@@ -12,7 +12,7 @@ class TestApplicationRuby(TestApplicationProto):
def prepare_env(self, script):
shutil.copytree(
option.test_dir + '/ruby/' + script,
- option.temp_dir + '/ruby/' + script
+ option.temp_dir + '/ruby/' + script,
)
public_dir(option.temp_dir + '/ruby/' + script)
@@ -22,17 +22,23 @@ class TestApplicationRuby(TestApplicationProto):
script_path = option.temp_dir + '/ruby/' + script
+ app = {
+ "type": self.get_application_type(),
+ "processes": {"spare": 0},
+ "working_directory": script_path,
+ "script": script_path + '/' + name,
+ }
+
+ for key in [
+ 'hooks',
+ ]:
+ if key in kwargs:
+ app[key] = kwargs[key]
+
self._load_conf(
{
"listeners": {"*:7080": {"pass": "applications/" + script}},
- "applications": {
- script: {
- "type": self.get_application_type(),
- "processes": {"spare": 0},
- "working_directory": script_path,
- "script": script_path + '/' + name,
- }
- },
+ "applications": {script: app},
},
**kwargs
)
diff --git a/test/unit/applications/proto.py b/test/unit/applications/proto.py
index 92754c03..e30d21ff 100644
--- a/test/unit/applications/proto.py
+++ b/test/unit/applications/proto.py
@@ -47,13 +47,15 @@ class TestApplicationProto(TestControl):
if 'applications' in conf:
for app in conf['applications'].keys():
app_conf = conf['applications'][app]
- if 'user' in kwargs:
- app_conf['user'] = kwargs['user']
- if 'group' in kwargs:
- app_conf['group'] = kwargs['group']
-
- if 'isolation' in kwargs:
- app_conf['isolation'] = kwargs['isolation']
+ for key in [
+ 'user',
+ 'group',
+ 'isolation',
+ 'processes',
+ 'threads',
+ ]:
+ if key in kwargs:
+ app_conf[key] = kwargs[key]
assert 'success' in self.conf(conf), 'load application configuration'
diff --git a/test/unit/utils.py b/test/unit/utils.py
index a627e9f5..43aaa81b 100644
--- a/test/unit/utils.py
+++ b/test/unit/utils.py
@@ -1,3 +1,4 @@
+import glob
import os
import socket
import subprocess
@@ -16,8 +17,8 @@ def public_dir(path):
os.chmod(os.path.join(root, f), 0o777)
-def waitforfiles(*files):
- for i in range(50):
+def waitforfiles(*files, timeout=50):
+ for i in range(timeout):
wait = False
for f in files:
@@ -33,6 +34,21 @@ def waitforfiles(*files):
return False
+def waitforglob(pattern, count=1, timeout=50):
+ for i in range(timeout):
+ n = 0
+
+ for f in glob.glob(pattern):
+ n += 1
+
+ if n == count:
+ return True
+
+ time.sleep(0.1)
+
+ return False
+
+
def waitforsocket(port):
for i in range(50):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
@@ -72,8 +88,8 @@ def sysctl():
return out
-def waitformount(template, wait=50):
- for i in range(wait):
+def waitformount(template, timeout=50):
+ for i in range(timeout):
if findmnt().find(template) != -1:
return True
@@ -82,8 +98,8 @@ def waitformount(template, wait=50):
return False
-def waitforunmount(template, wait=50):
- for i in range(wait):
+def waitforunmount(template, timeout=50):
+ for i in range(timeout):
if findmnt().find(template) == -1:
return True