Revamped lte-cell-selection test suite with better success probability
authorBudiarto Herman <budiarto.herman@magister.fi>
Sun, 15 Sep 2013 20:54:03 +0300
changeset 10360 b3d6acea639c
parent 10359 4c5acef374ce
child 10361 858da9c4d11b
Revamped lte-cell-selection test suite with better success probability
doc/models/Makefile
src/lte/doc/Makefile
src/lte/doc/source/figures/lte-cell-selection-closed-access.dia
src/lte/doc/source/figures/lte-cell-selection-open-access.dia
src/lte/doc/source/figures/lte-cell-selection-scenario.dia
src/lte/doc/source/lte-references.rst
src/lte/doc/source/lte-testing.rst
src/lte/test/lte-test-cell-selection.cc
src/lte/test/lte-test-cell-selection.h
--- a/doc/models/Makefile	Wed Sep 11 22:51:10 2013 +0300
+++ b/doc/models/Makefile	Sun Sep 15 20:54:03 2013 +0300
@@ -117,8 +117,7 @@
 	$(SRC)/lte/doc/source/figures/ue-meas-piecewise-a1.dia \
 	$(SRC)/lte/doc/source/figures/ue-meas-piecewise-a1-hys.dia \
 	$(SRC)/lte/doc/source/figures/lte-cell-selection.dia \
-	$(SRC)/lte/doc/source/figures/lte-cell-selection-open-access.dia \
-	$(SRC)/lte/doc/source/figures/lte-cell-selection-closed-access.dia \
+	$(SRC)/lte/doc/source/figures/lte-cell-selection-scenario.dia \
 	$(SRC)/lte/doc/source/figures/lte-handover-target-scenario.dia \
 	$(SRC)/lte/doc/source/figures/lena-dual-stripe.eps \
 	$(SRC)/lte/doc/source/figures/lte-mcs-index.eps \
@@ -259,8 +258,7 @@
 	$(FIGURES)/ue-meas-piecewise-a1.eps \
 	$(FIGURES)/ue-meas-piecewise-a1-hys.eps \
 	$(FIGURES)/lte-cell-selection.eps \
-	$(FIGURES)/lte-cell-selection-open-access.eps \
-	$(FIGURES)/lte-cell-selection-closed-access.eps \
+	$(FIGURES)/lte-cell-selection-scenario.eps \
 	$(FIGURES)/lte-handover-target-scenario.eps \
 	$(FIGURES)/lena-dual-stripe.eps \
 	$(FIGURES)/lte-mcs-index.eps \
--- a/src/lte/doc/Makefile	Wed Sep 11 22:51:10 2013 +0300
+++ b/src/lte/doc/Makefile	Sun Sep 15 20:54:03 2013 +0300
@@ -38,8 +38,7 @@
 	$(FIGURES)/ue-meas-piecewise-a1.dia \
 	$(FIGURES)/ue-meas-piecewise-a1-hys.dia \
 	$(FIGURES)/lte-cell-selection.dia \
-	$(FIGURES)/lte-cell-selection-open-access.dia \
-	$(FIGURES)/lte-cell-selection-closed-access.dia \
+	$(FIGURES)/lte-cell-selection-scenario.dia \
 	$(FIGURES)/lte-handover-target-scenario.dia
 
 
Binary file src/lte/doc/source/figures/lte-cell-selection-closed-access.dia has changed
Binary file src/lte/doc/source/figures/lte-cell-selection-open-access.dia has changed
Binary file src/lte/doc/source/figures/lte-cell-selection-scenario.dia has changed
--- a/src/lte/doc/source/lte-references.rst	Wed Sep 11 22:51:10 2013 +0300
+++ b/src/lte/doc/source/lte-references.rst	Sun Sep 15 20:54:03 2013 +0300
@@ -42,8 +42,6 @@
 
 .. [TR36814] 3GPP TR 36.814 "E-UTRA Further advancements for E-UTRA physical layer aspects"
 
-.. [TS36922] 3GPP TS 36.922 "E-UTRA TDD Home eNode B (HeNB) Radio Frequency (RF) requirements analysis"
-
 .. [R1-081483] 3GPP R1-081483 `"Conveying MCS and TB size via PDCCH"
    <http://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_52b/Docs/R1-081483.zip>`_
 
--- a/src/lte/doc/source/lte-testing.rst	Wed Sep 11 22:51:10 2013 +0300
+++ b/src/lte/doc/source/lte-testing.rst	Sun Sep 15 20:54:03 2013 +0300
@@ -1019,67 +1019,30 @@
 ----------------------
 
 The test suite `lte-cell-selection` is responsible for verifying the
-:ref:`sec-initial-cell-selection` procedure. Included in the suite are 3 short
-test cases using ideal RRC protocol and the same test cases but using real RRC
-protocol.
-
-Each test case is a simulation of a small network of 4 cells. Each eNodeB is
-equipped with directional antenna (parabolic model) and is arranged so that some
-of their coverage are overlapping with other eNodeB. They are configured using
-the same Tx Power. Several static UEs are then placed at predefined locations
-and with initial cell selection procedure enabled. Thus the UEs enters the
-simulation without being attached to any cell.
+:ref:`sec-initial-cell-selection` procedure. The test is a simulation of a small 
+etwork of 4 non-CSG cells and 2 non-CSG cells. Several static UEs are then
+placed at predefined locations and with initial cell selection procedure
+enabled. Thus the UEs enters the simulation without being attached to any cell.
 
-At the end of the simulation, the test verifies that every UE is attached to the
-right cell. Moreover, the test also ensures that the UE is properly connected
-(i.e. its final state is `CONNECTED_NORMALLY`).
+At predefined check point times during the simulation, the test verifies that
+every UE is attached to the right cell. Moreover, the test also ensures that the
+UE is properly connected, i.e., its final state is `CONNECTED_NORMALLY`. Figure
+:ref:`fig-lte-cell-selection-scenario` depicts the network layout and the
+expected result.
 
-The first test case is a scenario with open access cells, i.e. without Closed
-Subscriber Group (CSG). The result shows that the UEs are attaching to the
-expected cells, as shown in Figure :ref:`fig-lte-cell-selection-open-access`
-below. Note that the grey area below each eNodeB only indicates the rough
-directivity of the antenna, while the actual cell coverage is much wider and
-larger.
+.. _fig-lte-cell-selection-scenario:
 
-.. _fig-lte-cell-selection-open-access:
-
-.. figure:: figures/lte-cell-selection-open-access.*
+.. figure:: figures/lte-cell-selection-scenario.*
    :scale: 80 %
    :align: center
 
-   Sample result of cell selection in open access scenario
-
-The second and third cases incorporate CSG into the simulation. 2 out of 4 cells
-become a single CSG and implement closed access, while the other 2 cells stay
-open. In a similar way, half of the UEs are configured as members of the CSG,
-while the rest are not. The resulting simulation is depicted in Figure
-:ref:`fig-lte-cell-selection-closed-access` below.
-
-.. _fig-lte-cell-selection-closed-access:
-
-.. figure:: figures/lte-cell-selection-closed-access.*
-   :scale: 80 %
-   :align: center
-
-   Sample result of cell selection in closed access scenario
+   Sample result of cell selection test
 
 It shows that CSG members may attach to either CSG or non-CSG cells, and simply
 choose the stronger one. On the other hand, non-members can only attach to
 non-CSG cells, even when they are actually receiving stronger signal from a CSG
 cell.
 
-The CSG scenario reveals an interference issue experienced by the UE highlighted
-in the figure above. The UE is positioned within the coverage of a CSG cell but
-it is not a member of the CSG. The CSG cell becomes a source of major
-interference to the UE and causing difficulties (i.e. low SINR) to the UE in its
-attempt to attach (i.e. receiving MIB and SIB1) to the closest non-CSG cell.
-
-A real life CSG deployment typically implements interference coordination to
-remedy such issue. Section 5.1 of [TS36922]_ describes frequency, time, and
-spatial partitioning as possible approaches to interference coordination.
-However, none of these approaches are implemented in this test suite.
-
-
 
 GTP-U protocol
 --------------
--- a/src/lte/test/lte-test-cell-selection.cc	Wed Sep 11 22:51:10 2013 +0300
+++ b/src/lte/test/lte-test-cell-selection.cc	Sun Sep 15 20:54:03 2013 +0300
@@ -25,6 +25,7 @@
 #include <ns3/log.h>
 #include <ns3/boolean.h>
 #include <ns3/double.h>
+#include <ns3/integer.h>
 
 #include <ns3/mobility-helper.h>
 #include <ns3/lte-helper.h>
@@ -55,92 +56,50 @@
 LteCellSelectionTestSuite::LteCellSelectionTestSuite ()
   : TestSuite ("lte-cell-selection", SYSTEM)
 {
-  // LogComponentEnable ("LteCellSelectionTest", LOG_PREFIX_ALL);
-  // LogComponentEnable ("LteCellSelectionTest", LOG_FUNCTION);
-  // LogComponentEnable ("LteSpectrumPhy", LOG_PREFIX_ALL);
-  // LogComponentEnable ("LteSpectrumPhy", LOG_DEBUG);
+  //LogComponentEnable ("LteCellSelectionTest", LOG_PREFIX_ALL);
+  //LogComponentEnable ("LteCellSelectionTest", LOG_FUNCTION);
+  //LogComponentEnable ("LteCellSelectionTest", LOG_INFO);
+  //LogComponentEnable ("LteSpectrumPhy", LOG_PREFIX_ALL);
+  //LogComponentEnable ("LteSpectrumPhy", LOG_DEBUG);
 
-  std::vector<LteCellSelectionTestCase::UeSetup_t> x;
+  std::ostringstream oss;
+  std::vector<LteCellSelectionTestCase::UeSetup_t> w;
 
-  /*
-   *           <--           <--
-   *    ue1---CELL3   ue2---CELL4   ue3
-   *         /                     /
-   *        /                     /
-   *       /   -->           --> /
-   *    ue4   CELL1---ue5   CELL2---ue6
-   */
-  x.clear ();                                    // position  x   y  z, csg expectedCellId
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (-80, 20, 0), 0, 3));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector ( 80, 20, 0), 0, 4));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (240, 20, 0), 0, 2));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (-80, 10, 0), 0, 3));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector ( 80, 10, 0), 0, 1));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (240, 10, 0), 0, 2));
-  AddTestCase (new LteCellSelectionTestCase ("[EPC, ideal RRC] Open access",
-                                             true, true, false, x,
-                                             MilliSeconds (261)),
-               TestCase::QUICK);
-  AddTestCase (new LteCellSelectionTestCase ("[EPC, real RRC] Open access",
-                                             true, false, false, x,
-                                             MilliSeconds (279)),
+  w.clear ();
+  //                                                     x     y    csgMember
+  //                                                     checkPoint     cell1, cell2
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.0, 1.55, false,
+                                                    MilliSeconds (266), 1, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.0, 1.45, false,
+                                                    MilliSeconds (266), 1, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 2.0,  false,
+                                                    MilliSeconds (266), 1, 4));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 1.45, false,
+                                                    MilliSeconds (341), 1, 4));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 0.55, true,
+                                                    MilliSeconds (266), 2, 5));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 0.0,  true,
+                                                    MilliSeconds (266), 3, 6));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (1.0, 0.55, true,
+                                                    MilliSeconds (266), 5, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (1.0, 0.45, true,
+                                                    MilliSeconds (266), 6, 0));
+
+  AddTestCase (new LteCellSelectionTestCase ("EPC, ideal RRC, RngNum=1",
+                                             true, true,
+                                             60.0, 20.0, w, 1),
+                                          // isd   txpow    rngrun
                TestCase::QUICK);
 
-  /*
-   *           <--           <--
-   *    ue1---CELL3   ue2---CELL4   ue3
-   *    (1)    (1)    (1)  / (0)   /(1)
-   *                      /       /
-   *           -->       /   --> /
-   *    ue4   CELL1   ue5   CELL2---ue6
-   *    (0)    (1)    (0)    (0)    (0)
-   *
-   *  DL error rate of ue4 when attached to CELL3 = 0
-   *                       when attached to CELL4 = 0.734758
-   */
-  x.clear ();                                    // position  x   y  z, csg expectedCellId
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (-80, 20, 0), 1, 3));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector ( 80, 20, 0), 1, 4));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (240, 20, 0), 1, 2));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (-80, 10, 0), 0, 0));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector ( 80, 10, 0), 0, 4));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (240, 10, 0), 0, 2));
-  AddTestCase (new LteCellSelectionTestCase ("[EPC, ideal RRC] Some CSG 1",
-                                             true, true, true, x,
-                                             MilliSeconds (261)),
-               TestCase::EXTENSIVE);
-  AddTestCase (new LteCellSelectionTestCase ("[EPC, real RRC] Some CSG 1",
-                                             true, false, true, x,
-                                             MilliSeconds (279)),
-               TestCase::EXTENSIVE);
-
-  /*
-   *           <--           <--
-   *    ue1   CELL3   ue2---CELL4   ue3
-   *    (0)  / (1)    (0)    (0)   /(0)
-   *        /                     /
-   *       /   -->           --> /
-   *    ue4   CELL1---ue5   CELL2---ue6
-   *    (1)    (1)    (1)    (0)    (1)
-   *
-   *  DL error rate of ue1 when attached to CELL3 = 0
-   *                       when attached to CELL4 = 0.777789
-   */
-  x.clear ();                                    // position  x   y  z, csg expectedCellId
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (-80, 20, 0), 0, 0));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector ( 80, 20, 0), 0, 4));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (240, 20, 0), 0, 2));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (-80, 10, 0), 1, 3));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector ( 80, 10, 0), 1, 1));
-  x.push_back (LteCellSelectionTestCase::UeSetup_t (Vector (240, 10, 0), 1, 2));
-  AddTestCase (new LteCellSelectionTestCase ("[EPC, ideal RRC] Some CSG 2",
-                                             true, true, true, x,
-                                             MilliSeconds (261)),
-               TestCase::EXTENSIVE);
-  AddTestCase (new LteCellSelectionTestCase ("[EPC, real RRC] Some CSG 2",
-                                             true, false, true, x,
-                                             MilliSeconds (279)),
-               TestCase::EXTENSIVE);
+  for (int64_t i = 2; i <= 4; i++)
+    {
+      oss.str ("");
+      oss << "EPC, ideal RRC, RngNum=" << i;
+      AddTestCase (new LteCellSelectionTestCase (oss.str (), true, true,
+                                                 60.0, 20.0, w, 1),
+                                              // isd   txpow    rngrun
+                   TestCase::TAKES_FOREVER);
+    }
 
 } // end of LteCellSelectionTestSuite::LteCellSelectionTestSuite ()
 
@@ -150,29 +109,33 @@
 
 
 /*
- * Test Case
+ * 6-cell Test Case
  */
 
 
-LteCellSelectionTestCase::UeSetup_t::UeSetup_t (Vector position,
-                                                uint32_t csgIdentity,
-                                                uint16_t expectedCellId)
-  : position (position),
-    csgIdentity (csgIdentity),
-    expectedCellId (expectedCellId)
+LteCellSelectionTestCase::UeSetup_t::UeSetup_t (
+  double relPosX, double relPosY, bool isCsgMember, Time checkPoint,
+  uint16_t expectedCellId1, uint16_t expectedCellId2)
+  : position (Vector (relPosX, relPosY, 0.0)),
+    isCsgMember (isCsgMember),
+    checkPoint (checkPoint),
+    expectedCellId1 (expectedCellId1),
+    expectedCellId2 (expectedCellId2)
 {
 }
 
 
 LteCellSelectionTestCase::LteCellSelectionTestCase (
-  std::string name, bool isEpcMode, bool isIdealRrc, bool hasCsgDiversity,
-  std::vector<UeSetup_t> ueSetupList, Time duration)
+  std::string name, bool isEpcMode, bool isIdealRrc,
+  double interSiteDistance, double enbTxPower,
+  std::vector<UeSetup_t> ueSetupList, int64_t rngRun)
   : TestCase (name),
     m_isEpcMode (isEpcMode),
     m_isIdealRrc (isIdealRrc),
-    m_hasCsgDiversity (hasCsgDiversity),
+    m_interSiteDistance (interSiteDistance),
+    m_enbTxPower (enbTxPower),
     m_ueSetupList (ueSetupList),
-    m_duration (duration)
+    m_rngRun (rngRun)
 {
   NS_LOG_FUNCTION (this << GetName ());
   m_lastState.resize (m_ueSetupList.size (), LteUeRrc::NUM_STATES);
@@ -190,6 +153,8 @@
 {
   NS_LOG_FUNCTION (this << GetName ());
 
+  Config::SetGlobal ("RngRun", IntegerValue (m_rngRun));
+
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
   lteHelper->SetAttribute ("PathlossModel",
                            StringValue ("ns3::FriisSpectrumPropagationLossModel"));
@@ -206,34 +171,35 @@
   /*
    * The topology is the following:
    *
-   *         +   <--x                <--x      - Parabolic antenna model is used
-   *         |    Cell3               Cell4    - eNodeB 1 at (  0, 10, 0), facing east
-   *    10 m |                                 - eNodeB 2 at (160, 10, 0), facing east
-   *         |                                 - eNodeB 3 at (  0, 20, 0), facing west
-   *         +      x-->                x-->   - eNodeB 4 at (160, 20, 0), facing west
-   *              Cell1               Cell2    - UEs are placed according to input
-   *                                           - UEs do not move during simulation
-   *                +------ 160 m ------+
+   * TODO
    */
 
   // Create Nodes
   NodeContainer enbNodes;
-  enbNodes.Create (4);
+  enbNodes.Create (6);
   NodeContainer ueNodes;
   uint16_t nUe = m_ueSetupList.size ();
   ueNodes.Create (nUe);
 
   // Assign nodes to position
   Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
-  positionAlloc->Add (Vector (  0.0, 10.0, 0.0));
-  positionAlloc->Add (Vector (160.0, 10.0, 0.0));
-  positionAlloc->Add (Vector (  0.0, 20.0, 0.0));
-  positionAlloc->Add (Vector (160.0, 20.0, 0.0));
-
+  // eNodeB
+  positionAlloc->Add (Vector (                0.0, 2 * m_interSiteDistance, 0.0));
+  positionAlloc->Add (Vector (                0.0,     m_interSiteDistance, 0.0));
+  positionAlloc->Add (Vector (                0.0,                     0.0, 0.0));
+  positionAlloc->Add (Vector (m_interSiteDistance, 2 * m_interSiteDistance, 0.0));
+  positionAlloc->Add (Vector (m_interSiteDistance,     m_interSiteDistance, 0.0));
+  positionAlloc->Add (Vector (m_interSiteDistance,                     0.0, 0.0));
+  // UE
   std::vector<UeSetup_t>::const_iterator itSetup;
-  for (itSetup = m_ueSetupList.begin (); itSetup != m_ueSetupList.end (); itSetup++)
+  for (itSetup = m_ueSetupList.begin ();
+       itSetup != m_ueSetupList.end (); itSetup++)
     {
-      positionAlloc->Add (itSetup->position);
+      Vector uePos (m_interSiteDistance * itSetup->position.x,
+                    m_interSiteDistance * itSetup->position.y,
+                    m_interSiteDistance * itSetup->position.z);
+      NS_LOG_INFO ("UE position " << uePos);
+      positionAlloc->Add (uePos);
     }
 
   MobilityHelper mobility;
@@ -243,34 +209,50 @@
   mobility.Install (ueNodes);
 
   // Create Devices and install them in the Nodes (eNB and UE)
-  lteHelper->SetEnbAntennaModelType ("ns3::ParabolicAntennaModel");
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth", DoubleValue (70));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxAttenuation", DoubleValue (20.0));
+  int64_t stream = 1;
   NetDeviceContainer enbDevs;
-  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (0));
-  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (0)));
-  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (1)));
-  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (180));
-  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (2)));
-  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (3)));
+  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  stream += lteHelper->AssignStreams (enbDevs, stream);
+
+  lteHelper->SetEnbCsgId (enbDevs.Get (1), 1, true); // cell ID 2
+  lteHelper->SetEnbCsgId (enbDevs.Get (4), 1, true); // cell ID 5
 
   NetDeviceContainer ueDevs;
   ueDevs = lteHelper->InstallUeDevice (ueNodes);
+  stream += lteHelper->AssignStreams (ueDevs, stream);
 
-  // Set the CSG ID
-  if (m_hasCsgDiversity)
-    {
-      lteHelper->SetEnbCsgId (enbDevs.Get (0), 1, true);
-      lteHelper->SetEnbCsgId (enbDevs.Get (2), 1, true);
-    }
-
+  Time lastCheckPoint = MilliSeconds (0);
   NS_ASSERT (m_ueSetupList.size () == ueDevs.GetN ());
   NetDeviceContainer::Iterator itDev;
   for (itSetup = m_ueSetupList.begin (), itDev = ueDevs.Begin ();
        itSetup != m_ueSetupList.end () || itDev != ueDevs.End ();
        itSetup++, itDev++)
     {
-      lteHelper->SetUeCsgId (*itDev, itSetup->csgIdentity);
+      if (itSetup->isCsgMember)
+        {
+          lteHelper->SetUeCsgId (*itDev, 1);
+        }
+
+      Ptr<LteUeNetDevice> ueDev = (*itDev)->GetObject<LteUeNetDevice> ();
+      NS_ASSERT (ueDev != 0);
+      Simulator::Schedule (itSetup->checkPoint,
+                           &LteCellSelectionTestCase::CheckPoint,
+                           this, ueDev,
+                           itSetup->expectedCellId1, itSetup->expectedCellId2);
+
+      if (lastCheckPoint < itSetup->checkPoint)
+        {
+          lastCheckPoint = itSetup->checkPoint;
+        }
+    }
+
+  // Tests
+  NS_ASSERT (m_ueSetupList.size () == ueDevs.GetN ());
+  for (itSetup = m_ueSetupList.begin (), itDev = ueDevs.Begin ();
+       itSetup != m_ueSetupList.end () || itDev != ueDevs.End ();
+       itSetup++, itDev++)
+    {
+      Ptr<LteUeNetDevice> ueDev = (*itDev)->GetObject<LteUeNetDevice> ();
     }
 
   if (m_isEpcMode)
@@ -321,89 +303,71 @@
     }
 
   // Connect to trace sources in UEs
-  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/MibReceived",
-                   MakeCallback (&LteCellSelectionTestCase::MibReceivedCallback, this));
-  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/Sib1Received",
-                   MakeCallback (&LteCellSelectionTestCase::Sib1ReceivedCallback, this));
-  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/Sib2Received",
-                   MakeCallback (&LteCellSelectionTestCase::Sib2ReceivedCallback, this));
   Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/StateTransition",
-                   MakeCallback (&LteCellSelectionTestCase::StateTransitionCallback, this));
+                   MakeCallback (&LteCellSelectionTestCase::StateTransitionCallback,
+                                 this));
   Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/InitialCellSelectionEndOk",
-                   MakeCallback (&LteCellSelectionTestCase::InitialCellSelectionEndOkCallback, this));
+                   MakeCallback (&LteCellSelectionTestCase::InitialCellSelectionEndOkCallback,
+                                 this));
   Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/InitialCellSelectionEndError",
-                   MakeCallback (&LteCellSelectionTestCase::InitialCellSelectionEndErrorCallback, this));
+                   MakeCallback (&LteCellSelectionTestCase::InitialCellSelectionEndErrorCallback,
+                                 this));
   Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
-                   MakeCallback (&LteCellSelectionTestCase::ConnectionEstablishedCallback, this));
+                   MakeCallback (&LteCellSelectionTestCase::ConnectionEstablishedCallback,
+                                 this));
 
   // Enable Idle mode cell selection
   lteHelper->Attach (ueDevs);
 
   // Run simulation
-  Simulator::Stop (m_duration);
+  Simulator::Stop (lastCheckPoint);
   Simulator::Run ();
 
-  // Tests
-  NS_ASSERT (m_ueSetupList.size () == ueDevs.GetN ());
-  for (itSetup = m_ueSetupList.begin (), itDev = ueDevs.Begin ();
-       itSetup != m_ueSetupList.end () || itDev != ueDevs.End ();
-       itSetup++, itDev++)
-    {
-      Ptr<LteUeNetDevice> ueDev = (*itDev)->GetObject<LteUeNetDevice> ();
-      NS_ASSERT (ueDev != 0);
-      uint16_t actualCellId = ueDev->GetRrc ()->GetCellId ();
-      uint16_t expectedCellId = itSetup->expectedCellId;
-      NS_TEST_ASSERT_MSG_EQ (actualCellId, expectedCellId,
-                             "IMSI " << ueDev->GetImsi ()
-                                     << " has attached to an unexpected cell");
-      if (expectedCellId > 0)
-        {
-          NS_TEST_ASSERT_MSG_EQ (m_lastState.at (ueDev->GetImsi () - 1),
-                                 LteUeRrc::CONNECTED_NORMALLY,
-                                 "UE " << ueDev->GetImsi ()
-                                       << " is not at CONNECTED_NORMALLY state");
-        }
-    }
-
+  NS_LOG_INFO ("Simulation ends");
   Simulator::Destroy ();
 
-} // end of void LteCellSelectionTestCase::DoRun ()
-
+} // end of void LteCellSelection6CellTestCase::DoRun ()
 
 
 void
-LteCellSelectionTestCase::MibReceivedCallback (
-  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
-  uint16_t sourceCellId)
+LteCellSelectionTestCase::CheckPoint (Ptr<LteUeNetDevice> ueDev,
+                                      uint16_t expectedCellId1,
+                                      uint16_t expectedCellId2)
 {
-  NS_LOG_FUNCTION (this << imsi << cellId << rnti << sourceCellId);
+  uint16_t actualCellId = ueDev->GetRrc ()->GetCellId ();
+
+  if (expectedCellId2 == 0)
+    {
+      NS_TEST_ASSERT_MSG_EQ (actualCellId, expectedCellId1,
+                             "IMSI " << ueDev->GetImsi ()
+                                     << " has attached to an unexpected cell");
+    }
+  else
+    {
+      bool pass = (actualCellId == expectedCellId1) ||
+        (actualCellId == expectedCellId2);
+      NS_TEST_ASSERT_MSG_EQ (pass, true,
+                             "IMSI " << ueDev->GetImsi ()
+                                     << " has attached to an unexpected cell"
+                                     << " (actual: " << actualCellId << ","
+                                     << " expected: " << expectedCellId1
+                                     << " or " << expectedCellId2 << ")");
+    }
+
+  if (expectedCellId1 > 0)
+    {
+      NS_TEST_ASSERT_MSG_EQ (m_lastState.at (ueDev->GetImsi () - 1),
+                             LteUeRrc::CONNECTED_NORMALLY,
+                             "UE " << ueDev->GetImsi ()
+                                   << " is not at CONNECTED_NORMALLY state");
+    }
 }
 
 
 void
-LteCellSelectionTestCase::Sib1ReceivedCallback (
+LteCellSelectionTestCase::StateTransitionCallback (
   std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
-  uint16_t sourceCellId)
-{
-  NS_LOG_FUNCTION (this << imsi << cellId << rnti << sourceCellId);
-}
-
-
-void
-LteCellSelectionTestCase::Sib2ReceivedCallback (
-  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
-{
-  NS_LOG_FUNCTION (this << imsi << cellId << rnti);
-}
-
-
-void
-LteCellSelectionTestCase::StateTransitionCallback (std::string context,
-                                                   uint64_t imsi,
-                                                   uint16_t cellId,
-                                                   uint16_t rnti,
-                                                   LteUeRrc::State oldState,
-                                                   LteUeRrc::State newState)
+  LteUeRrc::State oldState, LteUeRrc::State newState)
 {
   NS_LOG_FUNCTION (this << imsi << cellId << rnti << oldState << newState);
   m_lastState.at (imsi - 1) = newState;
--- a/src/lte/test/lte-test-cell-selection.h	Wed Sep 11 22:51:10 2013 +0300
+++ b/src/lte/test/lte-test-cell-selection.h	Sun Sep 15 20:54:03 2013 +0300
@@ -46,6 +46,8 @@
 
 
 
+class LteUeNetDevice;
+
 /**
  * \brief Testing the initial cell selection procedure by UE at IDLE state in
  *        the beginning of simulation.
@@ -58,22 +60,27 @@
    */
   struct UeSetup_t
   {
-    Vector position; ///< The position where the UE will be spawned in the simulation.
-    uint32_t csgIdentity; ///< Closed Subscriber Group identity of the UE.
-    uint16_t expectedCellId; ///< The cell ID that the UE is expected to attach to (0 means that the UE should not attach to any cell).
-    UeSetup_t (Vector position, uint32_t csgIdentity, uint16_t expectedCellId);
+    Vector position; ///< The position, relative to the inter site distance, where the UE will be spawned in the simulation.
+    bool isCsgMember; ///< Whether UE is allowed access to CSG cell.
+    Time checkPoint; ///< The time in simulation when the UE is verified by the test script.
+    uint16_t expectedCellId1; ///< The cell ID that the UE is expected to attach to (0 means that the UE should not attach to any cell).
+    uint16_t expectedCellId2; ///< An alternative cell ID that the UE is expected to attach to (0 means that this no alternative cell is expected).
+    UeSetup_t (double relPosX, double relPosY, bool isCsgMember, Time checkPoint,
+               uint16_t expectedCellId1, uint16_t expectedCellId2);
   };
 
   /**
    * \brief Creates an instance of the initial cell selection test case.
    * \param name name of this test
    * \param isEpcMode set to true for setting up simulation with EPC enabled
-   * \param ueSetupList an array of UE setup parameters
-   * \param duration length of simulation
+   * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+   *                   simulation uses Real RRC protocol
+   * TODO
    */
-  LteCellSelectionTestCase (std::string name, bool isEpcMode,
-                            bool isIdealRrc, bool hasCsgDiversity,
-                            std::vector<UeSetup_t> ueSetupList, Time duration);
+  LteCellSelectionTestCase (std::string name, bool isEpcMode, bool isIdealRrc,
+                            double interSiteDistance, double enbTxPower,
+                            std::vector<UeSetup_t> ueSetupList,
+                            int64_t rngRun);
 
   virtual ~LteCellSelectionTestCase ();
 
@@ -84,14 +91,9 @@
    */
   virtual void DoRun ();
 
-  void MibReceivedCallback (std::string context, uint64_t imsi,
-                            uint16_t cellId, uint16_t rnti,
-                            uint16_t sourceCellId);
-  void Sib1ReceivedCallback (std::string context, uint64_t imsi,
-                             uint16_t cellId, uint16_t rnti,
-                             uint16_t sourceCellId);
-  void Sib2ReceivedCallback (std::string context, uint64_t imsi,
-                             uint16_t cellId, uint16_t rnti);
+  void CheckPoint (Ptr<LteUeNetDevice> ueDev, uint16_t expectedCellId1,
+                   uint16_t expectedCellId2);
+
   void StateTransitionCallback (std::string context, uint64_t imsi,
                                 uint16_t cellId, uint16_t rnti,
                                 LteUeRrc::State oldState, LteUeRrc::State newState);
@@ -102,39 +104,12 @@
   void ConnectionEstablishedCallback (std::string context, uint64_t imsi,
                                       uint16_t cellId, uint16_t rnti);
 
-  /**
-   * \brief If true, then the simulation should be set up with EPC enabled.
-   */
   bool m_isEpcMode;
-
-  /**
-   * \brief If true, then the simulation should be set up with ideal RRC
-   *        protocol, otherwise real RRC protocol is used.
-   */
   bool m_isIdealRrc;
-
-  /**
-   * \brief If true, then the west cells in the simulation will be CSG cell,
-   *        while the east cells will be non-CSG cells.
-   */
-  bool m_hasCsgDiversity;
-
-  /**
-   * \brief The list of UE setups to be used during the test execution.
-   */
+  double m_interSiteDistance;
+  double m_enbTxPower;
   std::vector<UeSetup_t> m_ueSetupList;
-
-  /**
-   * \brief The length of the simulation.
-   *
-   * The shortest possible simulation length for testing initial cell selection
-   * is 206 milliseconds. If RRC_CONNECTED state is required, then the length
-   * should be extended to 261 milliseconds in ideal RRC protocol, or at least
-   * 278 milliseconds in real RRC protocol. Moreover, scenarios which expect
-   * failure in initial cell selection procedure might want to extend this even
-   * further to give the UE the chance to retry the procedure.
-   */
-  Time m_duration;
+  int64_t m_rngRun;
 
   /// The current UE RRC state.
   std::vector<LteUeRrc::State> m_lastState;
@@ -142,6 +117,7 @@
 }; // end of class LteCellSelectionTestCase
 
 
+
 } // end of namespace ns3