ilesspainfulclient-cucumber 0.0.1

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 (43) hide show
  1. data/.hgignore +1 -0
  2. data/.idea/.name +1 -0
  3. data/.idea/.rakeTasks +7 -0
  4. data/.idea/dictionaries/krukow.xml +9 -0
  5. data/.idea/encodings.xml +5 -0
  6. data/.idea/iLessPainfulClient.iml +17 -0
  7. data/.idea/jsLibraryMappings.xml +7 -0
  8. data/.idea/misc.xml +8 -0
  9. data/.idea/modules.xml +9 -0
  10. data/.idea/vcs.xml +7 -0
  11. data/.idea/workspace.xml +626 -0
  12. data/Gemfile +4 -0
  13. data/Gemfile.lock +39 -0
  14. data/LICENSE +13 -0
  15. data/NOTICE +6 -0
  16. data/Rakefile +2 -0
  17. data/bin/ilesspainful-skeleton +19 -0
  18. data/features-skeleton/my_first.feature +8 -0
  19. data/features-skeleton/step_definitions/launch_steps.rb +0 -0
  20. data/features-skeleton/support/env.rb +1 -0
  21. data/ilesspainfulclient.gemspec +24 -0
  22. data/lib/ilesspainfulclient-cucumber/color_helper.rb +13 -0
  23. data/lib/ilesspainfulclient-cucumber/cucumber.rb +9 -0
  24. data/lib/ilesspainfulclient-cucumber/lesspainful_steps.rb +569 -0
  25. data/lib/ilesspainfulclient-cucumber/operations.rb +254 -0
  26. data/lib/ilesspainfulclient-cucumber/resources/pinch_in_ipad.base64 +188 -0
  27. data/lib/ilesspainfulclient-cucumber/resources/pinch_in_iphone.base64 +234 -0
  28. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_down_to_left_ipad.base64 +3 -0
  29. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_down_to_left_iphone.base64 +2 -0
  30. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_down_to_right_ipad.base64 +5 -0
  31. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_down_to_right_iphone.base64 +2 -0
  32. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_down_to_up_ipad.base64 +3 -0
  33. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_left_to_down_ipad.base64 +3 -0
  34. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_left_to_down_iphone.base64 +2 -0
  35. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_right_to_down_ipad.base64 +3 -0
  36. data/lib/ilesspainfulclient-cucumber/resources/rotate_home_right_to_down_iphone.base64 +2 -0
  37. data/lib/ilesspainfulclient-cucumber/resources/swipe_left_hard_iphone.base64 +15 -0
  38. data/lib/ilesspainfulclient-cucumber/resources/swipe_left_iphone.base64 +18 -0
  39. data/lib/ilesspainfulclient-cucumber/resources/swipe_right_hard_iphone.base64 +17 -0
  40. data/lib/ilesspainfulclient-cucumber/resources/swipe_right_iphone.base64 +13 -0
  41. data/lib/ilesspainfulclient-cucumber/version.rb +5 -0
  42. data/lib/ilesspainfulclient-cucumber.rb +0 -0
  43. metadata +132 -0
@@ -0,0 +1,254 @@
1
+ require 'net/http/persistent'
2
+ require 'json'
3
+
4
+ module ILessPainfulClient module Cucumber
5
+
6
+ module Operations
7
+
8
+ DATA_PATH = File.expand_path(File.dirname(__FILE__))
9
+
10
+ def query(uiquery, *args)
11
+ map(uiquery, :query, *args)
12
+ end
13
+
14
+ def touch(uiquery,*args)
15
+ views_touched=map(uiquery, :touch, *args)
16
+ raise "could not find view to touch: '#{uiquery}', args: #{args}" if views_touched.empty?
17
+ views_touched
18
+ end
19
+
20
+ def simple_touch(label,*args)
21
+ touch("view marked:'#{label}'", *args)
22
+ end
23
+
24
+ def ok
25
+ touch("view marked:'ok'")
26
+ end
27
+
28
+ def set_text(uiquery, txt)
29
+ text_fields_modified = map(uiquery, "setText", txt)
30
+ raise "could not find text field #{uiquery}" if text_fields_modified.empty?
31
+ text_fields_modified
32
+ end
33
+
34
+
35
+ def swipe(dir,options={})
36
+ playback("swipe_#{dir}_#{ENV['DEVICE']}",options)
37
+ end
38
+
39
+ def done
40
+ map(nil,:touchDone)
41
+ end
42
+
43
+ def scroll(uiquery,direction)
44
+ views_touched=map(uiquery, :scroll, direction)
45
+ raise "could not find view to scroll: '#{uiquery}', args: #{direction}" if views_touched.empty?
46
+ views_touched
47
+ end
48
+
49
+ def pinch(in_out,options={})
50
+ options.merge!({:reverse=>in_out.to_sym==:out})
51
+ playback("pinch_in_#{ENV['DEVICE']}", options)
52
+ end
53
+
54
+ def rotate(dir)
55
+ @current_rotation = @current_rotation || :down
56
+ rotate_cmd = nil
57
+ case dir
58
+ when :left then
59
+ if @current_rotation == :down
60
+ @current_rotation = :right
61
+ rotate_cmd = "down_to_right"
62
+ elsif @current_rotation == :left
63
+ @current_rotation = :down
64
+ rotate_cmd = "left_to_down"
65
+ end
66
+ when :right then
67
+ if @current_rotation == :down
68
+ @current_rotation = :left
69
+ rotate_cmd = "down_to_left"
70
+ elsif @current_rotation == :right
71
+ @current_rotation = :down
72
+ rotate_cmd = "right_to_down"
73
+ end
74
+ end
75
+
76
+ if rotate_cmd.nil?
77
+ throw "Does not support rotating #{dir} when home button is pointing #{@current_rotation}"
78
+ end
79
+ playback("rotate_home_#{rotate_cmd}_#{ENV['DEVICE']}")
80
+ end
81
+
82
+ def background(secs)
83
+ raise "Not implemented yet"
84
+ IO.popen("/Users/krukow/Projects/iOS/libimobiledevice/tools/idevicedebugserver -u #{ENV['UUID']} dk.tk-solutions.Background", "w+") do |pipe|
85
+ puts "sleep"
86
+ sleep(secs)
87
+ puts "wake"
88
+ pipe.puts "kill"
89
+ pipe.close_write
90
+ sleep(5)
91
+ end
92
+ system("/Users/krukow/Projects/iOS/libimobiledevice/tools/idevicedebugserver --dont-kill -u #{ENV['UUID']} #{ENV['BUNDLE_ID']} &")
93
+
94
+ end
95
+
96
+ #
97
+ #def swipe( uiquery, direction )
98
+ # views_touched = frankly_map( uiquery, "swipe:", direction)
99
+ # raise "could not find anything matching [#{uiquery}] to swipe" if views_touched.empty?
100
+ # #TODO raise warning if views_touched.count > 1
101
+ # end
102
+
103
+ def element_exists(uiquery)
104
+ !query(uiquery).empty?
105
+ end
106
+
107
+ def view_with_mark_exists(expected_mark)
108
+ element_exists( "view marked:'#{expected_mark}'" )
109
+ end
110
+
111
+ def check_element_exists( query )
112
+ element_exists( query ).should be_true
113
+ end
114
+
115
+ def check_element_does_not_exist( query )
116
+ element_exists( query ).should be_false
117
+ end
118
+
119
+ def check_view_with_mark_exists(expected_mark)
120
+ check_element_exists( "view marked:'#{expected_mark}'" )
121
+ end
122
+
123
+ # a better name would be element_exists_and_is_not_hidden
124
+ def element_is_not_hidden(uiquery)
125
+ matches = query(uiquery, 'isHidden')
126
+ matches.delete(true)
127
+ !matches.empty?
128
+ end
129
+
130
+ def playback(recording, options={})
131
+ rec_dir = ENV['PLAYBACK_DIR'] || "#{Dir.pwd}/playback"
132
+ data = nil
133
+ if (File.exists?("#{recording}.base64"))
134
+ data = File.read("#{recording}.base64")
135
+ puts "found #{recording}"
136
+ elsif (File.exists?("#{rec_dir}/#{recording}.base64"))
137
+ data = File.read("#{rec_dir}/#{recording}.base64")
138
+ puts "#{rec_dir}/#{recording}.base64"
139
+ elsif (File.exists?("#{DATA_PATH}/resources/#{recording}.base64"))
140
+ data = File.read("#{DATA_PATH}/resources/#{recording}.base64")
141
+ puts "#{DATA_PATH}/resources/#{recording}.base64"
142
+ else
143
+ raise "Playback not found: #{recording} (searched for #{recording}.base64 in #{Dir.pwd}, #{rec_dir}, #{DATA_PATH}/resources"
144
+ end
145
+
146
+
147
+ post_data = %Q|{"events":"#{data}"|
148
+ post_data<< %Q|,"query":"#{options[:query]}"| if options[:query]
149
+ post_data<< %Q|,"offset":#{options[:offset].to_json}| if options[:offset]
150
+ post_data<< %Q|,"reverse":#{options[:reverse]}| if options[:reverse]
151
+ post_data << "}"
152
+
153
+ res = http({:method=>:post, :raw=>true, :path=>'play'}, post_data)
154
+
155
+ res = JSON.parse( res )
156
+ if res['outcome'] != 'SUCCESS'
157
+ raise "playback failed because: #{res['reason']}\n#{res['details']}"
158
+ end
159
+ res['results']
160
+ end
161
+
162
+ def record_begin
163
+ http({:method=>:post, :path=>'record'}, {:action => :start})
164
+ end
165
+
166
+ def record_end(file_name)
167
+ res = http({:method=>:post, :path=>'record'}, {:action => :stop})
168
+ File.open("_recording.plist",'wb') do |f|
169
+ f.write res
170
+ end
171
+ system("plutil -i _recording.plist -o _recording_binary.plist -convert binary1")
172
+ system("openssl base64 -in _recording_binary.plist -out #{file_name}")
173
+ system("rm _recording.plist _recording_binary.plist")
174
+ file_name
175
+ end
176
+
177
+ def screencast_begin
178
+ http({:method=>:post, :path=>'screencast'}, {:action => :start})
179
+ end
180
+
181
+ def screencast_end(file_name)
182
+ res = http({:method=>:post, :path=>'screencast'}, {:action => :stop})
183
+ File.open(file_name,'wb') do |f|
184
+ f.write res
185
+ end
186
+ file_name
187
+ end
188
+
189
+ def screenshot
190
+ if !/localhost/.match(ENV['DEVICE_ENDPOINT'])
191
+ system("idevicescreenshot -u #{ENV['UUID']}")
192
+ else
193
+ res = http({:method =>:get, :path => 'screenshot'})
194
+ @sc_count = @sc_count || 0
195
+ path = "screenshot_#{@sc_count}.png"
196
+ @sc_count += 1
197
+ File.open(path,'wb') do |f|
198
+ f.write res
199
+ end
200
+ system("open #{path}")
201
+ end
202
+ end
203
+
204
+ def map( query, method_name, *method_args )
205
+ operation_map = {
206
+ :method_name => method_name,
207
+ :arguments => method_args
208
+ }
209
+ res = http({:method=>:post, :path=>'map'},
210
+ {:query => query, :operation => operation_map})
211
+ res = JSON.parse(res)
212
+ if res['outcome'] != 'SUCCESS'
213
+ raise "map #{query}, #{method_name} failed because: #{res['reason']}\n#{res['details']}"
214
+ end
215
+
216
+ res['results']
217
+ end
218
+
219
+ def http(options, data=nil)
220
+ url = url_for(options[:path])
221
+ if options[:method] == :post
222
+ req = Net::HTTP::Post.new url.path
223
+ if options[:raw]
224
+ req.body=data
225
+ else
226
+ req.body = data.to_json
227
+ end
228
+
229
+ else
230
+ req = Net::HTTP::Get.new url.path
231
+ end
232
+ make_http_request( url, req )
233
+ end
234
+
235
+
236
+ def url_for( verb )
237
+ url = URI.parse (ENV['DEVICE_ENDPOINT']|| "http://localhost:37265/")
238
+ url.path = '/'+verb
239
+ url
240
+ end
241
+
242
+ def make_http_request( url, req )
243
+ @http = @http || Net::HTTP.new(url.host, url.port)
244
+ res = @http.start do |sess|
245
+ sess.request req
246
+ end
247
+ res.body
248
+ end
249
+
250
+
251
+ end
252
+
253
+
254
+ end end
@@ -0,0 +1,188 @@
1
+ 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