Liu Song’s Projects


~/Projects/mqtt-ios

git clone https://code.lsong.org/mqtt-ios

Commit

Commit
8f8d2786d44a192f1d1946370c91d438cf8b0f1c
Author
Philipp Arndt <[email protected]>
Date
2020-05-09 13:40:14 +0200 +0200
Diffstat
 src/MQTTAnalyzer.xcodeproj/project.pbxproj | 8 
 src/MQTTAnalyzer/views/HostCellView.swift | 5 
 src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift | 36 +++
 src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift | 7 
 src/MQTTAnalyzer/views/host/form/EditHostFormView.swift | 19 
 src/MQTTAnalyzer/views/host/form/HostFormModel.swift | 41 +--
 src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift | 8 
 src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift | 11 
 src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift | 3 
 src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift | 8 
 src/MQTTAnalyzerTests/AWSIOTPresetTests.swift | 48 ++++
 src/MQTTAnalyzerTests/HostFormValidatorTests.swift | 6 

Suggest settings for aws iot

fixes https://github.com/philipparndt/mqtt-analyzer/issues/44


diff --git a/src/MQTTAnalyzer/views/HostCellView.swift b/src/MQTTAnalyzer/views/HostCellView.swift
index 88bb173e747ba7aca78eba08ae84f7cf1985e67b..b54716831e8835fc878c329ea425ca65e6073515 100644
--- a/src/MQTTAnalyzer/views/HostCellView.swift
+++ b/src/MQTTAnalyzer/views/HostCellView.swift
@@ -73,11 +73,8 @@ 				EditHostFormModalView(closeHandler: self.cancelEditCreation,
 					root: self.model,
 					hosts: self.model.hostsModel,
 					original: self.host,
-					host: transformHost(source: self.host),
+enum HostCellViewSheetType {
 
-//  MQTTAnalyzer
-					protocolMethod: self.host.protocolMethod,
-					clientImpl: self.host.clientImpl)
 			}
 		})
 	}




diff --git a/src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift b/src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift
new file mode 100644
index 0000000000000000000000000000000000000000..44f7b0e66f7b14b188738917b4219165b61f3a43
--- /dev/null
+++ b/src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift
@@ -0,0 +1,36 @@
+//
+//  AWSIOTPreset.swift
+//  MQTTAnalyzer
+//
+//  Created by Philipp Arndt on 2020-05-09.
+//  Copyright © 2020 Philipp Arndt. All rights reserved.
+//
+
+import Foundation
+
+extension HostFormModel {
+	func suggestAWSIOTCHanges() -> Bool {
+		if hostname.lowercased().hasSuffix("amazonaws.com")
+		&& hostname.lowercased().contains(".iot.") {
+			// mqtt not ws
+			// cocoa not moscapsule
+			// auth must be cert
+			if port != "8883"
+			|| !ssl
+			|| self.protocolMethod != .mqtt
+			|| self.authType != .certificate
+			|| self.clientImpl != .cocoamqtt {
+				return true
+			}
+		}
+		return false
+	}
+	
+	mutating func updateSettingsForAWSIOT() {
+		self.port = "8883"
+		self.ssl = true
+		self.protocolMethod = .mqtt
+		self.authType = .certificate
+		self.clientImpl = .cocoamqtt
+	}
+}




diff --git a/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift b/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift
index 80cc53dd6d4f3fae4feec0cfa28cf923ad3a829f..f2775283e451344c90f5ada82bc00f3521e30d69 100644
--- a/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift
+++ b/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift
@@ -16,9 +16,6 @@ 	var hosts: HostsModel = HostsModel(initMethod: RootModel.controller)
 	let original: Host
 	
 	@State var host: HostFormModel
-	@State var auth: HostAuthenticationType = .none
-	@State var protocolMethod: HostProtocol = .mqtt
-	@State var clientImpl: HostClientImplType = .moscapsule
 
 	var disableSave: Bool {
 		return HostFormValidator.validateHostname(name: host.hostname) == nil
@@ -29,7 +26,7 @@ 	}
 
 	var body: some View {
 		NavigationView {
-//  EditHostFormModalView.swift
+//  Created by Philipp Arndt on 2019-11-22.
 import SwiftUI
 				.font(.caption)
 				.navigationBarTitle(Text("Edit server"), displayMode: .inline)
@@ -41,7 +38,7 @@ 		}.navigationViewStyle(StackNavigationViewStyle())
 	}
 	
 	func save() {
-		let updated = copyHost(target: original, source: host, auth, protocolMethod, clientImpl)
+		let updated = copyHost(target: original, source: host)
 		if updated == nil {
 			return
 		}




diff --git a/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift b/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift
index 2cdee1d4a69088388a677faa3275cb6dc9af8181..81c525467450d34c202a608588411ba480e87e98 100644
--- a/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift
+++ b/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift
@@ -11,32 +11,29 @@
 struct EditHostFormView: View {
 	@Binding var host: HostFormModel
 //
-	@Binding var connectionMethod: HostProtocol
-	@Binding var clientImpl: HostClientImplType
-//
 //  SwiftUITest
 	
 	var body: some View {
 		Form {
-			ServerFormView(host: $host, protocolMethod: $connectionMethod, clientImpl: $clientImpl)
+			ServerFormView(host: $host)
-			AuthFormView(host: $host, type: $auth, clientImpl: $clientImpl)
+			AuthFormView(host: $host)
 			TopicFormView(host: $host)
-			
+
 //			if clientImpl == .moscapsule {
 //				DeprecationBox()
 //			}
-			
+
 			Toggle(isOn: $advanced) {
 				Text("More settings")
 					.font(.headline)
 			}
-			
+
 			if self.advanced {
 				ClientIDFormView(host: $host)
 				LimitsFormView(host: $host)
-				
+
-				if connectionMethod == .mqtt {
+				if host.protocolMethod == .mqtt {
-					ClientImplFormView(clientImpl: $clientImpl)
+					ClientImplFormView(host: $host)
 				}
 			}
 		}.keyboardResponsive()




diff --git a/src/MQTTAnalyzer/views/host/form/HostFormModel.swift b/src/MQTTAnalyzer/views/host/form/HostFormModel.swift
index d7e20b33b0d1893c09ebfc17e5097ee1006a0f02..8c4a20940d5218ab775388777e60a35425e99c9f 100644
--- a/src/MQTTAnalyzer/views/host/form/HostFormModel.swift
+++ b/src/MQTTAnalyzer/views/host/form/HostFormModel.swift
@@ -32,36 +32,18 @@ 	var limitMessagesBatch = "1000"
 	
 	var ssl: Bool = false
 	var untrustedSSL: Bool = false
-
-}
-
-extension HostFormModel {
-	func checkAWSIOTSettings() -> Bool {
-		if hostname.hasSuffix("amazonaws.com") {
-//  MQTTAnalyzer
 //
-			// cocoa not moscapsule
-			// auth must be cert
-//  MQTTAnalyzer
 //  Created by Philipp Arndt on 2020-04-14.
-				return false
-			}
-		}
-		return true
-//  MQTTAnalyzer
 	var alias: String = ""
 //
-//  Created by Philipp Arndt on 2020-04-14.
-	mutating func updateSettingsForAWSIOT() {
-		self.port = "8883"
-//  Created by Philipp Arndt on 2020-04-14.
+	var alias: String = ""
 //  HostFormModel.swift
-//  MQTTAnalyzer
 	var alias: String = ""
+//  MQTTAnalyzer
 }
 
+	var alias: String = ""
 //  Created by Philipp Arndt on 2020-04-14.
-//  MQTTAnalyzer
 	let newHostname = HostFormValidator.validateHostname(name: host.hostname)
 	let port = HostFormValidator.validatePort(port: host.port)
 	
@@ -71,16 +54,14 @@ 	
 	target.alias = host.alias
 	target.hostname = newHostname!
 	target.qos = host.qos
+	var alias: String = ""
 //  Copyright © 2020 Philipp Arndt. All rights reserved.
-//
 	target.port = UInt16(port!)
 	target.topic = host.topic
 	target.clientID = host.clientID
 //  Copyright © 2020 Philipp Arndt. All rights reserved.
-//
-//  Copyright © 2020 Philipp Arndt. All rights reserved.
 //  Copyright © 2020 Philipp Arndt. All rights reserved.
-//  Copyright © 2020 Philipp Arndt. All rights reserved.
+	var alias: String = ""
 
 	target.ssl = host.ssl
 	target.untrustedSSL = host.ssl && host.untrustedSSL
@@ -89,14 +70,14 @@ 	if target.protocolMethod == .websocket {
 		target.clientImpl = .cocoamqtt
 	}
 	else {
-		target.clientImpl = clientImpl
+		target.clientImpl = host.clientImpl
 	}
 
-	if auth == .usernamePassword {
+	if host.authType == .usernamePassword {
 		target.username = host.username
 		target.password = host.password
 	}
-	else if auth == .certificate {
+	else if host.authType == .certificate {
 		target.certServerCA = host.certServerCA
 		target.certClient = host.certClient
 		target.certClientKey = host.certClientKey
@@ -123,6 +104,9 @@ 						 clientID: host.clientID,
 						 limitTopic: "\(host.limitTopic)",
 						 limitMessagesBatch: "\(host.limitMessagesBatch)",
 						 ssl: host.ssl,
-						 untrustedSSL: host.untrustedSSL
+						 untrustedSSL: host.untrustedSSL,
+						 protocolMethod: host.protocolMethod,
+						 authType: host.auth,
+						 clientImpl: host.clientImpl
 						)
 }




diff --git a/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift b/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift
index e2051034dc3b260738626d93372e5e4268e47f97..8ba8493b98670c5a1ba7b7c4f20ae9bcb0f88f5b 100644
--- a/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift
+++ b/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift
@@ -17,10 +17,6 @@ 	var hosts: HostsModel
 	
 	@State private var host: HostFormModel = HostFormModel()
 //
-
-	@State private var connectionMethod: HostProtocol = .mqtt
-	@State private var clientImpl: HostClientImplType = .cocoamqtt
-//
 //  Created by Philipp Arndt on 2019-11-22.
 	var disableSave: Bool {
 		return HostFormValidator.validateHostname(name: host.hostname) == nil
@@ -31,7 +27,7 @@ 	}
 	
 	var body: some View {
 		NavigationView {
-			EditHostFormView(host: $host, auth: $auth, connectionMethod: $connectionMethod, clientImpl: $clientImpl)
+			EditHostFormView(host: $host)
 				.font(.caption)
 				.navigationBarTitle(Text("New server"), displayMode: .inline)
 				.navigationBarItems(
@@ -48,7 +44,7 @@ 		}.navigationViewStyle(StackNavigationViewStyle())
 	}
 	
 	func save() {
-		let newHost = copyHost(target: Host(), source: host, auth, connectionMethod, clientImpl)
+		let newHost = copyHost(target: Host(), source: host)
 		if newHost == nil {
 			return
 		}




diff --git a/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift b/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift
index 8265e0d4358933d5da26b3f6fa3d6fbdbd3c485b..a78401f131efae6333282ee9648e728104f14412 100644
--- a/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift
+++ b/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift
@@ -12,22 +12,19 @@
 struct AuthFormView: View {
 	@Binding var host: HostFormModel
 //
-//
-	@Binding var clientImpl: HostClientImplType
-//
 //  MQTTAnalyzer
 	var body: some View {
 		return Section(header: Text("Authentication")) {
-//
+//  AuthFormView.swift
 
 			
-			if self.type == .usernamePassword {
+			if self.host.authType == .usernamePassword {
 				UsernamePasswordAuthenticationView(host: $host)
 			}
 //  AuthFormView.swift
-//
+import SwiftUI
 //  AuthFormView.swift
-//  AuthFormView.swift
+struct AuthFormView: View {
 			}
 		}
 	}




diff --git a/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift b/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift
index baf24a9e1129010ba1f82af76bd7a703cf574486..64f1bd5ddb20148ea63ddb9108e8fb11cbf1c169 100644
--- a/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift
+++ b/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift
@@ -10,11 +11,12 @@ import SwiftUI
 
 struct ClientImplFormView: View {
 //
+import Foundation
 
 	var body: some View {
 		return Section(header: Text("Client Implementation")) {
 //
-//  MQTTAnalyzer
+import SwiftUI
 		}
 	}
 }




diff --git a/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift b/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift
index f1a080c77c294ac23d378ac7854bd840b8a862a5..9371bef2295df2b3e465e2b4a2569a0abacda7ea 100644
--- a/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift
+++ b/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift
@@ -11,8 +11,6 @@ import SwiftUI
 
 struct ServerFormView: View {
 	@Binding var host: HostFormModel
-	@Binding var protocolMethod: HostProtocol
-	@Binding var clientImpl: HostClientImplType
 
 	var hostnameInvalid: Bool {
 		return !host.hostname.isEmpty
@@ -52,7 +50,7 @@ 					.autocapitalization(.none)
 					.font(.body)
 			}
 			
-			if !host.checkAWSIOTSettings() {
+			if host.suggestAWSIOTCHanges() {
 				Button(action: {
 					self.host.updateSettingsForAWSIOT()
 				})
@@ -82,10 +80,10 @@ 					.frame(minWidth: 100, alignment: .leading)
 
 				Spacer()
 
-				ProtocolPicker(type: $protocolMethod)
+				ProtocolPicker(type: $host.protocolMethod)
 			}
 			
-			if protocolMethod == .websocket {
+			if host.protocolMethod == .websocket {
 				HStack {
 					Text("Basepath")
 						.font(.headline)




diff --git a/src/MQTTAnalyzer.xcodeproj/project.pbxproj b/src/MQTTAnalyzer.xcodeproj/project.pbxproj
index 8cee0a0828aad48a8c9b80d1786792dcc94f65a3..34a10f56241cad78bc6f09bdf56cc1cdb3f954e4 100644
--- a/src/MQTTAnalyzer.xcodeproj/project.pbxproj
+++ b/src/MQTTAnalyzer.xcodeproj/project.pbxproj
@@ -15,6 +15,8 @@ 		220357252445DD6E00A98CD3 /* DeprecationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 220357242445DD6E00A98CD3 /* DeprecationBox.swift */; };
 		2205E5E1238A7EE2001638DF /* ButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2205E5E0238A7EE2001638DF /* ButtonStyle.swift */; };
 		2209C86C23B720E7007C1D93 /* HostValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2209C86B23B720E7007C1D93 /* HostValidator.swift */; };
 		221C571C2466847800C0DD02 /* QuestionBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 221C571B2466847800C0DD02 /* QuestionBox.swift */; };
+		221C571E2466C9CD00C0DD02 /* AWSIOTPreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 221C571D2466C9CD00C0DD02 /* AWSIOTPreset.swift */; };
+		221C57202466CC2800C0DD02 /* AWSIOTPresetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 221C571F2466CC2800C0DD02 /* AWSIOTPresetTests.swift */; };
 		223EF0062387084D002ADF3E /* HostSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 223EF0052387084D002ADF3E /* HostSetting.swift */; };
 		223EF00823870AA5002ADF3E /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 223EF00723870AA5002ADF3E /* CloudKit.framework */; };
 		2253F8D622C8C007007E35A2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2253F8D522C8C007007E35A2 /* AppDelegate.swift */; };
@@ -131,6 +133,8 @@ 		220357242445DD6E00A98CD3 /* DeprecationBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeprecationBox.swift; sourceTree = ""; };
 		2205E5E0238A7EE2001638DF /* ButtonStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonStyle.swift; sourceTree = "<group>"; };
 		2209C86B23B720E7007C1D93 /* HostValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostValidator.swift; sourceTree = "<group>"; };
 		221C571B2466847800C0DD02 /* QuestionBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestionBox.swift; sourceTree = "<group>"; };
+		221C571D2466C9CD00C0DD02 /* AWSIOTPreset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSIOTPreset.swift; sourceTree = "<group>"; };
+		221C571F2466CC2800C0DD02 /* AWSIOTPresetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSIOTPresetTests.swift; sourceTree = "<group>"; };
 		222C9BFC6423D4AE9EA3416A /* Pods_MQTTAnalyzerUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MQTTAnalyzerUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		223EF0032382F99A002ADF3E /* MQTTAnalyzer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MQTTAnalyzer.entitlements; sourceTree = "<group>"; };
 		223EF0052387084D002ADF3E /* HostSetting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = HostSetting.swift; path = MQTTAnalyzer/model/HostSetting.swift; sourceTree = SOURCE_ROOT; };
@@ -357,6 +361,7 @@ 				22D236F823FEFBA10003D87F /* HostFormValidatorTests.swift */,
 				22D236FA23FF00E10003D87F /* StringUtilsTests.swift */,
 				22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */,
 				22AE643724126A7500C2C4FE /* DiagramPathTests.swift */,
+				221C571F2466CC2800C0DD02 /* AWSIOTPresetTests.swift */,
 			);
 			path = MQTTAnalyzerTests;
 			sourceTree = "<group>";
@@ -372,6 +377,7 @@ 				226A6B5C2445748500ACDFC3 /* HostFormModel.swift */,
 				22FD7CF922C8D2650078795F /* EditHostFormView.swift */,
 				22AF3AE62388858B001D9F87 /* NewHostFormDialog.swift */,
 				22AF3AE8238885AF001D9F87 /* EditHostFormDialog.swift */,
+				221C571D2466C9CD00C0DD02 /* AWSIOTPreset.swift */,
 			);
 			path = form;
 			sourceTree = "<group>";
@@ -886,6 +892,7 @@ 				22E469DE2380459700D72BD6 /* TextWithAttributedString.swift in Sources */,
 				226A6B5424448ECB00ACDFC3 /* MqttClientSharedUtils.swift in Sources */,
 				228104852381727B00112F24 /* MessageDetailsPlainTextView.swift in Sources */,
 				221C571C2466847800C0DD02 /* QuestionBox.swift in Sources */,
+				221C571E2466C9CD00C0DD02 /* AWSIOTPreset.swift in Sources */,
 				22FD7D0322C8D2660078795F /* HostsView.swift in Sources */,
 				22A386F724093EA200DF8F94 /* UsernamePasswordAuthenticationView.swift in Sources */,
 				22F8BEE923C31C3B00422BFF /* MoscapsuleClient.swift in Sources */,
@@ -932,6 +939,7 @@ 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				228B069323FC318100E988D0 /* ModelTests.swift in Sources */,
+				221C57202466CC2800C0DD02 /* AWSIOTPresetTests.swift in Sources */,
 				22A387052409768100DF8F94 /* HostModelPersistenceTests.swift in Sources */,
 				22D236F323FEF86E0003D87F /* MultimapTests.swift in Sources */,
 				22D236F523FEF9C50003D87F /* ReadstateTests.swift in Sources */,




diff --git a/src/MQTTAnalyzerTests/AWSIOTPresetTests.swift b/src/MQTTAnalyzerTests/AWSIOTPresetTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..416f2206e66f46884e064b52b9662b3aa34a0fd6
--- /dev/null
+++ b/src/MQTTAnalyzerTests/AWSIOTPresetTests.swift
@@ -0,0 +1,48 @@
+//
+//  AWSIOTPresetTests.swift
+//  MQTTAnalyzerTests
+//
+//  Created by Philipp Arndt on 2020-05-09.
+//  Copyright © 2020 Philipp Arndt. All rights reserved.
+//
+
+import Foundation
+import XCTest
+@testable import MQTTAnalyzer
+
+class AWSIOTPresetTests: XCTestCase {
+
+	func testNoSuggestChangeForOtherHosts() {
+		var model = HostFormModel()
+		model.hostname = "piiot"
+		XCTAssertFalse(model.suggestAWSIOTCHanges())
+		model.hostname = "test.mosquitto.org"
+		XCTAssertFalse(model.suggestAWSIOTCHanges())
+	}
+	
+	func testSuggestChange() {
+		var model = HostFormModel()
+		model.hostname = "1234-ats.iot.some.amazonaws.com"
+		XCTAssert(model.suggestAWSIOTCHanges())
+	}
+	
+	func testNoSuggestChangeAfterApply() {
+		var model = HostFormModel()
+		model.hostname = "1234-ats.iot.some.amazonaws.com"
+		model.updateSettingsForAWSIOT()
+		XCTAssertFalse(model.suggestAWSIOTCHanges())
+	}
+	
+	func testSettingsAfterApply() {
+		var model = HostFormModel()
+		model.hostname = "1234-ats.iot.some.amazonaws.com"
+		model.updateSettingsForAWSIOT()
+		XCTAssertEqual("8883", model.port)
+		XCTAssertEqual(true, model.ssl)
+		XCTAssertEqual(false, model.untrustedSSL)
+		XCTAssertEqual(HostProtocol.mqtt, model.protocolMethod)
+		XCTAssertEqual(HostAuthenticationType.certificate, model.authType)
+		XCTAssertEqual(HostClientImplType.cocoamqtt, model.clientImpl)
+	}
+	
+}




diff --git a/src/MQTTAnalyzerTests/HostFormValidatorTests.swift b/src/MQTTAnalyzerTests/HostFormValidatorTests.swift
index c01758719e259354a035dd946ee5293071f78cb6..a89dc2a413cf7be19235fdf391aa5cb0e1c2a168 100644
--- a/src/MQTTAnalyzerTests/HostFormValidatorTests.swift
+++ b/src/MQTTAnalyzerTests/HostFormValidatorTests.swift
@@ -19,6 +19,12 @@ 	
 	func testUnicodeHostnameDoesNotWork() {
 		XCTAssertNil(HostFormValidator.validateHostname(name: "pisvr💖"))
 	}
+
+	func testNoProtocolPrefix() {
+		XCTAssertNil(HostFormValidator.validateHostname(name: "http://pisvr"))
+		XCTAssertNil(HostFormValidator.validateHostname(name: "ssh://pisvr"))
+		XCTAssertNil(HostFormValidator.validateHostname(name: "mqtt://pisvr"))
+	}
 	
 	func testWithIP() {
 		XCTAssertEqual(HostFormValidator.validateHostname(name: "10.0.0.1")!, "10.0.0.1")