mqtt_spec.rb 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. require 'mqtt'
  2. require 'api_client'
  3. RSpec.describe 'State' do
  4. before(:all) do
  5. @client = ApiClient.new(ENV.fetch('ESPMH_HOSTNAME'), ENV.fetch('ESPMH_TEST_DEVICE_ID_BASE'))
  6. @client.upload_json('/settings', 'settings.json')
  7. @client.put(
  8. '/settings',
  9. mqtt_server: ENV.fetch('ESPMH_MQTT_SERVER'),
  10. mqtt_username: ENV.fetch('ESPMH_MQTT_USERNAME'),
  11. mqtt_password: ENV.fetch('ESPMH_MQTT_PASSWORD'),
  12. )
  13. @topic_prefix = ENV.fetch('ESPMH_MQTT_TOPIC_PREFIX')
  14. end
  15. context 'birth and LWT' do
  16. it 'should send birth and LWT messages when configured' do
  17. lwt_topic = "#{@topic_prefix}lwt"
  18. birth_topic = "#{@topic_prefix}birth"
  19. seen_birth = false
  20. seen_lwt = false
  21. MQTT::Client.connect("mqtt://#{ENV.fetch('ESPMH_MQTT_USERNAME')}:#{ENV.fetch('ESPMH_MQTT_PASSWORD')}@#{ENV.fetch('ESPMH_MQTT_SERVER')}") do |c|
  22. birth_listen_thread = Thread.new do
  23. begin
  24. Timeout.timeout(10) do
  25. c.get(birth_topic)
  26. seen_birth = true
  27. end
  28. rescue Timeout::Error
  29. end
  30. end
  31. lwt_listen_thread = Thread.new do
  32. begin
  33. Timeout.timeout(10) do
  34. c.get(lwt_topic)
  35. seen_lwt = true
  36. end
  37. rescue Timeout::Error
  38. end
  39. end
  40. @client.put(
  41. '/settings',
  42. mqtt_lwt_topic: lwt_topic,
  43. mqtt_lwt_message: 'disconnected',
  44. mqtt_birth_topic: birth_topic
  45. )
  46. @client.post('/system', command: 'restart')
  47. lwt_listen_thread.join
  48. birth_listen_thread.join
  49. end
  50. expect(seen_birth).to be(true)
  51. expect(seen_lwt).to be(true)
  52. end
  53. end
  54. end