hacky_hal 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/hacky_hal.gemspec +2 -2
- data/lib/hacky_hal/device_controllers/epson_projector.rb +5 -5
- data/lib/hacky_hal/device_controllers/generic_ssh.rb +2 -2
- data/lib/hacky_hal/device_controllers/io_gear_avior_hdmi_switch.rb +2 -2
- data/lib/hacky_hal/device_controllers/yamaha_av_receiver.rb +6 -6
- data/lib/hacky_hal/registry.rb +1 -0
- data/spec/hacky_hal/device_controllers/base_spec.rb +2 -2
- data/spec/hacky_hal/device_controllers/generic_serial_port_spec.rb +48 -48
- data/spec/hacky_hal/device_controllers/generic_ssh_spec.rb +38 -38
- data/spec/hacky_hal/device_controllers/roku_spec.rb +6 -6
- data/spec/hacky_hal/device_controllers/yamaha_av_receiver_spec.rb +6 -6
- data/spec/hacky_hal/device_resolvers/base_spec.rb +1 -1
- data/spec/hacky_hal/device_resolvers/ssdp_spec.rb +7 -7
- data/spec/hacky_hal/device_resolvers/static_uri_spec.rb +1 -1
- data/spec/hacky_hal/log_spec.rb +3 -3
- data/spec/hacky_hal/options_spec.rb +2 -2
- data/spec/hacky_hal/registry_spec.rb +6 -5
- data/spec/hacky_hal/util_spec.rb +3 -3
- metadata +2 -2
data/hacky_hal.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = "hacky_hal"
|
5
|
-
gem.version = "0.2.
|
5
|
+
gem.version = "0.2.5"
|
6
6
|
|
7
7
|
gem.authors = ["Nick Ewing"]
|
8
8
|
gem.email = ["nick@nickewing.net"]
|
@@ -18,5 +18,5 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(/^spec/)
|
19
19
|
gem.require_paths = ["lib"]
|
20
20
|
|
21
|
-
gem.license =
|
21
|
+
gem.license = "MIT"
|
22
22
|
end
|
@@ -78,11 +78,11 @@ module HackyHAL
|
|
78
78
|
@model = options[:model]
|
79
79
|
end
|
80
80
|
|
81
|
-
def
|
81
|
+
def power
|
82
82
|
power_status == :on
|
83
83
|
end
|
84
84
|
|
85
|
-
def
|
85
|
+
def set_power(value)
|
86
86
|
value = value ? "ON" : "OFF"
|
87
87
|
write_command("PWR #{value}")
|
88
88
|
read_command(1)
|
@@ -109,7 +109,7 @@ module HackyHAL
|
|
109
109
|
{id: source_id, name: source_name}
|
110
110
|
end
|
111
111
|
|
112
|
-
def
|
112
|
+
def set_source(source_id)
|
113
113
|
write_command("SOURCE #{source_id}")
|
114
114
|
read_command(SOURCE_COMMAND_TIMEOUT)
|
115
115
|
end
|
@@ -124,7 +124,7 @@ module HackyHAL
|
|
124
124
|
{id: color_mode_id, name: color_mode_name}
|
125
125
|
end
|
126
126
|
|
127
|
-
def
|
127
|
+
def set_color_mode(color_mode_id)
|
128
128
|
write_command("CMODE #{color_mode_id}")
|
129
129
|
read_command
|
130
130
|
end
|
@@ -139,7 +139,7 @@ module HackyHAL
|
|
139
139
|
{id: aspect_ratio_id, name: aspect_ratio_name}
|
140
140
|
end
|
141
141
|
|
142
|
-
def
|
142
|
+
def set_aspect_ratio(aspect_ratio_id)
|
143
143
|
write_command("ASPECT #{aspect_ratio_id}")
|
144
144
|
read_command
|
145
145
|
end
|
@@ -17,7 +17,7 @@ module HackyHAL
|
|
17
17
|
super(options)
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def set_input(value)
|
21
21
|
unless value.is_a?(Fixnum)
|
22
22
|
raise ArgumentError, "Input value must be an integer."
|
23
23
|
end
|
@@ -41,7 +41,7 @@ module HackyHAL
|
|
41
41
|
read_command
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
44
|
+
def set_power_on_detection(value)
|
45
45
|
value = value ? "on" : "off"
|
46
46
|
write_command("pod #{value}")
|
47
47
|
read_command
|
@@ -104,7 +104,7 @@ module HackyHAL
|
|
104
104
|
response.elements["YAMAHA_AV/Main_Zone/Input/Input_Sel"].text
|
105
105
|
end
|
106
106
|
|
107
|
-
def
|
107
|
+
def set_input(input_name)
|
108
108
|
put_request(%|<Main_Zone><Input><Input_Sel>#{input_name}</Input_Sel></Input></Main_Zone>|)
|
109
109
|
end
|
110
110
|
|
@@ -118,12 +118,12 @@ module HackyHAL
|
|
118
118
|
put_request(%|<System><Sound_Video><HDMI><Output><#{output_name}>#{value}</#{output_name}></Output></HDMI></Sound_Video></System>|)
|
119
119
|
end
|
120
120
|
|
121
|
-
def
|
121
|
+
def power
|
122
122
|
response = get_request("<Main_Zone><Power_Control><Power>GetParam</Power></Power_Control></Main_Zone>")
|
123
123
|
response.elements["YAMAHA_AV/Main_Zone/Power_Control/Power"].text == "On"
|
124
124
|
end
|
125
125
|
|
126
|
-
def
|
126
|
+
def set_power(value)
|
127
127
|
value = value ? "On" : "Standby"
|
128
128
|
put_request("<Main_Zone><Power_Control><Power>#{value}</Power></Power_Control></Main_Zone>")
|
129
129
|
end
|
@@ -133,7 +133,7 @@ module HackyHAL
|
|
133
133
|
element_volume_value(response.elements["YAMAHA_AV/Main_Zone/Volume/Lvl/Val"])
|
134
134
|
end
|
135
135
|
|
136
|
-
def
|
136
|
+
def set_volume(value)
|
137
137
|
value = (value * 10.0).to_i.to_s
|
138
138
|
response = put_request("<Main_Zone><Volume><Lvl><Val>#{value}</Val><Exp>1</Exp><Unit>dB</Unit></Lvl></Volume></Main_Zone>")
|
139
139
|
end
|
@@ -143,7 +143,7 @@ module HackyHAL
|
|
143
143
|
element_on?(response.elements["YAMAHA_AV/Main_Zone/Volume/Mute"])
|
144
144
|
end
|
145
145
|
|
146
|
-
def
|
146
|
+
def set_mute(value)
|
147
147
|
value = case value
|
148
148
|
when true then "On"
|
149
149
|
when false then "Off"
|
@@ -158,7 +158,7 @@ module HackyHAL
|
|
158
158
|
response.elements["YAMAHA_AV/Main_Zone/Surround/Program_Sel/Current/Sound_Program"].text
|
159
159
|
end
|
160
160
|
|
161
|
-
def
|
161
|
+
def set_sound_program(program_name)
|
162
162
|
response = put_request("<Main_Zone><Surround><Program_Sel><Current><Sound_Program>#{program_name}</Sound_Program></Current></Program_Sel></Surround></Main_Zone>")
|
163
163
|
puts response
|
164
164
|
# response.elements["YAMAHA_AV/Main_Zone/Surround/Program_Sel/Current/Sound_Program"].text
|
data/lib/hacky_hal/registry.rb
CHANGED
@@ -3,13 +3,13 @@ require "hacky_hal/device_controllers/base"
|
|
3
3
|
|
4
4
|
describe HackyHAL::DeviceControllers::Base do
|
5
5
|
it "should include Options" do
|
6
|
-
described_class.ancestors.
|
6
|
+
expect(described_class.ancestors).to include(HackyHAL::Options)
|
7
7
|
end
|
8
8
|
|
9
9
|
describe "#log" do
|
10
10
|
it "should log to HackyHAL::Log with device name" do
|
11
11
|
controller = described_class.new(name: "dummy device")
|
12
|
-
HackyHAL::Log.instance.
|
12
|
+
expect(HackyHAL::Log.instance).to receive(:info).with("dummy device: dummy message")
|
13
13
|
controller.log("dummy message", :info)
|
14
14
|
end
|
15
15
|
end
|
@@ -4,51 +4,51 @@ require "hacky_hal/device_controllers/generic_serial_port"
|
|
4
4
|
describe HackyHAL::DeviceControllers::GenericSerialPort do
|
5
5
|
before(:each) do
|
6
6
|
@serial_port = double("serial port")
|
7
|
-
@serial_port.
|
8
|
-
@serial_port.
|
9
|
-
@serial_port.
|
10
|
-
@serial_port.
|
11
|
-
@serial_port.
|
12
|
-
@serial_port.
|
7
|
+
allow(@serial_port).to receive(:read_timeout=)
|
8
|
+
allow(@serial_port).to receive(:baud=)
|
9
|
+
allow(@serial_port).to receive(:data_bits=)
|
10
|
+
allow(@serial_port).to receive(:stop_bits=)
|
11
|
+
allow(@serial_port).to receive(:parity=)
|
12
|
+
allow(@serial_port).to receive(:flow_control=)
|
13
13
|
|
14
14
|
@serial_device_path = "/dev/foo0"
|
15
15
|
@generic_serial_port = described_class.new(serial_device_path: @serial_device_path)
|
16
16
|
|
17
|
-
SerialPort.
|
17
|
+
allow(SerialPort).to receive(:new).and_return(@serial_port)
|
18
18
|
end
|
19
19
|
|
20
20
|
describe "#write_command" do
|
21
21
|
before(:each) do
|
22
|
-
@serial_port.
|
22
|
+
allow(@serial_port).to receive(:flush)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should write to the serial port" do
|
26
|
-
@serial_port.
|
26
|
+
expect(@serial_port).to receive(:write).with("foobar\r\n")
|
27
27
|
@generic_serial_port.write_command("foobar")
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should return true on successful run" do
|
31
|
-
@serial_port.
|
32
|
-
@generic_serial_port.write_command("foobar").
|
31
|
+
expect(@serial_port).to receive(:write)
|
32
|
+
expect(@generic_serial_port.write_command("foobar")).to be true
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should retry after rescuing from an Errno::EIO" do
|
36
|
-
@generic_serial_port.
|
36
|
+
expect(@generic_serial_port).to receive(:disconnect)
|
37
37
|
|
38
38
|
retries = 0
|
39
|
-
@serial_port.
|
39
|
+
allow(@serial_port).to receive(:write) do
|
40
40
|
if retries < HackyHAL::DeviceControllers::GenericSerialPort::MAX_READ_WRITE_RETRIES
|
41
41
|
retries += 1
|
42
42
|
raise Errno::EIO
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
@generic_serial_port.write_command("foobar").
|
46
|
+
expect(@generic_serial_port.write_command("foobar")).to be true
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should raise Errno::EIO if retry failed" do
|
50
|
-
@serial_port.
|
51
|
-
@serial_port.
|
50
|
+
allow(@serial_port).to receive(:write) { raise Errno::EIO }
|
51
|
+
allow(@serial_port).to receive(:close)
|
52
52
|
|
53
53
|
expect {
|
54
54
|
@generic_serial_port.write_command("foobar")
|
@@ -56,47 +56,47 @@ describe HackyHAL::DeviceControllers::GenericSerialPort do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should log debug message" do
|
59
|
-
@serial_port.
|
60
|
-
@generic_serial_port.
|
59
|
+
allow(@serial_port).to receive(:write)
|
60
|
+
expect(@generic_serial_port).to receive(:log).with("Wrote: \"foobar\\r\\n\"", :debug)
|
61
61
|
@generic_serial_port.write_command("foobar")
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
65
|
describe "#read_command" do
|
66
66
|
it "should return read string on successful run" do
|
67
|
-
@serial_port.
|
68
|
-
@generic_serial_port.read_command.
|
67
|
+
allow(@serial_port).to receive(:readline).and_return("a return string")
|
68
|
+
expect(@generic_serial_port.read_command).to eq "a return string"
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should set the serial port read timeout to given value" do
|
72
|
-
@serial_port.
|
73
|
-
@serial_port.
|
72
|
+
allow(@serial_port).to receive(:readline)
|
73
|
+
expect(@serial_port).to receive(:read_timeout=).with(12000)
|
74
74
|
@generic_serial_port.read_command(12)
|
75
75
|
end
|
76
76
|
|
77
77
|
it "should call handle_error if error_response?(response) is true" do
|
78
|
-
@serial_port.
|
79
|
-
@generic_serial_port.
|
80
|
-
@generic_serial_port.
|
78
|
+
allow(@serial_port).to receive(:readline)
|
79
|
+
allow(@generic_serial_port).to receive(:error_response?).and_return(true)
|
80
|
+
expect(@generic_serial_port).to receive(:handle_error)
|
81
81
|
@generic_serial_port.read_command
|
82
82
|
end
|
83
83
|
|
84
84
|
it "should rescue EOFError and return nil" do
|
85
|
-
@serial_port.
|
86
|
-
@generic_serial_port.read_command.
|
85
|
+
allow(@serial_port).to receive(:readline) { raise EOFError }
|
86
|
+
expect(@generic_serial_port.read_command).to be nil
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should rescue EOFError and log warn message" do
|
90
|
-
@serial_port.
|
91
|
-
@generic_serial_port.
|
90
|
+
allow(@serial_port).to receive(:readline) { raise EOFError }
|
91
|
+
expect(@generic_serial_port).to receive(:log).with("Read EOFError", :warn)
|
92
92
|
@generic_serial_port.read_command
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should retry after rescuing from an Errno::EIO" do
|
96
|
-
@generic_serial_port.
|
96
|
+
expect(@generic_serial_port).to receive(:disconnect)
|
97
97
|
|
98
98
|
retries = 0
|
99
|
-
@serial_port.
|
99
|
+
allow(@serial_port).to receive(:readline) do
|
100
100
|
if retries < HackyHAL::DeviceControllers::GenericSerialPort::MAX_READ_WRITE_RETRIES
|
101
101
|
retries += 1
|
102
102
|
raise Errno::EIO
|
@@ -105,12 +105,12 @@ describe HackyHAL::DeviceControllers::GenericSerialPort do
|
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
-
@generic_serial_port.read_command.
|
108
|
+
expect(@generic_serial_port.read_command).to eq "a return string"
|
109
109
|
end
|
110
110
|
|
111
111
|
it "should raise Errno::EIO if retry failed" do
|
112
|
-
@serial_port.
|
113
|
-
@serial_port.
|
112
|
+
allow(@serial_port).to receive(:readline) { raise Errno::EIO }
|
113
|
+
allow(@serial_port).to receive(:close)
|
114
114
|
|
115
115
|
expect {
|
116
116
|
@generic_serial_port.read_command
|
@@ -118,8 +118,8 @@ describe HackyHAL::DeviceControllers::GenericSerialPort do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
it "should log debug message" do
|
121
|
-
@serial_port.
|
122
|
-
@generic_serial_port.
|
121
|
+
allow(@serial_port).to receive(:readline).and_return("response")
|
122
|
+
expect(@generic_serial_port).to receive(:log).with("Read: \"response\"", :debug)
|
123
123
|
@generic_serial_port.read_command
|
124
124
|
end
|
125
125
|
end
|
@@ -127,41 +127,41 @@ describe HackyHAL::DeviceControllers::GenericSerialPort do
|
|
127
127
|
describe "#disconnect" do
|
128
128
|
it "should close serial port if serial port is set" do
|
129
129
|
@generic_serial_port.serial_port # make sure serial port is set
|
130
|
-
@serial_port.
|
130
|
+
expect(@serial_port).to receive(:close)
|
131
131
|
@generic_serial_port.disconnect
|
132
132
|
end
|
133
133
|
|
134
134
|
it "should not attempt to close serial port if serial port is not set" do
|
135
|
-
@generic_serial_port.
|
135
|
+
allow(@generic_serial_port).to receive(:serial_port).and_return(nil)
|
136
136
|
@generic_serial_port.disconnect
|
137
137
|
end
|
138
138
|
|
139
139
|
it "should set serial_port to nil" do
|
140
140
|
@generic_serial_port.serial_port # make sure serial port is set
|
141
|
-
@serial_port.
|
141
|
+
expect(@serial_port).to receive(:close)
|
142
142
|
@generic_serial_port.disconnect
|
143
|
-
SerialPort.
|
143
|
+
expect(SerialPort).to receive(:new)
|
144
144
|
@generic_serial_port.serial_port
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
148
|
describe "#serial_port" do
|
149
149
|
it "should create new SerialPort" do
|
150
|
-
SerialPort.
|
151
|
-
@generic_serial_port.
|
150
|
+
expect(SerialPort).to receive(:new).with(@serial_device_path).and_return(@serial_port)
|
151
|
+
allow(@generic_serial_port).to receive(:serial_options).and_return(
|
152
152
|
baud_rate: 50,
|
153
153
|
data_bits: 5,
|
154
154
|
stop_bits: 2,
|
155
155
|
parity: SerialPort::EVEN,
|
156
156
|
flow_control: SerialPort::HARD
|
157
157
|
)
|
158
|
-
@serial_port.
|
159
|
-
@serial_port.
|
160
|
-
@serial_port.
|
161
|
-
@serial_port.
|
162
|
-
@serial_port.
|
158
|
+
expect(@serial_port).to receive(:baud=).with(50)
|
159
|
+
expect(@serial_port).to receive(:data_bits=).with(5)
|
160
|
+
expect(@serial_port).to receive(:stop_bits=).with(2)
|
161
|
+
expect(@serial_port).to receive(:parity=).with(SerialPort::EVEN)
|
162
|
+
expect(@serial_port).to receive(:flow_control=).with(SerialPort::HARD)
|
163
163
|
|
164
|
-
@generic_serial_port.serial_port.
|
164
|
+
expect(@generic_serial_port.serial_port).to eq @serial_port
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
@@ -22,60 +22,60 @@ describe HackyHAL::DeviceControllers::GenericSsh do
|
|
22
22
|
)
|
23
23
|
|
24
24
|
@ssh = double("ssh connection")
|
25
|
-
@ssh.
|
26
|
-
@ssh.
|
27
|
-
@ssh.
|
28
|
-
Net::SSH.
|
25
|
+
allow(@ssh).to receive(:exec!).and_yield(nil, nil, "dummy output")
|
26
|
+
allow(@ssh).to receive(:close)
|
27
|
+
allow(@ssh).to receive(:closed?).and_return(false)
|
28
|
+
allow(Net::SSH).to receive(:start).and_return(@ssh)
|
29
29
|
end
|
30
30
|
|
31
31
|
describe "#exec" do
|
32
32
|
it "should pass command to ssh.exec!" do
|
33
|
-
@ssh.
|
33
|
+
expect(@ssh).to receive(:exec!).with("dummy_command")
|
34
34
|
@generic_ssh.exec("dummy_command")
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should connect if not connected" do
|
38
|
-
@generic_ssh.
|
39
|
-
@generic_ssh.
|
40
|
-
@generic_ssh.
|
41
|
-
@generic_ssh.
|
38
|
+
expect(@generic_ssh).to receive(:connected?).and_return(false)
|
39
|
+
expect(@generic_ssh).to receive(:connect)
|
40
|
+
allow(@generic_ssh).to receive(:ssh_exec)
|
41
|
+
allow(@generic_ssh).to receive(:disconnect)
|
42
42
|
@generic_ssh.exec("dummy_command")
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should not connect if already connected" do
|
46
|
-
@generic_ssh.
|
47
|
-
@generic_ssh.
|
48
|
-
@generic_ssh.
|
49
|
-
@generic_ssh.
|
46
|
+
expect(@generic_ssh).to receive(:connected?).and_return(true)
|
47
|
+
expect(@generic_ssh).not_to receive(:connect)
|
48
|
+
allow(@generic_ssh).to receive(:ssh_exec)
|
49
|
+
allow(@generic_ssh).to receive(:disconnect)
|
50
50
|
@generic_ssh.exec("dummy_command")
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should join output from ssh.exec!" do
|
54
|
-
@ssh.
|
55
|
-
@generic_ssh.exec("dummy_command").
|
54
|
+
allow(@ssh).to receive(:exec!).and_yield(nil, nil, "foo").and_yield(nil, nil, "bar")
|
55
|
+
expect(@generic_ssh.exec("dummy_command")).to eq "foobar"
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should log debug message" do
|
59
|
-
@generic_ssh.
|
60
|
-
@generic_ssh.
|
59
|
+
expect(@generic_ssh).to receive(:log).with("Command: \"dummy_command\"", :debug)
|
60
|
+
expect(@generic_ssh).to receive(:log).with("Output: \"dummy output\"", :debug)
|
61
61
|
@generic_ssh.exec("dummy_command")
|
62
62
|
end
|
63
63
|
|
64
64
|
describe "on command failure" do
|
65
65
|
before(:each) do
|
66
|
-
@generic_ssh.
|
66
|
+
allow(@generic_ssh).to receive(:ssh_exec).and_raise(EOFError.new("foo"))
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should log warn message" do
|
70
|
-
@generic_ssh.
|
71
|
-
@generic_ssh.
|
72
|
-
@generic_ssh.
|
70
|
+
expect(@generic_ssh).to receive(:log).with("Command: \"dummy_command\"", :debug).twice
|
71
|
+
expect(@generic_ssh).to receive(:log).with("Command failed: EOFError - foo", :warn).twice
|
72
|
+
expect(@generic_ssh).to receive(:log).with("Retrying last command", :warn).once
|
73
73
|
@generic_ssh.exec("dummy_command")
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should retry once after reconnecting" do
|
77
|
-
@generic_ssh.
|
78
|
-
@generic_ssh.
|
77
|
+
expect(@generic_ssh).to receive(:disconnect).twice
|
78
|
+
expect(@generic_ssh).to receive(:connect).twice
|
79
79
|
@generic_ssh.exec("dummy_command")
|
80
80
|
end
|
81
81
|
end
|
@@ -84,18 +84,18 @@ describe HackyHAL::DeviceControllers::GenericSsh do
|
|
84
84
|
describe "#connect" do
|
85
85
|
it "should disconnect if already connected" do
|
86
86
|
@generic_ssh.connect
|
87
|
-
@generic_ssh.
|
87
|
+
expect(@generic_ssh).to receive(:disconnect)
|
88
88
|
@generic_ssh.connect
|
89
89
|
end
|
90
90
|
|
91
91
|
it "should open a new Net:SSH connection" do
|
92
|
-
Net::SSH.
|
92
|
+
expect(Net::SSH).to receive(:start)
|
93
93
|
@generic_ssh.connect
|
94
94
|
end
|
95
95
|
|
96
96
|
it "should log warn message on error" do
|
97
|
-
Net::SSH.
|
98
|
-
@generic_ssh.
|
97
|
+
expect(Net::SSH).to receive(:start).and_raise(SocketError.new("dummy message"))
|
98
|
+
expect(@generic_ssh).to receive(:log).with("Failed to connect: SocketError - dummy message", :warn)
|
99
99
|
@generic_ssh.connect
|
100
100
|
end
|
101
101
|
end
|
@@ -103,38 +103,38 @@ describe HackyHAL::DeviceControllers::GenericSsh do
|
|
103
103
|
describe "disconnect" do
|
104
104
|
it "should close the ssh connection if connected" do
|
105
105
|
@generic_ssh.connect
|
106
|
-
@ssh.
|
107
|
-
@generic_ssh.disconnect.
|
106
|
+
expect(@ssh).to receive(:close)
|
107
|
+
expect(@generic_ssh.disconnect).to be nil
|
108
108
|
end
|
109
109
|
|
110
110
|
it "should not close the ssh connection if not connected" do
|
111
|
-
@generic_ssh.
|
112
|
-
@ssh.
|
113
|
-
@generic_ssh.disconnect.
|
111
|
+
expect(@generic_ssh).to receive(:connected?).and_return(false)
|
112
|
+
expect(@ssh).not_to receive(:close)
|
113
|
+
expect(@generic_ssh.disconnect).to be nil
|
114
114
|
end
|
115
115
|
|
116
116
|
it "should return nil on Net::SSH::Disconnect" do
|
117
117
|
@generic_ssh.connect
|
118
|
-
@ssh.
|
119
|
-
@generic_ssh.disconnect.
|
118
|
+
expect(@ssh).to receive(:close).and_raise(Net::SSH::Disconnect)
|
119
|
+
expect(@generic_ssh.disconnect).to be nil
|
120
120
|
end
|
121
121
|
|
122
122
|
it "should still disconnect on Net::SSH::Disconnect" do
|
123
123
|
@generic_ssh.connect
|
124
|
-
@ssh.
|
124
|
+
expect(@ssh).to receive(:close).and_raise(Net::SSH::Disconnect)
|
125
125
|
@generic_ssh.disconnect
|
126
|
-
@generic_ssh.connected
|
126
|
+
expect(@generic_ssh.connected?).to be false
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
130
|
describe "connect?" do
|
131
131
|
it "should return true if connected" do
|
132
132
|
@generic_ssh.connect
|
133
|
-
@generic_ssh.connected
|
133
|
+
expect(@generic_ssh.connected?).to be true
|
134
134
|
end
|
135
135
|
|
136
136
|
it "should return false if not connected" do
|
137
|
-
@generic_ssh.connected
|
137
|
+
expect(@generic_ssh.connected?).to be false
|
138
138
|
end
|
139
139
|
end
|
140
140
|
end
|
@@ -19,12 +19,12 @@ describe HackyHAL::DeviceControllers::Roku do
|
|
19
19
|
# FIXME: identical in YamahaAvReceiver spec
|
20
20
|
it "should resolve host through device resolver" do
|
21
21
|
resolved_uri = double("resolved URI")
|
22
|
-
resolved_uri.
|
23
|
-
resolved_uri.
|
22
|
+
allow(resolved_uri).to receive(:path=)
|
23
|
+
allow(resolved_uri).to receive(:port=)
|
24
24
|
device_resolver = double("device resolver")
|
25
|
-
device_resolver.
|
26
|
-
HackyHAL::DeviceResolvers::Dummy.
|
27
|
-
controller = described_class.new(device_resolver: {type:
|
28
|
-
controller.host_uri.
|
25
|
+
expect(device_resolver).to receive(:uri).and_return(resolved_uri)
|
26
|
+
expect(HackyHAL::DeviceResolvers::Dummy).to receive(:new).with(foo: 1).and_return(device_resolver)
|
27
|
+
controller = described_class.new(device_resolver: {type: "Dummy", foo: 1})
|
28
|
+
expect(controller.host_uri).to eq resolved_uri
|
29
29
|
end
|
30
30
|
end
|
@@ -18,12 +18,12 @@ describe HackyHAL::DeviceControllers::YamahaAvReceiver do
|
|
18
18
|
|
19
19
|
it "should resolve host through device resolver" do
|
20
20
|
resolved_uri = double("resolved URI")
|
21
|
-
resolved_uri.
|
22
|
-
resolved_uri.
|
21
|
+
allow(resolved_uri).to receive(:path=)
|
22
|
+
allow(resolved_uri).to receive(:port=)
|
23
23
|
device_resolver = double("device resolver")
|
24
|
-
device_resolver.
|
25
|
-
HackyHAL::DeviceResolvers::Dummy.
|
26
|
-
controller = described_class.new(device_resolver: {type:
|
27
|
-
controller.host_uri.
|
24
|
+
expect(device_resolver).to receive(:uri).and_return(resolved_uri)
|
25
|
+
expect(HackyHAL::DeviceResolvers::Dummy).to receive(:new).with(foo: 1).and_return(device_resolver)
|
26
|
+
controller = described_class.new(device_resolver: {type: "Dummy", foo: 1})
|
27
|
+
expect(controller.host_uri).to eq resolved_uri
|
28
28
|
end
|
29
29
|
end
|
@@ -11,7 +11,7 @@ describe HackyHAL::DeviceResolvers::SSDP do
|
|
11
11
|
|
12
12
|
it "should default to search for root devices" do
|
13
13
|
resolver = described_class.new(usn: "dummy-usn")
|
14
|
-
resolver.options[:search].
|
14
|
+
expect(resolver.options[:search]).to eq "upnp:rootdevice"
|
15
15
|
end
|
16
16
|
|
17
17
|
describe "instance" do
|
@@ -20,27 +20,27 @@ describe HackyHAL::DeviceResolvers::SSDP do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should return uri resolved via SSDP" do
|
23
|
-
UPnP::SSDP.
|
23
|
+
allow(UPnP::SSDP).to receive(:search).and_return([
|
24
24
|
{location: "http://resolved-host/path", usn: "dummy-usn"}
|
25
25
|
])
|
26
|
-
@resolver.uri.host.
|
26
|
+
expect(@resolver.uri.host).to eq "resolved-host"
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should raise SsdpUnresolvedDevice if no device found" do
|
30
|
-
UPnP::SSDP.
|
30
|
+
allow(UPnP::SSDP).to receive(:search).and_return([])
|
31
31
|
expect { @resolver.uri }.to raise_error(HackyHAL::DeviceResolvers::SsdpUnresolvedDevice)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should return the host of device with given USN" do
|
35
|
-
UPnP::SSDP.
|
35
|
+
allow(UPnP::SSDP).to receive(:search).and_return([
|
36
36
|
{location: "http://other-resolved-host/path", usn: "other-usn"},
|
37
37
|
{location: "http://resolved-host/path", usn: "dummy-usn"}
|
38
38
|
])
|
39
|
-
@resolver.uri.host.
|
39
|
+
expect(@resolver.uri.host).to eq "resolved-host"
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should raise SsdpUnresolvedDevice if device with request USN not found" do
|
43
|
-
UPnP::SSDP.
|
43
|
+
allow(UPnP::SSDP).to receive(:search).and_return([
|
44
44
|
{location: "http://other-resolved-host/path", usn: "other-usn"}
|
45
45
|
])
|
46
46
|
expect { @resolver.uri }.to raise_error(HackyHAL::DeviceResolvers::SsdpUnresolvedDevice)
|
@@ -11,6 +11,6 @@ describe HackyHAL::DeviceResolvers::StaticURI do
|
|
11
11
|
|
12
12
|
it "should return static host" do
|
13
13
|
resolver = described_class.new(uri: "http://device-host.local")
|
14
|
-
resolver.uri.host.
|
14
|
+
expect(resolver.uri.host).to eq "device-host.local"
|
15
15
|
end
|
16
16
|
end
|
data/spec/hacky_hal/log_spec.rb
CHANGED
@@ -12,14 +12,14 @@ describe HackyHAL::Log do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should use custom formatter" do
|
15
|
-
described_class.instance.formatter.
|
16
|
-
described_class.instance.formatter.
|
15
|
+
expect(described_class.instance.formatter).to be_a(described_class::Formatter)
|
16
|
+
expect(described_class.instance.formatter).to receive(:call)
|
17
17
|
described_class.instance.info("foo")
|
18
18
|
end
|
19
19
|
|
20
20
|
describe "#write" do
|
21
21
|
it "should alias to self.<<" do
|
22
|
-
described_class.instance.
|
22
|
+
expect(described_class.instance).to receive(:<<).with("foo")
|
23
23
|
described_class.instance.write("foo")
|
24
24
|
end
|
25
25
|
end
|
@@ -9,14 +9,14 @@ describe HackyHAL::Options do
|
|
9
9
|
describe "#initialize" do
|
10
10
|
it "should set options" do
|
11
11
|
object = DummyClass.new(dummy_argument: "dummy value")
|
12
|
-
object.options.
|
12
|
+
expect(object.options).to eq({dummy_argument: "dummy value"})
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "#[]" do
|
17
17
|
it "should return option values" do
|
18
18
|
object = DummyClass.new(dummy_argument: "dummy value")
|
19
|
-
object[:dummy_argument].
|
19
|
+
expect(object[:dummy_argument]).to eq "dummy value"
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -10,21 +10,22 @@ describe HackyHAL::Registry do
|
|
10
10
|
"foo" => "bar"
|
11
11
|
}
|
12
12
|
}
|
13
|
-
|
14
|
-
|
13
|
+
|
14
|
+
allow(File).to receive(:read)
|
15
|
+
allow(YAML).to receive(:load).and_return(@device_config)
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should load and initialize device controllers into registry" do
|
18
19
|
described_class.instance.load_yaml_file("foo.yml")
|
19
20
|
devices = described_class.instance.devices
|
20
|
-
devices.length.
|
21
|
-
devices[:foo_device].
|
21
|
+
expect(devices.length).to eq 1
|
22
|
+
expect(devices[:foo_device]).to be_instance_of(HackyHAL::DeviceControllers::Base)
|
22
23
|
end
|
23
24
|
|
24
25
|
it "should convert keys to symbols" do
|
25
26
|
described_class.instance.load_yaml_file("foo.yml")
|
26
27
|
devices = described_class.instance.devices
|
27
|
-
devices[:foo_device][:foo].
|
28
|
+
expect(devices[:foo_device][:foo]).to eq "bar"
|
28
29
|
end
|
29
30
|
end
|
30
31
|
end
|
data/spec/hacky_hal/util_spec.rb
CHANGED
@@ -14,14 +14,14 @@ describe HackyHAL::Util do
|
|
14
14
|
|
15
15
|
it "should return instance of built class" do
|
16
16
|
dummy_instance = double("dummy instance")
|
17
|
-
DummyModule::DummyClass.
|
18
|
-
described_class.object_from_hash({type:
|
17
|
+
expect(DummyModule::DummyClass).to receive(:new).with(foo: 1).and_return(dummy_instance)
|
18
|
+
expect(described_class.object_from_hash({type: "DummyClass", foo: 1}, DummyModule)).to eq dummy_instance
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
describe ".symbolize_keys_deep" do
|
23
23
|
it "should symbolize hash keys" do
|
24
|
-
described_class.symbolize_keys_deep("a" => 1, :b => {"c" => 2}).
|
24
|
+
expect(described_class.symbolize_keys_deep("a" => 1, :b => {"c" => 2})).to eq({a: 1, b: {c: 2}})
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: hacky_hal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Nick Ewing
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: upnp-nickewing
|