Point regression tests to final locations, update release steps, bug 158

This commit is contained in:
Craig Dowell
2008-04-02 21:33:31 -07:00
6 changed files with 159 additions and 53 deletions

View File

@@ -19,10 +19,25 @@ Steps in doing an ns-3 release
- cd /home/code/repos/ns-3.0.x/.hg and edit the hgrc appropriately:
"description = ns-3.0.x release
name = ns-3.0.x"
6. upload "ns-3.0.x.tar.bz2" to the /var/www/html/releases/ directory on
6. Run the regression tests on the new release and update the reference traces
- cd regression
- python regression.py
- There should be no regressions at this time
- tag ns-3-dev-ref-traces with "release ns-3.0.X"
hg tag "release ns-3.0.x"
hg push
- clone the ns-3-dev-ref-traces and place it on the repository as in step
6 but use the name ns-3.0.x-ref-traces
7. Create a reference traces tarball
- cd regression
- tar -cjf ns-3.0.x-ref-traces.tar.bz2 ns-3-dev-ref-traces/
8. upload "ns-3.0.x.tar.bz2" to the /var/www/html/releases/ directory on
the www.nsnam.org server
- give it 644 file permissions, and user/group = apache
7. update web pages on www.nsnam.org (source is in the www/ module)
9. upload "ns-3.0.x-ref-traces.tar.bz2" to the /var/www/html/releases/
directory on the www.nsnam.org server
- give it 644 file permissions, and user/group = apache
10. update web pages on www.nsnam.org (source is in the www/ module)
- add link to news.html
- update getting_started.html
- update documents.html
@@ -32,4 +47,4 @@ Steps in doing an ns-3 release
-- edit ~/bin/update-doxygen-release file and change RELEASE variable
to the right version number
-- run ~/bin/update-doxygen-release
8. announce to ns-developers, with summary of release notes
11. announce to ns-developers, with summary of release notes

View File

@@ -117,6 +117,11 @@ int main (int argc, char *argv[])
// LogComponentEnable("PacketSink", LOG_LEVEL_ALL);
// LogComponentEnable("TcpLargeTransfer", LOG_LEVEL_ALL);
//
// Make the random number generators generate reproducible results.
//
RandomVariable::UseGlobalSeed (1, 1, 2, 3, 5, 8);
// Allow the user to override any of the defaults and the above
// Bind()s at run-time, via command-line arguments
CommandLine cmd;
@@ -182,9 +187,9 @@ int main (int argc, char *argv[])
std::ofstream ascii;
ascii.open ("tcp-large-transfer.tr");
PointToPointHelper::EnablePcap ("tcp-large-transfer");
PointToPointHelper::EnableAscii (ascii);
InternetStackHelper::EnablePcap ("tcp-large-transfer");
Simulator::StopAt (Seconds(1000));
Simulator::Run ();

View File

@@ -36,20 +36,20 @@ refUrl = "http://www.nsnam.org/releases/"
# mercurial on the system. It is expected to be created using tar -cjf and
# will be extracted using tar -xjf
#
refTarName = "ns-3-ref-traces.tar.bz2"
refTarName = "ns-3.0.12-ref-traces.tar.bz2"
#
# The path to the Mercurial repository used to find the reference traces if
# we find "hg" on the system. We expect that the repository will be named
# identically to refDirName below
#
refRepo = "http://code.nsnam.org/craigdo/"
refRepo = "http://code.nsnam.org/"
#
# The local directory name into which the reference traces will go in either
# case (net or hg).
#
refDirName = "ns-3-ref-traces"
refDirName = "ns-3-dev-ref-traces"
def main(tests = None, testdir = None):
"""Execute regression tests.
@@ -78,33 +78,6 @@ def main(tests = None, testdir = None):
if o == '-v': verbose = 1
if o == '-g': generate = 1
print "========== Running Unit Tests =========="
os.system("./waf check")
print "========== Running Regression Tests =========="
if os.system("hg version > /dev/null 2>&1") == 0:
print "Synchronizing reference traces using Mercurial."
if not os.path.exists(refDirName):
os.system("hg clone " + refRepo + refDirName +
" > /dev/null 2>&1")
else:
os.chdir(refDirName)
os.system("hg pull " + refRepo + refDirName +
" > /dev/null 2>&1")
os.chdir("..")
else:
print "Synchronizing reference traces from web."
urllib.urlretrieve(refUrl + refTarName, refTarName)
os.system("tar -xjf " + refTarName)
print "Done."
bad = []
if not os.path.exists(refDirName):
print "Reference traces directory does not exist"
return 3
if not testdir:
testdir = os.path.join(os.curdir, "tests")
@@ -123,12 +96,39 @@ def main(tests = None, testdir = None):
if not tests:
tests = findtests(testdir)
if not generate:
print "========== Running Unit Tests =========="
os.system("./waf check")
print "========== Running Regression Tests =========="
if os.system("hg version > /dev/null 2>&1") == 0:
print "Synchronizing reference traces using Mercurial."
if not os.path.exists(refDirName):
os.system("hg clone " + refRepo + refDirName + " > /dev/null 2>&1")
else:
os.chdir(refDirName)
os.system("hg pull " + refRepo + refDirName + " > /dev/null 2>&1")
os.chdir("..")
else:
print "Synchronizing reference traces from web."
urllib.urlretrieve(refUrl + refTarName, refTarName)
os.system("tar -xjf " + refTarName)
print "Done."
if not os.path.exists(refDirName):
print "Reference traces directory does not exist"
return 3
bad = []
for test in tests:
result = run_test(test)
if result == 0:
if generate:
print "GENERATE" + test
print "GENERATE " + test
else:
print "PASS " + test
else:

View File

@@ -9,28 +9,24 @@ import shutil
def run_test(verbose, generate, refDirName, testName):
"""Execute a test."""
repoName = "ns-3-ref-traces/"
refDirName = testName + ".ref"
refTestDirName = refDirName + "/" + testName + ".ref"
if not os.path.exists(repoName):
if not os.path.exists(refDirName):
print"No reference trace repository"
return 1
if generate:
if not os.path.exists(repoName + refDirName):
print "creating new " + repoName + refDirName
os.mkdir(repoName + refDirName)
if not os.path.exists(refTestDirName):
print "creating new " + refTestDirName
os.mkdir(refTestDirName)
try:
os.system("./waf --cwd regression/" + repoName + refDirName +
" --run " + testName + " > /dev/null 2>&1")
except:
sys.exit(1)
os.system("./waf --cwd regression/" + refTestDirName +
" --run " + testName + " > /dev/null 2>&1")
print "Remember to commit " + repoName + refDirName
print "Remember to commit " + refTestDirName
return 0
else:
if not os.path.exists(repoName + refDirName):
if not os.path.exists(refTestDirName):
print "Cannot locate reference traces"
return 1
@@ -41,21 +37,20 @@ def run_test(verbose, generate, refDirName, testName):
testName + " > /dev/null 2>&1")
if verbose:
diffCmd = "diff traces " + repoName + refDirName + " | head"
diffCmd = "diff traces " + refTestDirName + " | head"
else:
diffCmd = "diff traces " + repoName + refDirName + \
diffCmd = "diff traces " + refTestDirName + \
" > /dev/null 2>&1"
rc = os.system(diffCmd)
if rc:
print "----------"
print "Traces differ in test: test-" + testName
print "Reference traces in directory: " + repoName + \
refDirName
print "Reference traces in directory: " + refTestDirName
print "Traces in directory: traces"
print "Rerun regression test as: " + \
"\"python regression.py test-" + testName + "\""
print "Then do \"diff -u traces " + repoName + refDirName + \
print "Then do \"diff -u traces " + refTestDirName + \
"\" for details"
print "----------"
return rc

View File

@@ -20,9 +20,13 @@
#include "internet-stack-helper.h"
#include "ns3/internet-stack.h"
#include "ns3/packet-socket-factory.h"
#include "ns3/config.h"
namespace ns3 {
std::vector<InternetStackHelper::Trace> InternetStackHelper::m_traces;
std::string InternetStackHelper::m_pcapBaseFilename;
void
InternetStackHelper::Build (NodeContainer c)
{
@@ -35,5 +39,68 @@ InternetStackHelper::Build (NodeContainer c)
}
}
void
InternetStackHelper::EnablePcap (std::string filename)
{
InternetStackHelper::m_pcapBaseFilename = filename;
Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Tx",
MakeCallback (&InternetStackHelper::LogTxIp));
Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Rx",
MakeCallback (&InternetStackHelper::LogRxIp));
}
uint32_t
InternetStackHelper::GetNodeIndex (std::string context)
{
std::string::size_type pos;
pos = context.find ("/NodeList/");
NS_ASSERT (pos == 0);
std::string::size_type afterNodeIndex = context.find ("/", 11);
NS_ASSERT (afterNodeIndex != std::string::npos);
std::string index = context.substr (10, afterNodeIndex - 10);
std::istringstream iss;
iss.str (index);
uint32_t nodeIndex;
iss >> nodeIndex;
return nodeIndex;
}
void
InternetStackHelper::LogTxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex)
{
Ptr<PcapWriter> writer = InternetStackHelper::GetStream (GetNodeIndex (context), interfaceIndex);
writer->WritePacket (packet);
}
void
InternetStackHelper::LogRxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex)
{
Ptr<PcapWriter> writer = InternetStackHelper::GetStream (GetNodeIndex (context), interfaceIndex);
writer->WritePacket (packet);
}
Ptr<PcapWriter>
InternetStackHelper::GetStream (uint32_t nodeId, uint32_t interfaceId)
{
for (std::vector<Trace>::iterator i = m_traces.begin ();
i != m_traces.end (); i++)
{
if (i->nodeId == nodeId &&
i->interfaceId == interfaceId)
{
return i->writer;
}
}
InternetStackHelper::Trace trace;
trace.nodeId = nodeId;
trace.interfaceId = interfaceId;
trace.writer = Create<PcapWriter> ();
std::ostringstream oss;
oss << m_pcapBaseFilename << "-" << nodeId << "-" << interfaceId << ".pcap";
trace.writer->Open (oss.str ());
trace.writer->WriteIpHeader ();
m_traces.push_back (trace);
return trace.writer;
}
} // namespace ns3

View File

@@ -21,6 +21,9 @@
#define INTERNET_STACK_HELPER_H
#include "node-container.h"
#include "net-device-container.h"
#include "ns3/pcap-writer.h"
#include "ns3/packet.h"
namespace ns3 {
@@ -37,6 +40,27 @@ public:
* of the ns3::Ipv4, ns3::Udp, and, ns3::Tcp classes.
*/
void Build (NodeContainer c);
/**
* \param filename filename prefix to use for pcap files.
*
* Enable pcap output on each protocol instance which is of the
* ns3::Ipv4L3Protocol type. Both Tx and Rx events will be logged.
*/
static void EnablePcap (std::string filename);
private:
static void LogRxIp (std::string context, Ptr<const Packet> packet, uint32_t deviceId);
static void LogTxIp (std::string context, Ptr<const Packet> packet, uint32_t deviceId);
static Ptr<PcapWriter> GetStream (uint32_t nodeId, uint32_t interfaceId);
struct Trace {
uint32_t nodeId;
uint32_t interfaceId;
Ptr<PcapWriter> writer;
};
static std::string m_pcapBaseFilename;
static uint32_t GetNodeIndex (std::string context);
static std::vector<Trace> m_traces;
};
} // namespace ns3