Exemple #1
0
        public void IsResolverInformationValid_Flat_IsValid(Boolean shouldBeValid)
        {
            Random random = new Random();

            CreateScopeResolverInformation inputModel = new CreateScopeResolverInformation();
            Int32 propertyAmount = random.Next(3, 30);

            for (int i = 0; i < propertyAmount; i++)
            {
                inputModel.PropertiesAndValues.Add($"property-{i + 1}", $"{random.Next()}");
            }

            Mock <ISerializer>         serializerMock = new Mock <ISerializer>(MockBehavior.Strict);
            DHCPv6ScopeResolverManager scopeManager   = new DHCPv6ScopeResolverManager(serializerMock.Object, Mock.Of <IDeviceService>(MockBehavior.Strict), Mock.Of <ILogger <DHCPv6ScopeResolverManager> >());

            Mock <IScopeResolver <DHCPv6Packet, IPv6Address> > resolverMock = new Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            resolverMock.Setup(x => x.ArePropertiesAndValuesValid(inputModel.PropertiesAndValues, serializerMock.Object)).Returns(shouldBeValid);

            String typeName = $"typname-{random.Next()}";

            scopeManager.AddOrUpdateScopeResolver(typeName, () => resolverMock.Object);
            inputModel.Typename = typeName;

            Boolean actual = scopeManager.IsResolverInformationValid(inputModel);

            Assert.Equal(shouldBeValid, actual);

            resolverMock.Verify(x => x.ArePropertiesAndValuesValid(inputModel.PropertiesAndValues, serializerMock.Object), Times.Once());
        }
Exemple #2
0
        protected static CreateScopeResolverInformation GetMockupResolver(
            IEnumerable <DHCPv6Packet> packets,
            out Mock <IScopeResolverManager <DHCPv6Packet, IPv6Address> > scopeResolverMock,
            Byte[] uniqueIdentifierValue = null
            )
        {
            CreateScopeResolverInformation resolverInformations = new CreateScopeResolverInformation {
                Typename = "something"
            };

            scopeResolverMock = new Mock <IScopeResolverManager <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            Mock <IScopeResolver <DHCPv6Packet, IPv6Address> > resolverMock = new Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            foreach (var packet in packets)
            {
                resolverMock.Setup(x => x.PacketMeetsCondition(packet)).Returns(true);
                resolverMock.SetupGet(x => x.HasUniqueIdentifier).Returns(uniqueIdentifierValue != null);
                if (uniqueIdentifierValue != null)
                {
                    resolverMock.Setup(x => x.GetUniqueIdentifier(packet)).Returns(uniqueIdentifierValue);
                }
            }

            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(resolverMock.Object);

            return(resolverInformations);
        }
Exemple #3
0
        public void HandleInform_InformsAreAllowed()
        {
            Random      random        = new Random();
            IPv4Address clientAddress = IPv4Address.FromString("192.168.178.10");

            IPv4HeaderInformation headerInformation =
                new IPv4HeaderInformation(clientAddress, IPv4Address.FromString("192.168.178.1"));

            Byte[] clientMacAdress = random.NextBytes(6);

            DHCPv4Packet requestPacket = new DHCPv4Packet(
                headerInformation, clientMacAdress, (UInt32)random.Next(),
                IPv4Address.Empty, IPv4Address.Empty, clientAddress,
                DHCPv4PacketFlags.Unicast,
                new DHCPv4PacketMessageTypeOption(DHCPv4MessagesTypes.Inform)
                );

            Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> > scopeResolverMock =
                new Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            var resolverInformations = new CreateScopeResolverInformation
            {
                Typename = nameof(DHCPv4RelayAgentSubnetResolver),
            };

            Mock <IScopeResolver <DHCPv4Packet, IPv4Address> > resolverMock = new Mock <IScopeResolver <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(resolverMock.Object);

            Guid scopeId = random.NextGuid();

            DHCPv4RootScope rootScope = GetRootScope(scopeResolverMock);

            rootScope.Load(new List <DomainEvent> {
                new DHCPv4ScopeEvents.DHCPv4ScopeAddedEvent(
                    new DHCPv4ScopeCreateInstruction
                {
                    AddressProperties = new DHCPv4ScopeAddressProperties(
                        IPv4Address.FromString("192.168.178.1"),
                        IPv4Address.FromString("192.168.178.255"),
                        new List <IPv4Address> {
                        IPv4Address.FromString("192.168.178.1")
                    },
                        informsAreAllowd: true
                        ),
                    ResolverInformation = resolverInformations,
                    Name = "Testscope",
                    Id   = scopeId,
                })
            });

            DHCPv4Packet result = rootScope.HandleInform(requestPacket);

            CheckAcknowledgePacket(clientAddress, result);

            CheckEventAmount(1, rootScope);
            CheckHandeledEvent(0, InformErros.NoError, requestPacket, result, rootScope);
        }
Exemple #4
0
        protected static CreateScopeResolverInformation GetMockupPseudoResolver(out Mock <IScopeResolverManager <DHCPv6Packet, IPv6Address> > scopeResolverMock)
        {
            CreateScopeResolverInformation resolverInformations = new CreateScopeResolverInformation {
                Typename = "something"
            };

            scopeResolverMock = new Mock <IScopeResolverManager <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(new DHCPv6PseudoResolver());

            return(resolverInformations);
        }
Exemple #5
0
        public override Boolean UpdateScopeResolver(Guid scopeId, CreateScopeResolverInformation resolverInformation)
        {
            CheckIfScopeResolverIsValid(scopeId, resolverInformation);
            if (CheckIfScopeResolverHasChanged(scopeId, resolverInformation) == false)
            {
                return(false);
            }

            base.Apply(new DHCPv6ScopeResolverUpdatedEvent(scopeId, resolverInformation));

            CancelAllLeasesBecauseOfChangeOfResolver(scopeId);
            return(true);
        }
Exemple #6
0
        public IScopeResolver <TPacket, TAddress> InitializeResolver(CreateScopeResolverInformation resolverCreateModel)
        {
            IScopeResolver <TPacket, TAddress> resolver = GetResolverFromCreateModel(resolverCreateModel, true);

            if (resolver is IScopeResolverContainingOtherResolvers <TPacket, TAddress> == true)
            {
                var resolverContainingOthers = (IScopeResolverContainingOtherResolvers <TPacket, TAddress>)resolver;
                IEnumerable <CreateScopeResolverInformation> innenrResolvers = resolverContainingOthers.ExtractResolverCreateModels(resolverCreateModel, _serializer);
                GenerateResolverTree(innenrResolvers, resolverContainingOthers);
            }

            return(resolver);
        }
Exemple #7
0
        public void IsResolverInformationValid_ResolverTypeNotFound()
        {
            Random random = new Random();
            CreateScopeResolverInformation inputModel = new CreateScopeResolverInformation();

            DHCPv6ScopeResolverManager scopeManager = new DHCPv6ScopeResolverManager(Mock.Of <ISerializer>(MockBehavior.Strict), Mock.Of <IDeviceService>(MockBehavior.Strict), Mock.Of <ILogger <DHCPv6ScopeResolverManager> >());

            String typeName = $"typname-{random.Next()}";

            inputModel.Typename = typeName;

            Boolean actual = scopeManager.IsResolverInformationValid(inputModel);

            Assert.False(actual);
        }
Exemple #8
0
        public void InitializeResolver_Fail_TypeNotFound()
        {
            Random random = new Random();
            CreateScopeResolverInformation inputModel = new CreateScopeResolverInformation();

            Mock <ISerializer> serializerMock = new Mock <ISerializer>(MockBehavior.Strict);

            DHCPv6ScopeResolverManager scopeManager = new DHCPv6ScopeResolverManager(Mock.Of <ISerializer>(MockBehavior.Strict), Mock.Of <IDeviceService>(MockBehavior.Strict), Mock.Of <ILogger <DHCPv6ScopeResolverManager> >());

            String typeName = $"typname-{random.Next()}";

            inputModel.Typename = typeName;

            Exception exp = Assert.Throws <Exception>(() => scopeManager.InitializeResolver(inputModel));

            Assert.NotNull(exp);
        }
Exemple #9
0
        private IScopeResolver <TPacket, TAddress> GetResolverFromCreateModel(CreateScopeResolverInformation resolverCreateModel, Boolean applyValues)
        {
            String normalizeNamed = GetNormalizedMapperName(resolverCreateModel.Typename);

            if (_resolverMapper.ContainsKey(normalizeNamed) == false)
            {
                throw new Exception();
            }

            IScopeResolver <TPacket, TAddress> resolver = _resolverMapper[normalizeNamed].Invoke();

            if (applyValues == true)
            {
                resolver.ApplyValues(resolverCreateModel.PropertiesAndValues, _serializer);
            }

            return(resolver);
        }
Exemple #10
0
        private static CreateScopeResolverInformation GetMockupResolver(
            DHCPv6Packet packet,
            out Mock <IScopeResolverManager <DHCPv6Packet, IPv6Address> > scopeResolverMock
            )
        {
            CreateScopeResolverInformation resolverInformations = new CreateScopeResolverInformation {
                Typename = "something"
            };

            scopeResolverMock = new Mock <IScopeResolverManager <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            Mock <IScopeResolver <DHCPv6Packet, IPv6Address> > resolverMock = new Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            resolverMock.Setup(x => x.PacketMeetsCondition(packet)).Returns(true);
            resolverMock.SetupGet(x => x.HasUniqueIdentifier).Returns(false);
            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(resolverMock.Object);

            return(resolverInformations);
        }
Exemple #11
0
        public bool IsResolverInformationValid(CreateScopeResolverInformation resolverCreateModel)
        {
            if (resolverCreateModel == null || String.IsNullOrEmpty(resolverCreateModel.Typename) == true)
            {
                return(false);
            }

            String normalizeNamed = GetNormalizedMapperName(resolverCreateModel.Typename);

            if (_resolverMapper.ContainsKey(normalizeNamed) == false)
            {
                return(false);
            }

            IScopeResolver <TPacket, TAddress> resolver = _resolverMapper[normalizeNamed].Invoke();

            Boolean result = resolver.ArePropertiesAndValuesValid(resolverCreateModel.PropertiesAndValues, _serializer);

            if (result == true && resolver is IScopeResolverContainingOtherResolvers <TPacket, TAddress> resolvers)
            {
                var resolverContainingOthers = resolvers;
                IEnumerable <CreateScopeResolverInformation> innenrResolvers = resolverContainingOthers.ExtractResolverCreateModels(resolverCreateModel, _serializer);

                foreach (CreateScopeResolverInformation item in innenrResolvers)
                {
                    Boolean childResult = IsResolverInformationValid(item);
                    if (childResult == false)
                    {
                        result = false;
                        break;
                    }
                }
            }

            return(result);
        }
Exemple #12
0
        public void HandleRelease_LeaseExists_AddressIsActive_NotSentDiscover()
        {
            Random      random        = new Random();
            IPv4Address leasedAddress = IPv4Address.FromString("192.168.178.10");

            IPv4HeaderInformation headerInformation =
                new IPv4HeaderInformation(leasedAddress, IPv4Address.FromString("192.168.178.1"));

            Byte[] clientMacAdress = random.NextBytes(6);

            DHCPv4Packet requestPacket = new DHCPv4Packet(
                headerInformation, clientMacAdress, (UInt32)random.Next(),
                IPv4Address.Empty, IPv4Address.Empty, IPv4Address.Empty,
                DHCPv4PacketFlags.Unicast,
                new DHCPv4PacketMessageTypeOption(DHCPv4MessagesTypes.Release)
                );

            DHCPv4Packet discoverPacket = new DHCPv4Packet(
                headerInformation, clientMacAdress, (UInt32)random.Next(),
                IPv4Address.Empty, IPv4Address.Empty, IPv4Address.Empty,
                DHCPv4PacketFlags.Broadcast,
                new DHCPv4PacketMessageTypeOption(DHCPv4MessagesTypes.Discover),
                new DHCPv4PacketClientIdentifierOption(DHCPv4ClientIdentifier.FromIdentifierValue("random test client"))
                );

            Mock <IScopeResolver <DHCPv4Packet, IPv4Address> > resolverMock = new Mock <IScopeResolver <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            resolverMock.Setup(x => x.PacketMeetsCondition(discoverPacket)).Returns(true);
            resolverMock.SetupGet(x => x.HasUniqueIdentifier).Returns(false);

            Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> > scopeResolverMock =
                new Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            var resolverInformations = new CreateScopeResolverInformation
            {
                Typename = nameof(DHCPv4RelayAgentSubnetResolver),
            };

            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(resolverMock.Object);

            Guid scopeId = random.NextGuid();
            Guid leaseId = random.NextGuid();

            DateTime        leaseCreatedAt = DateTime.UtcNow.AddHours(-1);
            DHCPv4RootScope rootScope      = GetRootScope(scopeResolverMock);

            rootScope.Load(new List <DomainEvent> {
                new DHCPv4ScopeEvents.DHCPv4ScopeAddedEvent(
                    new DHCPv4ScopeCreateInstruction
                {
                    AddressProperties = new DHCPv4ScopeAddressProperties(
                        IPv4Address.FromString("192.168.178.1"),
                        IPv4Address.FromString("192.168.178.255"),
                        new List <IPv4Address> {
                        IPv4Address.FromString("192.168.178.1")
                    },
                        leaseTime: TimeSpan.FromDays(1),
                        renewalTime: TimeSpan.FromHours(12),
                        preferredLifetime: TimeSpan.FromHours(18),
                        reuseAddressIfPossible: true,
                        acceptDecline: true,
                        addressAllocationStrategy: DHCPv4ScopeAddressProperties.AddressAllocationStrategies.Next,
                        supportDirectUnicast: true,
                        maskLength: 24
                        ),
                    ResolverInformation = resolverInformations,
                    Name = "Testscope",
                    Id   = scopeId,
                }),
                new DHCPv4LeaseCreatedEvent
                {
                    EntityId         = leaseId,
                    Address          = leasedAddress,
                    ClientIdenfier   = DHCPv4ClientIdentifier.FromIdentifierValue("random test client").GetBytes(),
                    ScopeId          = scopeId,
                    UniqueIdentifier = null,
                    StartedAt        = leaseCreatedAt,
                    ValidUntil       = DateTime.UtcNow.AddDays(1),
                },
                new DHCPv4LeaseActivatedEvent
                {
                    EntityId = leaseId,
                    ScopeId  = scopeId,
                },
            });

            DHCPv4Lease existingLease = rootScope.GetScopeById(scopeId).Leases.GetLeaseById(leaseId);

            DHCPv4Packet releaseResult = rootScope.HandleRelease(requestPacket);

            Assert.Equal(DHCPv4Packet.Empty, releaseResult);

            CheckIfLeaseIsRelease(existingLease);

            CheckEventAmount(2, rootScope);
            CheckLeaseReleasedEvent(0, scopeId, rootScope, leaseId);
            CheckHandeledEvent(1, ReleaseError.NoError, requestPacket, rootScope);

            DHCPv4Packet discoveryResult    = rootScope.HandleDiscover(discoverPacket);
            IPv4Address  newAssignedAddress = IPv4Address.FromString("192.168.178.2");

            Assert.Equal(newAssignedAddress, discoveryResult.YourIPAdress);
        }
Exemple #13
0
        public void TestNotifcationTriggerForSolicitMessages(Boolean reuse, Boolean prefixRequest, Boolean hadPrefix, Boolean shouldHaveOldBinding, Boolean shouldHaveNewBinding)
        {
            Random random = new Random();
            IPv6HeaderInformation headerInformation =
                new IPv6HeaderInformation(IPv6Address.FromString("fe80::1"), IPv6Address.FromString("fe80::2"));

            DUID clientDuid = new UUIDDUID(random.NextGuid());

            UInt32 iaId = random.NextBoolean() == false?random.NextUInt32() : 0;

            IPv6Address leasedAddress = IPv6Address.FromString("fe80::5");

            UInt32 prefixIaId = random.NextBoolean() == false?random.NextUInt32() : 0;

            Byte exisitngPrefixLength = 62;
            DHCPv6PrefixDelegation existingDelegation = DHCPv6PrefixDelegation.FromValues(
                IPv6Address.FromString("2a4c::0"), new IPv6SubnetMask(new IPv6SubnetMaskIdentifier(exisitngPrefixLength)), prefixIaId);

            var packetOptions = new List <DHCPv6PacketOption>
            {
                new DHCPv6PacketIdentifierOption(DHCPv6PacketOptionTypes.ClientIdentifier, clientDuid),
                new DHCPv6PacketIdentityAssociationNonTemporaryAddressesOption(iaId, TimeSpan.Zero, TimeSpan.Zero, Array.Empty <DHCPv6PacketSuboption>()),
            };

            if (prefixRequest == true)
            {
                packetOptions.Add(
                    new DHCPv6PacketIdentityAssociationPrefixDelegationOption(prefixIaId, TimeSpan.Zero, TimeSpan.Zero, Array.Empty <DHCPv6PacketSuboption>()));
            }

            DHCPv6Packet innerPacket = DHCPv6Packet.AsInner(random.NextUInt16(),
                                                            DHCPv6PacketTypes.REBIND, packetOptions);

            DHCPv6Packet packet = DHCPv6RelayPacket.AsOuterRelay(headerInformation, true, 1, random.GetIPv6Address(), random.GetIPv6Address(),
                                                                 new DHCPv6PacketOption[] { new DHCPv6PacketByteArrayOption(DHCPv6PacketOptionTypes.InterfaceId, random.NextBytes(10)) }, innerPacket);

            CreateScopeResolverInformation resolverInformations = new CreateScopeResolverInformation {
                Typename = "something"
            };

            Mock <IScopeResolver <DHCPv6Packet, IPv6Address> > resolverMock = new Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            resolverMock.Setup(x => x.PacketMeetsCondition(packet)).Returns(true);
            resolverMock.SetupGet(x => x.HasUniqueIdentifier).Returns(false);

            var scopeResolverMock = new Mock <IScopeResolverManager <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);

            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(resolverMock.Object);

            Mock <ILoggerFactory> factoryMock = new Mock <ILoggerFactory>(MockBehavior.Strict);

            factoryMock.Setup(x => x.CreateLogger(It.IsAny <String>())).Returns(Mock.Of <ILogger <DHCPv6RootScope> >());

            var rootScope = new DHCPv6RootScope(Guid.NewGuid(), scopeResolverMock.Object, factoryMock.Object);

            Guid scopeId = random.NextGuid();
            Guid leaseId = random.NextGuid();

            var expetecNewLeaseAddress = IPv6Address.FromString("fe80::0");
            var events = new List <DomainEvent> {
                new DHCPv6ScopeEvents.DHCPv6ScopeAddedEvent(
                    new DHCPv6ScopeCreateInstruction
                {
                    AddressProperties = new DHCPv6ScopeAddressProperties(
                        IPv6Address.FromString("fe80::0"),
                        IPv6Address.FromString("fe80::ff"),
                        new List <IPv6Address> {
                        IPv6Address.FromString("fe80::1")
                    },
                        t1: DHCPv6TimeScale.FromDouble(0.5),
                        t2: DHCPv6TimeScale.FromDouble(0.75),
                        preferredLifeTime: TimeSpan.FromDays(0.5),
                        validLifeTime: TimeSpan.FromDays(1),
                        reuseAddressIfPossible: reuse,
                        prefixDelgationInfo: DHCPv6PrefixDelgationInfo.FromValues(existingDelegation.NetworkAddress, new IPv6SubnetMaskIdentifier(40), new IPv6SubnetMaskIdentifier(64)),
                        addressAllocationStrategy: DHCPv6ScopeAddressProperties.AddressAllocationStrategies.Next),
                    ResolverInformation = resolverInformations,
                    Name = "Testscope",
                    Id   = scopeId,
                }),
                new DHCPv6LeaseCreatedEvent
                {
                    EntityId                      = leaseId,
                    Address                       = leasedAddress,
                    ClientIdentifier              = clientDuid,
                    IdentityAssocationId          = iaId,
                    ScopeId                       = scopeId,
                    HasPrefixDelegation           = hadPrefix,
                    UniqueIdentiifer              = Array.Empty <Byte>(),
                    PrefixLength                  = hadPrefix == true ? exisitngPrefixLength : (Byte)0,
                    IdentityAssocationIdForPrefix = hadPrefix == true ? prefixIaId : (UInt32)0,
                    DelegatedNetworkAddress       = hadPrefix == true ? existingDelegation.NetworkAddress : IPv6Address.Empty,
                    StartedAt                     = DateTime.UtcNow.AddDays(-1),
                    ValidUntil                    = DateTime.UtcNow.AddDays(1),
                },
                new DHCPv6LeaseActivatedEvent
                {
                    EntityId = leaseId,
                    ScopeId  = scopeId,
                }
            };

            rootScope.Load(events);

            var serverPropertiesResolverMock = new Mock <IDHCPv6ServerPropertiesResolver>(MockBehavior.Strict);

            serverPropertiesResolverMock.Setup(x => x.GetServerDuid()).Returns(new UUIDDUID(Guid.NewGuid()));

            var _ = rootScope.HandleRebind(packet, serverPropertiesResolverMock.Object);

            if (shouldHaveNewBinding == false && shouldHaveOldBinding == false)
            {
                CheckEmptyTrigger(rootScope);
            }
            else
            {
                var trigger = CheckTrigger <PrefixEdgeRouterBindingUpdatedTrigger>(rootScope);

                Assert.Equal(scopeId, trigger.ScopeId);

                if (shouldHaveNewBinding == true)
                {
                    Assert.NotNull(trigger.NewBinding);

                    Assert.Equal(64, trigger.NewBinding.Mask.Identifier);
                    if (reuse == true)
                    {
                        Assert.Equal(leasedAddress, trigger.NewBinding.Host);
                    }
                    else
                    {
                        Assert.Equal(expetecNewLeaseAddress, trigger.NewBinding.Host);
                    }
                }
                else
                {
                    Assert.Null(trigger.NewBinding);
                }

                if (shouldHaveOldBinding == true)
                {
                    Assert.NotNull(trigger.OldBinding);

                    Assert.Equal(exisitngPrefixLength, trigger.OldBinding.Mask.Identifier);
                    Assert.Equal(existingDelegation.NetworkAddress, trigger.OldBinding.Prefix);
                    Assert.Equal(leasedAddress, trigger.OldBinding.Host);
                }
                else
                {
                    Assert.Null(trigger.OldBinding);
                }
            }
        }
Exemple #14
0
        public void InitializeResolver_NotMocked()
        {
            Random random          = new Random();
            UInt32 enterpriseId    = random.NextUInt32();
            Int32  relayAgentIndex = random.Next();

            CreateScopeResolverInformation createScopeResolverInformation = new CreateScopeResolverInformation
            {
                Typename            = nameof(DHCPv6AndResolver),
                PropertiesAndValues = new Dictionary <String, String>
                {
                    { "InnerResolvers", JsonConvert.SerializeObject(new CreateScopeResolverInformation[]
                        {
                            new CreateScopeResolverInformation {
                                Typename            = nameof(DHCPv6AndResolver),
                                PropertiesAndValues = new Dictionary <String, String>
                                {
                                    { "InnerResolvers", JsonConvert.SerializeObject(new CreateScopeResolverInformation[]
                                        {
                                            new CreateScopeResolverInformation {
                                                Typename            = nameof(DHCPv6RemoteIdentifierEnterpriseNumberResolver),
                                                PropertiesAndValues = new Dictionary <String, String>
                                                {
                                                    { nameof(DHCPv6RemoteIdentifierEnterpriseNumberResolver.EnterpriseNumber), enterpriseId.ToString() },
                                                    { nameof(DHCPv6RemoteIdentifierEnterpriseNumberResolver.RelayAgentIndex), relayAgentIndex.ToString() },
                                                }
                                            }
                                        }) }
                                }
                            }
                        }) }
                }
            };

            DHCPv6ScopeResolverManager scopeManager = new DHCPv6ScopeResolverManager(
                new JSONBasedSerializer(), Mock.Of <IDeviceService>(MockBehavior.Strict), Mock.Of <ILogger <DHCPv6ScopeResolverManager> >());

            scopeManager.AddOrUpdateScopeResolver(nameof(DHCPv6AndResolver), () => new DHCPv6AndResolver());
            scopeManager.AddOrUpdateScopeResolver(nameof(DHCPv6RemoteIdentifierEnterpriseNumberResolver), () => new DHCPv6RemoteIdentifierEnterpriseNumberResolver(Mock.Of <ILogger <DHCPv6RemoteIdentifierEnterpriseNumberResolver> >()));

            var firstLevelResolver = scopeManager.InitializeResolver(createScopeResolverInformation);

            Assert.NotNull(firstLevelResolver);

            Assert.IsAssignableFrom <DHCPv6AndResolver>(firstLevelResolver);

            DHCPv6AndResolver firstLevelAndResolver = (DHCPv6AndResolver)firstLevelResolver;

            Assert.Single(firstLevelAndResolver.GetScopeResolvers());

            var secondLevelResolver = firstLevelAndResolver.GetScopeResolvers().First();

            Assert.IsAssignableFrom <DHCPv6AndResolver>(secondLevelResolver);

            DHCPv6AndResolver secondLevelAndResolver = (DHCPv6AndResolver)secondLevelResolver;

            Assert.Single(secondLevelAndResolver.GetScopeResolvers());

            var innerResolver = secondLevelAndResolver.GetScopeResolvers().First();

            Assert.IsAssignableFrom <DHCPv6RemoteIdentifierEnterpriseNumberResolver>(innerResolver);

            DHCPv6RemoteIdentifierEnterpriseNumberResolver innerCasedResolver = (DHCPv6RemoteIdentifierEnterpriseNumberResolver)innerResolver;

            Assert.Equal(enterpriseId, innerCasedResolver.EnterpriseNumber);
            Assert.Equal(relayAgentIndex, innerCasedResolver.RelayAgentIndex);
        }
Exemple #15
0
        public void IsResolverInformationValid_ComplexStructure(Boolean shouldBeValid)
        {
            for (int seed = 1; seed <= 10; seed++)
            {
                Random random = new Random(seed);

                CreateScopeResolverInformation inputModel = new CreateScopeResolverInformation
                {
                    Typename = $"typename-{random.Next()}",
                };

                Int32 propertyAmount = random.Next(3, 30);
                for (int i = 0; i < propertyAmount; i++)
                {
                    inputModel.PropertiesAndValues.Add($"property-{i + 1}", $"{random.Next()}");
                }

                Mock <ISerializer>         serializerMock = new Mock <ISerializer>(MockBehavior.Strict);
                DHCPv6ScopeResolverManager scopeManager   = new DHCPv6ScopeResolverManager(serializerMock.Object, Mock.Of <IDeviceService>(MockBehavior.Strict), Mock.Of <ILogger <DHCPv6ScopeResolverManager> >());

                Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> > resolverMock = new Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);
                resolverMock.Setup(x => x.ArePropertiesAndValuesValid(inputModel.PropertiesAndValues, serializerMock.Object)).Returns(true);

                Dictionary <String, Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> > mocksWithChildren =
                    new Dictionary <string, Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> >
                {
                    {
                        inputModel.Typename,
                        new Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation>(
                            resolverMock, inputModel)
                    }
                };

                Dictionary <String, Tuple <Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> > mocksWithoutChildren = new Dictionary <string, Tuple <Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> >
                                                                                                                                                            ();

                GenerateResolverTreeForValidation(serializerMock, resolverMock, inputModel, mocksWithChildren, mocksWithoutChildren, random, random.NextDouble());

                foreach (var item in mocksWithChildren)
                {
                    scopeManager.AddOrUpdateScopeResolver(item.Key, () => item.Value.Item1.Object);
                }

                foreach (var item in mocksWithoutChildren)
                {
                    scopeManager.AddOrUpdateScopeResolver(item.Key, () => item.Value.Item1.Object);
                }

                if (shouldBeValid == false)
                {
                    if (random.NextDouble() > 0.5)
                    {
                        var item = mocksWithChildren.ElementAt(random.Next(0, mocksWithChildren.Count));
                        item.Value.Item1.Setup(x => x.ArePropertiesAndValuesValid(item.Value.Item2.PropertiesAndValues, serializerMock.Object)).Returns(false);
                    }
                    else
                    {
                        var item = mocksWithoutChildren.ElementAt(random.Next(0, mocksWithoutChildren.Count));
                        item.Value.Item1.Setup(x => x.ArePropertiesAndValuesValid(item.Value.Item2.PropertiesAndValues, serializerMock.Object)).Returns(false);
                    }
                }

                Boolean actual = scopeManager.IsResolverInformationValid(inputModel);
                Assert.Equal(shouldBeValid, actual);

                var times = Times.AtMost(1);
                if (shouldBeValid == true)
                {
                    times = Times.Exactly(1);
                }

                foreach (var item in mocksWithChildren)
                {
                    item.Value.Item1.Verify(x => x.ArePropertiesAndValuesValid(item.Value.Item2.PropertiesAndValues, serializerMock.Object), times);
                    item.Value.Item1.Verify(x => x.ExtractResolverCreateModels(item.Value.Item2, serializerMock.Object), times);
                }

                foreach (var item in mocksWithoutChildren)
                {
                    item.Value.Item1.Verify(x => x.ArePropertiesAndValuesValid(item.Value.Item2.PropertiesAndValues, serializerMock.Object), times);
                }
            }
        }
Exemple #16
0
        private void GenerateResolverTreeForValidation(
            Mock <ISerializer> seralizerMock,
            Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> > parent,
            CreateScopeResolverInformation parentCreateModel,
            Dictionary <String, Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> > typeNameToResolverContainingOtherMapper,
            Dictionary <String, Tuple <Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> > typeNameToResolverMapper,
            Random random, Double value)
        {
            List <CreateScopeResolverInformation> childCreateModels = new List <CreateScopeResolverInformation>();

            parent.Setup(x => x.ExtractResolverCreateModels(parentCreateModel, seralizerMock.Object)).Returns(childCreateModels);

            if (value > 1)
            {
                return;
            }

            Int32 childAmount = random.Next(3, 10);

            for (int i = 0; i < childAmount; i++)
            {
                CreateScopeResolverInformation childCreateModel = new CreateScopeResolverInformation
                {
                    Typename = $"typename-{random.Next()}",
                };

                childCreateModels.Add(childCreateModel);

                Int32 propertyAmount = random.Next(3, 30);
                for (int j = 0; j < propertyAmount; j++)
                {
                    childCreateModel.PropertiesAndValues.Add($"property-{j + 1}", $"{random.Next()}");
                }

                Boolean containingOthers = random.NextDouble() > 0.5;
                IScopeResolver <DHCPv6Packet, IPv6Address> childElement = null;
                if (containingOthers == true)
                {
                    Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> > child = new Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);
                    child.Setup(x => x.ArePropertiesAndValuesValid(childCreateModel.PropertiesAndValues, seralizerMock.Object)).Returns(true);

                    childElement = child.Object;

                    typeNameToResolverContainingOtherMapper.Add(childCreateModel.Typename,
                                                                new Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation>(
                                                                    child,
                                                                    childCreateModel));

                    GenerateResolverTreeForValidation(seralizerMock, child, childCreateModel, typeNameToResolverContainingOtherMapper, typeNameToResolverMapper, random, value + random.NextDouble());
                }
                else
                {
                    Mock <IScopeResolver <DHCPv6Packet, IPv6Address> > resolverMock = new Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);
                    resolverMock.Setup(x => x.ArePropertiesAndValuesValid(childCreateModel.PropertiesAndValues, seralizerMock.Object)).Returns(true);

                    childElement = resolverMock.Object;
                    typeNameToResolverMapper.Add(childCreateModel.Typename, new Tuple <Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation>(resolverMock, childCreateModel));
                }

                parent.Setup(x => x.AddResolver(childElement)).Returns(true);
            }
        }
Exemple #17
0
        public void HandleDecline_AcceptDecline_RequesAddressExits_LeaseExists_LeaseIsPending_AddressIsNotSuspended()
        {
            Random random = new Random();

            IPv4Address leasedAddress = IPv4Address.FromString("192.168.178.3");

            DHCPv4Packet requestPacket = GetDeclinePacket(random, leasedAddress);

            Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> > scopeResolverMock =
                new Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            var resolverInformations = new CreateScopeResolverInformation
            {
                Typename = nameof(DHCPv4RelayAgentSubnetResolver),
            };

            Mock <IScopeResolver <DHCPv4Packet, IPv4Address> > resolverMock = new Mock <IScopeResolver <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(resolverMock.Object);

            Guid scopeId = random.NextGuid();
            Guid leaseId = random.NextGuid();

            DateTime        leaseCreatedAt = DateTime.UtcNow.AddHours(-1);
            DHCPv4RootScope rootScope      = GetRootScope(scopeResolverMock);

            rootScope.Load(new List <DomainEvent> {
                new DHCPv4ScopeEvents.DHCPv4ScopeAddedEvent(
                    new DHCPv4ScopeCreateInstruction
                {
                    AddressProperties = new DHCPv4ScopeAddressProperties(
                        IPv4Address.FromString("192.168.178.0"),
                        IPv4Address.FromString("192.168.178.100"),
                        new List <IPv4Address> {
                        IPv4Address.FromString("192.168.178.0")
                    },
                        leaseTime: TimeSpan.FromDays(1),
                        acceptDecline: true),
                    ResolverInformation = resolverInformations,
                    Name = "Testscope",
                    Id   = scopeId,
                }),
                new DHCPv4LeaseCreatedEvent
                {
                    EntityId         = leaseId,
                    Address          = leasedAddress,
                    ClientIdenfier   = DHCPv4ClientIdentifier.FromHwAddress(requestPacket.ClientHardwareAddress).GetBytes(),
                    ScopeId          = scopeId,
                    UniqueIdentifier = null,
                    StartedAt        = leaseCreatedAt,
                    ValidUntil       = DateTime.UtcNow.AddDays(1),
                },
            });

            DHCPv4Packet result = rootScope.HandleDecline(requestPacket);

            Assert.Equal(DHCPv4Packet.Empty, result);

            DHCPv4Lease lease = rootScope.GetScopeById(scopeId).Leases.GetLeaseById(leaseId);

            Assert.Equal(LeaseStates.Suspended, lease.State);

            CheckEventAmount(2, rootScope);
            CheckDeclineEvent(0, leaseId, leasedAddress, scopeId, rootScope);
            CheckDeclinedEvent(1, DeclineErros.NoError, requestPacket, rootScope, scopeId);
        }
Exemple #18
0
        public void HandleRelease_LeaseExists_AddressIsActive()
        {
            Random      random        = new Random();
            IPv4Address leasedAddress = IPv4Address.FromString("192.168.178.10");

            IPv4HeaderInformation headerInformation =
                new IPv4HeaderInformation(leasedAddress, IPv4Address.FromString("192.168.178.1"));

            Byte[] clientMacAdress = random.NextBytes(6);

            DHCPv4Packet requestPacket = new DHCPv4Packet(
                headerInformation, clientMacAdress, (UInt32)random.Next(),
                IPv4Address.Empty, IPv4Address.Empty, IPv4Address.Empty,
                DHCPv4PacketFlags.Unicast,
                new DHCPv4PacketMessageTypeOption(DHCPv4MessagesTypes.Release)
                );

            Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> > scopeResolverMock =
                new Mock <IScopeResolverManager <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            var resolverInformations = new CreateScopeResolverInformation
            {
                Typename = nameof(DHCPv4RelayAgentSubnetResolver),
            };

            Mock <IScopeResolver <DHCPv4Packet, IPv4Address> > resolverMock = new Mock <IScopeResolver <DHCPv4Packet, IPv4Address> >(MockBehavior.Strict);

            scopeResolverMock.Setup(x => x.InitializeResolver(resolverInformations)).Returns(resolverMock.Object);

            Guid scopeId = random.NextGuid();
            Guid leaseId = random.NextGuid();

            DateTime        leaseCreatedAt = DateTime.UtcNow.AddHours(-1);
            DHCPv4RootScope rootScope      = GetRootScope(scopeResolverMock);

            rootScope.Load(new List <DomainEvent> {
                new DHCPv4ScopeEvents.DHCPv4ScopeAddedEvent(
                    new DHCPv4ScopeCreateInstruction
                {
                    AddressProperties = new DHCPv4ScopeAddressProperties(
                        IPv4Address.FromString("192.168.178.1"),
                        IPv4Address.FromString("192.168.178.255"),
                        new List <IPv4Address> {
                        IPv4Address.FromString("192.168.178.1")
                    },
                        leaseTime: TimeSpan.FromDays(1)
                        ),
                    ResolverInformation = resolverInformations,
                    Name = "Testscope",
                    Id   = scopeId,
                }),
                new DHCPv4LeaseCreatedEvent
                {
                    EntityId         = leaseId,
                    Address          = leasedAddress,
                    ClientIdenfier   = DHCPv4ClientIdentifier.FromHwAddress(clientMacAdress).GetBytes(),
                    ScopeId          = scopeId,
                    UniqueIdentifier = null,
                    StartedAt        = leaseCreatedAt,
                    ValidUntil       = DateTime.UtcNow.AddDays(1),
                },
                new DHCPv4LeaseActivatedEvent
                {
                    EntityId = leaseId,
                    ScopeId  = scopeId,
                },
            });
            DHCPv4Lease lease = rootScope.GetScopeById(scopeId).Leases.GetLeaseById(leaseId);

            DHCPv4Packet result = rootScope.HandleRelease(requestPacket);

            Assert.Equal(DHCPv4Packet.Empty, result);

            CheckIfLeaseIsRelease(lease);

            CheckEventAmount(2, rootScope);
            CheckLeaseReleasedEvent(0, scopeId, rootScope, leaseId);
            CheckHandeledEvent(1, ReleaseError.NoError, requestPacket, rootScope);
        }
Exemple #19
0
 public DHCPv4ScopeResolverUpdatedEvent(Guid scopeId, CreateScopeResolverInformation information) : base(scopeId)
 {
     ResolverInformationen = information;
 }
Exemple #20
0
        public void InitializeResolver_ComplexStructure()
        {
            for (int seed = 1; seed <= 10; seed++)
            {
                Random random = new Random(seed);

                CreateScopeResolverInformation inputModel = new CreateScopeResolverInformation
                {
                    Typename = $"typename-{random.Next()}",
                };

                Int32 propertyAmount = random.Next(3, 30);
                for (int i = 0; i < propertyAmount; i++)
                {
                    inputModel.PropertiesAndValues.Add($"property-{i + 1}", $"{random.Next()}");
                }

                Mock <ISerializer> serializerMock = new Mock <ISerializer>(MockBehavior.Strict);

                DHCPv6ScopeResolverManager scopeManager = new DHCPv6ScopeResolverManager(serializerMock.Object, Mock.Of <IDeviceService>(MockBehavior.Strict), Mock.Of <ILogger <DHCPv6ScopeResolverManager> >());

                Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> > resolverMock = new Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >(MockBehavior.Strict);
                resolverMock.Setup(x => x.ApplyValues(inputModel.PropertiesAndValues, serializerMock.Object));

                Dictionary <String, Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation, List <IScopeResolver <DHCPv6Packet, IPv6Address> > > > mocksWithChildren =
                    new Dictionary <string, Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation, List <IScopeResolver <DHCPv6Packet, IPv6Address> > > >
                {
                    {
                        inputModel.Typename,
                        new Tuple <Mock <IScopeResolverContainingOtherResolvers <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation, List <IScopeResolver <DHCPv6Packet, IPv6Address> > >(
                            resolverMock, inputModel, new List <IScopeResolver <DHCPv6Packet, IPv6Address> >())
                    }
                };

                Dictionary <String, Tuple <Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> > mocksWithoutChildren =
                    new Dictionary <string, Tuple <Mock <IScopeResolver <DHCPv6Packet, IPv6Address> >, CreateScopeResolverInformation> >();

                GenerateResolverTree(serializerMock, true, resolverMock, inputModel, mocksWithChildren, mocksWithoutChildren, random, random.NextDouble());

                foreach (var item in mocksWithChildren)
                {
                    scopeManager.AddOrUpdateScopeResolver(item.Key, () => item.Value.Item1.Object);
                }

                foreach (var item in mocksWithoutChildren)
                {
                    scopeManager.AddOrUpdateScopeResolver(item.Key, () => item.Value.Item1.Object);
                }

                IScopeResolver <DHCPv6Packet, IPv6Address> actual = scopeManager.InitializeResolver(inputModel);
                Assert.Equal(resolverMock.Object, actual);


                foreach (var item in mocksWithChildren)
                {
                    item.Value.Item1.Verify(x => x.ApplyValues(item.Value.Item2.PropertiesAndValues, serializerMock.Object), Times.Once());
                    item.Value.Item1.Verify(x => x.ExtractResolverCreateModels(item.Value.Item2, serializerMock.Object), Times.Once());
                    foreach (var scopeResolver in item.Value.Item3)
                    {
                        item.Value.Item1.Verify(x => x.AddResolver(scopeResolver), Times.Once());
                    }
                }

                foreach (var item in mocksWithoutChildren)
                {
                    item.Value.Item1.Verify(x => x.ApplyValues(item.Value.Item2.PropertiesAndValues, serializerMock.Object), Times.Once());
                }
            }
        }