tests: cleanup isolate usage
[rainbows.git] / t / GNUmakefile
blob955f273aa848a88651e321ee74d9c0a4f910848d
1 # we can run tests in parallel with GNU make
3 all::
5 pid := $(shell echo $$PPID)
7 RUBY = ruby
8 rainbows_lib := $(shell cd ../lib && pwd)
9 -include ../local.mk
10 ifeq ($(RUBY_VERSION),)
11 RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION')
12 endif
14 ifeq ($(RUBY_VERSION),)
15 $(error unable to detect RUBY_VERSION)
16 endif
18 export RUBY_VERSION
20 models += WriterThreadPool
21 models += WriterThreadSpawn
22 models += ThreadPool
23 models += ThreadSpawn
24 models += Rev
25 models += EventMachine
26 models += NeverBlock
27 models += RevThreadSpawn
28 models += RevThreadPool
30 rp := )
31 ONENINE := $(shell case $(RUBY_VERSION) in 1.9.*$(rp) echo true;;esac)
32 ifeq ($(ONENINE),true)
33 models += Revactor
34 models += FiberSpawn
35 models += RevFiberSpawn
36 models += FiberPool
37 endif
38 all_models := $(models) Base
40 T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
42 MODEL_T := $(foreach m,$(all_models),$(addprefix $(m).,$(T)))
43 $(T): MODELS = $(models)
45 # some tests can be run with all models
46 t0000-simple-http.sh: MODELS = $(all_models)
47 t0001-unix-http.sh: MODELS = $(all_models)
48 t0002-graceful.sh: MODELS = $(all_models)
49 t0002-parser-error.sh: MODELS = $(all_models)
50 t0003-reopen-logs.sh: MODELS = $(all_models)
52 # recursively run per-model tests
53 # haven't figured out a good way to make make non-recursive here, yet...
54 $(T):
55 $(MAKE) $(foreach m,$(MODELS),$(addprefix $(m).,$@))
57 $(all_models):
58 $(MAKE) $(filter $@.%,$(MODEL_T))
60 all:: $(T)
62 # can't rely on "set -o pipefail" since we don't require bash or ksh93 :<
63 t_pfx = trash/$@-$(RUBY_VERSION)
64 TEST_OPTS =
65 # TRACER = strace -f -o $(t_pfx).strace -s 100000
66 # TRACER = /usr/bin/time -o $(t_pfx).time
68 ifdef V
69 ifeq ($(V),2)
70 TEST_OPTS += --trace
71 else
72 TEST_OPTS += --verbose
73 endif
74 endif
76 test-bin-$(RUBY_VERSION)/rainbows: ruby_bin = $(shell which $(RUBY))
77 test-bin-$(RUBY_VERSION)/rainbows: ../bin/rainbows
78 mkdir -p $(@D)
79 install -m 755 $^ $@.$(pid)
80 $(RUBY) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $@.$(pid)
81 mv $@.$(pid) $@
83 random_blob:
84 dd if=/dev/urandom bs=1M count=30 of=$@.$(pid)
85 mv $@.$(pid) $@
87 $(T): random_blob
89 dependencies := socat curl
90 deps := $(addprefix .dep+,$(dependencies))
91 $(deps): dep_bin = $(lastword $(subst +, ,$@))
92 $(deps):
93 @which $(dep_bin) > $@.$(pid) 2>/dev/null || :
94 @test -s $@.$(pid) || \
95 { echo >&2 "E '$(dep_bin)' not found in PATH=$(PATH)"; exit 1; }
96 @mv $@.$(pid) $@
98 libs := tmp/isolate/ruby-$(RUBY_VERSION)/.libs
99 $(libs): test_isolate.rb
100 mkdir -p $(@D)
101 $(RUBY) $< > $@+
102 mv $@+ $@
103 $(T): $(libs) $(deps) test-bin-$(RUBY_VERSION)/rainbows trash/.gitignore
105 $(MODEL_T): export model = $(firstword $(subst ., ,$@))
106 $(MODEL_T): script = $(subst $(model).,,$@)
107 $(MODEL_T): export RUBY := $(RUBY)
108 $(MODEL_T): export PATH := $(CURDIR)/test-bin-$(RUBY_VERSION):$(PATH)
109 $(MODEL_T):
110 RUBYLIB=$(rainbows_lib):$$(cat $(libs)) \
111 $(TRACER) $(SHELL) $(SH_TEST_OPTS) $(script) $(TEST_OPTS)
113 trash/.gitignore:
114 mkdir -p $(@D)
115 echo '*' > $@
117 clean:
118 $(RM) -r trash/*.log trash/*.code test-bin-$(RUBY_VERSION)
120 .PHONY: $(T) clean