Add v6 rebinding test when all leases are expired
authorAdrian-Ken Rueegsegger <ken@codelabs.ch>
Mon, 4 Nov 2019 15:58:37 +0000 (16:58 +0100)
committerReto Buerki <reet@codelabs.ch>
Thu, 7 Nov 2019 15:50:38 +0000 (16:50 +0100)
Check that discovery is restarted when all leases are expired after
processing a reply, e.g. by the server explicitly setting lease lifetime
to 0.

tests/v6/dhcpv6-states-rebinding-tests.adb

index 84b8491..29d40a2 100644 (file)
@@ -95,161 +95,244 @@ is
 
    procedure Process_Reply_Message
    is
-      use type DHCP.Notify.Reason_Type;
-      use type OI.Option_Type'Class;
-
-      Now     : constant Ada.Real_Time.Time := Ada.Real_Time.Clock;
-      Old_SID : constant OI.Raw_Option_Type := OI.Raw_Option_Type
-        (OI.Create
-           (Name => Options.Server_Identifier,
-            Data => (16#ff#, 16#ff#, 16#00#, 16#01#, 16#ff#, 16#95#, 16#ff#,
-                     16#ff#, 16#08#, 16#00#, 16#27#, 16#5d#, 16#ff#, 16#ff#)));
-      Ref_DNS : constant OI.Option_Type'Class := OI.Create
-        (Name => Options.Name_Servers,
-         Data => (16#20#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
-                  16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
-                  16#00#, 16#ff#, 16#20#, 16#00#, 16#00#, 16#00#, 16#00#,
-                  16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
-                  16#00#, 16#00#, 16#00#, 16#fe#));
-      IA_Addr : constant OI6.IA_Address_Option_Type
-        := OI6.IA_Address_Option_Type
-          (Options.Inst.Create
-             (Name => Options.IA_Address,
-              Data => (16#20#, 16#01#, 16#0d#, 16#00#, 16#00#, 16#01#,
-                       16#00#, 16#02#, 16#00#, 16#00#, 16#00#, 16#00#,
-                       16#00#, 16#00#, 16#12#, 16#01#, 16#00#, 16#00#,
-                       16#1c#, 16#1f#, 16#00#, 16#00#, 16#2d#, 16#4c#)));
-
-      T   : Transactions.Mock.Transaction_Type;
-      Msg : Message.Message_Type := Message.Create
-        (Kind => Message.Reply);
-
-      Dummy_1 : DHCP.Timer.Test.Cleaner_Type;
-      Dummy_2 : Database.Mock.Cleaner;
-      Dummy_3 : DHCP.Notify.Mock.Notify_Cleaner;
-   begin
-      DHCP.Notify.Mock.Install;
-      Database.Initialize (Client_ID => Database.Mock.Ref_Client_ID);
-      Database.Add_Global_Option (Opt => Old_SID);
 
-      Msg.Add_Option (Opt => Database.Mock.Ref_Server_ID);
-      Msg.Add_Option (Opt => Ref_DNS);
+      procedure Process_Reply;
+      --  Positive test.
+
+      procedure No_More_Leases;
+      --  Test for reply setting all lease lifetimes to 0.
+
+      ----------------------------------------------------------------------
+
+      procedure No_More_Leases
+      is
+         Now     : constant Ada.Real_Time.Time := Ada.Real_Time.Clock;
+         Old_SID : constant OI.Raw_Option_Type := OI.Raw_Option_Type
+           (OI.Create
+              (Name => Options.Server_Identifier,
+               Data => (16#ff#, 16#ff#, 16#00#, 16#01#, 16#ff#, 16#95#, 16#ff#,
+                        16#ff#, 16#08#, 16#00#, 16#27#, 16#5d#, 16#ff#,
+                        16#ff#)));
+         Ref_DNS : constant OI.Option_Type'Class := OI.Create
+           (Name => Options.Name_Servers,
+            Data => (16#20#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#ff#, 16#20#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#00#, 16#00#, 16#fe#));
+         IA_Addr : constant OI6.IA_Address_Option_Type
+           := OI6.IA_Address_Option_Type
+             (Options.Inst.Create
+                (Name => Options.IA_Address,
+                 Data => (16#20#, 16#01#, 16#0d#, 16#00#, 16#00#, 16#01#,
+                          16#00#, 16#02#, 16#00#, 16#00#, 16#00#, 16#00#,
+                          16#00#, 16#00#, 16#12#, 16#01#, 16#00#, 16#00#,
+                          16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#)));
+
+         T   : Transactions.Mock.Transaction_Type;
+         Msg : Message.Message_Type := Message.Create
+           (Kind => Message.Reply);
+
+         Dummy_1 : DHCP.Timer.Test.Cleaner_Type;
+         Dummy_2 : Database.Mock.Cleaner;
+         Dummy_3 : DHCP.Notify.Mock.Notify_Cleaner;
+      begin
+         DHCP.Notify.Mock.Install;
+         Database.Initialize (Client_ID => Database.Mock.Ref_Client_ID);
+         Database.Add_Global_Option (Opt => Old_SID);
+
+         Msg.Add_Option (Opt => Database.Mock.Ref_Server_ID);
+         Msg.Add_Option (Opt => Ref_DNS);
+
+         for I in Natural range 1 .. 3 loop
+            declare
+               IA : IAs.Identity_Association_Type := IAs.Create
+                 (IAID => DHCP.Types.IAID_Type (I));
+            begin
+               Database.Add_IA (IA => IA);
+               IAs.Set_Timestamp (IA        => IA,
+                                  Timestamp => Now);
+               IAs.Set_Timeouts (IA => IA,
+                                 T1 => Duration (I * 1000),
+                                 T2 => Duration (I * 2000));
+               IAs.Add_Address (IA      => IA,
+                                Address => IA_Addr);
+               Msg.Add_Option (Opt => IAs.To_Option (IA => IA));
+            end;
+         end loop;
+
+         States.State_Type'Class (State.all).Process_Reply_Msg
+           (Transaction => T,
+            Msg         => Msg);
+
+         Assert (Condition => T.Restart_Srv_Disc_Count = 1,
+                 Message   => "Server discovery not restarted");
+      end No_More_Leases;
+
+      ----------------------------------------------------------------------
+
+      procedure Process_Reply
+      is
+         use type DHCP.Notify.Reason_Type;
+         use type OI.Option_Type'Class;
+
+         Now     : constant Ada.Real_Time.Time := Ada.Real_Time.Clock;
+         Old_SID : constant OI.Raw_Option_Type := OI.Raw_Option_Type
+           (OI.Create
+              (Name => Options.Server_Identifier,
+               Data => (16#ff#, 16#ff#, 16#00#, 16#01#, 16#ff#, 16#95#, 16#ff#,
+                        16#ff#, 16#08#, 16#00#, 16#27#, 16#5d#, 16#ff#,
+                        16#ff#)));
+         Ref_DNS : constant OI.Option_Type'Class := OI.Create
+           (Name => Options.Name_Servers,
+            Data => (16#20#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#ff#, 16#20#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#, 16#00#,
+                     16#00#, 16#00#, 16#00#, 16#fe#));
+         IA_Addr : constant OI6.IA_Address_Option_Type
+           := OI6.IA_Address_Option_Type
+             (Options.Inst.Create
+                (Name => Options.IA_Address,
+                 Data => (16#20#, 16#01#, 16#0d#, 16#00#, 16#00#, 16#01#,
+                          16#00#, 16#02#, 16#00#, 16#00#, 16#00#, 16#00#,
+                          16#00#, 16#00#, 16#12#, 16#01#, 16#00#, 16#00#,
+                          16#1c#, 16#1f#, 16#00#, 16#00#, 16#2d#, 16#4c#)));
+
+         T   : Transactions.Mock.Transaction_Type;
+         Msg : Message.Message_Type := Message.Create
+           (Kind => Message.Reply);
+
+         Dummy_1 : DHCP.Timer.Test.Cleaner_Type;
+         Dummy_2 : Database.Mock.Cleaner;
+         Dummy_3 : DHCP.Notify.Mock.Notify_Cleaner;
+      begin
+         DHCP.Notify.Mock.Install;
+         Database.Initialize (Client_ID => Database.Mock.Ref_Client_ID);
+         Database.Add_Global_Option (Opt => Old_SID);
+
+         Msg.Add_Option (Opt => Database.Mock.Ref_Server_ID);
+         Msg.Add_Option (Opt => Ref_DNS);
+
+         for I in Natural range 1 .. 3 loop
+            declare
+               IA : IAs.Identity_Association_Type := IAs.Create
+                 (IAID => DHCP.Types.IAID_Type (I));
+            begin
+               Database.Add_IA (IA => IA);
+               IAs.Set_Timestamp (IA        => IA,
+                                  Timestamp => Now);
+               IAs.Set_Timeouts (IA => IA,
+                                 T1 => Duration (I * 1000),
+                                 T2 => Duration (I * 2000));
+               IAs.Add_Address (IA      => IA,
+                                Address => IA_Addr);
+               Msg.Add_Option (Opt => IAs.To_Option (IA => IA));
+            end;
+         end loop;
+
+         States.State_Type'Class (State.all).Process_Reply_Msg
+           (Transaction => T,
+            Msg         => Msg);
+
+         Assert (Condition => T.Reset_Count = 1,
+                 Message   => "Transaction not reset");
+         Assert (Condition => T.Reset_Retrans_Count = 1,
+                 Message   => "Transaction retransmission not canceled");
+         Assert (Condition => Database.Contains_Option
+                 (Name => Options.Name_Servers),
+                 Message   => "Name server option not stored in DB");
+         Assert (Condition => Database.Get_Global_Options.Get
+                 (Name => Options.Name_Servers) = Ref_DNS,
+                 Message   => "Name server option mismatch");
+         Assert (Condition => Database.Contains_Option
+                 (Name => Options.Name_Servers),
+                 Message   => "Server ID missing");
 
-      for I in Natural range 1 .. 3 loop
          declare
-            IA : IAs.Identity_Association_Type := IAs.Create
-              (IAID => DHCP.Types.IAID_Type (I));
+            procedure Check_IA (IA : IAs.Identity_Association_Type);
+            procedure Check_IA (IA : IAs.Identity_Association_Type)
+            is
+               use Ada.Real_Time;
+
+               ID : constant DHCP.Types.IAID_Type := IAs.Get_ID (IA => IA);
+            begin
+               Assert (Condition => To_Duration
+                       (IAs.Get_Timestamp (IA => IA) - Now) < 1.0,
+                       Message   => "IA" & ID'Img & " Timestamp mismatch");
+               Assert (Condition => IAs.Get_T1
+                       (IA => IA) = Duration (ID) * 1000.0,
+                       Message   => "IA" & ID'Img & " T1 mismatch");
+               Assert (Condition => IAs.Get_T2
+                       (IA => IA) = Duration (ID) * 2000.0,
+                       Message   => "IA" & ID'Img & " T2 mismatch");
+               Assert (Condition => IAs.Get_Addresses (IA => IA).Get
+                       (Name => Options.IA_Address)
+                       = OI.Option_Type'Class (IA_Addr),
+                       Message   => "IA" & ID'Img & " address mismatch");
+            end Check_IA;
          begin
-            Database.Add_IA (IA => IA);
-            IAs.Set_Timestamp (IA        => IA,
-                               Timestamp => Now);
-            IAs.Set_Timeouts (IA => IA,
-                              T1 => Duration (I * 1000),
-                              T2 => Duration (I * 2000));
-            IAs.Add_Address (IA      => IA,
-                             Address => IA_Addr);
-            Msg.Add_Option (Opt => IAs.To_Option (IA => IA));
+            Database.Iterate (Process => Check_IA'Access);
          end;
-      end loop;
-
-      States.State_Type'Class (State.all).Process_Reply_Msg
-        (Transaction => T,
-         Msg         => Msg);
-
-      Assert (Condition => T.Reset_Count = 1,
-              Message   => "Transaction not reset");
-      Assert (Condition => T.Reset_Retrans_Count = 1,
-              Message   => "Transaction retransmission not canceled");
-      Assert (Condition => Database.Contains_Option
-              (Name => Options.Name_Servers),
-              Message   => "Name server option not stored in DB");
-      Assert (Condition => Database.Get_Global_Options.Get
-              (Name => Options.Name_Servers) = Ref_DNS,
-              Message   => "Name server option mismatch");
-      Assert (Condition => Database.Contains_Option
-              (Name => Options.Name_Servers),
-              Message   => "Server ID missing");
-
-      declare
-         procedure Check_IA (IA : IAs.Identity_Association_Type);
-         procedure Check_IA (IA : IAs.Identity_Association_Type)
-         is
+
+         Assert (Condition => DHCP.Timer.Event_Count = 3,
+                 Message   => "T1, T2 and Lease expiry timers not scheduled");
+
+         declare
             use Ada.Real_Time;
+            use type DHCP.Types.DHCP_Timer_Kind;
 
-            ID : constant DHCP.Types.IAID_Type := IAs.Get_ID (IA => IA);
+            Ev  : constant DHCP.Timing_Events.Timer_Expiry.Expiry_Type
+              := DHCP.Timing_Events.Timer_Expiry.Expiry_Type
+                (DHCP.Timer.Test.Get_Next_Event);
+            Dur : constant Duration := To_Duration (Ev.Get_Time - Now);
          begin
-            Assert (Condition => To_Duration
-                    (IAs.Get_Timestamp (IA => IA) - Now) < 1.0,
-                    Message   => "IA" & ID'Img & " Timestamp mismatch");
-            Assert (Condition => IAs.Get_T1
-                    (IA => IA) = Duration (ID) * 1000.0,
-                    Message   => "IA" & ID'Img & " T1 mismatch");
-            Assert (Condition => IAs.Get_T2
-                    (IA => IA) = Duration (ID) * 2000.0,
-                    Message   => "IA" & ID'Img & " T2 mismatch");
-            Assert (Condition => IAs.Get_Addresses (IA => IA).Get
-                    (Name => Options.IA_Address)
-                    = OI.Option_Type'Class (IA_Addr),
-                    Message   => "IA" & ID'Img & " address mismatch");
-         end Check_IA;
-      begin
-         Database.Iterate (Process => Check_IA'Access);
-      end;
+            Assert (Condition => Ev.Timer_Kind = DHCP.Types.T1,
+                    Message   => "T1 not correct timer kind");
+            Assert (Condition =>  Dur > 999.0 and then Dur < 1001.0,
+                    Message   => "T1 not in 1000 seconds");
+            DHCP.Timer.Cancel (Event => Ev);
+         end;
+
+         declare
+            use Ada.Real_Time;
+            use type DHCP.Types.DHCP_Timer_Kind;
 
-      Assert (Condition => DHCP.Timer.Event_Count = 3,
-              Message   => "T1, T2 and Lease expiry timers not scheduled");
+            Ev  : constant DHCP.Timing_Events.Timer_Expiry.Expiry_Type
+              := DHCP.Timing_Events.Timer_Expiry.Expiry_Type
+                (DHCP.Timer.Test.Get_Next_Event);
+            Dur : constant Duration := To_Duration (Ev.Get_Time - Now);
+         begin
+            Assert (Condition => Ev.Timer_Kind = DHCP.Types.T2,
+                    Message   => "T2 not correct timer kind");
+            Assert (Condition =>  Dur > 1999.0 and then Dur < 2001.0,
+                    Message   => "T2 not in 2000 seconds");
+            DHCP.Timer.Cancel (Event => Ev);
+         end;
 
-      declare
-         use Ada.Real_Time;
-         use type DHCP.Types.DHCP_Timer_Kind;
+         declare
+            use Ada.Real_Time;
+            use type DHCP.Types.DHCP_Timer_Kind;
 
-         Ev  : constant DHCP.Timing_Events.Timer_Expiry.Expiry_Type
-           := DHCP.Timing_Events.Timer_Expiry.Expiry_Type
-             (DHCP.Timer.Test.Get_Next_Event);
-         Dur : constant Duration := To_Duration (Ev.Get_Time - Now);
-      begin
-         Assert (Condition => Ev.Timer_Kind = DHCP.Types.T1,
-                 Message   => "T1 not correct timer kind");
-         Assert (Condition =>  Dur > 999.0 and then Dur < 1001.0,
-                 Message   => "T1 not in 1000 seconds");
-         DHCP.Timer.Cancel (Event => Ev);
-      end;
-
-      declare
-         use Ada.Real_Time;
-         use type DHCP.Types.DHCP_Timer_Kind;
-
-         Ev  : constant DHCP.Timing_Events.Timer_Expiry.Expiry_Type
-           := DHCP.Timing_Events.Timer_Expiry.Expiry_Type
-             (DHCP.Timer.Test.Get_Next_Event);
-         Dur : constant Duration := To_Duration (Ev.Get_Time - Now);
-      begin
-         Assert (Condition => Ev.Timer_Kind = DHCP.Types.T2,
-                 Message   => "T2 not correct timer kind");
-         Assert (Condition =>  Dur > 1999.0 and then Dur < 2001.0,
-                 Message   => "T2 not in 2000 seconds");
-         DHCP.Timer.Cancel (Event => Ev);
-      end;
-
-      declare
-         use Ada.Real_Time;
-         use type DHCP.Types.DHCP_Timer_Kind;
-
-         Ev  : constant DHCP.Timing_Events.Timer_Expiry.Expiry_Type
-           := DHCP.Timing_Events.Timer_Expiry.Expiry_Type
-             (DHCP.Timer.Test.Get_Next_Event);
-         Dur : constant Duration := To_Duration (Ev.Get_Time - Now);
-      begin
-         Assert (Condition => Ev.Timer_Kind = DHCP.Types.Lease_Expiry,
-                 Message   => "Lease expiry not correct timer kind");
-         Assert (Condition =>  Dur > 11595.0 and then Dur < 11597.0,
-                 Message   => "Lease expiry not in 11596 seconds");
-         DHCP.Timer.Cancel (Event => Ev);
-      end;
+            Ev  : constant DHCP.Timing_Events.Timer_Expiry.Expiry_Type
+              := DHCP.Timing_Events.Timer_Expiry.Expiry_Type
+                (DHCP.Timer.Test.Get_Next_Event);
+            Dur : constant Duration := To_Duration (Ev.Get_Time - Now);
+         begin
+            Assert (Condition => Ev.Timer_Kind = DHCP.Types.Lease_Expiry,
+                    Message   => "Lease expiry not correct timer kind");
+            Assert (Condition =>  Dur > 11595.0 and then Dur < 11597.0,
+                    Message   => "Lease expiry not in 11596 seconds");
+            DHCP.Timer.Cancel (Event => Ev);
+         end;
 
-      Assert
-        (Condition => DHCP.Notify.Mock.Get_Last_Reason = DHCP.Notify.Rebind,
-         Message   => "No rebind notification");
+         Assert
+           (Condition => DHCP.Notify.Mock.Get_Last_Reason = DHCP.Notify.Rebind,
+            Message   => "No rebind notification");
+      end Process_Reply;
+   begin
+      Process_Reply;
+      No_More_Leases;
    end Process_Reply_Message;
 
 end DHCPv6.States.Rebinding.Tests;