frank-cucumber 0.8.14 → 0.8.15

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.
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency( "i18n" )
24
24
  s.add_dependency( "plist" )
25
25
  s.add_dependency( "json" ) # TODO: figure out how to be more permissive as to which JSON gems we allow
26
+ s.add_dependency( "dnssd" )
26
27
 
27
28
  s.add_development_dependency( "rr" )
28
29
  end
Binary file
Binary file
@@ -0,0 +1,73 @@
1
+ require 'timeout'
2
+ require 'uri'
3
+
4
+ module Frank module Cucumber
5
+ class Bonjour
6
+
7
+ FRANK_SERVICE_NAME = 'Frank UISpec server'
8
+ FRANK_PORT = 37265
9
+ LOOKUP_TIMEOUT = 10
10
+
11
+ def debug string
12
+ puts string if $DEBUG
13
+ end
14
+
15
+ def found_a_frank( reply )
16
+ debug reply.inspect
17
+ unless reply.flags.add?
18
+ debug 'got a non-add reply'
19
+ debug "flags: #{reply.flags.to_a.inspect}"
20
+ return nil
21
+ end
22
+
23
+ resolve_service = DNSSD::Service.new
24
+ addr_service = DNSSD::Service.new
25
+ resolve_service.resolve reply do |r|
26
+ debug "#{r.name} on #{r.target}:#{r.port}"
27
+
28
+ address = nil
29
+ addr_service.getaddrinfo r.target do |addrinfo|
30
+ address = addrinfo.address
31
+ break
32
+ end
33
+
34
+ debug "first address for #{r.target} is #{address}"
35
+ return address
36
+ end
37
+ end
38
+
39
+ def browse_for_franks_address
40
+ require 'dnssd'
41
+
42
+ DNSSD.browse! '_http._tcp.' do |reply|
43
+ debug 'got a reply'
44
+ if reply.name == FRANK_SERVICE_NAME
45
+ address = found_a_frank(reply)
46
+ if address
47
+ debug "OK WE HAVE AN ADDRESS: #{address}"
48
+ return address
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def lookup_frank_base_uri
55
+ puts "finding Frank server via Bonjour..."
56
+ address = begin
57
+ Timeout::timeout(LOOKUP_TIMEOUT){ address = browse_for_franks_address }
58
+ rescue Timeout::Error
59
+ puts "could not find Frank within #{LOOKUP_TIMEOUT} seconds"
60
+ end
61
+
62
+ if address
63
+ puts "...found Frank via Bonjour: #{address}"
64
+ return URI::HTTP.new( 'http', nil, address, FRANK_PORT, nil, nil, nil, nil, nil )
65
+ else
66
+ puts '...failed to find Frank server via Bonjour'
67
+ return nil
68
+ end
69
+ end
70
+
71
+ end
72
+
73
+ end end
@@ -3,6 +3,7 @@ require 'frank-cucumber/gateway'
3
3
  require 'frank-cucumber/host_scripting'
4
4
  require 'frank-cucumber/wait_helper'
5
5
  require 'frank-cucumber/keyboard_helper'
6
+ require 'frank-cucumber/bonjour'
6
7
 
7
8
  module Frank module Cucumber
8
9
 
@@ -13,16 +14,28 @@ module FrankHelper
13
14
 
14
15
  class << self
15
16
  # TODO: adding an ivar to the module itself is a big ugyl hack. We need a FrankDriver class, or similar
16
- attr_accessor :selector_engine
17
+ attr_accessor :selector_engine, :server_base_url
18
+
17
19
  def use_shelley_from_now_on
18
20
  @selector_engine = 'shelley_compat'
19
21
  end
22
+
23
+ def test_on_physical_device_via_bonjour
24
+ @server_base_url = Bonjour.new.lookup_frank_base_uri
25
+ raise 'could not detect running Frank server' unless @server_base_url
26
+ end
20
27
  end
21
28
 
22
29
  def selector_engine
23
30
  Frank::Cucumber::FrankHelper.selector_engine || 'uiquery' # default to UIQuery for backwards compatibility
24
31
  end
32
+
33
+ def base_server_url
34
+ Frank::Cucumber::FrankHelper.server_base_url
35
+ end
25
36
 
37
+
38
+
26
39
  def touch( uiquery )
27
40
  touch_successes = frankly_map( uiquery, 'touch' )
28
41
  raise "could not find anything matching [#{uiquery}] to touch" if touch_successes.empty?
@@ -203,7 +216,7 @@ module FrankHelper
203
216
  end
204
217
 
205
218
  def frank_server
206
- @_frank_server ||= Frank::Cucumber::Gateway.new
219
+ @_frank_server ||= Frank::Cucumber::Gateway.new( base_server_url )
207
220
  end
208
221
 
209
222
  end
@@ -4,11 +4,10 @@ require 'uri'
4
4
  module Frank module Cucumber
5
5
 
6
6
  class Gateway
7
- DEFAULT_HOST = "localhost"
8
- DEFAULT_PORT = 37265
7
+ DEFAULT_BASE_URL = "http://localhost:37265/"
9
8
 
10
- def initialize( host=DEFAULT_HOST, port=DEFAULT_PORT )
11
- @base_uri = URI.parse "http://#{host}:#{port}/"
9
+ def initialize( base_url = nil )
10
+ @base_url = URI.parse (base_url || DEFAULT_BASE_URL).to_s
12
11
  end
13
12
 
14
13
  def ping
@@ -72,7 +71,7 @@ class Gateway
72
71
  private
73
72
 
74
73
  def frank_url_for( verb )
75
- url = @base_uri.clone
74
+ url = @base_url.clone
76
75
  url.path = '/'+verb
77
76
  url
78
77
  end
@@ -6,7 +6,7 @@ module KeyboardHelper
6
6
  text_to_type = text_to_type+"\n" unless text_to_type.end_with?("\n")
7
7
  res = frank_server.send_post(
8
8
  'type_into_keyboard',
9
- :text_to_type => text_to_type,
9
+ :text_to_type => text_to_type
10
10
  )
11
11
  Frank::Cucumber::Gateway.evaluate_frankly_response( res, "typing the following into the keyboard '#{text_to_type}'" )
12
12
  end
@@ -1,5 +1,5 @@
1
1
  module Frank
2
2
  module Cucumber
3
- VERSION = "0.8.14"
3
+ VERSION = "0.8.15"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: frank-cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.14
4
+ version: 0.8.15
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-05-22 00:00:00.000000000Z
13
+ date: 2012-06-06 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: cucumber
17
- requirement: &70144982662120 !ruby/object:Gem::Requirement
17
+ requirement: &70354211328540 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70144982662120
25
+ version_requirements: *70354211328540
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rspec
28
- requirement: &70144982661540 !ruby/object:Gem::Requirement
28
+ requirement: &70354211327880 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70144982661540
36
+ version_requirements: *70354211327880
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sim_launcher
39
- requirement: &70144982661020 !ruby/object:Gem::Requirement
39
+ requirement: &70354211327300 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *70144982661020
47
+ version_requirements: *70354211327300
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: i18n
50
- requirement: &70144982660500 !ruby/object:Gem::Requirement
50
+ requirement: &70354211326740 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70144982660500
58
+ version_requirements: *70354211326740
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: plist
61
- requirement: &70144982660000 !ruby/object:Gem::Requirement
61
+ requirement: &70354211326180 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *70144982660000
69
+ version_requirements: *70354211326180
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: json
72
- requirement: &70144982659180 !ruby/object:Gem::Requirement
72
+ requirement: &70354211325680 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,21 @@ dependencies:
77
77
  version: '0'
78
78
  type: :runtime
79
79
  prerelease: false
80
- version_requirements: *70144982659180
80
+ version_requirements: *70354211325680
81
+ - !ruby/object:Gem::Dependency
82
+ name: dnssd
83
+ requirement: &70354211325200 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: *70354211325200
81
92
  - !ruby/object:Gem::Dependency
82
93
  name: rr
83
- requirement: &70144982658640 !ruby/object:Gem::Requirement
94
+ requirement: &70354211324620 !ruby/object:Gem::Requirement
84
95
  none: false
85
96
  requirements:
86
97
  - - ! '>='
@@ -88,7 +99,7 @@ dependencies:
88
99
  version: '0'
89
100
  type: :development
90
101
  prerelease: false
91
- version_requirements: *70144982658640
102
+ version_requirements: *70354211324620
92
103
  description: Use cucumber to test native iOS apps via Frank
93
104
  email:
94
105
  - gems@thepete.net
@@ -138,6 +149,7 @@ files:
138
149
  - frank-skeleton/libShelley.a
139
150
  - lib/frank-cucumber.rb
140
151
  - lib/frank-cucumber/app_bundle_locator.rb
152
+ - lib/frank-cucumber/bonjour.rb
141
153
  - lib/frank-cucumber/color_helper.rb
142
154
  - lib/frank-cucumber/core_frank_steps.rb
143
155
  - lib/frank-cucumber/frank_helper.rb