Ruby4Skype 0.2.3 → 0.3.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/LICENSE +3 -0
  2. data/README +14 -0
  3. data/Rakefile +67 -0
  4. data/lib/skypeapi.rb +570 -509
  5. data/lib/skypeapi/application.rb +79 -77
  6. data/lib/skypeapi/call.rb +243 -230
  7. data/lib/skypeapi/chat.rb +162 -172
  8. data/lib/skypeapi/chatmember.rb +26 -28
  9. data/lib/skypeapi/chatmessage.rb +81 -65
  10. data/lib/skypeapi/error.rb +8 -0
  11. data/lib/skypeapi/event.rb +25 -26
  12. data/lib/skypeapi/filetransfer.rb +47 -28
  13. data/lib/skypeapi/group.rb +72 -73
  14. data/lib/skypeapi/menuitem.rb +44 -44
  15. data/lib/skypeapi/message.rb +39 -41
  16. data/lib/skypeapi/object.rb +246 -82
  17. data/lib/skypeapi/os/etc.rb +48 -98
  18. data/lib/skypeapi/os/mac.rb +92 -4
  19. data/lib/skypeapi/os/notifier.rb +31 -0
  20. data/lib/skypeapi/os/window_event_queue.rb +198 -0
  21. data/lib/skypeapi/os/window_messagehandler.rb +120 -0
  22. data/lib/skypeapi/os/windows.rb +170 -306
  23. data/lib/skypeapi/profile.rb +190 -120
  24. data/lib/skypeapi/sharefunctions.rb +31 -23
  25. data/lib/skypeapi/sms.rb +87 -67
  26. data/lib/skypeapi/user.rb +159 -99
  27. data/lib/skypeapi/version.rb +3 -3
  28. data/lib/skypeapi/voicemail.rb +59 -52
  29. data/spec/matcher_be_boolean.rb +10 -0
  30. data/spec/skypeapi/application_spec.rb +76 -0
  31. data/spec/skypeapi/chat_spec.rb +356 -0
  32. data/spec/skypeapi/chatmember_spec.rb +42 -0
  33. data/spec/skypeapi/chatmessage_spec.rb +89 -0
  34. data/spec/skypeapi/event_spec.rb +31 -0
  35. data/spec/skypeapi/filetransfer_spec.rb +67 -0
  36. data/spec/skypeapi/group_spec.rb +16 -0
  37. data/spec/skypeapi/menuitem_spec.rb +37 -0
  38. data/spec/skypeapi/os/windows_spec.rb +305 -0
  39. data/spec/skypeapi/profile_spec.rb +22 -0
  40. data/spec/skypeapi/user_spec.rb +25 -0
  41. data/spec/skypeapi_spec.rb +528 -0
  42. metadata +32 -12
  43. data/lib/skypeapi/os/timer.rb +0 -108
@@ -0,0 +1,31 @@
1
+ require 'skypeapi'
2
+ require 'timeout'
3
+
4
+ describe SkypeAPI::Event do
5
+ before :all do
6
+ SkypeAPI.init
7
+ SkypeAPI.start_messageloop
8
+ SkypeAPI.attach_wait
9
+ end
10
+
11
+ after :all do
12
+ SkypeAPI.close
13
+ end
14
+
15
+ it "should event create" do
16
+ pending 'skype event obs?'
17
+ flag = false
18
+ event = SkypeAPI::Event.create('testEvent','testEvent','Testhint') do
19
+ flag = true
20
+ end
21
+ event.should be_instance_of SkypeAPI::Event
22
+
23
+ puts 'click testEvent'
24
+
25
+ timeout(60){sleep 1 until flag}
26
+
27
+ event.delete.should be_true
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,67 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ require 'skypeapi'
5
+
6
+ describe SkypeAPI::FileTransfer do
7
+ before :all do
8
+ SkypeAPI.init
9
+ SkypeAPI.start_messageloop
10
+ SkypeAPI.attach_wait
11
+ end
12
+
13
+ before(:each) do
14
+ @filetransfer = SkypeAPI.searchFileTransfers[0]
15
+ pending 'a file_trasfer is nothing.' unless @filetransfer
16
+ end
17
+
18
+ after :all do
19
+ SkypeAPI.close
20
+ end
21
+
22
+ it 'get_type should match /(INCOMING)|(OUTGOING)/' do
23
+ @filetransfer.get_type.should match /(INCOMING)|(OUTGOING)/
24
+ end
25
+
26
+ it 'get_status should match /(NEW)|(WAITING_FOR_ACCEPT)|(CONNECTING)|(TRANSFERRING)|(TRANSFERRING_OVER_RELAY)|(PAUSED)|(REMOTELY_PAUSED)|(CANCELLED)|(COMPLETED)|(FAILED)/' do
27
+ @filetransfer.get_status.should match /(NEW)|(WAITING_FOR_ACCEPT)|(CONNECTING)|(TRANSFERRING)|(TRANSFERRING_OVER_RELAY)|(PAUSED)|(REMOTELY_PAUSED)|(CANCELLED)|(COMPLETED)|(FAILED)/
28
+ end
29
+
30
+ it 'get_failure_reason /(SENDER_NOT_AUTHORIZED)|(REMOTELY_CANCELLED)|(FAILED_READ)|(FAILED_REMOTE_READ)|(FAILED_WRITE)|(FAILED_REMOTE_WRITE)|(REMOTE_DOES_NOT_SUPPORT_FT)|(REMOTE_OFFLINE_FOR_TOO_LONG)|(UNKNOWN)/' do
31
+ @filetransfer.get_failure_reason.should match /(SENDER_NOT_AUTHORIZED)|(REMOTELY_CANCELLED)|(FAILED_READ)|(FAILED_REMOTE_READ)|(FAILED_WRITE)|(FAILED_REMOTE_WRITE)|(REMOTE_DOES_NOT_SUPPORT_FT)|(REMOTE_OFFLINE_FOR_TOO_LONG)|(UNKNOWN)/
32
+ end
33
+
34
+ it 'get_partner should be instance of User' do
35
+ @filetransfer.get_partner.should be_instance_of SkypeAPI::User
36
+ end
37
+
38
+ it 'get_partner_dispname should be instance of String' do
39
+ @filetransfer.get_partner_dispname.should be_instance_of String
40
+ end
41
+
42
+ it 'get_start_time should be instance of Time' do
43
+ @filetransfer.get_start_time.should be_instance_of Time
44
+ end
45
+
46
+ it 'get_finish_time should be instance of Time' do
47
+ @filetransfer.get_finish_time.should be_instance_of Time
48
+ end
49
+
50
+ it 'get_file_path should be instance of String' do
51
+ @filetransfer.get_file_path.should be_instance_of String
52
+ end
53
+
54
+ it 'get_file_size should kind of Numeric' do
55
+ @filetransfer.get_file_size.should be_kind_of Numeric
56
+ end
57
+
58
+ it 'get_bytes_per_second should be kind of Numeric' do
59
+ @filetransfer.get_bytes_per_second.should be_kind_of Numeric
60
+ end
61
+
62
+ it 'get_bytes_transferred should be kind of Numeric' do
63
+ @filetransfer.get_bytes_transferred.should be_kind_of Numeric
64
+ end
65
+
66
+ end
67
+
@@ -0,0 +1,16 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ require 'skypeapi'
5
+
6
+ describe SkypeAPI::Group do
7
+ before(:each) do
8
+ pending 'constructor is broken'
9
+ @group = Group.new
10
+ end
11
+
12
+ it "should desc" do
13
+ # TODO
14
+ end
15
+ end
16
+
@@ -0,0 +1,37 @@
1
+ require 'skypeapi'
2
+
3
+ describe SkypeAPI::MenuItem do
4
+ before :all do
5
+ SkypeAPI.init
6
+ SkypeAPI.start_messageloop
7
+ SkypeAPI.attach_wait
8
+ end
9
+
10
+ after :all do
11
+ SkypeAPI.close
12
+ end
13
+
14
+ it "should,,," do
15
+ pending 'menu_item obs?'
16
+ flag = false
17
+ menuitem = SkypeAPI::MenuItem.create(:id => 'testMenu', :context => 'CONTACT', :caption => 'testMenu') do |instance, context, user, context_id|
18
+ menuitem.should == instance
19
+ context.should be_instance_of String
20
+ user.should be_instance_of SkypeAPI::User
21
+ context_id.should be_nil
22
+ flag = true
23
+ end
24
+
25
+ puts "click user context menu changeCap"
26
+
27
+ menuitem.should be_instance_of SkypeAPI::MenuItem
28
+ menuitem.setCaption('changeCap').should be_true
29
+ menuitem.setHint('changeHint').should be_true
30
+ menuitem.setEnabled(false).should be_true
31
+ menuitem.setEnabled(true).should be_true
32
+ timeout(60){sleep until flag}
33
+ menuitem.delete.should be_true
34
+ end
35
+
36
+ end
37
+
@@ -0,0 +1,305 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ require 'skypeapi/os/etc'
5
+ require 'skypeapi/os/windows'
6
+
7
+ Thread.abort_on_exception = true
8
+
9
+ describe SkypeAPI::OS::Windows do
10
+ describe 'before attach' do
11
+ describe 'attach' do
12
+ before(:each) do
13
+ @message = Array.new
14
+ @win = SkypeAPI::OS::Windows.new
15
+ @win.set_notify_selector{ |msg| @message.push msg }
16
+ @win.start_messageloop
17
+ end
18
+
19
+ after(:each) do
20
+ @win.close
21
+ end
22
+
23
+ it "should notified 3 message" do
24
+ @win.attach_wait
25
+ sleep 1
26
+ @message[0].should match(/^CONNSTATUS /)
27
+ @message[1].should match(/^CURRENTUSERHANDLE /)
28
+ @message[2].should match(/^USERSTATUS /)
29
+ end
30
+
31
+ it "should many attach and close" do
32
+ @win.close
33
+ 10.times do |i|
34
+ @win = SkypeAPI::OS::Windows.new
35
+ @win.set_notify_selector{ |msg| @message.push msg }
36
+ @win.start_messageloop
37
+ @win.attach_wait
38
+ @win.close
39
+ end
40
+ @win = SkypeAPI::OS::Windows.new
41
+ end
42
+
43
+ it "should call attached event" do
44
+ flag = false
45
+ @win.add_event(:attached){ flag=true }
46
+ @win.attach
47
+ sleep 3
48
+ flag.should be_true
49
+ end
50
+
51
+ end
52
+
53
+ describe "windows event queue process on main thread" do
54
+ before(:each) do
55
+ @win = SkypeAPI::OS::Windows.new
56
+ end
57
+
58
+ after(:each) do
59
+ @win.close
60
+ end
61
+
62
+ it "should attach and close" do
63
+ i = 0
64
+ @win.set_notify_selector do |msg|
65
+ i+=1
66
+ @win.close if i >= 3
67
+ end
68
+ f = false
69
+ #@win.add_event(:attached){f=true}
70
+ @win.attach_wait
71
+ timeout(10) do
72
+ @win.messageloop
73
+ end
74
+ end
75
+
76
+
77
+
78
+ end
79
+ end
80
+
81
+ describe "after attach" do
82
+
83
+ def chat_send id, msg
84
+ @win.invoke("CHAT CREATE #{id}") =~ /^CHAT (.+?) /
85
+ chat_id = $1
86
+ chat_id.should match /^#bopper-\/\$#{id};.+$/
87
+ @win.invoke("CHATMESSAGE #{chat_id} #{msg}") =~ /CHATMESSAGE (\d+?) STATUS SENDING/
88
+ chat_message_id = $1
89
+ chat_message_id.should match /^\d+$/
90
+ @win.invoke("GET CHATMESSAGE #{chat_message_id} BODY").should == "CHATMESSAGE #{chat_message_id} BODY #{msg}"
91
+ end
92
+
93
+
94
+ before :each do
95
+ @win = SkypeAPI::OS::Windows.new
96
+ @win.start_messageloop
97
+ @win.attach_wait
98
+ end
99
+
100
+ after :each do
101
+ @win.close
102
+ end
103
+
104
+ describe 'invoke' do
105
+
106
+ def get_skype_version
107
+ @win.invoke('GET SKYPEVERSION').should match(/^SKYPEVERSION \d+\.\d+\.\d+\.\d+$/)
108
+ end
109
+
110
+ it "invoke GET SKYPEVERSION should match SKYPEVERSION num.num.num.num" do
111
+ get_skype_version
112
+ end
113
+
114
+ it "should invoke many times" do
115
+ 10.times do |i|
116
+ get_skype_version
117
+ end
118
+ end
119
+
120
+ end
121
+
122
+ describe 'notify' do
123
+
124
+ #it "sleeped notify thread by invoke should wake up" do
125
+ it "" do
126
+ i = 0
127
+ @win.set_notify_selector do |msg|
128
+ if msg =~ /^CHATMESSAGE \d+ STATUS SENDING/ and i < 10
129
+ i+=1
130
+ end
131
+ end
132
+ 10.times{ chat_send('echo123', 'this is a notify test') }
133
+ timeout(6) do
134
+ sleep 1 until i >= 9
135
+ end
136
+ end
137
+
138
+ end
139
+
140
+ describe 'recovery timeout' do
141
+ it '' do
142
+ count = 0
143
+ @win.add_hook :sent do |msg|
144
+ p "#{Time.now.to_i}s>#{msg}"
145
+ count += 1 if msg =~ /SEARCH USERS foobarsdfjweiorj/
146
+ end
147
+ @win.add_hook :received do |msg|
148
+ p "#{Time.now.to_i}r>#{msg}"
149
+ end
150
+ @win.__send__(:invoke_block,"SEARCH USERS foobarsdfjweiorj",1).should be_instance_of String
151
+ count.should == 1
152
+ end
153
+ end
154
+
155
+ describe 'detach and reattach' do
156
+ before do
157
+ pending 'hogehoge'
158
+ end
159
+
160
+ describe 'Skype shutdonw' do
161
+ before do
162
+ pending 'hogehoge'
163
+ end
164
+
165
+ end
166
+ describe 'Skype killed' do
167
+ before do
168
+ pending 'hogehoge'
169
+ end
170
+
171
+ end
172
+ end
173
+
174
+ describe 'multi threads' do
175
+
176
+ describe "many create chats" do
177
+
178
+ before :each do
179
+ @log = Array.new
180
+ @win.add_hook :sent do |msg|
181
+ @log.push "#{Time.now.to_i}s>#{msg}"
182
+ end
183
+ @win.add_hook :received do |msg|
184
+ @log.push "#{Time.now.to_i}r>#{msg}"
185
+ end
186
+ end
187
+
188
+ it "should not error" do
189
+ pending 'spend long time'
190
+ a = 0
191
+ 3.times do |tn|
192
+ Thread.new(tn) do |n|
193
+ 10000.times do |i|
194
+ begin
195
+ @win.invoke("CHAT CREATE echo123").should match(/^CHAT .+? STATUS .+?$/)
196
+ rescue TimeoutError => e
197
+ puts @log
198
+ raise e
199
+ end
200
+ end
201
+ a += 1
202
+ end
203
+ end
204
+ sleep 1 until a >= 3
205
+ end
206
+ end
207
+
208
+ describe "notify thread" do
209
+ before :each do
210
+ @win.add_hook :sent do |msg|
211
+ puts "#{Time.now.to_i}s>#{msg}"
212
+ end
213
+ @win.add_hook :received do |msg|
214
+ puts "#{Time.now.to_i}r>#{msg}"
215
+ end
216
+ end
217
+
218
+ it "should invoke in notify" do
219
+ #pending
220
+ i = 0
221
+ @win.set_notify_selector do |msg|
222
+ if msg =~ /CHATMESSAGE (\d+) STATUS RECEIVED/
223
+ cid=$1
224
+ if @win.invoke("GET CHATMESSAGE #{cid} FROM_HANDLE") == "CHATMESSAGE #{cid} FROM_HANDLE ehco123"
225
+ i+=1
226
+ chat_send 'echo123', 'send from notify thread'
227
+ end
228
+ end
229
+ end
230
+
231
+ chat_send 'echo123', 'send from main thread'
232
+
233
+ sleep 1 until i < 30#00
234
+ end
235
+
236
+ end
237
+ end
238
+
239
+ describe 'when ctrl+c keydown' do
240
+ it 'should raise interrupt' do
241
+ pending 'how should I write this test?'
242
+ end
243
+ end
244
+
245
+ describe 'endurance' do
246
+ before(:each) do
247
+ @win.add_hook :sent do |msg|
248
+ puts "#{Time.now.to_i}s>#{msg}"
249
+ end
250
+ @win.add_hook :received do |msg|
251
+ puts "#{Time.now.to_i}r>#{msg}"
252
+ end
253
+ end
254
+
255
+ it 'should send tooo many chat messages by 3 threads' do
256
+ pending 'buzy'
257
+ @win.set_notify_selector{ |msg| }#p(msg) end
258
+
259
+ result = Array.new(3,0)
260
+ f = true
261
+ 3.times do |t_num|
262
+ Thread.new(t_num) do |t_num|
263
+ while f
264
+ chat_send 'echo123', "this is a endurance test #{result[t_num]} by #{t_num} thread."
265
+ p [result[t_num],t_num]
266
+ result[t_num]+=1
267
+ end
268
+ end
269
+ end
270
+ #sleep 60*10
271
+ i =0
272
+ while true
273
+ i+=10
274
+ p [i,result]
275
+ sleep 10
276
+ end
277
+ f = false
278
+ end
279
+
280
+ it 'should send too many chat messages while 3 days' do
281
+ pending 'bore'
282
+ i = 0
283
+ # @win.set_notify_selector do |msg|
284
+ # if msg =~ /^CHATMESSAGE \d+ STATUS SENDING/
285
+ # chat_send('echo123', "this is a endurance test #{i}")
286
+ # i+=1
287
+ # p i
288
+ # end
289
+ # end
290
+
291
+ @win.set_notify_selector{|msg|}
292
+
293
+ while true
294
+ chat_send('echo123', "this is a first endurance test #{i}")
295
+ i+=1
296
+ p i
297
+ end
298
+ #start_time = Time.now
299
+ #sleep 10 while Time.now - start_time < 60*30#60*60*24*3
300
+ end
301
+ end
302
+ end
303
+ end
304
+
305
+