Point regression tests to final locations, update release steps, bug 158
authorCraig Dowell <craigdo@ee.washington.edu>
Wed Apr 02 21:33:31 2008 -0700 (22 months ago)
changeset 2865d40eb18a4da0
parent 2864 dc911620c136
parent 2845 2398826af6b4
child 2866 1d829915f092
child 2867 d63b525e3f80
Point regression tests to final locations, update release steps, bug 158
doc/release_steps.txt
examples/tcp-large-transfer.cc
regression/regression.py
regression/tracediff.py
src/helper/internet-stack-helper.cc
     1.1 --- a/doc/release_steps.txt	Tue Apr 01 17:05:54 2008 -0700
     1.2 +++ b/doc/release_steps.txt	Wed Apr 02 21:33:31 2008 -0700
     1.3 @@ -19,10 +19,25 @@
     1.4     - cd /home/code/repos/ns-3.0.x/.hg and edit the hgrc appropriately:
     1.5       "description = ns-3.0.x release
     1.6        name = ns-3.0.x"
     1.7 -6. upload "ns-3.0.x.tar.bz2" to the /var/www/html/releases/ directory on 
     1.8 +6. Run the regression tests on the new release and update the reference traces
     1.9 +   - cd regression
    1.10 +   - python regression.py
    1.11 +   - There should be no regressions at this time
    1.12 +   - tag ns-3-dev-ref-traces with "release ns-3.0.X"
    1.13 +     hg tag "release ns-3.0.x"
    1.14 +     hg push
    1.15 +   - clone the ns-3-dev-ref-traces and place it on the repository as in step
    1.16 +     6 but use the name ns-3.0.x-ref-traces
    1.17 +7. Create a reference traces tarball
    1.18 +   - cd regression
    1.19 +   - tar -cjf ns-3.0.x-ref-traces.tar.bz2 ns-3-dev-ref-traces/
    1.20 +8. upload "ns-3.0.x.tar.bz2" to the /var/www/html/releases/ directory on 
    1.21     the www.nsnam.org server
    1.22     - give it 644 file permissions, and user/group = apache
    1.23 -7. update web pages on www.nsnam.org (source is in the www/ module)
    1.24 +9. upload "ns-3.0.x-ref-traces.tar.bz2" to the /var/www/html/releases/ 
    1.25 +   directory on the www.nsnam.org server
    1.26 +   - give it 644 file permissions, and user/group = apache
    1.27 +10. update web pages on www.nsnam.org (source is in the www/ module)
    1.28     - add link to news.html
    1.29     - update getting_started.html
    1.30     - update documents.html
    1.31 @@ -32,4 +47,4 @@
    1.32       -- edit ~/bin/update-doxygen-release file and change RELEASE variable 
    1.33          to the right version number 
    1.34       -- run ~/bin/update-doxygen-release
    1.35 -8. announce to ns-developers, with summary of release notes
    1.36 +11. announce to ns-developers, with summary of release notes
     2.1 --- a/examples/tcp-large-transfer.cc	Tue Apr 01 17:05:54 2008 -0700
     2.2 +++ b/examples/tcp-large-transfer.cc	Wed Apr 02 21:33:31 2008 -0700
     2.3 @@ -117,6 +117,11 @@
     2.4    //  LogComponentEnable("PacketSink", LOG_LEVEL_ALL);
     2.5    //  LogComponentEnable("TcpLargeTransfer", LOG_LEVEL_ALL);
     2.6  
     2.7 +  //
     2.8 +  // Make the random number generators generate reproducible results.
     2.9 +  //
    2.10 +  RandomVariable::UseGlobalSeed (1, 1, 2, 3, 5, 8);
    2.11 +
    2.12    // Allow the user to override any of the defaults and the above
    2.13    // Bind()s at run-time, via command-line arguments
    2.14    CommandLine cmd;
    2.15 @@ -182,9 +187,9 @@
    2.16  
    2.17    std::ofstream ascii;
    2.18    ascii.open ("tcp-large-transfer.tr");
    2.19 -  PointToPointHelper::EnablePcap ("tcp-large-transfer");
    2.20    PointToPointHelper::EnableAscii (ascii);
    2.21  
    2.22 +  InternetStackHelper::EnablePcap ("tcp-large-transfer");
    2.23  
    2.24    Simulator::StopAt (Seconds(1000));
    2.25    Simulator::Run ();
     3.1 --- a/regression/regression.py	Tue Apr 01 17:05:54 2008 -0700
     3.2 +++ b/regression/regression.py	Wed Apr 02 21:33:31 2008 -0700
     3.3 @@ -36,20 +36,20 @@
     3.4  # mercurial on the system.  It is expected to be created using tar -cjf and
     3.5  # will be extracted using tar -xjf
     3.6  #
     3.7 -refTarName = "ns-3-ref-traces.tar.bz2"
     3.8 +refTarName = "ns-3.0.12-ref-traces.tar.bz2"
     3.9  
    3.10  #
    3.11  # The path to the Mercurial repository used to find the reference traces if
    3.12  # we find "hg" on the system.  We expect that the repository will be named
    3.13  # identically to refDirName below
    3.14  #
    3.15 -refRepo = "http://code.nsnam.org/craigdo/"
    3.16 +refRepo = "http://code.nsnam.org/"
    3.17  
    3.18  #
    3.19  # The local directory name into which the reference traces will go in either
    3.20  # case (net or hg).
    3.21  #
    3.22 -refDirName = "ns-3-ref-traces"
    3.23 +refDirName = "ns-3-dev-ref-traces"
    3.24  
    3.25  def main(tests = None, testdir = None):
    3.26      """Execute regression tests.
    3.27 @@ -78,33 +78,6 @@
    3.28          if o == '-v': verbose = 1
    3.29          if o == '-g': generate = 1
    3.30  
    3.31 -    print "========== Running Unit Tests =========="
    3.32 -    os.system("./waf check")
    3.33 -
    3.34 -    print "========== Running Regression Tests =========="
    3.35 -    if os.system("hg version > /dev/null 2>&1") == 0:
    3.36 -        print "Synchronizing reference traces using Mercurial."
    3.37 -        if not os.path.exists(refDirName):
    3.38 -            os.system("hg clone " + refRepo + refDirName +
    3.39 -              " > /dev/null 2>&1")
    3.40 -        else:
    3.41 -            os.chdir(refDirName)
    3.42 -            os.system("hg pull " + refRepo + refDirName +
    3.43 -                " > /dev/null 2>&1")
    3.44 -            os.chdir("..")
    3.45 -    else:
    3.46 -        print "Synchronizing reference traces from web."
    3.47 -        urllib.urlretrieve(refUrl + refTarName, refTarName)
    3.48 -        os.system("tar -xjf " + refTarName)
    3.49 -
    3.50 -    print "Done."
    3.51 -
    3.52 -    bad = []
    3.53 -
    3.54 -    if not os.path.exists(refDirName):
    3.55 -        print "Reference traces directory does not exist"
    3.56 -        return 3
    3.57 -    
    3.58      if not testdir:
    3.59          testdir = os.path.join(os.curdir, "tests")
    3.60  
    3.61 @@ -123,12 +96,39 @@
    3.62  
    3.63      if not tests:
    3.64          tests = findtests(testdir)
    3.65 +        if not generate:
    3.66 +            print "========== Running Unit Tests =========="
    3.67 +            os.system("./waf check")
    3.68 +
    3.69 +    print "========== Running Regression Tests =========="
    3.70 +
    3.71 +    if os.system("hg version > /dev/null 2>&1") == 0:
    3.72 +        print "Synchronizing reference traces using Mercurial."
    3.73 +        if not os.path.exists(refDirName):
    3.74 +            os.system("hg clone " + refRepo + refDirName + " > /dev/null 2>&1")
    3.75 +        else:
    3.76 +            os.chdir(refDirName)
    3.77 +            os.system("hg pull " + refRepo + refDirName + " > /dev/null 2>&1")
    3.78 +            os.chdir("..")
    3.79 +    else:
    3.80 +        print "Synchronizing reference traces from web."
    3.81 +        urllib.urlretrieve(refUrl + refTarName, refTarName)
    3.82 +        os.system("tar -xjf " + refTarName)
    3.83 +
    3.84 +    print "Done."
    3.85 +
    3.86 +    if not os.path.exists(refDirName):
    3.87 +        print "Reference traces directory does not exist"
    3.88 +        return 3
    3.89 +    
    3.90 +    bad = []
    3.91 +
    3.92  
    3.93      for test in tests:
    3.94          result = run_test(test)
    3.95          if result == 0:
    3.96              if generate:
    3.97 -                print "GENERATE" + test
    3.98 +                print "GENERATE " + test
    3.99              else:
   3.100                  print "PASS " + test
   3.101          else:
     4.1 --- a/regression/tracediff.py	Tue Apr 01 17:05:54 2008 -0700
     4.2 +++ b/regression/tracediff.py	Wed Apr 02 21:33:31 2008 -0700
     4.3 @@ -9,28 +9,24 @@
     4.4  def run_test(verbose, generate, refDirName, testName):
     4.5      """Execute a test."""
     4.6  
     4.7 -    repoName = "ns-3-ref-traces/"
     4.8 -    refDirName = testName + ".ref"
     4.9 +    refTestDirName = refDirName + "/" + testName + ".ref"
    4.10  
    4.11 -    if not os.path.exists(repoName):
    4.12 +    if not os.path.exists(refDirName):
    4.13          print"No reference trace repository"
    4.14          return 1
    4.15  
    4.16      if generate:
    4.17 -        if not os.path.exists(repoName + refDirName):
    4.18 -            print "creating new " + repoName + refDirName
    4.19 -            os.mkdir(repoName + refDirName)
    4.20 +        if not os.path.exists(refTestDirName):
    4.21 +            print "creating new " + refTestDirName
    4.22 +            os.mkdir(refTestDirName)
    4.23  
    4.24 -        try:
    4.25 -            os.system("./waf --cwd regression/" + repoName + refDirName +
    4.26 -                " --run " + testName + " > /dev/null 2>&1")
    4.27 -        except:
    4.28 -            sys.exit(1)
    4.29 +        os.system("./waf --cwd regression/" + refTestDirName +
    4.30 +            " --run " + testName + " > /dev/null 2>&1")
    4.31  
    4.32 -        print "Remember to commit " + repoName + refDirName
    4.33 +        print "Remember to commit " + refTestDirName
    4.34          return 0
    4.35      else:
    4.36 -        if not os.path.exists(repoName + refDirName):
    4.37 +        if not os.path.exists(refTestDirName):
    4.38              print "Cannot locate reference traces"
    4.39              return 1
    4.40  
    4.41 @@ -41,21 +37,20 @@
    4.42            testName + " > /dev/null 2>&1")
    4.43  
    4.44          if verbose:
    4.45 -            diffCmd = "diff traces " + repoName + refDirName + " | head"
    4.46 +            diffCmd = "diff traces " + refTestDirName + " | head"
    4.47          else:
    4.48 -            diffCmd = "diff traces " + repoName + refDirName + \
    4.49 +            diffCmd = "diff traces " + refTestDirName + \
    4.50                  " > /dev/null 2>&1"
    4.51  
    4.52          rc = os.system(diffCmd)
    4.53          if rc:
    4.54              print "----------"
    4.55              print "Traces differ in test: test-" + testName
    4.56 -            print "Reference traces in directory: " + repoName + \
    4.57 -                refDirName
    4.58 +            print "Reference traces in directory: " + refTestDirName
    4.59              print "Traces in directory: traces"
    4.60              print "Rerun regression test as: " + \
    4.61                  "\"python regression.py test-" + testName + "\""
    4.62 -            print "Then do \"diff -u traces " + repoName + refDirName + \
    4.63 +            print "Then do \"diff -u traces " + refTestDirName + \
    4.64                  "\" for details"
    4.65              print "----------"
    4.66          return rc
     5.1 --- a/src/helper/internet-stack-helper.cc	Tue Apr 01 17:05:54 2008 -0700
     5.2 +++ b/src/helper/internet-stack-helper.cc	Wed Apr 02 21:33:31 2008 -0700
     5.3 @@ -20,9 +20,13 @@
     5.4  #include "internet-stack-helper.h"
     5.5  #include "ns3/internet-stack.h"
     5.6  #include "ns3/packet-socket-factory.h"
     5.7 +#include "ns3/config.h"
     5.8  
     5.9  namespace ns3 {
    5.10  
    5.11 +std::vector<InternetStackHelper::Trace> InternetStackHelper::m_traces;
    5.12 +std::string InternetStackHelper::m_pcapBaseFilename;
    5.13 +
    5.14  void 
    5.15  InternetStackHelper::Build (NodeContainer c)
    5.16  {
    5.17 @@ -35,5 +39,68 @@
    5.18      }
    5.19  }
    5.20  
    5.21 +void
    5.22 +InternetStackHelper::EnablePcap (std::string filename)
    5.23 +{
    5.24 +  InternetStackHelper::m_pcapBaseFilename = filename;
    5.25 +  Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Tx",
    5.26 +                              MakeCallback (&InternetStackHelper::LogTxIp));
    5.27 +  Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Rx",
    5.28 +                              MakeCallback (&InternetStackHelper::LogRxIp));
    5.29 +}
    5.30 +
    5.31 +uint32_t
    5.32 +InternetStackHelper::GetNodeIndex (std::string context)
    5.33 +{
    5.34 +  std::string::size_type pos;
    5.35 +  pos = context.find ("/NodeList/");
    5.36 +  NS_ASSERT (pos == 0);
    5.37 +  std::string::size_type afterNodeIndex = context.find ("/", 11);
    5.38 +  NS_ASSERT (afterNodeIndex != std::string::npos);
    5.39 +  std::string index = context.substr (10, afterNodeIndex - 10);
    5.40 +  std::istringstream iss;
    5.41 +  iss.str (index);
    5.42 +  uint32_t nodeIndex;
    5.43 +  iss >> nodeIndex;
    5.44 +  return nodeIndex;
    5.45 +}
    5.46 +
    5.47 +void
    5.48 +InternetStackHelper::LogTxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex)
    5.49 +{
    5.50 +  Ptr<PcapWriter> writer = InternetStackHelper::GetStream (GetNodeIndex (context), interfaceIndex);
    5.51 +  writer->WritePacket (packet);
    5.52 +}
    5.53 +
    5.54 +void
    5.55 +InternetStackHelper::LogRxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex)
    5.56 +{
    5.57 +  Ptr<PcapWriter> writer = InternetStackHelper::GetStream (GetNodeIndex (context), interfaceIndex);
    5.58 +  writer->WritePacket (packet);
    5.59 +}
    5.60 +
    5.61 +Ptr<PcapWriter>
    5.62 +InternetStackHelper::GetStream (uint32_t nodeId, uint32_t interfaceId)
    5.63 +{
    5.64 +  for (std::vector<Trace>::iterator i = m_traces.begin ();
    5.65 +       i != m_traces.end (); i++)
    5.66 +  {
    5.67 +    if (i->nodeId == nodeId &&
    5.68 +        i->interfaceId == interfaceId)
    5.69 +    {
    5.70 +      return i->writer;
    5.71 +    }
    5.72 +  }
    5.73 +  InternetStackHelper::Trace trace;
    5.74 +  trace.nodeId = nodeId;
    5.75 +  trace.interfaceId = interfaceId;
    5.76 +  trace.writer = Create<PcapWriter> ();
    5.77 +  std::ostringstream oss;
    5.78 +  oss << m_pcapBaseFilename << "-" << nodeId << "-" << interfaceId << ".pcap";
    5.79 +  trace.writer->Open (oss.str ());
    5.80 +  trace.writer->WriteIpHeader ();
    5.81 +  m_traces.push_back (trace);
    5.82 +  return trace.writer;
    5.83 +}
    5.84  
    5.85  } // namespace ns3
     6.1 --- a/src/helper/internet-stack-helper.h	Tue Apr 01 17:05:54 2008 -0700
     6.2 +++ b/src/helper/internet-stack-helper.h	Wed Apr 02 21:33:31 2008 -0700
     6.3 @@ -21,6 +21,9 @@
     6.4  #define INTERNET_STACK_HELPER_H
     6.5  
     6.6  #include "node-container.h"
     6.7 +#include "net-device-container.h"
     6.8 +#include "ns3/pcap-writer.h"
     6.9 +#include "ns3/packet.h"
    6.10  
    6.11  namespace ns3 {
    6.12  
    6.13 @@ -37,6 +40,27 @@
    6.14     * of the ns3::Ipv4, ns3::Udp, and, ns3::Tcp classes.
    6.15     */
    6.16    void Build (NodeContainer c);
    6.17 +
    6.18 +  /**
    6.19 +   * \param filename filename prefix to use for pcap files.
    6.20 +   *
    6.21 +   * Enable pcap output on each protocol instance which is of the
    6.22 +   * ns3::Ipv4L3Protocol type.  Both Tx and Rx events will be logged.
    6.23 +   */
    6.24 +  static void EnablePcap (std::string filename);
    6.25 +
    6.26 +private:
    6.27 +  static void LogRxIp (std::string context, Ptr<const Packet> packet, uint32_t deviceId);
    6.28 +  static void LogTxIp (std::string context, Ptr<const Packet> packet, uint32_t deviceId);
    6.29 +  static Ptr<PcapWriter> GetStream (uint32_t nodeId, uint32_t interfaceId);
    6.30 +  struct Trace {
    6.31 +    uint32_t nodeId;
    6.32 +    uint32_t interfaceId;
    6.33 +    Ptr<PcapWriter> writer;
    6.34 +  };
    6.35 +  static std::string m_pcapBaseFilename;
    6.36 +  static uint32_t GetNodeIndex (std::string context);
    6.37 +  static std::vector<Trace> m_traces;
    6.38  };
    6.39  
    6.40  } // namespace ns3