ilesspainfulclient-cucumber 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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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