watirgrid 1.0.4.pre → 1.0.4

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.
data/README.rdoc CHANGED
@@ -12,9 +12,9 @@ WatirGrid is built on Rinda which implements the Linda distributed computing par
12
12
  In other words, WatirGrid allows multiple parallel processes to *_provide_* remote Watir objects in the form of tuple spaces across a grid network. This grid network is *_controlled_* by a ring server.
13
13
 
14
14
  ==== Key Terminology
15
- The *controller* implements a repository of tuples (tuple space) that can be accessed concurrently. The controller hosts the *ring* *server* which advertises these tuples across a grid network making it loosely coupled. Typically you will host one controller on a central machine.
15
+ The *controller* implements a repository of tuples (tuple space) that can be accessed concurrently. The controller also hosts a *ring* *server* which advertises these tuples across a grid network making it loosely coupled. Typically you will host one controller on a central machine. You will normally connect to this controller via a direct URI. You can also find this controller by its ring server, using a UDP broadcast for the ring server port.
16
16
 
17
- The *providers* make remote Watir objects available to the tuple space hosted by the *ring* *server*. Typically you will host one or many providers on your grid network, for example, each PC may become a single provider of a Watir tuple in the form of an Internet Explorer, Firefox or Safari browser object.
17
+ The *providers* make remote Watir objects available to the tuple space hosted by the *controller*. Typically you will host one or many providers on your grid network, for example, each PC may become a single provider of a Watir tuple in the form of an Internet Explorer, Firefox, Safari or WebDriver browser object.
18
18
 
19
19
  === Simple Example
20
20
 
@@ -22,51 +22,51 @@ Pick a server to host the 'controller' for the ring server and execute the follo
22
22
  $ controller
23
23
 
24
24
  This should find your external facing IP and start the corresponding DRb and Ring Servers:
25
- Controller started on : druby://143.238.105.61:11235
26
- Ring server started on: druby://143.238.105.61:12358
25
+ I, [2011-04-09 18:06:19 #1971] INFO -- : Controller started on : druby://127.0.0.1:11235
27
26
 
28
27
  On each client PC, host the 'provider' for the distributed (DRb) Watir objects
29
- $ provider
28
+ $ provider -b ie -c druby://127.0.0.1:11235
30
29
 
31
30
  This should find the recently started Ring Server and register a tuple for the Watir object:
32
- Provider started on : druby://143.238.105.61:11236
33
- Controller found on : druby://143.238.105.61:11355
34
- New tuple registered : druby://143.238.105.61:11355
31
+ I, [2011-04-09 18:06:26 #1972] INFO -- : Provider started on : druby://127.0.0.1:11236
32
+ I, [2011-04-09 18:06:26 #1972] INFO -- : Controller found on : druby://127.0.0.1:11235
33
+ I, [2011-04-09 18:06:26 #1972] INFO -- : Provider registered : druby://127.0.0.1:11235
35
34
 
36
35
  You will now be able to execute commands across remote browsers on your grid network.
37
36
 
38
37
  e.g.
39
- Watir::Grid.control(:controller_uri => 'druby://143.238.105.61:11355') do |browser, id|
40
- browser.goto("http://www.google.com")
41
- browser.text_field(:name, 'q').set("watirgrid")
42
- browser.button(:name, "btnI").click
43
- end
38
+ require 'watirgrid'
39
+
40
+ Watir::Grid.control(:controller_uri => 'druby://127.0.0.1:11235') do |browser, id|
41
+ puts "My remote browser id is #{id}"
42
+ browser.goto("http://www.google.com")
43
+ browser.text_field(:name, 'q').set("watirgrid")
44
+ browser.button(:name, "btnI").click
44
45
  end
45
- threads.each {|thread| thread.join}
46
46
 
47
47
  You may wish to host the controller and providers on different machines in a real scenario. You can specify things like server hostnames, ports and access control lists for each of the different types of servers. For more help see:
48
48
  $ controller --help
49
49
  Usage: controller [options]
50
50
  Specific options:
51
- -H, --drb-server-host HOST Specify DRb Server interface to host on
52
- -d, --drb-server-port PORT Specify DRb Server port to listen on
53
- -h, --ring-server-host HOST Specify Ring Server interface to host on
54
- -r, --ring-server-port PORT Specify Ring Server port to listen on
55
- -a, --access-control-list ACLS Specify a comma separated Access Control List
56
- -l, --log-level LEVEL Specify log level {DEBUG|INFO|ERROR}
51
+ -H, --drb-server-host [HOST] Specify DRb Server interface to host on
52
+ -d, --drb-server-port [PORT] Specify DRb Server port to listen on
53
+ -h, --ring-server-host [HOST] Specify Ring Server interface to host on
54
+ -r, --ring-server-port [PORT] Specify Ring Server port to listen on
55
+ -a, --access-control-list [ACLS] Specify a comma separated Access Control List
56
+ -l, --log-level [LEVEL] Specify log level {DEBUG|INFO|ERROR}
57
57
  --help Show this message
58
58
 
59
59
  $ provider --help
60
- Usage: provider [options]
60
+ Usage: Usage: provider -b BROWSER_TYPE [options]
61
61
  Specific options:
62
- -H, --drb-server-host HOST Specify DRb Server interface to host on
63
- -d, --drb-server-port PORT Specify DRb Server port to listen on
64
- -h, --ring-server-host HOST Specify Ring Server host to connect to
65
- -r, --ring-server-port PORT Specify Ring Server port to broadcast on
66
- -c, --controller-uri URI Specify Controller URI e.g. druby://127.0.0.1:11235 to bypass Ring Server
67
62
  -b, --browser-type TYPE Specify browser type to register {ie|firefox|safari|webdriver}
68
- -a, --access-control-list ACLS Specify a comma separated Access Control List
69
- -l, --log-level LEVEL Specify log level {DEBUG|INFO|ERROR}
63
+ -c, --controller-uri [URI] Specify Controller URI e.g. druby://127.0.0.1:11235
64
+ -H, --drb-server-host [HOST] Specify DRb Server interface to host on
65
+ -d, --drb-server-port [PORT] Specify DRb Server port to listen on
66
+ -h, --ring-server-host [HOST] Specify Ring Server host to connect to
67
+ -r, --ring-server-port [PORT] Specify Ring Server port to broadcast on
68
+ -a, --access-control-list [ACL] Specify a comma separated Access Control List
69
+ -l, --log-level [LEVEL] Specify log level {DEBUG|INFO|ERROR}
70
70
  --help Show this message
71
71
 
72
72
  == Copyright
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ begin
9
9
  gem.email = "tim.koops@gmail.com"
10
10
  gem.homepage = "http://github.com/90kts/watirgrid"
11
11
  gem.authors = ["Tim Koopmans"]
12
- gem.version = "1.0.4.pre"
12
+ gem.version = "1.0.4"
13
13
  end
14
14
  rescue LoadError
15
15
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
data/bin/controller CHANGED
@@ -9,33 +9,33 @@ OptionParser.new do |opts|
9
9
  opts.banner = "Usage: controller [options]"
10
10
  opts.separator ""
11
11
  opts.separator "Specific options:"
12
- opts.on("-H HOST", "--drb-server-host", String,
12
+ opts.on("-H", "--drb-server-host [HOST]", String,
13
13
  "Specify DRb Server interface to host on") do |h|
14
14
  options[:drb_server_host] = h || nil
15
15
  end
16
- opts.on("-d PORT", "--drb-server-port", Integer,
16
+ opts.on("-d", "--drb-server-port [PORT]", Integer,
17
17
  "Specify DRb Server port to listen on") do |d|
18
18
  options[:drb_server_port] = d
19
- end
20
- opts.on("-h HOST", "--ring-server-host", String,
19
+ end
20
+ opts.on("-h", "--ring-server-host [HOST]", String,
21
21
  "Specify Ring Server interface to host on") do |h|
22
22
  options[:ring_server_host] = h || nil
23
23
  end
24
- opts.on("-r PORT", "--ring-server-port", Integer,
24
+ opts.on("-r", "--ring-server-port [PORT]", Integer,
25
25
  "Specify Ring Server port to listen on") do |r|
26
- options[:ring_server_port] = r
26
+ options[:ring_server_port] = r
27
27
  end
28
- opts.on("-a ACLS", "--access-control-list", Array,
28
+ opts.on("-a", "--access-control-list [ACLS]", Array,
29
29
  "Specify a comma separated Access Control List") do |a|
30
30
  options[:acls] = a
31
31
  end
32
- opts.on("-l LEVEL", "--log-level", String,
32
+ opts.on("-l", "--log-level [LEVEL]", String,
33
33
  "Specify log level {DEBUG|INFO|ERROR}") do |l|
34
34
  case l
35
35
  when 'DEBUG'
36
36
  options[:loglevel] = Logger::DEBUG
37
37
  when 'INFO'
38
- options[:loglevel] = Logger::INFO
38
+ options[:loglevel] = Logger::INFO
39
39
  when 'ERROR'
40
40
  options[:loglevel] = Logger::ERROR
41
41
  else
@@ -49,9 +49,9 @@ OptionParser.new do |opts|
49
49
  end.parse!
50
50
 
51
51
  controller = Controller.new(
52
- :drb_server_host => options[:drb_server_host],
53
- :drb_server_port => options[:drb_server_port] || 11235,
54
- :ring_server_host => options[:ring_server_host],
52
+ :drb_server_host => options[:drb_server_host],
53
+ :drb_server_port => options[:drb_server_port] || 11235,
54
+ :ring_server_host => options[:ring_server_host],
55
55
  :ring_server_port => options[:ring_server_port] || 12358,
56
56
  :acls => options[:acls] || %w{ allow all },
57
57
  :loglevel => options[:loglevel]
data/bin/provider CHANGED
@@ -5,39 +5,39 @@ require 'provider'
5
5
  require 'optparse'
6
6
 
7
7
  options = {}
8
- OptionParser.new do |opts|
9
- opts.banner = "Usage: provider [options]"
8
+ optparse = OptionParser.new do |opts|
9
+ opts.banner = "Usage: provider -b BROWSER_TYPE [options]"
10
10
  opts.separator ""
11
11
  opts.separator "Specific options:"
12
- opts.on("-H HOST", "--drb-server-host", String,
12
+ opts.on("-b", "--browser-type TYPE",
13
+ "Specify browser type to register {ie|firefox|safari|webdriver}") do |b|
14
+ options[:browser_type] = b
15
+ end
16
+ opts.on("-c", "--controller-uri [URI]",
17
+ "Specify Controller URI e.g. druby://127.0.0.1:11235") do |h|
18
+ options[:controller_uri] = h || nil
19
+ end
20
+ opts.on("-H", "--drb-server-host [HOST]",
13
21
  "Specify DRb Server interface to host on") do |h|
14
22
  options[:drb_server_host] = h || nil
15
23
  end
16
- opts.on("-d PORT", "--drb-server-port", Integer,
24
+ opts.on("-d", "--drb-server-port [PORT]",
17
25
  "Specify DRb Server port to listen on") do |d|
18
26
  options[:drb_server_port] = d
19
27
  end
20
- opts.on("-h HOST", "--ring-server-host", String,
28
+ opts.on("-h", "--ring-server-host [HOST]",
21
29
  "Specify Ring Server host to connect to") do |h|
22
30
  options[:ring_server_host] = h || nil
23
31
  end
24
- opts.on("-r PORT", "--ring-server-port", Integer,
32
+ opts.on("-r", "--ring-server-port [PORT]",
25
33
  "Specify Ring Server port to broadcast on") do |r|
26
34
  options[:ring_server_port] = r
27
35
  end
28
- opts.on("-c URI", "--controller-uri", String,
29
- "Specify Controller URI e.g. druby://127.0.0.1:11235 to bypass Ring Server") do |h|
30
- options[:controller_uri] = h || nil
31
- end
32
- opts.on("-b TYPE", "--browser-type", String,
33
- "Specify browser type to register {ie|firefox|safari}") do |b|
34
- options[:browser_type] = b
35
- end
36
- opts.on("-a ACLS", "--access-control-list", Array,
36
+ opts.on("-a", "--access-control-list [ACL]", Array,
37
37
  "Specify a comma separated Access Control List") do |a|
38
38
  options[:acls] = a
39
39
  end
40
- opts.on("-l LEVEL", "--log-level", String,
40
+ opts.on("-l", "--log-level [LEVEL]",
41
41
  "Specify log level {DEBUG|INFO|ERROR}") do |l|
42
42
  case l
43
43
  when 'DEBUG'
@@ -54,7 +54,22 @@ OptionParser.new do |opts|
54
54
  puts opts
55
55
  exit
56
56
  end
57
- end.parse!
57
+ end
58
+
59
+ begin
60
+ optparse.parse!
61
+ mandatory = [:browser_type]
62
+ missing = mandatory.select{ |param| options[param].nil? }
63
+ if not missing.empty?
64
+ puts "Missing options: #{missing.join(', ')}"
65
+ puts optparse
66
+ exit
67
+ end
68
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument
69
+ puts $!.to_s
70
+ puts optparse
71
+ exit
72
+ end
58
73
 
59
74
  provider = Provider.new(
60
75
  :drb_server_host => options[:drb_server_host],
data/lib/controller.rb CHANGED
@@ -46,8 +46,6 @@ class Controller
46
46
  @log = Logger.new(logfile, 'daily')
47
47
  @log.level = params[:loglevel] || Logger::INFO
48
48
  @log.datetime_format = "%Y-%m-%d %H:%M:%S "
49
-
50
- @log.debug("DRB Server Port #{@drb_server_port}\nRing Server Port #{@ring_server_port}")
51
49
  end
52
50
 
53
51
  ##
@@ -73,7 +71,7 @@ class Controller
73
71
 
74
72
  # obtain Ring Server uri
75
73
  @ring_server_uri = ring_server.uri
76
- @log.info("Ring server started on: #{@ring_server_uri}")
74
+ @log.debug("Ring Server started : #{@ring_server_uri}")
77
75
 
78
76
  # abort all threads on an exception
79
77
  Thread.abort_on_exception = true
@@ -86,7 +84,7 @@ class Controller
86
84
  # Stop the controller by shutting down the DRb service
87
85
  def stop
88
86
  DRb.stop_service
89
- @log.info("Controller stopped on: #{@drb_server_uri}")
87
+ @log.info("Controller stopped on : #{@drb_server_uri}")
90
88
  end
91
89
 
92
90
  private
data/lib/provider.rb CHANGED
@@ -156,9 +156,8 @@ class Provider
156
156
  # Start providing watir objects on the ring server
157
157
  def start
158
158
  # create a DRb 'front' object
159
- @log.debug("About to create a watir_provider")
160
159
  watir_provider = Watir::Provider.new(@browser_type)
161
- @log.debug("watir_provider is #{watir_provider}")
160
+ @log.debug("Watir provider is : #{watir_provider}")
162
161
  architecture = Config::CONFIG['arch']
163
162
  hostname = ENV['SERVER_NAME'] || %x{hostname}.strip
164
163
 
@@ -185,14 +184,14 @@ class Provider
185
184
  ]
186
185
 
187
186
  # locate the Rinda Ring Server via a UDP broadcast
188
- @log.debug("Attempting to find ring server on : druby://#{@ring_server_host}:#{@ring_server_port}")
187
+ @log.debug("Broadcast Ring Server : druby://#{@ring_server_host}:#{@ring_server_port}")
189
188
  find_ring_server
190
189
 
191
190
  # advertise this service on the primary remote tuple space
192
191
  @ring_server.write(@tuple, @renewer)
193
192
 
194
193
  # log DRb server uri
195
- @log.info("New tuple registered : #{@controller_uri}")
194
+ @log.info("Provider registered : #{@controller_uri}")
196
195
 
197
196
  # wait for explicit stop via ctrl-c
198
197
  DRb.thread.join if __FILE__ == $0
@@ -202,7 +201,7 @@ class Provider
202
201
  # Stop the provider by shutting down the DRb service
203
202
  def stop
204
203
  DRb.stop_service
205
- @log.info("DRb server stopped on : #{@drb_server_uri}")
204
+ @log.info("Provider stopped on : #{@drb_server_uri}")
206
205
  end
207
206
 
208
207
  private
data/lib/watirgrid.rb CHANGED
@@ -107,7 +107,7 @@ module Watir
107
107
  drb_server = DRb.start_service(
108
108
  "druby://#{@drb_server_host}:#{@drb_server_port}")
109
109
  @drb_server_uri = drb_server.uri
110
- @log.info("DRb server started on : #{@drb_server_uri}")
110
+ @log.info("Watir Grid started on : #{@drb_server_uri}")
111
111
  end
112
112
 
113
113
  ##
data/watirgrid.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{watirgrid}
8
- s.version = "1.0.4.pre"
8
+ s.version = "1.0.4"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tim Koopmans"]
12
- s.date = %q{2011-04-08}
12
+ s.date = %q{2011-04-09}
13
13
  s.description = %q{WatirGrid allows for distributed testing across a grid network using Watir.}
14
14
  s.email = %q{tim.koops@gmail.com}
15
15
  s.executables = ["controller", "listener", "provider"]
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watirgrid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 961915972
5
- prerelease: 6
4
+ hash: 31
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
9
  - 4
10
- - pre
11
- version: 1.0.4.pre
10
+ version: 1.0.4
12
11
  platform: ruby
13
12
  authors:
14
13
  - Tim Koopmans
@@ -16,7 +15,7 @@ autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2011-04-08 00:00:00 -07:00
18
+ date: 2011-04-09 00:00:00 -07:00
20
19
  default_executable:
21
20
  dependencies: []
22
21
 
@@ -81,14 +80,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
81
80
  required_rubygems_version: !ruby/object:Gem::Requirement
82
81
  none: false
83
82
  requirements:
84
- - - ">"
83
+ - - ">="
85
84
  - !ruby/object:Gem::Version
86
- hash: 25
85
+ hash: 3
87
86
  segments:
88
- - 1
89
- - 3
90
- - 1
91
- version: 1.3.1
87
+ - 0
88
+ version: "0"
92
89
  requirements: []
93
90
 
94
91
  rubyforge_project: