瀏覽代碼

Respect simple client status message setting, add test to ensure it behaves properly

Christopher Mullins 6 年之前
父節點
當前提交
273d385262
共有 3 個文件被更改,包括 50 次插入18 次删除
  1. 16 7
      lib/MQTT/MqttClient.cpp
  2. 1 1
      lib/MQTT/MqttClient.h
  3. 33 10
      test/remote/spec/mqtt_spec.rb

+ 16 - 7
lib/MQTT/MqttClient.cpp

@@ -237,14 +237,23 @@ inline void MqttClient::bindTopicString(
 }
 
 String MqttClient::generateConnectionStatusMessage(const char* connectionStatus) {
-  StaticJsonDocument<1024> json;
-  json["status"] = connectionStatus;
+  if (settings.simpleMqttClientStatus) {
+    // Don't expand disconnect type for simple status
+    if (0 == strcmp(connectionStatus, STATUS_CONNECTED)) {
+      return connectionStatus;
+    } else {
+      return "disconnected";
+    }
+  } else {
+    StaticJsonDocument<1024> json;
+    json["status"] = connectionStatus;
 
-  // Fill other fields
-  AboutHelper::generateAboutObject(json, true);
+    // Fill other fields
+    AboutHelper::generateAboutObject(json, true);
 
-  String response;
-  serializeJson(json, response);
+    String response;
+    serializeJson(json, response);
 
-  return response;
+    return response;
+  }
 }

+ 1 - 1
lib/MQTT/MqttClient.h

@@ -50,7 +50,7 @@ private:
     const uint16_t groupId
   );
 
-  static String generateConnectionStatusMessage(const char* status);
+  String generateConnectionStatusMessage(const char* status);
 };
 
 #endif

+ 33 - 10
test/remote/spec/mqtt_spec.rb

@@ -44,22 +44,21 @@ RSpec.describe 'State' do
   end
 
   context 'client status topic' do
-    # Unfortunately, no way to easily simulate an unclean disconnect, so only test birth
-    it 'should send client status messages when configured' do
-      status_topic = "#{@topic_prefix}client_status"
-
-      @client.put(
-        '/settings',
-        mqtt_client_status_topic: status_topic
-      )
+    before(:all) do
+      @status_topic = "#{@topic_prefix}client_status"
+      @client.patch_settings(mqtt_client_status_topic: @status_topic)
+    end
 
+    it 'should send client status messages when configured' do
       # Clear any retained messages
-      @mqtt_client.publish(status_topic, nil)
+      @mqtt_client.publish(@status_topic, nil)
 
+      # Unfortunately, no way to easily simulate an unclean disconnect, so only test birth
+      # and forced disconnect
       seen_statuses = Set.new
       required_statuses = %w(connected disconnected_clean)
 
-      @mqtt_client.on_message(status_topic, 20) do |topic, message|
+      @mqtt_client.on_message(@status_topic, 20) do |topic, message|
         message = JSON.parse(message)
 
         seen_statuses << message['status']
@@ -73,6 +72,30 @@ RSpec.describe 'State' do
 
       expect(seen_statuses).to include(*required_statuses)
     end
+
+    it 'should send simple client status message when configured' do
+      @client.patch_settings(simple_mqtt_client_status: true)
+
+      # Clear any retained messages
+      @mqtt_client.publish(@status_topic, nil)
+
+      # Unfortunately, no way to easily simulate an unclean disconnect, so only test birth
+      # and forced disconnect
+      seen_statuses = Set.new
+      required_statuses = %w(connected disconnected)
+
+      @mqtt_client.on_message(@status_topic, 20) do |topic, message|
+        seen_statuses << message
+        required_statuses.all? { |x| seen_statuses.include?(x) }
+      end
+
+      # Force MQTT reconnect by updating settings
+      @client.patch_settings(fakekey: 'fakevalue')
+
+      @mqtt_client.wait_for_listeners
+
+      expect(seen_statuses).to include(*required_statuses)
+    end
   end
 
   context 'commands and state' do