mqtt 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
1
  module MQTT
2
2
  # The version number of the MQTT gem
3
- VERSION = "0.3.1"
3
+ VERSION = "0.4.0"
4
4
  end
@@ -168,6 +168,14 @@ describe MQTT::Client do
168
168
  end
169
169
  end
170
170
 
171
+ describe "setting a client certificate directly" do
172
+ it "should add a certificate to the SSL context" do
173
+ expect(client.ssl_context.cert).to be_nil
174
+ client.cert = File.read(fixture_path('client.pem'))
175
+ expect(client.ssl_context.cert).to be_a(OpenSSL::X509::Certificate)
176
+ end
177
+ end
178
+
171
179
  describe "setting a client private key file path" do
172
180
  it "should add a certificate to the SSL context" do
173
181
  expect(client.ssl_context.key).to be_nil
@@ -176,6 +184,34 @@ describe MQTT::Client do
176
184
  end
177
185
  end
178
186
 
187
+ describe "setting a client private key directly" do
188
+ it "should add a certificate to the SSL context" do
189
+ expect(client.ssl_context.key).to be_nil
190
+ client.key = File.read(fixture_path('client.key'))
191
+ expect(client.ssl_context.key).to be_a(OpenSSL::PKey::RSA)
192
+ end
193
+ end
194
+
195
+ describe "setting an encrypted client private key, w/the correct passphrase" do
196
+ let(:key_pass) { 'mqtt' }
197
+
198
+ it "should add the decrypted certificate to the SSL context" do
199
+ expect(client.ssl_context.key).to be_nil
200
+ client.key_file = [fixture_path('client.pass.key'), key_pass]
201
+ expect(client.ssl_context.key).to be_a(OpenSSL::PKey::RSA)
202
+ end
203
+ end
204
+
205
+ describe "setting an encrypted client private key, w/an incorrect passphrase" do
206
+ let(:key_pass) { 'ttqm' }
207
+
208
+ it "should raise an OpenSSL::PKey::RSAError exception" do
209
+ expect(client.ssl_context.key).to be_nil
210
+ expect { client.key_file = [fixture_path('client.pass.key'), key_pass] }.to(
211
+ raise_error(OpenSSL::PKey::RSAError, /Neither PUB key nor PRIV key/))
212
+ end
213
+ end
214
+
179
215
  describe "setting a Certificate Authority file path" do
180
216
  it "should add a CA file path to the SSL context" do
181
217
  expect(client.ssl_context.ca_file).to be_nil
@@ -253,7 +289,7 @@ describe MQTT::Client do
253
289
  client.connect('myclient')
254
290
  end
255
291
 
256
- it "should throw an exception if no host is configured" do
292
+ it "should raise an exception if no host is configured" do
257
293
  expect {
258
294
  client = MQTT::Client.new
259
295
  client.connect
@@ -262,9 +298,19 @@ describe MQTT::Client do
262
298
  )
263
299
  end
264
300
 
265
- it "should disconnect after connecting, if a block is given" do
266
- expect(client).to receive(:disconnect).once
267
- client.connect('myclient') { nil }
301
+ context "if a block is given" do
302
+ it "should disconnect after connecting" do
303
+ expect(client).to receive(:disconnect).once
304
+ client.connect('myclient') { nil }
305
+ end
306
+
307
+ it "should disconnect even if the block raises an exception" do
308
+ expect(client).to receive(:disconnect).once
309
+ begin
310
+ client.connect('myclient') { raise StandardError }
311
+ rescue StandardError
312
+ end
313
+ end
268
314
  end
269
315
 
270
316
  it "should not disconnect after connecting, if no block is given" do
@@ -287,7 +333,7 @@ describe MQTT::Client do
287
333
  end
288
334
 
289
335
  context "no client id is given" do
290
- it "should throw an exception if the clean session flag is false" do
336
+ it "should raise an exception if the clean session flag is false" do
291
337
  expect {
292
338
  client.client_id = nil
293
339
  client.clean_session = false
@@ -376,7 +422,7 @@ describe MQTT::Client do
376
422
  expect(client.will_retain).to be_falsey
377
423
  end
378
424
 
379
- it "should have set the Will's retain QOS value to 1" do
425
+ it "should have set the Will's retain QoS value to 1" do
380
426
  expect(client.will_qos).to eq(1)
381
427
  end
382
428
 
@@ -423,37 +469,37 @@ describe MQTT::Client do
423
469
  allow(IO).to receive(:select).and_return([[socket], [], []])
424
470
  end
425
471
 
426
- it "should not throw an exception for a successful CONNACK packet" do
472
+ it "should not raise an exception for a successful CONNACK packet" do
427
473
  socket.write("\x20\x02\x00\x00")
428
474
  socket.rewind
429
475
  expect { client.send(:receive_connack) }.not_to raise_error
430
476
  end
431
477
 
432
- it "should throw an exception if the packet type isn't CONNACK" do
478
+ it "should raise an exception if the packet type isn't CONNACK" do
433
479
  socket.write("\xD0\x00")
434
480
  socket.rewind
435
481
  expect { client.send(:receive_connack) }.to raise_error(MQTT::ProtocolException)
436
482
  end
437
483
 
438
- it "should throw an exception if the CONNACK packet return code is 'unacceptable protocol version'" do
484
+ it "should raise an exception if the CONNACK packet return code is 'unacceptable protocol version'" do
439
485
  socket.write("\x20\x02\x00\x01")
440
486
  socket.rewind
441
487
  expect { client.send(:receive_connack) }.to raise_error(MQTT::ProtocolException, /unacceptable protocol version/i)
442
488
  end
443
489
 
444
- it "should throw an exception if the CONNACK packet return code is 'client identifier rejected'" do
490
+ it "should raise an exception if the CONNACK packet return code is 'client identifier rejected'" do
445
491
  socket.write("\x20\x02\x00\x02")
446
492
  socket.rewind
447
493
  expect { client.send(:receive_connack) }.to raise_error(MQTT::ProtocolException, /client identifier rejected/i)
448
494
  end
449
495
 
450
- it "should throw an exception if the CONNACK packet return code is 'server unavailable'" do
496
+ it "should raise an exception if the CONNACK packet return code is 'server unavailable'" do
451
497
  socket.write("\x20\x02\x00\x03")
452
498
  socket.rewind
453
499
  expect { client.send(:receive_connack) }.to raise_error(MQTT::ProtocolException, /server unavailable/i)
454
500
  end
455
501
 
456
- it "should throw an exception if the CONNACK packet return code is an unknown" do
502
+ it "should raise an exception if the CONNACK packet return code is an unknown" do
457
503
  socket.write("\x20\x02\x00\xAA")
458
504
  socket.rewind
459
505
  expect { client.send(:receive_connack) }.to raise_error(MQTT::ProtocolException, /connection refused/i)
@@ -491,23 +537,6 @@ describe MQTT::Client do
491
537
  end
492
538
  end
493
539
 
494
- describe "when calling the 'ping' method" do
495
- before(:each) do
496
- client.instance_variable_set('@socket', socket)
497
- end
498
-
499
- it "should write a valid PINGREQ packet to the socket" do
500
- client.ping
501
- expect(socket.string).to eq("\xC0\x00")
502
- end
503
-
504
- it "should update the time a ping was last sent" do
505
- client.instance_variable_set('@last_pingreq', 0)
506
- client.ping
507
- expect(client.instance_variable_get('@last_pingreq')).not_to eq(0)
508
- end
509
- end
510
-
511
540
  describe "when calling the 'publish' method" do
512
541
  before(:each) do
513
542
  client.instance_variable_set('@socket', socket)
@@ -523,12 +552,14 @@ describe MQTT::Client do
523
552
  expect(socket.string).to eq("\x31\x0e\x00\x05topicpayload")
524
553
  end
525
554
 
526
- it "should write a valid PUBLISH packet to the socket with the QOS set to 1" do
555
+ it "should write a valid PUBLISH packet to the socket with the QoS set to 1" do
556
+ inject_puback(1)
527
557
  client.publish('topic','payload', false, 1)
528
558
  expect(socket.string).to eq("\x32\x10\x00\x05topic\x00\x01payload")
529
559
  end
530
560
 
531
- it "should write a valid PUBLISH packet to the socket with the QOS set to 2" do
561
+ it "should write a valid PUBLISH packet to the socket with the QoS set to 2" do
562
+ inject_puback(1)
532
563
  client.publish('topic','payload', false, 2)
533
564
  expect(socket.string).to eq("\x34\x10\x00\x05topic\x00\x01payload")
534
565
  end
@@ -538,7 +569,12 @@ describe MQTT::Client do
538
569
  expect(socket.string).to eq("\x30\x06\x00\x04test")
539
570
  end
540
571
 
541
- it "should throw an ArgumentError exception, if the topic is nil" do
572
+ it "should write a valid PUBLISH packet with frozen payload" do
573
+ client.publish('topic', 'payload'.freeze, false, 0)
574
+ expect(socket.string).to eq("\x30\x0e\x00\x05topicpayload")
575
+ end
576
+
577
+ it "should raise an ArgumentError exception, if the topic is nil" do
542
578
  expect {
543
579
  client.publish(nil)
544
580
  }.to raise_error(
@@ -547,7 +583,7 @@ describe MQTT::Client do
547
583
  )
548
584
  end
549
585
 
550
- it "should throw an ArgumentError exception, if the topic is empty" do
586
+ it "should raise an ArgumentError exception, if the topic is empty" do
551
587
  expect {
552
588
  client.publish("")
553
589
  }.to raise_error(
@@ -555,6 +591,16 @@ describe MQTT::Client do
555
591
  'Topic name cannot be empty'
556
592
  )
557
593
  end
594
+
595
+ it "correctly assigns consecutive ids to packets with QoS 1" do
596
+ inject_puback(1)
597
+ inject_puback(2)
598
+
599
+ expect(client).to receive(:send_packet) { |packet| expect(packet.id).to eq(1) }
600
+ client.publish "topic", "message", false, 1
601
+ expect(client).to receive(:send_packet) { |packet| expect(packet.id).to eq(2) }
602
+ client.publish "topic", "message", false, 1
603
+ end
558
604
  end
559
605
 
560
606
  describe "when calling the 'subscribe' method" do
@@ -616,14 +662,14 @@ describe MQTT::Client do
616
662
  client.instance_variable_set('@socket', socket)
617
663
  end
618
664
 
619
- it "should successfull receive a valid PUBLISH packet with a QoS 0" do
665
+ it "should successfully receive a valid PUBLISH packet with a QoS 0" do
620
666
  inject_packet(:topic => 'topic0', :payload => 'payload0', :qos => 0)
621
667
  topic,payload = client.get
622
668
  expect(topic).to eq('topic0')
623
669
  expect(payload).to eq('payload0')
624
670
  end
625
671
 
626
- it "should successfull receive a valid PUBLISH packet with a QoS 1" do
672
+ it "should successfully receive a valid PUBLISH packet with a QoS 1" do
627
673
  inject_packet(:topic => 'topic1', :payload => 'payload1', :qos => 1)
628
674
  topic,payload = client.get
629
675
  expect(topic).to eq('topic1')
@@ -631,8 +677,20 @@ describe MQTT::Client do
631
677
  expect(client.queue_empty?).to be_truthy
632
678
  end
633
679
 
680
+ it "acks calling #get_packet and qos=1" do
681
+ inject_packet(:topic => 'topic1', :payload => 'payload1', :qos => 1)
682
+ expect(client).to receive(:send_packet).with(an_instance_of(MQTT::Packet::Puback))
683
+ client.get_packet
684
+ end
685
+
686
+ it "acks calling #get and qos=1" do
687
+ inject_packet(:topic => 'topic1', :payload => 'payload1', :qos => 1)
688
+ expect(client).to receive(:send_packet).with(an_instance_of(MQTT::Packet::Puback))
689
+ client.get
690
+ end
691
+
634
692
  context "with a block" do
635
- it "should successfull receive a more than 1 message" do
693
+ it "should successfully receive more than 1 message" do
636
694
  inject_packet(:topic => 'topic0', :payload => 'payload0')
637
695
  inject_packet(:topic => 'topic1', :payload => 'payload1')
638
696
  payloads = []
@@ -643,6 +701,17 @@ describe MQTT::Client do
643
701
  expect(payloads.size).to eq(2)
644
702
  expect(payloads).to eq(['payload0', 'payload1'])
645
703
  end
704
+
705
+ it "acks when qos > 1 after running the block" do
706
+ inject_packet(:topic => 'topic1', :payload => 'payload1', :qos => 1)
707
+ inject_packet(:topic => 'topic2', :payload => 'payload1')
708
+ expect(client).to receive(:send_packet).with(an_instance_of(MQTT::Packet::Puback))
709
+ payloads = []
710
+ client.get do |topic,payload|
711
+ payloads << payload
712
+ break if payloads.size > 1
713
+ end
714
+ end
646
715
  end
647
716
  end
648
717
 
@@ -651,7 +720,7 @@ describe MQTT::Client do
651
720
  client.instance_variable_set('@socket', socket)
652
721
  end
653
722
 
654
- it "should successfull receive a valid PUBLISH packet with a QoS 0" do
723
+ it "should successfully receive a valid PUBLISH packet with a QoS 0" do
655
724
  inject_packet(:topic => 'topic0', :payload => 'payload0', :qos => 0)
656
725
  packet = client.get_packet
657
726
  expect(packet.class).to eq(MQTT::Packet::Publish)
@@ -660,7 +729,7 @@ describe MQTT::Client do
660
729
  expect(packet.payload).to eq('payload0')
661
730
  end
662
731
 
663
- it "should successfull receive a valid PUBLISH packet with a QoS 1" do
732
+ it "should successfully receive a valid PUBLISH packet with a QoS 1" do
664
733
  inject_packet(:topic => 'topic1', :payload => 'payload1', :qos => 1)
665
734
  packet = client.get_packet
666
735
  expect(packet.class).to eq(MQTT::Packet::Publish)
@@ -671,7 +740,7 @@ describe MQTT::Client do
671
740
  end
672
741
 
673
742
  context "with a block" do
674
- it "should successfull receive a more than 1 packet" do
743
+ it "should successfully receive more than 1 packet" do
675
744
  inject_packet(:topic => 'topic0', :payload => 'payload0')
676
745
  inject_packet(:topic => 'topic1', :payload => 'payload1')
677
746
  packets = []
@@ -729,10 +798,15 @@ describe MQTT::Client do
729
798
  expect(@read_queue.size).to eq(0)
730
799
  end
731
800
 
732
- it "should send a ping packet if one is due" do
733
- expect(IO).to receive(:select).and_return(nil)
734
- client.instance_variable_set('@last_pingreq', Time.at(0))
735
- expect(client).to receive(:ping).once
801
+ it "should close the socket if there is an exception" do
802
+ expect(socket).to receive(:close).once
803
+ allow(MQTT::Packet).to receive(:read).and_raise(MQTT::Exception)
804
+ client.send(:receive_packet)
805
+ end
806
+
807
+ it "should pass exceptions up to parent thread" do
808
+ expect(@parent_thread).to receive(:raise).once
809
+ allow(MQTT::Packet).to receive(:read).and_raise(MQTT::Exception)
736
810
  client.send(:receive_packet)
737
811
  end
738
812
 
@@ -742,17 +816,34 @@ describe MQTT::Client do
742
816
  client.send :receive_packet
743
817
  expect(client.last_ping_response).to be_within(1).of Time.now
744
818
  end
819
+ end
820
+
821
+ describe "when calling the 'keep_alive!' method" do
822
+ before(:each) do
823
+ client.instance_variable_set('@socket', socket)
824
+ end
745
825
 
746
- it "should close the socket if there is an exception" do
747
- expect(socket).to receive(:close).once
748
- allow(MQTT::Packet).to receive(:read).and_raise(MQTT::Exception)
749
- client.send(:receive_packet)
826
+ it "should send a ping packet if one is due" do
827
+ client.instance_variable_set('@last_ping_request', Time.at(0))
828
+ client.send('keep_alive!')
829
+ expect(socket.string).to eq("\xC0\x00")
750
830
  end
751
831
 
752
- it "should pass exceptions up to parent thread" do
753
- expect(@parent_thread).to receive(:raise).once
754
- allow(MQTT::Packet).to receive(:read).and_raise(MQTT::Exception)
755
- client.send(:receive_packet)
832
+ it "should update the time a ping was last sent" do
833
+ client.instance_variable_set('@last_ping_request', Time.at(0))
834
+ client.send('keep_alive!')
835
+ expect(client.instance_variable_get('@last_ping_request')).not_to eq(0)
836
+ end
837
+
838
+ it "should raise an exception if no ping response has been received" do
839
+ client.instance_variable_set('@last_ping_request', Time.now)
840
+ client.instance_variable_set('@last_ping_response', Time.at(0))
841
+ expect {
842
+ client.send('keep_alive!')
843
+ }.to raise_error(
844
+ MQTT::ProtocolException,
845
+ /No Ping Response received for \d+ seconds/
846
+ )
756
847
  end
757
848
  end
758
849
 
@@ -797,4 +888,9 @@ describe MQTT::Client do
797
888
  client.instance_variable_get('@read_queue').push(packet)
798
889
  end
799
890
 
891
+ def inject_puback(packet_id)
892
+ packet = MQTT::Packet::Puback.new(:id => packet_id)
893
+ client.instance_variable_get('@pubacks')[packet_id] = packet
894
+ end
895
+
800
896
  end
@@ -4,7 +4,6 @@
4
4
  $:.unshift(File.dirname(__FILE__))
5
5
 
6
6
  require 'spec_helper'
7
- require 'mqtt'
8
7
 
9
8
  describe MQTT::Packet do
10
9
 
@@ -96,7 +95,7 @@ end
96
95
 
97
96
  describe MQTT::Packet::Publish do
98
97
  describe "when creating a packet" do
99
- it "should allow you to set the packet QOS level as a hash parameter" do
98
+ it "should allow you to set the packet QoS level as a hash parameter" do
100
99
  packet = MQTT::Packet::Publish.new( :qos => 2 )
101
100
  expect(packet.qos).to eq(2)
102
101
  end
@@ -106,7 +105,7 @@ describe MQTT::Packet::Publish do
106
105
  expect(packet.retain).to be_truthy
107
106
  end
108
107
 
109
- it "should throw an exception the QoS is greater than 2" do
108
+ it "should raise an exception the QoS is greater than 2" do
110
109
  expect {
111
110
  packet = MQTT::Packet::Publish.new( :qos => 3 )
112
111
  }.to raise_error(
@@ -114,7 +113,7 @@ describe MQTT::Packet::Publish do
114
113
  )
115
114
  end
116
115
 
117
- it "should throw an exception the QoS is less than 0" do
116
+ it "should raise an exception the QoS is less than 0" do
118
117
  expect {
119
118
  packet = MQTT::Packet::Publish.new( :qos => -1 )
120
119
  }.to raise_error(
@@ -159,22 +158,22 @@ describe MQTT::Packet::Publish do
159
158
  end
160
159
 
161
160
  describe "when serialising a packet" do
162
- it "should output the correct bytes for a packet with default QOS and no flags" do
161
+ it "should output the correct bytes for a packet with default QoS and no flags" do
163
162
  packet = MQTT::Packet::Publish.new( :topic => 'test', :payload => 'hello world' )
164
163
  expect(packet.to_s).to eq("\x30\x11\x00\x04testhello world")
165
164
  end
166
165
 
167
- it "should output the correct bytes for a packet with QOS 1 and no flags" do
166
+ it "should output the correct bytes for a packet with QoS 1 and no flags" do
168
167
  packet = MQTT::Packet::Publish.new( :id => 5, :qos => 1, :topic => 'a/b', :payload => 'hello world' )
169
168
  expect(packet.to_s).to eq("\x32\x12\x00\x03a/b\x00\x05hello world")
170
169
  end
171
170
 
172
- it "should output the correct bytes for a packet with QOS 2 and retain flag set" do
171
+ it "should output the correct bytes for a packet with QoS 2 and retain flag set" do
173
172
  packet = MQTT::Packet::Publish.new( :id => 5, :qos => 2, :retain => true, :topic => 'c/d', :payload => 'hello world' )
174
173
  expect(packet.to_s).to eq("\x35\x12\x00\x03c/d\x00\x05hello world")
175
174
  end
176
175
 
177
- it "should output the correct bytes for a packet with QOS 2 and dup flag set" do
176
+ it "should output the correct bytes for a packet with QoS 2 and dup flag set" do
178
177
  packet = MQTT::Packet::Publish.new( :id => 5, :qos => 2, :duplicate => true, :topic => 'c/d', :payload => 'hello world' )
179
178
  expect(packet.to_s).to eq("\x3C\x12\x00\x03c/d\x00\x05hello world")
180
179
  end
@@ -194,7 +193,7 @@ describe MQTT::Packet::Publish do
194
193
  expect(packet.to_s).to eq("\x30\x0c\x00\x06symbol1234")
195
194
  end
196
195
 
197
- it "should throw an exception when there is no topic name" do
196
+ it "should raise an exception when there is no topic name" do
198
197
  expect {
199
198
  MQTT::Packet::Publish.new.to_s
200
199
  }.to raise_error(
@@ -202,7 +201,7 @@ describe MQTT::Packet::Publish do
202
201
  )
203
202
  end
204
203
 
205
- it "should throw an exception when there is an empty topic name" do
204
+ it "should raise an exception when there is an empty topic name" do
206
205
  expect {
207
206
  MQTT::Packet::Publish.new( :topic => '' ).to_s
208
207
  }.to raise_error(
@@ -212,7 +211,7 @@ describe MQTT::Packet::Publish do
212
211
  end
213
212
 
214
213
  describe "when serialising an oversized packet" do
215
- it "should throw an exception when body is bigger than 256MB" do
214
+ it "should raise an exception when body is bigger than 256MB" do
216
215
  expect {
217
216
  packet = MQTT::Packet::Publish.new( :topic => 'test', :payload => 'x'*268435455 )
218
217
  packet.to_s
@@ -222,14 +221,14 @@ describe MQTT::Packet::Publish do
222
221
  end
223
222
  end
224
223
 
225
- describe "when parsing a packet with QOS 0" do
224
+ describe "when parsing a packet with QoS 0" do
226
225
  let(:packet) { MQTT::Packet.parse( "\x30\x11\x00\x04testhello world" ) }
227
226
 
228
227
  it "should correctly create the right type of packet object" do
229
228
  expect(packet.class).to eq(MQTT::Packet::Publish)
230
229
  end
231
230
 
232
- it "should set the QOS level correctly" do
231
+ it "should set the QoS level correctly" do
233
232
  expect(packet.qos).to eq(0)
234
233
  end
235
234
 
@@ -252,14 +251,14 @@ describe MQTT::Packet::Publish do
252
251
  end
253
252
  end
254
253
 
255
- describe "when parsing a packet with QOS 2 and retain and dup flags set" do
254
+ describe "when parsing a packet with QoS 2 and retain and dup flags set" do
256
255
  let(:packet) { MQTT::Packet.parse( "\x3D\x12\x00\x03c/d\x00\x05hello world" ) }
257
256
 
258
257
  it "should correctly create the right type of packet object" do
259
258
  expect(packet.class).to eq(MQTT::Packet::Publish)
260
259
  end
261
260
 
262
- it "should set the QOS level correctly" do
261
+ it "should set the QoS level correctly" do
263
262
  expect(packet.qos).to eq(2)
264
263
  end
265
264
 
@@ -299,7 +298,7 @@ describe MQTT::Packet::Publish do
299
298
  end
300
299
 
301
300
  describe "when parsing a packet with a QoS value of 3" do
302
- it "should throw an exception" do
301
+ it "should raise an exception" do
303
302
  expect {
304
303
  packet = MQTT::Packet.parse( "\x36\x12\x00\x03a/b\x00\x05hello world" )
305
304
  }.to raise_error(
@@ -310,7 +309,7 @@ describe MQTT::Packet::Publish do
310
309
  end
311
310
 
312
311
  describe "when parsing a packet with QoS value of 0 and DUP set" do
313
- it "should throw an exception" do
312
+ it "should raise an exception" do
314
313
  expect {
315
314
  packet = MQTT::Packet.parse( "\x38\x10\x00\x03a/bhello world" )
316
315
  }.to raise_error(
@@ -412,7 +411,7 @@ describe MQTT::Packet::Publish do
412
411
  expect(packet.body_length).to eq(17)
413
412
  end
414
413
 
415
- it "should set the QOS level correctly" do
414
+ it "should set the QoS level correctly" do
416
415
  expect(packet.qos).to eq(0)
417
416
  end
418
417
 
@@ -469,7 +468,7 @@ describe MQTT::Packet::Connect do
469
468
  end
470
469
 
471
470
  context "protocol version 3.1.0" do
472
- it "should throw an exception when there is no client identifier" do
471
+ it "should raise an exception when there is no client identifier" do
473
472
  expect {
474
473
  MQTT::Packet::Connect.new(:version => '3.1.0', :client_id => '').to_s
475
474
  }.to raise_error(
@@ -477,7 +476,7 @@ describe MQTT::Packet::Connect do
477
476
  )
478
477
  end
479
478
 
480
- it "should throw an exception when the client identifier is too long" do
479
+ it "should raise an exception when the client identifier is too long" do
481
480
  expect {
482
481
  client_id = '0EB8D2FE7C254715B4467C5B2ECAD100'
483
482
  MQTT::Packet::Connect.new(:version => '3.1.0', :client_id => client_id).to_s
@@ -508,7 +507,7 @@ describe MQTT::Packet::Connect do
508
507
  end
509
508
  end
510
509
 
511
- it "should throw an exception if the keep alive value is less than 0" do
510
+ it "should raise an exception if the keep alive value is less than 0" do
512
511
  expect {
513
512
  MQTT::Packet::Connect.new(:client_id => 'test', :keep_alive => -2).to_s
514
513
  }.to raise_error(
@@ -583,7 +582,7 @@ describe MQTT::Packet::Connect do
583
582
  end
584
583
 
585
584
  context 'an invalid protocol version number' do
586
- it "should throw a protocol exception" do
585
+ it "should raise a protocol exception" do
587
586
  expect {
588
587
  packet = MQTT::Packet::Connect.new( :version => 'x.x.x', :client_id => 'myclient' )
589
588
  }.to raise_error(
@@ -744,7 +743,7 @@ describe MQTT::Packet::Connect do
744
743
  expect(packet.clean_session).to be_truthy
745
744
  end
746
745
 
747
- it "should set the QOS of the Will should be 1" do
746
+ it "should set the QoS of the Will should be 1" do
748
747
  expect(packet.will_qos).to eq(1)
749
748
  end
750
749
 
@@ -941,7 +940,7 @@ describe MQTT::Packet::Connect do
941
940
  end
942
941
 
943
942
  describe "when parsing packet with an unknown protocol name" do
944
- it "should throw a protocol exception" do
943
+ it "should raise a protocol exception" do
945
944
  expect {
946
945
  packet = MQTT::Packet.parse(
947
946
  "\x10\x16\x00\x06FooBar\x03\x00\x00\x0a\x00\x08myclient"
@@ -954,7 +953,7 @@ describe MQTT::Packet::Connect do
954
953
  end
955
954
 
956
955
  describe "when parsing packet with an unknown protocol level" do
957
- it "should throw a protocol exception" do
956
+ it "should raise a protocol exception" do
958
957
  expect {
959
958
  packet = MQTT::Packet.parse(
960
959
  "\x10\x16\x00\x06MQIsdp\x02\x00\x00\x0a\x00\x08myclient"
@@ -967,7 +966,7 @@ describe MQTT::Packet::Connect do
967
966
  end
968
967
 
969
968
  describe "when parsing packet with invalid fixed header flags" do
970
- it "should throw a protocol exception" do
969
+ it "should raise a protocol exception" do
971
970
  expect {
972
971
  MQTT::Packet.parse(
973
972
  "\x13\x16\x00\x06MQIsdp\x03\x00\x00\x0a\x00\x08myclient"
@@ -1199,7 +1198,7 @@ describe MQTT::Packet::Connack do
1199
1198
  end
1200
1199
 
1201
1200
  describe "when parsing packet with invalid Connack flags set" do
1202
- it "should throw an exception" do
1201
+ it "should raise an exception" do
1203
1202
  expect {
1204
1203
  packet = MQTT::Packet.parse( "\x20\x02\xff\x05" )
1205
1204
  }.to raise_error(
@@ -1210,7 +1209,7 @@ describe MQTT::Packet::Connack do
1210
1209
  end
1211
1210
 
1212
1211
  describe "when parsing packet with extra bytes on the end" do
1213
- it "should throw an exception" do
1212
+ it "should raise an exception" do
1214
1213
  expect {
1215
1214
  packet = MQTT::Packet.parse( "\x20\x03\x00\x00\x00" )
1216
1215
  }.to raise_error(
@@ -1221,7 +1220,7 @@ describe MQTT::Packet::Connack do
1221
1220
  end
1222
1221
 
1223
1222
  describe "when parsing packet with invalid fixed header flags" do
1224
- it "should throw a protocol exception" do
1223
+ it "should raise a protocol exception" do
1225
1224
  expect {
1226
1225
  MQTT::Packet.parse( "\x23\x02\x00\x00" )
1227
1226
  }.to raise_error(
@@ -1264,7 +1263,7 @@ describe MQTT::Packet::Puback do
1264
1263
  end
1265
1264
 
1266
1265
  describe "when parsing packet with extra bytes on the end" do
1267
- it "should throw an exception" do
1266
+ it "should raise an exception" do
1268
1267
  expect {
1269
1268
  packet = MQTT::Packet.parse( "\x40\x03\x12\x34\x00" )
1270
1269
  }.to raise_error(
@@ -1275,7 +1274,7 @@ describe MQTT::Packet::Puback do
1275
1274
  end
1276
1275
 
1277
1276
  describe "when parsing packet with invalid fixed header flags" do
1278
- it "should throw a protocol exception" do
1277
+ it "should raise a protocol exception" do
1279
1278
  expect {
1280
1279
  MQTT::Packet.parse( "\x43\x02\x12\x34" )
1281
1280
  }.to raise_error(
@@ -1312,7 +1311,7 @@ describe MQTT::Packet::Pubrec do
1312
1311
  end
1313
1312
 
1314
1313
  describe "when parsing packet with extra bytes on the end" do
1315
- it "should throw an exception" do
1314
+ it "should raise an exception" do
1316
1315
  expect {
1317
1316
  packet = MQTT::Packet.parse( "\x50\x03\x12\x34\x00" )
1318
1317
  }.to raise_error(
@@ -1323,7 +1322,7 @@ describe MQTT::Packet::Pubrec do
1323
1322
  end
1324
1323
 
1325
1324
  describe "when parsing packet with invalid fixed header flags" do
1326
- it "should throw a protocol exception" do
1325
+ it "should raise a protocol exception" do
1327
1326
  expect {
1328
1327
  MQTT::Packet.parse( "\x53\x02\x12\x34" )
1329
1328
  }.to raise_error(
@@ -1360,7 +1359,7 @@ describe MQTT::Packet::Pubrel do
1360
1359
  end
1361
1360
 
1362
1361
  describe "when parsing packet with extra bytes on the end" do
1363
- it "should throw an exception" do
1362
+ it "should raise an exception" do
1364
1363
  expect {
1365
1364
  packet = MQTT::Packet.parse( "\x62\x03\x12\x34\x00" )
1366
1365
  }.to raise_error(
@@ -1371,7 +1370,7 @@ describe MQTT::Packet::Pubrel do
1371
1370
  end
1372
1371
 
1373
1372
  describe "when parsing packet with invalid fixed header flags" do
1374
- it "should throw a protocol exception" do
1373
+ it "should raise a protocol exception" do
1375
1374
  expect {
1376
1375
  MQTT::Packet.parse( "\x60\x02\x12\x34" )
1377
1376
  }.to raise_error(
@@ -1408,7 +1407,7 @@ describe MQTT::Packet::Pubcomp do
1408
1407
  end
1409
1408
 
1410
1409
  describe "when parsing packet with extra bytes on the end" do
1411
- it "should throw an exception" do
1410
+ it "should raise an exception" do
1412
1411
  expect {
1413
1412
  MQTT::Packet.parse( "\x70\x03\x12\x34\x00" )
1414
1413
  }.to raise_error(
@@ -1419,7 +1418,7 @@ describe MQTT::Packet::Pubcomp do
1419
1418
  end
1420
1419
 
1421
1420
  describe "when parsing packet with invalid fixed header flags" do
1422
- it "should throw a protocol exception" do
1421
+ it "should raise a protocol exception" do
1423
1422
  expect {
1424
1423
  MQTT::Packet.parse( "\x72\x02\x12\x34" )
1425
1424
  }.to raise_error(
@@ -1464,7 +1463,7 @@ describe MQTT::Packet::Subscribe do
1464
1463
  expect(packet.topics).to eq([['a/b', 0], ['b/c', 1]])
1465
1464
  end
1466
1465
 
1467
- it "should throw an exception when setting topic with a non-string" do
1466
+ it "should raise an exception when setting topic with a non-string" do
1468
1467
  expect {
1469
1468
  packet.topics = 56
1470
1469
  }.to raise_error(
@@ -1484,7 +1483,7 @@ describe MQTT::Packet::Subscribe do
1484
1483
  expect(packet.to_s).to eq("\x82\x0e\000\x06\x00\x03a/b\x00\x00\x03c/d\x01")
1485
1484
  end
1486
1485
 
1487
- it "should throw an exception when no topics are given" do
1486
+ it "should raise an exception when no topics are given" do
1488
1487
  expect {
1489
1488
  MQTT::Packet::Subscribe.new.to_s
1490
1489
  }.to raise_error(
@@ -1534,7 +1533,7 @@ describe MQTT::Packet::Subscribe do
1534
1533
  end
1535
1534
 
1536
1535
  describe "when parsing packet with invalid fixed header flags" do
1537
- it "should throw a protocol exception" do
1536
+ it "should raise a protocol exception" do
1538
1537
  expect {
1539
1538
  MQTT::Packet.parse( "\x80\x08\x00\x01\x00\x03a/b\x00" )
1540
1539
  }.to raise_error(
@@ -1569,15 +1568,15 @@ describe MQTT::Packet::Suback do
1569
1568
  expect(packet.to_s).to eq("\x90\x04\x00\x06\x00\x01")
1570
1569
  end
1571
1570
 
1572
- it "should throw an exception when no granted QOSs are given" do
1571
+ it "should raise an exception when no granted QoSs are given" do
1573
1572
  expect {
1574
1573
  MQTT::Packet::Suback.new( :id => 7 ).to_s
1575
1574
  }.to raise_error(
1576
- 'no granted QOS given when serialising packet'
1575
+ 'no granted QoS given when serialising packet'
1577
1576
  )
1578
1577
  end
1579
1578
 
1580
- it "should throw an exception if the granted QOS is not an integer" do
1579
+ it "should raise an exception if the granted QoS is not an integer" do
1581
1580
  expect {
1582
1581
  MQTT::Packet::Suback.new( :id => 8, :return_codes => :foo ).to_s
1583
1582
  }.to raise_error(
@@ -1586,7 +1585,7 @@ describe MQTT::Packet::Suback do
1586
1585
  end
1587
1586
  end
1588
1587
 
1589
- describe "when parsing a packet with a single QOS value of 0" do
1588
+ describe "when parsing a packet with a single QoS value of 0" do
1590
1589
  let(:packet) { MQTT::Packet.parse( "\x90\x03\x12\x34\x00" ) }
1591
1590
 
1592
1591
  it "should correctly create the right type of packet object" do
@@ -1597,12 +1596,12 @@ describe MQTT::Packet::Suback do
1597
1596
  expect(packet.id).to eq(0x1234)
1598
1597
  end
1599
1598
 
1600
- it "should set the Granted QOS of the packet correctly" do
1599
+ it "should set the Granted QoS of the packet correctly" do
1601
1600
  expect(packet.return_codes).to eq([0])
1602
1601
  end
1603
1602
  end
1604
1603
 
1605
- describe "when parsing a packet with two QOS values" do
1604
+ describe "when parsing a packet with two QoS values" do
1606
1605
  let(:packet) { MQTT::Packet.parse( "\x90\x04\x12\x34\x01\x01" ) }
1607
1606
 
1608
1607
  it "should correctly create the right type of packet object" do
@@ -1613,13 +1612,13 @@ describe MQTT::Packet::Suback do
1613
1612
  expect(packet.id).to eq(0x1234)
1614
1613
  end
1615
1614
 
1616
- it "should set the Granted QOS of the packet correctly" do
1615
+ it "should set the Granted QoS of the packet correctly" do
1617
1616
  expect(packet.return_codes).to eq([1,1])
1618
1617
  end
1619
1618
  end
1620
1619
 
1621
1620
  describe "when parsing packet with invalid fixed header flags" do
1622
- it "should throw a protocol exception" do
1621
+ it "should raise a protocol exception" do
1623
1622
  expect {
1624
1623
  MQTT::Packet.parse( "\x92\x03\x12\x34\x00" )
1625
1624
  }.to raise_error(
@@ -1666,7 +1665,7 @@ describe MQTT::Packet::Unsubscribe do
1666
1665
  expect(packet.to_s).to eq("\xa2\x0c\000\006\000\003a/b\000\003c/d")
1667
1666
  end
1668
1667
 
1669
- it "should throw an exception when no topics are given" do
1668
+ it "should raise an exception when no topics are given" do
1670
1669
  expect {
1671
1670
  MQTT::Packet::Unsubscribe.new.to_s
1672
1671
  }.to raise_error(
@@ -1692,7 +1691,7 @@ describe MQTT::Packet::Unsubscribe do
1692
1691
  end
1693
1692
 
1694
1693
  describe "when parsing packet with invalid fixed header flags" do
1695
- it "should throw a protocol exception" do
1694
+ it "should raise a protocol exception" do
1696
1695
  expect {
1697
1696
  MQTT::Packet.parse( "\xa0\x07\x00\x05\x00\x03a/b" )
1698
1697
  }.to raise_error(
@@ -1738,7 +1737,7 @@ describe MQTT::Packet::Unsuback do
1738
1737
  end
1739
1738
 
1740
1739
  describe "when parsing packet with extra bytes on the end" do
1741
- it "should throw an exception" do
1740
+ it "should raise an exception" do
1742
1741
  expect {
1743
1742
  packet = MQTT::Packet.parse( "\xB0\x03\x12\x34\x00" )
1744
1743
  }.to raise_error(
@@ -1749,7 +1748,7 @@ describe MQTT::Packet::Unsuback do
1749
1748
  end
1750
1749
 
1751
1750
  describe "when parsing packet with invalid fixed header flags" do
1752
- it "should throw a protocol exception" do
1751
+ it "should raise a protocol exception" do
1753
1752
  expect {
1754
1753
  MQTT::Packet.parse( "\xB2\x02\x12\x34" )
1755
1754
  }.to raise_error(
@@ -1779,7 +1778,7 @@ describe MQTT::Packet::Pingreq do
1779
1778
  expect(packet.class).to eq(MQTT::Packet::Pingreq)
1780
1779
  end
1781
1780
 
1782
- it "should throw an exception if the packet has a payload" do
1781
+ it "should raise an exception if the packet has a payload" do
1783
1782
  expect {
1784
1783
  MQTT::Packet.parse( "\xC0\x05hello" )
1785
1784
  }.to raise_error(
@@ -1789,7 +1788,7 @@ describe MQTT::Packet::Pingreq do
1789
1788
  end
1790
1789
 
1791
1790
  describe "when parsing packet with invalid fixed header flags" do
1792
- it "should throw a protocol exception" do
1791
+ it "should raise a protocol exception" do
1793
1792
  expect {
1794
1793
  MQTT::Packet.parse( "\xC2\x00" )
1795
1794
  }.to raise_error(
@@ -1819,7 +1818,7 @@ describe MQTT::Packet::Pingresp do
1819
1818
  expect(packet.class).to eq(MQTT::Packet::Pingresp)
1820
1819
  end
1821
1820
 
1822
- it "should throw an exception if the packet has a payload" do
1821
+ it "should raise an exception if the packet has a payload" do
1823
1822
  expect {
1824
1823
  MQTT::Packet.parse( "\xD0\x05hello" )
1825
1824
  }.to raise_error(
@@ -1829,7 +1828,7 @@ describe MQTT::Packet::Pingresp do
1829
1828
  end
1830
1829
 
1831
1830
  describe "when parsing packet with invalid fixed header flags" do
1832
- it "should throw a protocol exception" do
1831
+ it "should raise a protocol exception" do
1833
1832
  expect {
1834
1833
  MQTT::Packet.parse( "\xD2\x00" )
1835
1834
  }.to raise_error(
@@ -1860,7 +1859,7 @@ describe MQTT::Packet::Disconnect do
1860
1859
  expect(packet.class).to eq(MQTT::Packet::Disconnect)
1861
1860
  end
1862
1861
 
1863
- it "should throw an exception if the packet has a payload" do
1862
+ it "should raise an exception if the packet has a payload" do
1864
1863
  expect {
1865
1864
  MQTT::Packet.parse( "\xE0\x05hello" )
1866
1865
  }.to raise_error(
@@ -1870,7 +1869,7 @@ describe MQTT::Packet::Disconnect do
1870
1869
  end
1871
1870
 
1872
1871
  describe "when parsing packet with invalid fixed header flags" do
1873
- it "should throw a protocol exception" do
1872
+ it "should raise a protocol exception" do
1874
1873
  expect {
1875
1874
  MQTT::Packet.parse( "\xE2\x00" )
1876
1875
  }.to raise_error(
@@ -1889,7 +1888,7 @@ end
1889
1888
 
1890
1889
  describe "Serialising an invalid packet" do
1891
1890
  context "that has a no type" do
1892
- it "should throw an exception" do
1891
+ it "should raise an exception" do
1893
1892
  expect {
1894
1893
  MQTT::Packet.new.to_s
1895
1894
  }.to raise_error(
@@ -1902,7 +1901,7 @@ end
1902
1901
 
1903
1902
  describe "Reading in an invalid packet from a socket" do
1904
1903
  context "that has 0 length" do
1905
- it "should throw an exception" do
1904
+ it "should raise an exception" do
1906
1905
  expect {
1907
1906
  socket = StringIO.new
1908
1907
  MQTT::Packet.read(socket)
@@ -1914,7 +1913,7 @@ describe "Reading in an invalid packet from a socket" do
1914
1913
  end
1915
1914
 
1916
1915
  context "that has an incomplete packet length header" do
1917
- it "should throw an exception" do
1916
+ it "should raise an exception" do
1918
1917
  expect {
1919
1918
  socket = StringIO.new("\x30\xFF")
1920
1919
  MQTT::Packet.read(socket)
@@ -1926,7 +1925,7 @@ describe "Reading in an invalid packet from a socket" do
1926
1925
  end
1927
1926
 
1928
1927
  context "that has the maximum number of bytes in the length header" do
1929
- it "should throw an exception" do
1928
+ it "should raise an exception" do
1930
1929
  expect {
1931
1930
  socket = StringIO.new("\x30\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF")
1932
1931
  MQTT::Packet.read(socket)
@@ -1940,7 +1939,7 @@ end
1940
1939
 
1941
1940
  describe "Parsing an invalid packet" do
1942
1941
  context "that has no length" do
1943
- it "should throw an exception" do
1942
+ it "should raise an exception" do
1944
1943
  expect {
1945
1944
  MQTT::Packet.parse( "" )
1946
1945
  }.to raise_error(
@@ -1951,7 +1950,7 @@ describe "Parsing an invalid packet" do
1951
1950
  end
1952
1951
 
1953
1952
  context "that has an invalid type identifier" do
1954
- it "should throw an exception" do
1953
+ it "should raise an exception" do
1955
1954
  expect {
1956
1955
  MQTT::Packet.parse( "\x00\x00" )
1957
1956
  }.to raise_error(
@@ -1962,7 +1961,7 @@ describe "Parsing an invalid packet" do
1962
1961
  end
1963
1962
 
1964
1963
  context "that has an incomplete packet length header" do
1965
- it "should throw an exception" do
1964
+ it "should raise an exception" do
1966
1965
  expect {
1967
1966
  MQTT::Packet.parse( "\x30\xFF" )
1968
1967
  }.to raise_error(
@@ -1973,7 +1972,7 @@ describe "Parsing an invalid packet" do
1973
1972
  end
1974
1973
 
1975
1974
  context "that has too many bytes in the length field" do
1976
- it "should throw an exception" do
1975
+ it "should raise an exception" do
1977
1976
  expect {
1978
1977
  MQTT::Packet.parse( "\x30\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" )
1979
1978
  }.to raise_error(
@@ -1984,7 +1983,7 @@ describe "Parsing an invalid packet" do
1984
1983
  end
1985
1984
 
1986
1985
  context "that has a bigger buffer than expected" do
1987
- it "should throw an exception" do
1986
+ it "should raise an exception" do
1988
1987
  expect {
1989
1988
  MQTT::Packet.parse( "\x30\x11\x00\x04testhello big world" )
1990
1989
  }.to raise_error(
@@ -1995,7 +1994,7 @@ describe "Parsing an invalid packet" do
1995
1994
  end
1996
1995
 
1997
1996
  context "that has a smaller buffer than expected" do
1998
- it "should throw an exception" do
1997
+ it "should raise an exception" do
1999
1998
  expect {
2000
1999
  MQTT::Packet.parse( "\x30\x11\x00\x04testhello" )
2001
2000
  }.to raise_error(