From 20f43ef409121d2a48cdf9afacad958f002c2de7 Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Sun, 5 Oct 2025 12:40:44 -1000 Subject: [PATCH 1/2] Improve process cleanup and server readiness checks in E2eTestRunner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add warning logging when process group kill fails with EPERM - Log process group ID for debugging purposes - Fix server_responding? to reject 404 responses - Accept 200-399 status codes (success and redirects) - Add test coverage for EPERM handling and 404 rejection - Add test for 3xx redirect handling Closes #14 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../shakacode_demo_common/e2e_test_runner.rb | 9 ++++++--- .../e2e_test_runner_spec.rb | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/shakacode_demo_common/lib/shakacode_demo_common/e2e_test_runner.rb b/packages/shakacode_demo_common/lib/shakacode_demo_common/e2e_test_runner.rb index d925351..2a6184b 100644 --- a/packages/shakacode_demo_common/lib/shakacode_demo_common/e2e_test_runner.rb +++ b/packages/shakacode_demo_common/lib/shakacode_demo_common/e2e_test_runner.rb @@ -146,7 +146,8 @@ def stop def server_responding? url = "http://localhost:#{@port}" response = Net::HTTP.get_response(URI(url)) - response.code.to_i < 500 + # Accept 200-399 (success and redirects), reject 404 and 5xx + (200..399).cover?(response.code.to_i) rescue Errno::ECONNREFUSED, Errno::EADDRNOTAVAIL, SocketError false end @@ -170,8 +171,9 @@ def send_term_signal # Fall back to killing just the main process safe_kill_process('TERM', @server_pid) end - rescue Errno::ESRCH, Errno::EPERM + rescue Errno::ESRCH, Errno::EPERM => e # Process group doesn't exist or permission denied, try single process + puts "Warning: Failed to kill process group #{@server_pgid}: #{e.message}, trying single process" safe_kill_process('TERM', @server_pid) end @@ -182,7 +184,8 @@ def send_kill_signal else safe_kill_process('KILL', @server_pid) end - rescue Errno::ESRCH, Errno::EPERM + rescue Errno::ESRCH, Errno::EPERM => e + puts "Warning: Failed to kill process group #{@server_pgid}: #{e.message}, trying single process" safe_kill_process('KILL', @server_pid) end diff --git a/packages/shakacode_demo_common/spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb b/packages/shakacode_demo_common/spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb index 8abda11..ec58698 100644 --- a/packages/shakacode_demo_common/spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb +++ b/packages/shakacode_demo_common/spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb @@ -206,6 +206,15 @@ allow(Process).to receive(:kill).and_raise(Errno::ESRCH) expect { server.stop }.not_to raise_error end + + context 'when EPERM is raised' do + it 'logs warning and falls back to single process' do + allow(Process).to receive(:kill).with('TERM', -12345).and_raise(Errno::EPERM) + expect(server).to receive(:puts).with(/Warning: Failed to kill process group/) + expect(Process).to receive(:kill).with('TERM', 12345).and_raise(StandardError) + server.stop + end + end end context 'when server is running without process group' do @@ -250,11 +259,16 @@ expect(server.send(:server_responding?)).to be true end - it 'returns true for client errors (4xx)' do - allow(response).to receive(:code).and_return('404') + it 'returns true for redirects (3xx)' do + allow(response).to receive(:code).and_return('302') expect(server.send(:server_responding?)).to be true end + it 'returns false for client errors (4xx)' do + allow(response).to receive(:code).and_return('404') + expect(server.send(:server_responding?)).to be false + end + it 'returns false for server errors (5xx)' do allow(response).to receive(:code).and_return('500') expect(server.send(:server_responding?)).to be false From 680b0217cbcce5c2f78d0255d1d7afbfe473f563 Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Sun, 5 Oct 2025 12:43:36 -1000 Subject: [PATCH 2/2] Remove spec/examples.txt and add to .gitignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This file is generated by RSpec and should not be tracked in version control. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- packages/shakacode_demo_common/.gitignore | 1 + .../shakacode_demo_common/spec/examples.txt | 31 ------------------- 2 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 packages/shakacode_demo_common/spec/examples.txt diff --git a/packages/shakacode_demo_common/.gitignore b/packages/shakacode_demo_common/.gitignore index 397fbc4..bfabae8 100644 --- a/packages/shakacode_demo_common/.gitignore +++ b/packages/shakacode_demo_common/.gitignore @@ -12,6 +12,7 @@ lib/bundler/man pkg rdoc spec/reports +spec/examples.txt test/tmp test/version_tmp tmp diff --git a/packages/shakacode_demo_common/spec/examples.txt b/packages/shakacode_demo_common/spec/examples.txt deleted file mode 100644 index ee2702e..0000000 --- a/packages/shakacode_demo_common/spec/examples.txt +++ /dev/null @@ -1,31 +0,0 @@ -example_id | status | run_time | ------------------------------------------------------------------ | ------ | --------------- | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:1:1] | passed | 0.00003 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:1:2] | passed | 0.00004 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:2:1] | passed | 0.00065 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:2:2] | passed | 0.00182 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:2:3] | passed | 0.00066 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:2:4] | passed | 0.00074 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:2:5:1] | passed | 0.00067 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:2:6:1] | passed | 0.00054 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[1:2:6:2] | passed | 0.00057 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:1:1] | passed | 0.00004 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:1:2] | passed | 0.00003 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:2:1] | passed | 0.00452 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:3:1:1] | passed | 0.00022 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:3:1:2] | passed | 0.00048 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:3:2:1] | passed | 0.00483 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:3:2:2] | passed | 0.00174 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:3:3:1] | passed | 0.00037 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:4:1:1] | passed | 0.00049 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:4:1:2] | passed | 0.00044 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:4:1:3] | passed | 0.00027 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:4:1:4] | passed | 0.00122 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:4:2:1] | passed | 0.00024 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:4:2:2] | passed | 0.00031 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:4:3:1] | passed | 0.00008 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:5:1] | passed | 0.00035 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:5:2] | passed | 0.00043 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:5:3] | passed | 0.00019 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:5:4] | passed | 0.0002 seconds | -./spec/lib/shakacode_demo_common/e2e_test_runner_spec.rb[2:5:5] | passed | 0.00022 seconds |