bane 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY.md +49 -0
  3. data/LICENSE +1 -1
  4. data/README.md +41 -31
  5. data/TODO +15 -10
  6. data/bin/bane +8 -11
  7. data/lib/bane/arguments_parser.rb +75 -0
  8. data/lib/bane/behavior_maker.rb +41 -0
  9. data/lib/bane/behaviors/responders/close_after_pause.rb +23 -0
  10. data/lib/bane/behaviors/responders/close_immediately.rb +16 -0
  11. data/lib/bane/behaviors/responders/deluge_response.rb +29 -0
  12. data/lib/bane/behaviors/responders/echo_response.rb +18 -0
  13. data/lib/bane/behaviors/responders/exported.rb +11 -0
  14. data/lib/bane/behaviors/responders/fixed_response.rb +27 -0
  15. data/lib/bane/behaviors/responders/for_each_line.rb +20 -0
  16. data/lib/bane/behaviors/responders/http_refuse_all_credentials.rb +33 -0
  17. data/lib/bane/behaviors/responders/never_respond.rb +29 -0
  18. data/lib/bane/behaviors/responders/newline_response.rb +20 -0
  19. data/lib/bane/behaviors/responders/random_response.rb +26 -0
  20. data/lib/bane/behaviors/responders/slow_response.rb +34 -0
  21. data/lib/bane/behaviors/servers/exported.rb +20 -0
  22. data/lib/bane/behaviors/servers/responder_server.rb +52 -0
  23. data/lib/bane/behaviors/servers/timeout_in_listen_queue.rb +53 -0
  24. data/lib/bane/command_line_configuration.rb +41 -0
  25. data/lib/bane/extensions.rb +9 -0
  26. data/lib/bane/launcher.rb +9 -8
  27. data/lib/bane/naive_http_response.rb +2 -0
  28. data/lib/bane/version.rb +5 -0
  29. data/lib/bane.rb +21 -6
  30. metadata +104 -102
  31. data/Rakefile +0 -60
  32. data/examples/simple_port_and_class_as_constant.rb +0 -9
  33. data/examples/simple_port_and_class_as_string.rb +0 -7
  34. data/examples/specify_behavior_options.rb +0 -16
  35. data/examples/specify_ports.rb +0 -15
  36. data/lib/bane/behaviors.rb +0 -151
  37. data/lib/bane/compatibility.rb +0 -36
  38. data/lib/bane/configuration.rb +0 -50
  39. data/lib/bane/configuration_parser.rb +0 -74
  40. data/lib/bane/delegating_gserver.rb +0 -42
  41. data/lib/bane/service_registry.rb +0 -17
  42. data/test/bane/behaviors_test.rb +0 -137
  43. data/test/bane/configuration_parser_test.rb +0 -124
  44. data/test/bane/configuration_test.rb +0 -52
  45. data/test/bane/delegating_gserver_test.rb +0 -56
  46. data/test/bane/integration_test.rb +0 -67
  47. data/test/bane/launcher_test.rb +0 -16
  48. data/test/bane/naive_http_response_test.rb +0 -69
  49. data/test/bane/service_registry_test.rb +0 -20
  50. data/test/test_helper.rb +0 -9
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bane
4
+ module Behaviors
5
+ module Servers
6
+
7
+ EXPORTED = [TimeoutInListenQueue]
8
+
9
+ # Listen only on localhost
10
+ LOCALHOST = '127.0.0.1'
11
+
12
+ # Deprecated - use LOCALHOST - Listen only on localhost
13
+ DEFAULT_HOST = LOCALHOST
14
+
15
+ # Listen on all interfaces
16
+ ALL_INTERFACES = '0.0.0.0'
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'gserver'
4
+
5
+ module Bane
6
+ module Behaviors
7
+ module Servers
8
+
9
+ class ResponderServer < GServer
10
+
11
+ def initialize(port, behavior, host = Servers::LOCALHOST)
12
+ super(port, host)
13
+ @behavior = behavior
14
+ self.audit = true
15
+ end
16
+
17
+ def serve(io)
18
+ @behavior.serve(io)
19
+ end
20
+
21
+ def to_s
22
+ "<Bane::BehaviorServer: port=#{@port}, behavior=#{@behavior.class}>"
23
+ end
24
+
25
+ protected
26
+
27
+ alias_method :original_log, :log
28
+
29
+ def log(message)
30
+ original_log("#{@behavior.class.unqualified_name} #{@host}:#{@port} #{message}")
31
+ end
32
+
33
+ def connecting(client)
34
+ addr = client.peeraddr
35
+ log("client:#{addr[1]} #{addr[2]}<#{addr[3]}> connect")
36
+ end
37
+
38
+ def disconnecting(client_port)
39
+ log("client:#{client_port} disconnect")
40
+ end
41
+
42
+ def starting
43
+ log('start')
44
+ end
45
+
46
+ def stopping
47
+ log('stop')
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'socket'
4
+
5
+ module Bane
6
+ module Behaviors
7
+ module Servers
8
+
9
+ class TimeoutInListenQueue
10
+
11
+ def initialize(port, host = Servers::LOCALHOST)
12
+ @port = port
13
+ @host = host
14
+ self.stdlog= $stderr
15
+ end
16
+
17
+ def start
18
+ @server = Socket.new(:INET, :STREAM)
19
+ address = Socket.sockaddr_in(port, host)
20
+ @server.bind(address) # Note that we never call listen
21
+
22
+ log 'started'
23
+ end
24
+
25
+ def join
26
+ sleep
27
+ end
28
+
29
+ def stop
30
+ @server.close
31
+ log 'stopped'
32
+ end
33
+
34
+ def stdlog=(logger)
35
+ @logger = logger
36
+ end
37
+
38
+ def self.make(port, host)
39
+ new(port, host)
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :host, :port, :logger
45
+
46
+ def log(message)
47
+ logger.puts "[#{Time.new.ctime}] #{self.class.unqualified_name} #{host}:#{port} #{message}"
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bane
4
+
5
+ def self.find_makeables
6
+ Hash[Bane::Behaviors::Responders::EXPORTED.map { |responder| [responder.unqualified_name, ResponderMaker.new(responder)] }]
7
+ .merge(Hash[Bane::Behaviors::Servers::EXPORTED.map { |server| [server.unqualified_name, server] }])
8
+ end
9
+
10
+ class CommandLineConfiguration
11
+
12
+ def initialize(makeables)
13
+ @behavior_maker = BehaviorMaker.new(makeables)
14
+ @arguments_parser = ArgumentsParser.new(makeables.keys)
15
+ end
16
+
17
+ def process(args, &error_policy)
18
+ arguments = @arguments_parser.parse(args)
19
+ create(arguments.behaviors, arguments.port, arguments.host)
20
+ rescue ConfigurationError => ce
21
+ error_policy.call([ce.message, @arguments_parser.usage].join("\n"))
22
+ end
23
+
24
+ private
25
+
26
+ def create(behaviors, port, host)
27
+ if behaviors.any?
28
+ @behavior_maker.create(behaviors, port, host)
29
+ else
30
+ @behavior_maker.create_all(port, host)
31
+ end
32
+ rescue UnknownBehaviorError => ube
33
+ raise ConfigurationError, ube.message
34
+ end
35
+
36
+ end
37
+
38
+ class ConfigurationError < RuntimeError;
39
+ end
40
+
41
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ unless Class.respond_to?(:unqualified_name)
4
+ class Class
5
+ def unqualified_name
6
+ self.name.split("::").last
7
+ end
8
+ end
9
+ end
data/lib/bane/launcher.rb CHANGED
@@ -1,25 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bane
2
4
 
3
5
  class Launcher
4
6
 
5
- def initialize(configurations, logger = $stderr)
6
- @configuration = configurations
7
- @logger = logger
8
- @running_servers = []
7
+ def initialize(servers, logger = $stderr)
8
+ @servers = servers
9
+ @servers.each { |server| server.stdlog = logger }
9
10
  end
10
11
 
11
12
  def start
12
- @running_servers = @configuration.start(@logger)
13
+ @servers.each { |server| server.start }
13
14
  end
14
15
 
15
16
  def join
16
- @running_servers.each { |server| server.join }
17
+ @servers.each { |server| server.join }
17
18
  end
18
19
 
19
20
  def stop
20
- @running_servers.each { |server| server.stop }
21
+ @servers.each { |server| server.stop }
21
22
  end
22
23
 
23
24
  end
24
-
25
+
25
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NaiveHttpResponse
2
4
 
3
5
  CRLF = "\r\n"
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bane
4
+ VERSION = '1.0.0'
5
+ end
data/lib/bane.rb CHANGED
@@ -1,8 +1,23 @@
1
- require 'bane/compatibility'
2
- require 'bane/service_registry'
3
- require 'bane/behaviors'
1
+ # frozen_string_literal: true
2
+
3
+ require 'bane/extensions'
4
+ require 'bane/behavior_maker'
5
+ require 'bane/behaviors/responders/for_each_line'
6
+ require 'bane/behaviors/responders/close_after_pause'
7
+ require 'bane/behaviors/responders/close_immediately'
8
+ require 'bane/behaviors/responders/deluge_response'
9
+ require 'bane/behaviors/responders/echo_response'
10
+ require 'bane/behaviors/responders/fixed_response'
11
+ require 'bane/behaviors/responders/http_refuse_all_credentials'
12
+ require 'bane/behaviors/responders/never_respond'
13
+ require 'bane/behaviors/responders/newline_response'
14
+ require 'bane/behaviors/responders/random_response'
15
+ require 'bane/behaviors/responders/slow_response'
16
+ require 'bane/behaviors/responders/exported'
17
+ require 'bane/behaviors/servers/responder_server'
18
+ require 'bane/behaviors/servers/timeout_in_listen_queue'
19
+ require 'bane/behaviors/servers/exported'
4
20
  require 'bane/launcher'
5
- require 'bane/delegating_gserver'
6
- require 'bane/configuration'
7
- require 'bane/configuration_parser'
21
+ require 'bane/arguments_parser'
22
+ require 'bane/command_line_configuration'
8
23
  require 'bane/naive_http_response'
metadata CHANGED
@@ -1,122 +1,124 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: bane
3
- version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Daniel Wellman
14
- autorequire:
8
+ - Joe Leo
9
+ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2010-05-28 00:00:00 -04:00
19
- default_executable: bane
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: mocha
12
+ date: 2022-01-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '13.0'
21
+ type: :development
23
22
  prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 43
30
- segments:
31
- - 0
32
- - 9
33
- - 8
34
- version: 0.9.8
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '13.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rdoc
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '6.3'
35
35
  type: :development
36
- version_requirements: *id001
37
- description: " Bane is a test harness used to test your application's interaction with\n other servers. It is based upon the material from Michael Nygard's \"Release\n It!\" book as described in the \"Test Harness\" chapter.\n"
38
- email: dan@danielwellman.com
39
- executables:
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '6.3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: gserver
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '='
47
+ - !ruby/object:Gem::Version
48
+ version: 0.0.1
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '='
54
+ - !ruby/object:Gem::Version
55
+ version: 0.0.1
56
+ description: |
57
+ Bane is a test harness used to test your application's interaction with
58
+ other servers. It is based upon the material from Michael Nygard's "Release
59
+ It!" book as described in the "Test Harness" chapter.
60
+ email:
61
+ - dan@danielwellman.com
62
+ executables:
40
63
  - bane
41
64
  extensions: []
42
-
43
- extra_rdoc_files:
65
+ extra_rdoc_files:
66
+ - LICENSE
67
+ - README.md
68
+ - TODO
69
+ files:
70
+ - HISTORY.md
44
71
  - LICENSE
45
72
  - README.md
46
73
  - TODO
47
- files:
48
- - Rakefile
49
74
  - bin/bane
50
- - examples/simple_port_and_class_as_constant.rb
51
- - examples/simple_port_and_class_as_string.rb
52
- - examples/specify_behavior_options.rb
53
- - examples/specify_ports.rb
54
75
  - lib/bane.rb
55
- - lib/bane/behaviors.rb
56
- - lib/bane/compatibility.rb
57
- - lib/bane/configuration.rb
58
- - lib/bane/configuration_parser.rb
59
- - lib/bane/delegating_gserver.rb
76
+ - lib/bane/arguments_parser.rb
77
+ - lib/bane/behavior_maker.rb
78
+ - lib/bane/behaviors/responders/close_after_pause.rb
79
+ - lib/bane/behaviors/responders/close_immediately.rb
80
+ - lib/bane/behaviors/responders/deluge_response.rb
81
+ - lib/bane/behaviors/responders/echo_response.rb
82
+ - lib/bane/behaviors/responders/exported.rb
83
+ - lib/bane/behaviors/responders/fixed_response.rb
84
+ - lib/bane/behaviors/responders/for_each_line.rb
85
+ - lib/bane/behaviors/responders/http_refuse_all_credentials.rb
86
+ - lib/bane/behaviors/responders/never_respond.rb
87
+ - lib/bane/behaviors/responders/newline_response.rb
88
+ - lib/bane/behaviors/responders/random_response.rb
89
+ - lib/bane/behaviors/responders/slow_response.rb
90
+ - lib/bane/behaviors/servers/exported.rb
91
+ - lib/bane/behaviors/servers/responder_server.rb
92
+ - lib/bane/behaviors/servers/timeout_in_listen_queue.rb
93
+ - lib/bane/command_line_configuration.rb
94
+ - lib/bane/extensions.rb
60
95
  - lib/bane/launcher.rb
61
96
  - lib/bane/naive_http_response.rb
62
- - lib/bane/service_registry.rb
63
- - test/bane/behaviors_test.rb
64
- - test/bane/configuration_parser_test.rb
65
- - test/bane/configuration_test.rb
66
- - test/bane/delegating_gserver_test.rb
67
- - test/bane/integration_test.rb
68
- - test/bane/launcher_test.rb
69
- - test/bane/naive_http_response_test.rb
70
- - test/bane/service_registry_test.rb
71
- - test/test_helper.rb
72
- - LICENSE
73
- - README.md
74
- - TODO
75
- has_rdoc: true
76
- homepage: http://github.com/danielwellman/bane
77
- licenses: []
78
-
79
- post_install_message:
80
- rdoc_options:
81
- - --charset=UTF-8
82
- require_paths:
97
+ - lib/bane/version.rb
98
+ homepage: https://github.com/danielwellman/bane
99
+ licenses:
100
+ - BSD
101
+ metadata:
102
+ source_code_uri: https://github.com/danielwellman/bane
103
+ changelog_uri: https://github.com/danielwellman/bane/blob/main/HISTORY.md
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
83
107
  - lib
84
- required_ruby_version: !ruby/object:Gem::Requirement
85
- none: false
86
- requirements:
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
87
110
  - - ">="
88
- - !ruby/object:Gem::Version
89
- hash: 3
90
- segments:
91
- - 0
92
- version: "0"
93
- required_rubygems_version: !ruby/object:Gem::Requirement
94
- none: false
95
- requirements:
111
+ - !ruby/object:Gem::Version
112
+ version: 2.5.0
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
96
115
  - - ">="
97
- - !ruby/object:Gem::Version
98
- hash: 3
99
- segments:
100
- - 0
101
- version: "0"
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
102
118
  requirements: []
103
-
104
- rubyforge_project:
105
- rubygems_version: 1.3.7
106
- signing_key:
107
- specification_version: 3
108
- summary: A test harness for socket connections based upon ideas from Michael Nygard's 'Release It!'
109
- test_files:
110
- - test/bane/behaviors_test.rb
111
- - test/bane/configuration_parser_test.rb
112
- - test/bane/configuration_test.rb
113
- - test/bane/delegating_gserver_test.rb
114
- - test/bane/integration_test.rb
115
- - test/bane/launcher_test.rb
116
- - test/bane/naive_http_response_test.rb
117
- - test/bane/service_registry_test.rb
118
- - test/test_helper.rb
119
- - examples/simple_port_and_class_as_constant.rb
120
- - examples/simple_port_and_class_as_string.rb
121
- - examples/specify_behavior_options.rb
122
- - examples/specify_ports.rb
119
+ rubygems_version: 3.1.6
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: A test harness for socket connections based upon ideas from Michael Nygard's
123
+ 'Release It!'
124
+ test_files: []
data/Rakefile DELETED
@@ -1,60 +0,0 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "bane"
8
- gem.summary = "A test harness for socket connections based upon ideas from Michael Nygard's 'Release It!'"
9
- gem.description = <<-END
10
- Bane is a test harness used to test your application's interaction with
11
- other servers. It is based upon the material from Michael Nygard's "Release
12
- It!" book as described in the "Test Harness" chapter.
13
- END
14
- gem.authors = ["Daniel Wellman"]
15
- gem.email = "dan@danielwellman.com"
16
- gem.homepage = "http://github.com/danielwellman/bane"
17
- gem.files = FileList[ 'lib/**/*', 'bin/*', 'test/**/*', 'examples/*',
18
- 'Rakefile' ]
19
- gem.add_development_dependency('mocha', '>= 0.9.8')
20
- end
21
- Jeweler::GemcutterTasks.new
22
- rescue LoadError
23
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
24
- end
25
-
26
- require 'rake/testtask'
27
- desc "Run all tests"
28
- Rake::TestTask.new do |test|
29
- test.libs << 'test'
30
- test.test_files = FileList['test/**/*_test.rb']
31
- test.verbose = true
32
- end
33
-
34
- begin
35
- require 'rcov/rcovtask'
36
- Rcov::RcovTask.new do |test|
37
- test.libs << 'test'
38
- test.pattern = 'test/**/*_test.rb'
39
- test.verbose = true
40
- end
41
- rescue LoadError
42
- task :rcov do
43
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
44
- end
45
- end
46
-
47
-
48
- task :test => :check_dependencies
49
-
50
- task :default => :test
51
-
52
- require 'rake/rdoctask'
53
- Rake::RDocTask.new do |rdoc|
54
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
55
-
56
- rdoc.rdoc_dir = 'rdoc'
57
- rdoc.title = "bane #{version}"
58
- rdoc.rdoc_files.include('README*')
59
- rdoc.rdoc_files.include('lib/**/*.rb')
60
- end
@@ -1,9 +0,0 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
2
- require 'bane'
3
-
4
- include Bane
5
-
6
- launcher = Launcher.new(Configuration(3000, Behaviors::CloseImmediately, Behaviors::CloseAfterPause))
7
- launcher.start
8
- launcher.join
9
- # runs until interrupt...
@@ -1,7 +0,0 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
2
- require 'bane'
3
-
4
- launcher = Bane::Launcher.new(Configuration(3000, "CloseImmediately"))
5
- launcher.start
6
- launcher.join
7
- # runs until interrupt...
@@ -1,16 +0,0 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
2
- require 'bane'
3
-
4
- include Bane
5
- include Behaviors
6
-
7
- launcher = Launcher.new(Configuration(
8
- 10256 => {:behavior => CloseAfterPause, :duration => 3},
9
- 10593 => {:behavior => FixedResponse, :message => "Hey!"},
10
- 10689 => {:behavior => SlowResponse, :message => "Custom message", :pause_duration => 15},
11
- 11239 => CloseAfterPause # Use the defaults for this behavior, don't need a Hash
12
- )
13
- )
14
- launcher.start
15
- launcher.join
16
- # runs until interrupt...
@@ -1,15 +0,0 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
2
- require 'bane'
3
-
4
- include Bane
5
- include Behaviors
6
-
7
- launcher = Launcher.new(Configuration(
8
- 10256 => CloseAfterPause,
9
- 10689 => CloseAfterPause, # severs may be repeated
10
- 11999 => CloseImmediately
11
- )
12
- )
13
- launcher.start
14
- launcher.join
15
- # runs until interrupt...