From 88c51f4933beb69f17002810afbe3bfe090f0cf6 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 9 Apr 2017 16:57:56 -0600 Subject: [PATCH] added some safety checks to the data table serialier --- .../Serializers/DataTableSerializerTests.cs | 22 ++++++++++----- .../Config/Serializers/DataTableSerializer.cs | 27 ++++++++++++++----- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs b/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs index a8a5f1f9..fa114a95 100644 --- a/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs @@ -20,13 +20,6 @@ namespace mRemoteNGTests.Config.Serializers _dataTableSerializer = new DataTableSerializer(_saveFilter); } - [TearDown] - public void Teardown() - { - _saveFilter = null; - _dataTableSerializer = null; - } - [Test] public void AllItemsSerialized() { @@ -35,6 +28,14 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(dataTable.Rows.Count, Is.EqualTo(3)); } + [Test] + public void ReturnsEmptyDataTableWhenGivenEmptyConnectionTreeModel() + { + var model = new ConnectionTreeModel(); + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows.Count, Is.EqualTo(0)); + } + [Test] public void UsernameSerializedWhenSaveSecurityAllowsIt() { @@ -109,6 +110,13 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(dataTable.Rows[0]["InheritUsername"], Is.False); } + [Test] + public void CanSerializeEmptyConnectionInfo() + { + var dataTable = _dataTableSerializer.Serialize(new ConnectionInfo()); + Assert.That(dataTable.Rows.Count, Is.EqualTo(1)); + } + private ConnectionTreeModel CreateConnectionTreeModel() { diff --git a/mRemoteV1/Config/Serializers/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs index 22a1ceb8..183727a3 100644 --- a/mRemoteV1/Config/Serializers/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -25,20 +25,35 @@ namespace mRemoteNG.Config.Serializers public DataTable Serialize(ConnectionTreeModel connectionTreeModel) { - var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); - return Serialize(rootNode); + try + { + _dataTable = BuildTable(); + _currentNodeIndex = 0; + var rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + return Serialize(rootNode); + } + catch + { + return _dataTable; + } } public DataTable Serialize(ConnectionInfo serializationTarget) { - _dataTable = new DataTable(TableName); - CreateSchema(); - SetPrimaryKey(); + _dataTable = BuildTable(); _currentNodeIndex = 0; SerializeNodesRecursive(serializationTarget); return _dataTable; } + private DataTable BuildTable() + { + var dataTable = new DataTable(TableName); + CreateSchema(); + SetPrimaryKey(); + return dataTable; + } + private void CreateSchema() { // Note: these columns must be defined in the same order that they exist in the DB @@ -186,7 +201,7 @@ namespace mRemoteNG.Config.Serializers dataRow["Name"] = connectionInfo.Name; dataRow["Type"] = connectionInfo.GetTreeNodeType().ToString(); dataRow["ConstantID"] = connectionInfo.ConstantID; - dataRow["ParentID"] = connectionInfo.Parent.ConstantID; + dataRow["ParentID"] = connectionInfo.Parent?.ConstantID; dataRow["PositionID"] = _currentNodeIndex; dataRow["LastChange"] = (SqlDateTime)DateTime.Now; var info = connectionInfo as ContainerInfo;