snarl-snp 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +86 -4
- data/Rakefile +4 -3
- data/VERSION +1 -1
- data/YAML.rdoc +197 -0
- data/bin/snarl_snp +112 -0
- data/{GUIDE.rdoc.ja → doc-ja/GUIDE.rdoc.ja} +0 -0
- data/{README.rdoc.ja → doc-ja/README.rdoc.ja} +94 -29
- data/doc-ja/YAML.rdoc.ja +200 -0
- data/exsample/yahoo_weather.rb +18 -4
- data/lib/snarl/autotest.rb +7 -77
- data/lib/snarl/snp.rb +4 -4
- data/lib/snarl/snp/action.rb +15 -11
- data/lib/snarl/snp/autosnp.rb +69 -0
- data/lib/snarl/snp/config.rb +109 -17
- data/lib/snarl/snp/error.rb +7 -6
- data/lib/snarl/snp/request.rb +31 -21
- data/lib/snarl/snp/response.rb +1 -0
- data/lib/snarl/snp/snp.rb +56 -41
- data/lib/snarl/snp/snp_procedure.rb +105 -0
- data/snarl-snp.gemspec +21 -15
- data/spec/bin/snarl_snp_spec.rb +91 -0
- data/spec/snp/action_spec.rb +149 -86
- data/spec/snp/config_spec.rb +181 -37
- data/spec/snp/real_connection_spec.rb +295 -0
- data/spec/snp/request_spec.rb +40 -10
- data/spec/snp/snp_procedure_spec.rb +226 -0
- data/spec/snp/snp_spec.rb +216 -193
- data/spec/spec_helper.rb +6 -4
- metadata +22 -27
- data/spec/exsample/data/weather_yahoo_co_jp.html +0 -608
- data/spec/exsample/yahoo_weather_spec.rb +0 -22
data/spec/snp/request_spec.rb
CHANGED
@@ -1,24 +1,54 @@
|
|
1
|
-
# -*- coding:utf-8 -*-
|
2
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
3
2
|
|
4
3
|
describe "Request" do
|
5
4
|
|
6
|
-
describe "
|
7
|
-
def
|
8
|
-
Snarl::SNP::Request.new.__send__(:
|
5
|
+
describe "#normalize_command" do
|
6
|
+
def normalize_cmdkey(command)
|
7
|
+
Snarl::SNP::Request.new.__send__(:normalize_cmdkey, command)
|
8
|
+
end
|
9
|
+
it "returns downcased string" do
|
10
|
+
normalize_cmdkey('action').should eql('action')
|
11
|
+
normalize_cmdkey('Action').should eql('action')
|
12
|
+
normalize_cmdkey(:action).should eql('action')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#normalize_value" do
|
17
|
+
def normalize_value(value)
|
18
|
+
Snarl::SNP::Request.new.__send__(:normalize_value, value)
|
19
|
+
end
|
20
|
+
it 'converts one "\r\n" to one "\n"' do
|
21
|
+
normalize_value("1\r\n2\r\n").should eql("1\n2\n")
|
22
|
+
end
|
23
|
+
it 'converts one "\r" to one "\n"' do
|
24
|
+
normalize_value("1\r2\r").should eql("1\n2\n")
|
25
|
+
end
|
26
|
+
it 'never change multiple "\n\n\n\n\n"' do
|
27
|
+
many_newline = "1\n\n\n\n\n2"
|
28
|
+
normalize_value(many_newline).should eql(many_newline)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#normalize_action_value" do
|
33
|
+
def normalize_action_value(cmdhash)
|
34
|
+
Snarl::SNP::Request.new.__send__(:normalize_action_value, cmdhash)
|
9
35
|
end
|
10
36
|
it "returns action String, add-class is add_class" do
|
11
|
-
|
12
|
-
|
37
|
+
normalize_action_value('register').should eql('register')
|
38
|
+
normalize_action_value(:register).should eql('register')
|
39
|
+
normalize_action_value('Register').should eql('register')
|
40
|
+
normalize_action_value('add-class').should eql('add_class')
|
41
|
+
normalize_action_value(:add_class).should eql('add_class')
|
13
42
|
end
|
14
43
|
end
|
15
44
|
|
45
|
+
|
16
46
|
describe "#[]=" do
|
17
|
-
it "set
|
47
|
+
it "set command pair with normalization" do
|
18
48
|
req = Snarl::SNP::Request.new
|
19
|
-
req[:action] = '
|
20
|
-
req['
|
21
|
-
expected = {"
|
49
|
+
req[:action] = 'add-class'
|
50
|
+
req['Class'] = 'Just Testing...'
|
51
|
+
expected = {"class"=>"Just Testing...", 'action' =>"add_class"}
|
22
52
|
req.commands.should eql(expected)
|
23
53
|
end
|
24
54
|
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Snarl::SNP" do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@host = '192.168.0.2'
|
7
|
+
@port = 9887
|
8
|
+
@app = Snarl::SNP::DEFAULT_TITLE
|
9
|
+
@class = '1'
|
10
|
+
end
|
11
|
+
|
12
|
+
def snp_open(&block)
|
13
|
+
snp = Snarl::SNP.new(@host, @port)
|
14
|
+
snp.stub!(:send).and_return('SNP/1.1/0/OK/1234/')
|
15
|
+
block.call(snp)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#auto_register" do
|
19
|
+
it "do register when snp['app'] exists" do
|
20
|
+
expected = "type=SNP#?version=1.0#?action=register#?app=#{@app}\r\n"
|
21
|
+
snp_open do |snp|
|
22
|
+
snp['app'] = @app
|
23
|
+
snp.auto_register.request_str.should eql(expected)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
it "do nothing when snp['app'] is nil/unset/empty" do
|
27
|
+
snp_open do |snp|
|
28
|
+
snp['app'] = nil
|
29
|
+
snp.auto_register.should be_nil
|
30
|
+
end
|
31
|
+
snp_open do |snp|
|
32
|
+
snp.instance_variable_get(:@config).config.delete('app')
|
33
|
+
snp.auto_register.should be_nil
|
34
|
+
end
|
35
|
+
snp_open do |snp|
|
36
|
+
snp['app'] = ""
|
37
|
+
snp.auto_register.should be_nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
describe "#auto_add_class" do
|
43
|
+
before :all do
|
44
|
+
classname1, classtitle1 = 'classname1', 'classtitle1'
|
45
|
+
classname2 = 'classname2'
|
46
|
+
@res1 = "type=SNP#?version=1.0#?action=add_class#?app=#{@app}#?class=#{classname1}#?title=#{classtitle1}\r\n"
|
47
|
+
@res2 = "type=SNP#?version=1.0#?action=add_class#?app=#{@app}#?class=#{classname2}\r\n"
|
48
|
+
@classes = [[classname1, classtitle1], [classname2, nil]]
|
49
|
+
end
|
50
|
+
|
51
|
+
it "do register when snp['class'] exists" do
|
52
|
+
expected = [@res1, @res2]
|
53
|
+
snp_open do |snp|
|
54
|
+
snp['app'] = @app
|
55
|
+
snp['class'] = @classes
|
56
|
+
snp.auto_add_class.map{|e| e.request_str}.should eql(expected)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
it "do nothing when snp['class'] is nil/unset/empty" do
|
60
|
+
snp_open do |snp|
|
61
|
+
snp['app'] = @app
|
62
|
+
snp['class'] = nil
|
63
|
+
snp.auto_add_class.should be_nil
|
64
|
+
end
|
65
|
+
snp_open do |snp|
|
66
|
+
snp['app'] = @app
|
67
|
+
snp.instance_variable_get(:@config).config.delete('class')
|
68
|
+
snp.auto_add_class.should be_nil
|
69
|
+
end
|
70
|
+
snp_open do |snp|
|
71
|
+
snp['app'] = @app
|
72
|
+
snp['class'] = []
|
73
|
+
snp.auto_add_class.should be_nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
it "do nothing when snp['app'] is unset" do
|
77
|
+
snp_open do |snp|
|
78
|
+
snp.instance_variable_get(:@config).config.delete('app')
|
79
|
+
snp['class'] = @classes
|
80
|
+
snp.auto_add_class.should be_nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "#auto_notification" do
|
86
|
+
it "snp['notification'] == {notify_arg_hash} with snp['app']" do
|
87
|
+
expected = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=title#?text=text#?timeout=10\r\n"
|
88
|
+
snp_open do |snp|
|
89
|
+
snp['app'] = @app
|
90
|
+
snp['notification'] = {'title' => 'title', 'text' => 'text'}
|
91
|
+
snp.auto_notification.request_str.should eql(expected)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
it "snp['notification'] == {notify_arg_hash} without snp['app'] but hash has {'app' => app}" do
|
95
|
+
expected = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=title#?text=text#?timeout=10\r\n"
|
96
|
+
snp_open do |snp|
|
97
|
+
snp['notification'] = {'app' => @app, 'title' => 'title', 'text' => 'text'}
|
98
|
+
snp.auto_notification.request_str.should eql(expected)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
it "snp['notification'] == [notify_arg_array]" do
|
102
|
+
expected = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=title#?text=text#?timeout=9\r\n"
|
103
|
+
snp_open do |snp|
|
104
|
+
snp['app'] = @app
|
105
|
+
snp['notification'] = ['title', 'text', 9]
|
106
|
+
snp.auto_notification.request_str.should eql(expected)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
it "snp['notification'] == [{notify_arg_hash1}, {notify_arg_hash2}, ...]" do
|
110
|
+
arg1 = {'title' => 'title1', 'text' => 'text1', 'timeout' => 8}
|
111
|
+
arg2 = {'title' => 'title2', 'text' => 'text2', 'timeout' => 7}
|
112
|
+
notifications = [arg1, arg2]
|
113
|
+
res1 = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=title1#?text=text1#?timeout=8\r\n"
|
114
|
+
res2 = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=title2#?text=text2#?timeout=7\r\n"
|
115
|
+
expected = [res1, res2]
|
116
|
+
snp_open do |snp|
|
117
|
+
snp['app'] = @app
|
118
|
+
snp['notification'] = notifications
|
119
|
+
snp.auto_notification.map{|res| res.request_str}.should eql(expected)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
it "snp['notification'] == nil, build notify_hash from app,text,title,..." do
|
123
|
+
expected = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?class=class#?title=title#?text=text#?timeout=6\r\n"
|
124
|
+
snp_open do |snp|
|
125
|
+
snp['app'] = @app
|
126
|
+
snp.instance_variable_get(:@config).config.delete('notification')
|
127
|
+
snp['title'] = 'title'
|
128
|
+
snp['text'] = 'text'
|
129
|
+
snp['timeout'] = '6'
|
130
|
+
snp['class'] = 'class'
|
131
|
+
snp.auto_notification.request_str.should eql(expected)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "#auto_unregister" do
|
137
|
+
it "do unregister when snp['unregister'] and snp['app'] exist" do
|
138
|
+
expected = "type=SNP#?version=1.0#?action=unregister#?app=#{@app}\r\n"
|
139
|
+
snp_open do |snp|
|
140
|
+
snp['app'] = @app
|
141
|
+
snp['unregister'] = true
|
142
|
+
snp.auto_unregister.request_str.should eql(expected)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
it "do nothing when snp['unregister'] is nil/unset/false" do
|
146
|
+
snp_open do |snp|
|
147
|
+
snp['app'] = @app
|
148
|
+
snp['unregister'] = nil
|
149
|
+
snp.auto_unregister.should be_nil
|
150
|
+
end
|
151
|
+
snp_open do |snp|
|
152
|
+
snp['app'] = @app
|
153
|
+
snp.instance_variable_get(:@config).config.delete('unregister')
|
154
|
+
snp.auto_unregister.should be_nil
|
155
|
+
end
|
156
|
+
snp_open do |snp|
|
157
|
+
snp['app'] = @app
|
158
|
+
snp['unregister'] = false
|
159
|
+
snp.auto_unregister.should be_nil
|
160
|
+
end
|
161
|
+
end
|
162
|
+
it "do nothing when snp['app'] is nil/unset/empty" do
|
163
|
+
snp_open do |snp|
|
164
|
+
snp['app'] = nil
|
165
|
+
snp['unregister'] = true
|
166
|
+
snp.auto_unregister.should be_nil
|
167
|
+
end
|
168
|
+
snp_open do |snp|
|
169
|
+
snp.instance_variable_get(:@config).config.delete('app')
|
170
|
+
snp['unregister'] = true
|
171
|
+
snp.auto_unregister.should be_nil
|
172
|
+
end
|
173
|
+
snp_open do |snp|
|
174
|
+
snp['app'] = ""
|
175
|
+
snp['unregister'] = true
|
176
|
+
snp.auto_unregister.should be_nil
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
describe "#autoexecute_with_config!" do
|
182
|
+
before do
|
183
|
+
@classname, @classtitle = 'classname', 'classtitle'
|
184
|
+
@classes = [[@classname, @classtitle]]
|
185
|
+
@title, @text = 'title', 'text'
|
186
|
+
@notifications = {'title' => @title, 'text' => @text}
|
187
|
+
end
|
188
|
+
|
189
|
+
it "do register and add_class and notification automatically" do
|
190
|
+
res_register = "type=SNP#?version=1.0#?action=register#?app=#{@app}\r\n"
|
191
|
+
res_add_class = "type=SNP#?version=1.0#?action=add_class#?app=#{@app}#?class=#{@classname}#?title=#{@classtitle}\r\n"
|
192
|
+
res_notification = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=#{@title}#?text=#{@text}#?timeout=10\r\n"
|
193
|
+
expected = [res_register, res_add_class, res_notification]
|
194
|
+
snp_open do |snp|
|
195
|
+
snp['app'] = @app
|
196
|
+
snp['add_class'] = @classes
|
197
|
+
snp['notification'] = @notifications
|
198
|
+
snp.autoexecute_with_config!.flatten.map{|res| res.request_str}.should eql(expected)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
it "do nothing if no snp['app'] and snp['add_class'] and snp['notification']" do
|
202
|
+
snp_open do |snp|
|
203
|
+
snp.instance_variable_get(:@config).config.delete('app')
|
204
|
+
snp.instance_variable_get(:@config).config.delete('add_class')
|
205
|
+
snp.instance_variable_get(:@config).config.delete('notification')
|
206
|
+
snp.autoexecute_with_config!.flatten.should eql([nil, nil, nil])
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "#apply_yaml" do
|
212
|
+
it "apply yamldata to snp" do
|
213
|
+
app, classname = 'app', 'class'
|
214
|
+
yamldata = "app : #{app}\nclass : #{classname}\n"
|
215
|
+
snp_open do |snp|
|
216
|
+
snp['app'].should be_nil
|
217
|
+
snp['class'].should be_nil
|
218
|
+
snp.apply_yaml(yamldata)
|
219
|
+
snp['app'].should eql(app)
|
220
|
+
snp['class'].should eql([[classname, nil]])
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
# describe "#set_logger" #=> real_connection_spec.rb
|
226
|
+
end
|
data/spec/snp/snp_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# -*- coding:utf-8 -*-
|
2
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'stringio'
|
3
3
|
|
4
4
|
describe "SNP" do
|
5
5
|
|
@@ -8,258 +8,281 @@ describe "SNP" do
|
|
8
8
|
@port = 9887
|
9
9
|
@app = Snarl::SNP::DEFAULT_TITLE
|
10
10
|
@class = '1'
|
11
|
-
|
11
|
+
end
|
12
|
+
|
13
|
+
def snp_open(&block)
|
14
|
+
snp = Snarl::SNP.new(@host, @port)
|
15
|
+
snp.stub!(:send).and_return('SNP/1.1/0/OK/1234/')
|
16
|
+
block.call(snp)
|
12
17
|
end
|
13
18
|
|
14
19
|
describe "initialize" do
|
15
20
|
it "new('192.168.0.2', 9887). (snarl_working_machine_host, snarl_port_9887)" do
|
16
21
|
host, port, verbose = '192.168.0.2', 9887, true
|
17
22
|
snp = Snarl::SNP.new(host, port, verbose)
|
18
|
-
snp
|
19
|
-
snp
|
23
|
+
snp['host'].should eql(host)
|
24
|
+
snp['port'].should eql(port)
|
20
25
|
snp.verbose.should eql(verbose)
|
21
26
|
end
|
22
27
|
it "default host is 127.0.0.1, default port is 9887. when SNP.new()" do
|
28
|
+
bk_host = ENV['SNARL_HOST']
|
29
|
+
ENV['SNARL_HOST'] = nil
|
30
|
+
bk_port = ENV['SNARL_PORT']
|
31
|
+
ENV['SNARL_PORT'] = nil
|
23
32
|
snp = Snarl::SNP.new
|
24
|
-
snp
|
25
|
-
snp
|
33
|
+
snp['host'].should eql('127.0.0.1')
|
34
|
+
snp['port'].should eql(9887)
|
26
35
|
snp.verbose.should eql(false)
|
36
|
+
ENV['SNARL_HOST'] = bk_host
|
37
|
+
ENV['SNARL_PORT'] = bk_port
|
27
38
|
end
|
28
39
|
end
|
29
40
|
|
30
41
|
describe "#request" do
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
42
|
+
|
43
|
+
module ErrorPair
|
44
|
+
def self.casual_errors
|
45
|
+
{
|
46
|
+
'SNP/1.1/202/Not Registered' => Snarl::SNP::Error::SNP_ERROR_NOT_REGISTERED,
|
47
|
+
'SNP/1.1/203/Already Registered' => Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED,
|
48
|
+
'SNP/1.1/204/Class Already Exists' => Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS,
|
49
|
+
'SNP/1.1/201/Not Running' => Snarl::SNP::Error::SNP_ERROR_NOT_RUNNING,
|
50
|
+
'SNP/1.1/101/Failed' => Snarl::SNP::Error::SNP_ERROR_FAILED,
|
51
|
+
}
|
37
52
|
end
|
38
53
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
Snarl::SNP.open(@host, @port) do |snp|
|
47
|
-
snp.verbose = true
|
48
|
-
lambda{
|
49
|
-
snp.request(@register)
|
50
|
-
snp.request(@register)
|
51
|
-
}.should raise_error(Snarl::SNP::Error::SNP_ERROR_ALREADY_REGISTERED)
|
52
|
-
end
|
54
|
+
def self.fatal_errors
|
55
|
+
{
|
56
|
+
'SNP/1.1/102/Unknown Connamd' => Snarl::SNP::Error::SNP_ERROR_UNKNOWN_COMMAND,
|
57
|
+
'SNP/1.1/103/Timed Out' => Snarl::SNP::Error::SNP_ERROR_TIMED_OUT,
|
58
|
+
'SNP/1.1/107/Bad packet' => Snarl::SNP::Error::SNP_ERROR_BAD_PACKET,
|
59
|
+
'SNP/1.1/998/!Snarl::SNP\'s original error(unknown response code)' => Snarl::SNP::Error::RUBYSNARL_UNKNOWN_RESPONSE
|
60
|
+
}
|
53
61
|
end
|
62
|
+
end
|
54
63
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
66
|
-
snp.request(@notification)
|
67
|
-
snp.request(@unregister)
|
68
|
-
end
|
69
|
-
}.should_not raise_error
|
64
|
+
before :all do
|
65
|
+
@register ="type=SNP#?version=1.0#?action=register#?app=#{@app}\r\n"
|
66
|
+
@add_class = "type=SNP#?version=1.0#?action=add_class#?app=#{@app}#?class=#{@class}\r\n"
|
67
|
+
@notification = "type=SNP#?version=1.0#?action=notification#?app=#{@app}#?title=Raw!#?text=text!#?timeout=10\r\n"
|
68
|
+
@unregister = "type=SNP#?version=1.0#?action=unregister#?app=#{@app}\r\n"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns SNP::Response object" do
|
72
|
+
snp_open do |snp|
|
73
|
+
snp.request("fake").should be_kind_of(Snarl::SNP::Response)
|
70
74
|
end
|
71
75
|
end
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
76
|
+
|
77
|
+
it "if argument is String, it is used as-is" do
|
78
|
+
req_str = "fake"
|
79
|
+
snp_open do |snp|
|
80
|
+
snp.request(req_str).request_str.should eql(req_str)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it "Hash argument is converted in SNP::Request" do
|
85
|
+
notification = {
|
86
|
+
:app => @app,
|
87
|
+
:action => action = 'notification',
|
88
|
+
:class => @class,
|
89
|
+
:title => title = 'title',
|
90
|
+
:text => text = 'text',
|
91
|
+
:timeout => timeout = 9
|
92
|
+
}
|
93
|
+
expected = "type=SNP#?version=1.0#?action=#{action}#?app=#{@app}#?class=#{@class}#?title=#{title}#?text=#{text}#?timeout=#{timeout}\r\n"
|
94
|
+
snp_open do |snp|
|
95
|
+
snp.request(notification).request_str.should eql(expected)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "if snp.logger is set, put send/get logs to logger" do
|
100
|
+
|
101
|
+
def sio_logger(sio)
|
102
|
+
logger = Logger.new(sio)
|
103
|
+
logger.datetime_format = ""
|
104
|
+
logger
|
105
|
+
end
|
106
|
+
|
107
|
+
def expected_log_output(str, level='DEBUG')
|
108
|
+
/#{level[0,1]},\s+\[#\d+\]\s+#{Regexp.quote("#{level} -- : #{str}")}/
|
95
109
|
end
|
96
110
|
|
97
|
-
it "
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
111
|
+
it "request string is put to log" do
|
112
|
+
log = StringIO.new
|
113
|
+
req_query = "type=SNP#?version=1.0#?action=notification#?title=title#?text=text#?timeout=10"
|
114
|
+
expected = "notification: \"#{req_query}\""
|
115
|
+
snp_open do |snp|
|
116
|
+
snp.logger = sio_logger(log)
|
117
|
+
snp.notification('title', 'text')
|
118
|
+
log.rewind
|
119
|
+
log.read.should match(expected_log_output(expected, 'DEBUG'))
|
103
120
|
end
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
121
|
+
end
|
122
|
+
|
123
|
+
it "response string is put to log" do
|
124
|
+
log = StringIO.new
|
125
|
+
expected = "notification: SNP/1.1/0/OK/1234/"
|
126
|
+
snp_open do |snp|
|
127
|
+
snp.logger = sio_logger(log)
|
128
|
+
snp.notification('title', 'text')
|
129
|
+
log.rewind
|
130
|
+
log.read.should match(expected_log_output(expected, 'INFO'))
|
110
131
|
end
|
111
132
|
end
|
112
133
|
|
113
|
-
it "
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
snp.request(@add_class)
|
122
|
-
rescue Snarl::SNP::Error::SNP_ERROR_CLASS_ALREADY_EXISTS
|
123
|
-
end
|
124
|
-
snp.request(@notification)
|
125
|
-
snp.request(@unregister)
|
126
|
-
end
|
127
|
-
}.should_not raise_error
|
134
|
+
it "if no casual errors raise, log has 2 lines(reqstr, response)" do
|
135
|
+
log = StringIO.new
|
136
|
+
snp_open do |snp|
|
137
|
+
snp.logger = sio_logger(log)
|
138
|
+
snp.notification('title', 'text')
|
139
|
+
log.rewind
|
140
|
+
log.readlines.size.should eql(2)
|
141
|
+
end
|
128
142
|
end
|
129
|
-
end
|
130
|
-
end
|
131
143
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
snp.
|
138
|
-
snp.
|
139
|
-
|
140
|
-
|
141
|
-
snp.unregister(@app)
|
144
|
+
it "casual error is put regardress of snp.verbose" do
|
145
|
+
log = StringIO.new
|
146
|
+
expected = "register: (ignored) (203) Application is already registered"
|
147
|
+
snp_open do |snp|
|
148
|
+
snp.logger = sio_logger(log)
|
149
|
+
snp.stub!(:send).and_return('SNP/1.1/203/Application is already registered')
|
150
|
+
snp.register('Ruby-Snarl')
|
151
|
+
log.rewind
|
152
|
+
log.read.should match(expected_log_output(expected, 'INFO'))
|
142
153
|
end
|
143
|
-
|
154
|
+
end
|
144
155
|
end
|
145
|
-
end
|
146
156
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
157
|
+
describe "raises no Error::Casual when respnse is casual error and setting is default(SNP#verbose is unset, false)" do
|
158
|
+
ErrorPair.casual_errors.each_pair do |res, err|
|
159
|
+
e = <<E
|
160
|
+
it "not raise #{err}" do
|
161
|
+
snp_open do |snp|
|
162
|
+
snp.stub!(:send).and_return("#{res}")
|
163
|
+
lambda{snp.request("fake")}.should_not raise_error(#{err})
|
164
|
+
end
|
165
|
+
end
|
166
|
+
E
|
167
|
+
instance_eval(e)
|
151
168
|
end
|
152
169
|
end
|
153
|
-
end
|
154
170
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
171
|
+
describe "raises Error::Casual when respnse is casual error and SNP#verbose is set to true" do
|
172
|
+
ErrorPair.casual_errors.each_pair do |res, err|
|
173
|
+
e = <<E
|
174
|
+
it "raise #{err}" do
|
175
|
+
snp_open do |snp|
|
176
|
+
snp.verbose = true
|
177
|
+
snp.stub!(:send).and_return("#{res}")
|
178
|
+
lambda{snp.request("fake")}.should raise_error(#{err})
|
179
|
+
end
|
180
|
+
end
|
181
|
+
E
|
182
|
+
instance_eval(e)
|
159
183
|
end
|
160
184
|
end
|
161
|
-
end
|
162
185
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
186
|
+
describe "raises Error::Fatal when response is fatal error" do
|
187
|
+
ErrorPair.fatal_errors.each_pair do |res, err|
|
188
|
+
e = <<E
|
189
|
+
it "raise #{err}" do
|
190
|
+
snp_open do |snp|
|
191
|
+
snp.stub!(:send).and_return("#{res}")
|
192
|
+
lambda{snp.request("fake")}.should raise_error(#{err})
|
193
|
+
end
|
194
|
+
end
|
195
|
+
E
|
196
|
+
instance_eval(e)
|
171
197
|
end
|
172
198
|
end
|
173
|
-
end
|
174
199
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
200
|
+
describe "raises Error::Fatal when response is fatal error regardless of SNP#verbose" do
|
201
|
+
ErrorPair.fatal_errors.each_pair do |res, err|
|
202
|
+
e = <<E
|
203
|
+
it "raise #{err}" do
|
204
|
+
snp_open do |snp|
|
205
|
+
snp.stub!(:send).and_return("#{res}")
|
206
|
+
lambda{snp.request("fake")}.should raise_error(#{err})
|
207
|
+
end
|
208
|
+
end
|
209
|
+
E
|
210
|
+
instance_eval(e)
|
211
|
+
end
|
182
212
|
end
|
183
|
-
end
|
184
213
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
214
|
+
describe "returns SNP::Response when error does not raise" do
|
215
|
+
it "when SNP/1.1/0/OK, returns its SNP::Response object" do
|
216
|
+
snp_open do |snp|
|
217
|
+
snp.stub!(:send).and_return("SNP/1.1/0/OK")
|
218
|
+
snp.request("fake").inspect.should eql("SNP/1.1/0/OK")
|
219
|
+
end
|
220
|
+
end
|
221
|
+
ErrorPair.casual_errors.keys.each do |res|
|
222
|
+
e = <<E
|
223
|
+
it "when #{res}, returns its SNP::Response object" do
|
224
|
+
snp_open do |snp|
|
225
|
+
snp.stub!(:send).and_return("#{res}")
|
226
|
+
snp.request("fake").inspect.should eql("#{res}")
|
227
|
+
end
|
228
|
+
end
|
229
|
+
E
|
230
|
+
instance_eval(e)
|
189
231
|
end
|
190
232
|
end
|
191
|
-
end
|
192
233
|
|
193
|
-
describe ".show_message" do
|
194
|
-
it "show_message(host, port, title, text, timeout, icon) shows popup message" do
|
195
|
-
lambda{Snarl::SNP.show_message(@host, @port, 'snp_spec', 'test mesage', 2, nil)}.should_not raise_error
|
196
|
-
end
|
197
|
-
it "show_message(host, text) shows popup message with ease" do
|
198
|
-
lambda{Snarl::SNP.show_message(@host, 'short mesage')}.should_not raise_error
|
199
|
-
end
|
200
234
|
end
|
201
235
|
|
202
|
-
|
203
|
-
|
204
|
-
describe "SNP1.1 feature" do
|
205
|
-
# NOTE: With "type=SNP#?version=1.0" also works on Snarl R2.21. wow.
|
236
|
+
describe "#add_classes" do
|
206
237
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
238
|
+
it "runs add_class for each argument (if Array, use add_classes(*arr))" do
|
239
|
+
classes = [['1', 'one'], ['2', 'two']]
|
240
|
+
snp_open do |snp|
|
241
|
+
snp.register(@app)
|
242
|
+
snp.stub!(:send).and_return{|req| "SNP/1.1/0/OK/#{req.to_s.scan(/class=(\d)/).flatten[0]}"}
|
243
|
+
snp.add_classes(*classes).map{|res| res.infomation}.should eql(['1', '2'])
|
244
|
+
snp.unregister(@app)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
it "runs add_class for multi_class_str each argument" do
|
248
|
+
snp_open do |snp|
|
249
|
+
snp.register(@app)
|
250
|
+
snp.stub!(:send).and_return{|req| "SNP/1.1/0/OK/#{req.to_s.scan(/class=(\d)/).flatten[0]}"}
|
251
|
+
snp.add_classes('1', '2').map{|res| res.infomation}.should eql(['1', '2'])
|
252
|
+
snp.unregister(@app)
|
253
|
+
end
|
254
|
+
end
|
212
255
|
end
|
213
256
|
|
214
|
-
#
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
it "type=SNP#?version=1.1#?action=hello\\r\\n" do
|
221
|
-
Snarl::SNP.open(@host) do |snp|
|
222
|
-
res = snp.request("type=SNP#?version=1.1#?action=hello\r\n")
|
223
|
-
res.inspect.should match(/\ASNP\/1.1\/0\/OK\/Snarl /)
|
224
|
-
end
|
257
|
+
describe "#snarl_hello" do
|
258
|
+
it "returns Snarl release identifier string without popup" do
|
259
|
+
snp_open do |snp|
|
260
|
+
snp.stub!(:send).and_return("SNP/1.1/0/OK/Snarl R2.21")
|
261
|
+
expected = "Snarl R2.21"
|
262
|
+
snp.snarl_hello.should eql(expected)
|
225
263
|
end
|
226
264
|
end
|
265
|
+
end
|
227
266
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
267
|
+
describe "#snarl_version" do
|
268
|
+
it "returns Snarl (inner) version string without popup" do
|
269
|
+
snp_open do |snp|
|
270
|
+
snp.stub!(:send).and_return("SNP/1.1/0/OK/40.15")
|
271
|
+
expected = "40.15"
|
272
|
+
snp.snarl_version.should eql(expected)
|
234
273
|
end
|
235
274
|
end
|
236
|
-
|
237
275
|
end
|
238
276
|
|
239
|
-
describe "
|
240
|
-
it "
|
241
|
-
|
277
|
+
describe "#iconset" do
|
278
|
+
it "set icon using" do
|
279
|
+
iconset = {:red => 'red.jpg', :blue => 'blue.jpg'}
|
280
|
+
snp_open do |snp|
|
242
281
|
snp.register(@app)
|
243
|
-
snp.
|
244
|
-
|
245
|
-
|
246
|
-
snp.unregister(@class)
|
282
|
+
snp.iconset(iconset)
|
283
|
+
snp.notification('icon!', 'icon1!', :red, 1).request_str.should match(/icon=red\.jpg/)
|
284
|
+
snp.notification('icon!', 'icon2!', :blue, 1).request_str.should match(/icon=blue\.jpg/)
|
247
285
|
end
|
248
286
|
end
|
249
287
|
end
|
250
|
-
|
251
|
-
# describe "notification icon path can be URL" do
|
252
|
-
# it "use Google News Icon" do
|
253
|
-
# lambda{
|
254
|
-
# Snarl::SNP.open(@host) do |snp|
|
255
|
-
# snp.register(@app)
|
256
|
-
# snp.add_class(@class)
|
257
|
-
# icon = 'http://www.google.com/images/newspaper.gif'
|
258
|
-
# res = snp.request("type=SNP#?version=1.1#?action=notification#?app=#{@app}#?title=1.1!#?text=Google News!!#?timeout=4#?icon=#{icon}\r\n")
|
259
|
-
# snp.unregister(@class)
|
260
|
-
# end
|
261
|
-
# }.should_not raise_error
|
262
|
-
# end
|
263
|
-
# end
|
264
288
|
end
|
265
|
-
|