public void SystemDataRoundTripTest()
        {
            var testSystemData = new SerializableSystemData
            {
                Contact            = "Test-Contact",
                Description        = "Test-Description",
                DeviceAddress      = new IpAddress("1.2.3.4"),
                DeviceModel        = "Test-DeviceMode",
                EnterpriseObjectId = new Oid("5.6.7.8"),
                Location           = "Test-Location",
                Model         = "Test-Model",
                Name          = "Test-Name",
                QueryDuration = TimeSpan.FromSeconds(2),
                Uptime        = TimeSpan.FromMinutes(2),
                Version       = new SemanticVersion(1, 3, 5, "p7", "b9")
            };

            using (var context = new CacheDatabaseContext(this.database))
            {
                context.Database.EnsureDeleted();

                context.Database.EnsureCreated();

                Assert.NotNull(context, "The database context is null");

                context.CacheData.Add(new CacheData
                {
                    Address           = testSystemData.DeviceAddress,
                    InterfaceDetails  = null,
                    WirelessPeerInfos = null,
                    SystemData        = testSystemData
                });

                context.SaveChanges();
            }

            using (var context = new CacheDatabaseContext(this.database))
            {
                Assert.NotNull(context, "The database context is null");

                var retrievedSystemData = context.CacheData.First().SystemData;

                Assert.NotNull(retrievedSystemData, "Retrieved system data is null");

                Assert.AreEqual(testSystemData.Contact, retrievedSystemData.Contact, "Error in Contact");
                Assert.AreEqual(testSystemData.Description, retrievedSystemData.Description, "Error in Description");
                Assert.AreEqual(testSystemData.DeviceAddress, retrievedSystemData.DeviceAddress, "Error in DeviceAddress");
                Assert.AreEqual(testSystemData.DeviceModel, retrievedSystemData.DeviceModel, "Error in DeviceModel");
                Assert.AreEqual(testSystemData.EnterpriseObjectId, retrievedSystemData.EnterpriseObjectId, "Error in EnterpriseObjectId");
                Assert.AreEqual(testSystemData.Location, retrievedSystemData.Location, "Error in Location");
                Assert.AreEqual(testSystemData.Model, retrievedSystemData.Model, "Error in Model");
                Assert.AreEqual(testSystemData.Name, retrievedSystemData.Name, "Error in Name");
                Assert.AreNotEqual(testSystemData.QueryDuration, retrievedSystemData.QueryDuration, "Error in QueryDuration: Seems it has been serialized even though marked as ignore");
                Assert.AreNotEqual(testSystemData.Uptime, retrievedSystemData.Uptime, "Error in Uptime: Seems it has been serialized even though marked as ignore");
                Assert.AreEqual(testSystemData.Version, retrievedSystemData.Version, "Error in Version");
            }
        }
        public void InterfaceDetailsRoundTripTest()
        {
            var testInterfaceDetails = new SerializableInterfaceDetails
            {
                DeviceAddress = new IpAddress("1.2.3.4"),
                DeviceModel   = "Test-DeviceModel",
                Details       = new List <IInterfaceDetail>
                {
                    new SerializableInterfaceDetail
                    {
                        DeviceAddress    = new IpAddress("9.8.7.6"),
                        DeviceModel      = "Test-DeviceModel-InterfaceDetail",
                        InterfaceId      = 815,
                        InterfaceName    = "Test-InterfaceName",
                        InterfaceType    = IanaInterfaceType.A12MppSwitch,
                        MacAddressString = "Test-MacAddressString"
                    } as IInterfaceDetail
                }
            };

            using (var context = new CacheDatabaseContext(this.database))
            {
                context.Database.EnsureDeleted();

                context.Database.EnsureCreated();

                Assert.NotNull(context, "The database context is null");

                context.CacheData.Add(new CacheData
                {
                    Address           = testInterfaceDetails.DeviceAddress,
                    InterfaceDetails  = testInterfaceDetails,
                    WirelessPeerInfos = null,
                    SystemData        = null
                });

                context.SaveChanges();
            }

            using (var context = new CacheDatabaseContext(this.database))
            {
                Assert.NotNull(context, "The database context is null");

                var retrievedInterfaceDetails = context.CacheData.First().InterfaceDetails;

                Assert.NotNull(retrievedInterfaceDetails, "Retrieved interface details is null");

                Assert.NotNull(retrievedInterfaceDetails.Details, "Retrieved interface 'Details' property is null");

                Assert.AreEqual(testInterfaceDetails.Details.Count, retrievedInterfaceDetails.Details.Count, "Wrong count of peer infos");

                var firstPeerExpected  = testInterfaceDetails.Details.First();
                var firstPeerRetrieved = retrievedInterfaceDetails.Details.First();

                Assert.AreEqual(firstPeerExpected.DeviceAddress, firstPeerRetrieved.DeviceAddress, "Error in DeviceAddress");
                Assert.AreEqual(firstPeerExpected.DeviceModel, firstPeerRetrieved.DeviceModel, "Error in DeviceModel");
                Assert.AreEqual(firstPeerExpected.InterfaceId, firstPeerRetrieved.InterfaceId, "Error in InterfaceId");
                Assert.AreEqual(firstPeerExpected.MacAddressString, firstPeerRetrieved.MacAddressString, "Error in MacAddressString");
                Assert.AreNotEqual(firstPeerExpected.QueryDuration, firstPeerRetrieved.QueryDuration, "Error in QueryDuration: Seems it has been serialized even though marked as ignore");
                Assert.AreEqual(firstPeerExpected.InterfaceName, firstPeerRetrieved.InterfaceName, "Error in InterfaceName");
                Assert.AreEqual(firstPeerExpected.InterfaceType, firstPeerRetrieved.InterfaceType, "Error in InterfaceType");
            }
        }
        public void WirelessPeerInfoRoundTripTest()
        {
            var testPeerInfos = new SerializableWirelessPeerInfos
            {
                DeviceAddress = new IpAddress("1.2.3.4"),
                DeviceModel   = "Test-DeviceModel",
                Details       = new List <IWirelessPeerInfo>
                {
                    new SerializableWirelessPeerInfo
                    {
                        DeviceAddress    = new IpAddress("9.8.7.6"),
                        DeviceModel      = "Test-DeviceModel-PeerInfo",
                        InterfaceId      = 815,
                        IsAccessPoint    = true,
                        LinkUptime       = TimeSpan.FromMinutes(5),
                        RemoteMacString  = "Test-RemoteMacString",
                        RxSignalStrength = 8.15,
                        TxSignalStrength = 5.18,
                        Oids             = new Dictionary <CachableValueMeanings, ICachableOid>
                        {
                            { CachableValueMeanings.WirelessLinkUptime, new CachableOid(new IpAddress("9.8.7.6"), CachableValueMeanings.WirelessLinkUptime, new [] { new Oid("1.2.3.4.5.6"), new Oid("9.8.7.6.5.4") }) },
                            { CachableValueMeanings.WirelessRxSignalStrength, new CachableOid(new IpAddress("4.5.6.7"), CachableValueMeanings.WirelessRxSignalStrength, new [] { new Oid("73.74.75.76") }) }
                        }
                    } as IWirelessPeerInfo
                }
            };

            using (var context = new CacheDatabaseContext(this.database))
            {
                context.Database.EnsureDeleted();

                context.Database.EnsureCreated();

                Assert.NotNull(context, "The database context is null");

                context.CacheData.Add(new CacheData
                {
                    Address           = testPeerInfos.DeviceAddress,
                    InterfaceDetails  = null,
                    WirelessPeerInfos = testPeerInfos,
                    SystemData        = null
                });

                context.SaveChanges();
            }

            using (var context = new CacheDatabaseContext(this.database))
            {
                Assert.NotNull(context, "The database context is null");

                var retrievedPeerInfos = context.CacheData.First().WirelessPeerInfos;

                Assert.NotNull(retrievedPeerInfos, "Retrieved peers infos is null");

                Assert.NotNull(retrievedPeerInfos.Details, "Retrieved peer 'Details' property is null");

                Assert.AreEqual(testPeerInfos.Details.Count, retrievedPeerInfos.Details.Count, "Wrong count of peer infos");

                var firstPeerExpected  = testPeerInfos.Details.First();
                var firstPeerRetrieved = retrievedPeerInfos.Details.First();

                Assert.AreEqual(firstPeerExpected.DeviceAddress, firstPeerRetrieved.DeviceAddress, "Error in DeviceAddress");
                Assert.AreEqual(firstPeerExpected.DeviceModel, firstPeerRetrieved.DeviceModel, "Error in DeviceModel");
                Assert.AreEqual(firstPeerExpected.InterfaceId, firstPeerRetrieved.InterfaceId, "Error in InterfaceId");
                Assert.AreEqual(firstPeerExpected.IsAccessPoint, firstPeerRetrieved.IsAccessPoint, "Error in IsAccessPoint");
                Assert.AreNotEqual(firstPeerExpected.LinkUptime, firstPeerRetrieved.LinkUptime, "Error in LinkUptime: Seems it has been serialized even though marked as ignore");
                Assert.AreEqual(firstPeerExpected.RemoteMacString, firstPeerRetrieved.RemoteMacString, "Error in RemoteMacString");
                Assert.AreNotEqual(firstPeerExpected.RxSignalStrength, firstPeerRetrieved.RxSignalStrength, "Error in RxSignalStrength: Seems it has been serialized even though marked as ignore");
                Assert.AreNotEqual(firstPeerExpected.TxSignalStrength, firstPeerRetrieved.TxSignalStrength, "Error in TxSignalStrength: Seems it has been serialized even though marked as ignore");

                Assert.AreEqual(firstPeerExpected.Oids.Count, firstPeerRetrieved.Oids.Count, "Error in Oids");

                var firstOidExpected  = firstPeerRetrieved.Oids.First();
                var firstOidRetrieved = firstPeerRetrieved.Oids.First();
                Assert.AreEqual(firstOidExpected.Value.Address, firstOidRetrieved.Value.Address, "Error in Oids");
            }
        }