I am writing a script that reads connection information from a config file, and based, on what it finds, connects to multiple mysql servers and performs tasks. To test this script, I need to set up test servers, but getting them running without causing the tests to be rerun when they stop is a bit..tricky. I cannot say that I''m proud of it, but here is how I did it: tc_my_script_spec.rb: require ''my_script'' ... def setup_test_servers teardown_test_servers(:kill) ... pids = [] ... pid = fork {`nohup mysqld_safe --no-defaults #{server_options * '' ''} &`} raise "mysqld_safe fork failed" if $? != 0 if pid pids << pid else exit! end ... pids.each{|pid| Process.kill(9,pid)} Spec::Runner.configure do |config| config.after(:suite) at_exit(teardown_test_servers(nil) end end end def teardown_test_servers(kill) @servers.each do |server, data| connection_options = { :host => data[:host], :port => data[:port], :user => ''shutdown'', } connection_string = ''--no-defaults '' + connect_options.map{|opt, val| "--#{opt}=#{val}"} * '' '' if doit_status("mysqladmin #{connect_string} ping 2>&1") == 0 doit("mysqladmin #{connect_string} shutdown") end doit("rm -rf #{datadir}") if kill or !File.exists? "#{datadir}/keep" end def doit(command) response = core_do(command) $? != 0 and raise "Command: #{command}\nExit code :#{''%x'' % $?}.\n# {response}" response end def doit_status(command) core_do(command) $? >> 8 end def core_do(command) response = `#{command}` signal = $? & 0x7f kill(signal, 0) if signal != 0 response end ... describe ...
Ashley Moran
2009-Oct-29 10:22 UTC
[rspec-users] HOWTO: Background tasks during test (ugly)
On Oct 29, 2009, at 3:09 am, Student wrote:> I am writing a script that reads connection information from a config > file, and based, on what it finds, connects to multiple mysql servers > and performs tasks. To test this script, I need to set up test > servers, but getting them running without causing the tests to be > rerun when they stop is a bit..tricky. I cannot say that I''m proud of > it, but here is how I did it:Is this because of autospec? If so, you can modify the files autotest watches. Or, you could do the server stuff in a tmpdir[1] directory. Let me know if I''m off-target - I can''t see the definition of `datadir` in your snippet. Ashley [1] http://www.ruby-forum.com/topic/169054 -- http://www.patchspace.co.uk/ http://www.linkedin.com/in/ashleymoran http://aviewfromafar.net/
No autoscript here. I don''t doubt that there are wrappers that might handle it, I was going for a solution in a bare rspec environment. datadir was missed in the transposition--it should have been data [:dir]. Nathan On Oct 29, 5:22?am, Ashley Moran <ashley.mo... at patchspace.co.uk> wrote:> On Oct 29, 2009, at 3:09 am, Student wrote: > > > I am writing a script that reads connection information from a config > > file, and based, on what it finds, connects to multiple mysql servers > > and performs tasks. ?To test this script, I need to set up test > > servers, but getting them running without causing the tests to be > > rerun when they stop is a bit..tricky. ?I cannot say that I''m proud of > > it, but here is how I did it: > > Is this because of autospec? ?If so, you can modify the files autotest ? > watches. ?Or, you could do the server stuff in a tmpdir[1] directory. > > Let me know if I''m off-target - I can''t see the definition of ? > `datadir` in your snippet. > > Ashley > > [1]http://www.ruby-forum.com/topic/169054 > > --http://www.patchspace.co.uk/http://www.linkedin.com/in/ashleymoranhttp://aviewfromafar.net/ > > _______________________________________________ > rspec-users mailing list > rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
Ashley Moran
2009-Oct-29 14:54 UTC
[rspec-users] HOWTO: Background tasks during test (ugly)
On Oct 29, 2009, at 12:28 pm, Student wrote:> No autoscript here. I don''t doubt that there are wrappers that might > handle it, I was going for a solution in a bare rspec environment.Still not sure I understand the problem. Can you explain what you mean by "getting them running without causing the tests to be rerun when they stop is a bit..tricky"? Can you paste output to illustrate this? Ashley -- http://www.patchspace.co.uk/ http://www.linkedin.com/in/ashleymoran http://aviewfromafar.net/
forever.sh: while true ; do sleep 5 ; done tc_forks.rb 2.times do fork {`nohup sh forever.sh &`} end describe "We can do tests in the air" do it "Here is the first test" do 1.should not_raise end end spec tc_forks_spec.rb nohup: redirecting stderr to stdout nohup: redirecting stderr to stdout F 1) NameError in ''We can do tests in the air Here is the first test'' undefined local variable or method `not_raise'' for #<Spec::Example::ExampleGroup::Subclass_1:0xb7a5005c> ./tc_forks_spec.rb:8: Finished in 0.005975 seconds 1 example, 1 failure nathan-desktop ~/work/rspec_multiple ps PID TTY TIME CMD 10637 pts/2 00:00:00 bash 11010 pts/2 00:00:00 nedit 11286 pts/2 00:00:00 spec 11287 pts/2 00:00:00 spec 11288 pts/2 00:00:00 sh <defunct> 11289 pts/2 00:00:00 sh <defunct> 11290 pts/2 00:00:00 sh 11291 pts/2 00:00:00 sh 11300 pts/2 00:00:00 sleep 11301 pts/2 00:00:00 sleep 11303 pts/2 00:00:00 ps nathan-desktop ~/work/rspec_multiple kill 11290 nathan-desktop ~/work/rspec_multiple nohup: redirecting stderr to stdout nohup: redirecting stderr to stdout F 1) NameError in ''We can do tests in the air Here is the first test'' undefined local variable or method `not_raise'' for #<Spec::Example::ExampleGroup::Subclass_1:0xb7a4e900> ./tc_forks_spec.rb:8: ./tc_forks_spec.rb:2: Finished in 0.006251 seconds 1 example, 1 failure nathan-desktop ~/work/rspec_multiple ps PID TTY TIME CMD 10637 pts/2 00:00:00 bash 11010 pts/2 00:00:01 nedit 11286 pts/2 00:00:00 spec 11288 pts/2 00:00:00 sh <defunct> 11291 pts/2 00:00:00 sh 11346 pts/2 00:00:00 spec 11347 pts/2 00:00:00 spec 11348 pts/2 00:00:00 sh <defunct> 11349 pts/2 00:00:00 sh 11350 pts/2 00:00:00 sh <defunct> 11351 pts/2 00:00:00 sh 11436 pts/2 00:00:00 sleep 11437 pts/2 00:00:00 sleep 11438 pts/2 00:00:00 sleep 11439 pts/2 00:00:00 ps There are variations here. This particular example spawned two new spec processes when I killed one of the sh process. I thought it worthwhile to publish the one that works. ;) On Oct 29, 9:54?am, Ashley Moran <ashley.mo... at patchspace.co.uk> wrote:> On Oct 29, 2009, at 12:28 pm, Student wrote: > > > No autoscript here. ?I don''t doubt that there are wrappers that might > > handle it, I was going for a solution in a bare rspec environment. > > Still not sure I understand the problem. ?Can you explain what you ? > mean by "getting them running without causing the tests to be rerun ? > when they stop is a bit..tricky"? ?Can you paste output to illustrate ? > this? > > Ashley > > --http://www.patchspace.co.uk/http://www.linkedin.com/in/ashleymoranhttp://aviewfromafar.net/ > > _______________________________________________ > rspec-users mailing list > rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
David Chelimsky
2009-Oct-29 16:33 UTC
[rspec-users] HOWTO: Background tasks during test (ugly)
On Oct 29, 2009, at 11:17 AM, Student <blogger at pierian-spring.net> wrote:> forever.sh: > while true ; do sleep 5 ; done > > tc_forks.rb > 2.times do > fork {`nohup sh forever.sh &`} > end > > describe "We can do tests in the air" do > > it "Here is the first test" do > 1.should not_raise1.should_not raise_error> end > end > > > spec tc_forks_spec.rb > nohup: redirecting stderr to stdout > nohup: redirecting stderr to stdout > F > > 1) > NameError in ''We can do tests in the air Here is the first test'' > undefined local variable or method `not_raise'' for > #<Spec::Example::ExampleGroup::Subclass_1:0xb7a5005c> > ./tc_forks_spec.rb:8: > > Finished in 0.005975 seconds > > 1 example, 1 failure > nathan-desktop ~/work/rspec_multiple ps > PID TTY TIME CMD > 10637 pts/2 00:00:00 bash > 11010 pts/2 00:00:00 nedit > 11286 pts/2 00:00:00 spec > 11287 pts/2 00:00:00 spec > 11288 pts/2 00:00:00 sh <defunct> > 11289 pts/2 00:00:00 sh <defunct> > 11290 pts/2 00:00:00 sh > 11291 pts/2 00:00:00 sh > 11300 pts/2 00:00:00 sleep > 11301 pts/2 00:00:00 sleep > 11303 pts/2 00:00:00 ps > nathan-desktop ~/work/rspec_multiple kill 11290 > nathan-desktop ~/work/rspec_multiple nohup: redirecting stderr to > stdout > nohup: redirecting stderr to stdout > F > > 1) > NameError in ''We can do tests in the air Here is the first test'' > undefined local variable or method `not_raise'' for > #<Spec::Example::ExampleGroup::Subclass_1:0xb7a4e900> > ./tc_forks_spec.rb:8: > ./tc_forks_spec.rb:2: > > Finished in 0.006251 seconds > > 1 example, 1 failure > > nathan-desktop ~/work/rspec_multiple ps > PID TTY TIME CMD > 10637 pts/2 00:00:00 bash > 11010 pts/2 00:00:01 nedit > 11286 pts/2 00:00:00 spec > 11288 pts/2 00:00:00 sh <defunct> > 11291 pts/2 00:00:00 sh > 11346 pts/2 00:00:00 spec > 11347 pts/2 00:00:00 spec > 11348 pts/2 00:00:00 sh <defunct> > 11349 pts/2 00:00:00 sh > 11350 pts/2 00:00:00 sh <defunct> > 11351 pts/2 00:00:00 sh > 11436 pts/2 00:00:00 sleep > 11437 pts/2 00:00:00 sleep > 11438 pts/2 00:00:00 sleep > 11439 pts/2 00:00:00 ps > > There are variations here. This particular example spawned two new > spec processes when I killed one of the sh process. I thought it > worthwhile to publish the one that works. ;) > > > > > On Oct 29, 9:54 am, Ashley Moran <ashley.mo... at patchspace.co.uk> > wrote: >> On Oct 29, 2009, at 12:28 pm, Student wrote: >> >>> No autoscript here. I don''t doubt that there are wrappers that >>> might >>> handle it, I was going for a solution in a bare rspec environment. >> >> Still not sure I understand the problem. Can you explain what you >> mean by "getting them running without causing the tests to be rerun >> when they stop is a bit..tricky"? Can you paste output to illustrate >> this? >> >> Ashley >> >> --http://www.patchspace.co.uk/http://www.linkedin.com/in/ashleymoranhttp://aviewfromafar.net/ >> >> _______________________________________________ >> rspec-users mailing list >> rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/ >> rspec-users > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users