<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Rimay Technologies, LLC »  – Rimay Technologies, LLC</title>
	
	<link>http://rimaytech.com</link>
	<description>Automating telephony testing.</description>
	<lastBuildDate>Tue, 18 Oct 2011 18:32:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rimaytech" /><feedburner:info uri="rimaytech" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>How to Get More Complete Test Coverage</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/D4EkGI0xSTg/</link>
		<comments>http://rimaytech.com/complete-test-coverage/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 14:47:32 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-generator]]></category>
		<category><![CDATA[portmap]]></category>
		<category><![CDATA[test-strategy]]></category>
		<category><![CDATA[test-suite]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=339</guid>
		<description><![CDATA[We recently added a simple feature that makes it easier to achieve more thorough coverage automatically.

On the RCG, the config file that maps a physical port to the named port you use in a script is called portmap.conf. You can have multiple mappings configured in the file, each with a unique name. And you can choose between which portmap is active when you launch a test suite. In our upcoming release, you can list multiple portmaps on the command line.

You can run a custom test suite to be run with various port combinations -- kick off an three hour long test suite with ten different portmaps on Friday evening and not have to worry about relaunching the test, touching config files, or changing cables every few hours over the weekend. <p><a href="http://rimaytech.com/complete-test-coverage/" title="Continue reading How to Get More Complete Test Coverage">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>We recently added a simple feature that makes it easier to achieve more thorough coverage automatically. (A draft of this post had a lot of words that were confusing even to me. Pictures should make the whole thing easier.)</p>
<p>Let&#8217;s say you have a CPE with two ports, and you&#8217;re connecting a pair of this CPE to your RCG-4001. Further, let&#8217;s say your CPE supports SIP, MGCP, and H.248, and that you support a flavor of MGCP that is &#8220;native&#8221; all the way back to a softswitch, and another that is gatewayed over a GR-303 link back to a switch (so when we say &#8220;GR-303&#8243; we mean this flavor of MGCP). The picture below shows this pair of CPEs with one port set up for each protocol type:</p>
<p><a href="http://rimaytech.com/wp-content/uploads/2010/12/cpes-with-mixed-intfs-portmap-example-sm.png"><img class="aligncenter size-full wp-image-342" title="A pair of CPEs with four different port protocols." src="http://rimaytech.com/wp-content/uploads/2010/12/cpes-with-mixed-intfs-portmap-example-sm.png" alt="A pair of CPEs with four different port protocols connected to the RCG." width="400" height="282" /></a>On the RCG, the config file that maps a physical port to the named port you use in a script is called portmap.conf. You can have multiple mappings configured in the file, each with a unique name. And you can choose between which portmap is active when you launch a test suite. Here&#8217;s a possible portmap for the RCG shown above:</p>
<pre style="padding-left: 30px;">[DEFAULT]
port_map = {'A': 'port0', 'C': 'port1', 'B': 'port2', 'D': 'port3'}

[sip-mgcp]
port_map = {'A': 'port0', 'B': 'port1', 'C': 'port2', 'D': 'port3'}

[sip-h248]
port_map = {'A': 'port0', 'C': 'port1', 'B': 'port2', 'D': 'port3'}

[sip-gr303]
port_map = {'A': 'port0', 'D': 'port1', 'C': 'port2', 'B': 'port3'}

[mgcp-sip]
port_map = {'B': 'port0', 'A': 'port1', 'C': 'port2', 'D': 'port3'}</pre>
<p>You could list all of the possible combinations &#8212; this is enough for this example. The scripts that ship with the RCG refer to ports as &#8220;A&#8221;, &#8220;B&#8221;, &#8220;C&#8221;, &#8220;D&#8221;. The &#8220;a_calls_b&#8221; script places a call from &#8220;port A&#8221; to &#8220;port B&#8221;; whichever physical ports map to A and B are the ones that will be used by the test. You&#8217;ll notice that we&#8217;ve provided a &#8220;DEFAULT&#8221; mapping &#8212; this is required. We&#8217;ve chosen to make the &#8220;sip-mgcp&#8221; mapping the same so that we have a convenient mnemonic that refers to this mapping.</p>
<p>In our most recent release, the test suites take a &#8220;&#8211;portmap=&#8221; argument that allows you to select the portmap. For example:</p>
<pre style="padding-left: 30px;">bash$ a_calls_b.py --portmap=sip-h248 a_calls_b$
</pre>
<p>This will place a call from physical port 0 to physical port 2 (the SIP port on CPE1 to the H.248 port on CPE2).</p>
<p>In our upcoming release, you can list multiple portmaps on the command line. For example:</p>
<pre style="padding-left: 30px;">bash$ a_calls_b.py --portmap=sip-mgcp,sip-h248-sip-gr303,mgcp-sip a_calls_b$
</pre>
<p>This will run the script four times, once each using each listed portmap. You can run <a title="Create a custom call generator test suite." href="http://rimaytech.com/custom-test-suites-rimay-call-generator/">a custom test suite</a> with this argument, and the suite will be run in the various mappings. You can kick off an three hour long test suite with ten different portmaps on Friday evening and not have to worry about relaunching the test, touching config files, or changing cables every few hours over the weekend.</p>
<p style="padding-left: 30px;"><em>We&#8217;ve talked internally about how we might automatically generate all of the relevant maps. How would you like to see this work? Leave a comment below or <a title="Send email to Rimay Technologies, LLC" href="http://rimaytech.com/contact/">drop us a note</a>.</em></p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=D4EkGI0xSTg:oHc9fNPsPTQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=D4EkGI0xSTg:oHc9fNPsPTQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=D4EkGI0xSTg:oHc9fNPsPTQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=D4EkGI0xSTg:oHc9fNPsPTQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=D4EkGI0xSTg:oHc9fNPsPTQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=D4EkGI0xSTg:oHc9fNPsPTQ:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/D4EkGI0xSTg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/complete-test-coverage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/complete-test-coverage/</feedburner:origLink></item>
		<item>
		<title>Creating Custom Test Suites on the Rimay Call Generator</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/2CdulIJUuHw/</link>
		<comments>http://rimaytech.com/custom-test-suites-rimay-call-generator/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 14:19:06 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-generator]]></category>
		<category><![CDATA[call-script]]></category>
		<category><![CDATA[test-suite]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=147</guid>
		<description><![CDATA[It's easy -- almost trivial -- to create a custom test suite on the RCG.

An RCG test suite is simply a python script that calls "main()" on a ScriptRunner object. Here's a short example suite that will run two tests: <p><a href="http://rimaytech.com/custom-test-suites-rimay-call-generator/" title="Continue reading Creating Custom Test Suites on the Rimay Call Generator">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s easy &#8212; almost trivial &#8212; to create a custom test suite on the RCG.</p>
<p>An RCG test suite is simply a python script that calls &#8220;main()&#8221; on a ScriptRunner object. Here&#8217;s a short example suite that will run two tests:</p>
<p><code> </code></p>
<pre>#!/usr/bin/python

from rcg.test_runner import ScriptRunner
import a_calls_b

TESTS = [
    a_calls_b.a_calls_b,
    a_calls_b.ab_mesh,
    ]

if __name__ == '__main__':
    main()
</pre>
<p>Let&#8217;s break that down for readers less familiar with python:</p>
<p>The first line tells the OS we want to run this program using the python interpreter:<br />
<code>#!/usr/bin/python</code></p>
<p>The next two lines tells python that we want to use two existing modules, both of which in this case come from the RCG libraries. The first line here makes the ScriptRunner class available, and the second line lets us use the &#8220;a_calls_b&#8221; module, which contains several test scripts related to two-party calls.<br />
<code> </code></p>
<pre>from rcg.test_runner import ScriptRunner
import a_calls_b</pre>
<p>Then we create a list of two test scripts from the a_calls_b module, which we store in a variable called TESTS. We prefer to format the code this way so that it is easy to temporarily comment out one or more of the tests in a suite (with a # character at the beginning of the line) if we want to quickly change the suite definition for a test run.<br />
<code> </code></p>
<pre>TESTS = [
    a_calls_b.a_calls_b,
    a_calls_b.ab_mesh,
    ]</pre>
<p>Then we create a ScriptRunner object using that list of test scripts. The ScriptRunner will run those tests when we call it (see below).<br />
<code> </code></p>
<pre>main = ScriptRunner(TESTS)
main.title = 'My Suite'
</pre>
<p>Finally, this checks the built-in python variable &#8220;__name__&#8221; to see if this file is being run as a standalone program. If it is, we run the ScriptRunner &#8212; the ScriptRunner class defines a special method that allows ScriptRunner objects to be &#8220;called&#8221; as if they were functions. By including the check to see if the file is run as a standalone program, we allow for the case where this suite is imported by a larger suite. Defining suites in this way allows us to build up collections of test suites hierarchically in a way that makes sense for a particular application. If you look at a_calls_b.py, you will see that it is a suite defined using the same basic template provided here.<br />
<code> </code></p>
<pre>if __name__ == '__main__':
    main()
</pre>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=2CdulIJUuHw:0wC5LoQ5Ako:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=2CdulIJUuHw:0wC5LoQ5Ako:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=2CdulIJUuHw:0wC5LoQ5Ako:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=2CdulIJUuHw:0wC5LoQ5Ako:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=2CdulIJUuHw:0wC5LoQ5Ako:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=2CdulIJUuHw:0wC5LoQ5Ako:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/2CdulIJUuHw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/custom-test-suites-rimay-call-generator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/custom-test-suites-rimay-call-generator/</feedburner:origLink></item>
		<item>
		<title>Why Do Experts Plan For Failure?</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/UrGL69DmdTE/</link>
		<comments>http://rimaytech.com/experts-plan-failure/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 13:48:03 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-generator]]></category>
		<category><![CDATA[test-strategy]]></category>
		<category><![CDATA[test-tactics]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=134</guid>
		<description><![CDATA[The goal of testing is finding failures, right?

Then we should plan for the inevitable failure and make sure we are going to gather as much information as possible. When you are armed with all the right info, you will be able to find the root cause and develop a fix quickly and easily. Otherwise testers and developers wind up in an endless cycle of "can you retest it and capture X?" Half the battle -- usually more than half -- is simply reproducing the problem and figuring out what is really broken.

We've built a great feature into the RCG-4001. It captures, for every test: <p><a href="http://rimaytech.com/experts-plan-failure/" title="Continue reading Why Do Experts Plan For Failure?">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>The goal of testing is <em>finding</em> failures, right?</p>
<p>Then we should plan for the inevitable failure and make sure we are going to gather as much information as possible. When you are armed with all the right info, you will be able to find the root cause and develop a fix quickly and easily. Otherwise testers and developers wind up in an endless cycle of &#8220;can you retest it and capture X?&#8221; Half the battle &#8212; usually more than half &#8212; is simply reproducing the problem and figuring out what is really broken.</p>
<p>We&#8217;ve built a great feature into the RCG-4001. It captures, for every test:</p>
<ul>
<li>An audio recording, in a .wav file, of what each POTS port on the RCG &#8220;hears&#8221; during the test.</li>
<li>A capture of all of the network traffic seen at the RCG&#8217;s network interface in a .pcap (wireshark compatible) file.</li>
<li>Syslog messages from the DUT &#8212; you just have to configure the DUT to send syslog messages to the RCG.</li>
<li>A log of all of the RCG&#8217;s actions &#8212; debug information from the test scripts.</li>
<li>The RCG config files that were in effect for the test &#8212; so you can easily reproduce the failure with the exact same configuration.</li>
<li>The source of the script that was running &#8212; so you can easily reproduce the failure with the exact same actions.</li>
</ul>
<p>All of those pieces get put into a ZIP file and saved on the RCG so you can easily copy it into your bug database when you find a broken call flow.</p>
<p><strong>This feature is awesome.</strong> That&#8217;s not just coming from me &#8212; our feedback so far has been enthusiastic. Once you&#8217;ve used it, you&#8217;ll wonder why you spent so much time in the dark ages.</p>
<p>Here&#8217;s a simple but very usable setup that enables the use of this feature:</p>
<p><a href="http://rimaytech.com/wp-content/uploads/2009/12/plan-for-failure.png"><img class="size-medium wp-image-311 aligncenter" title="Layout of a test network optimized for troubleshooting." src="http://rimaytech.com/wp-content/uploads/2009/12/plan-for-failure-300x300.png" alt="Layout of a test network optimized for troubleshooting." width="300" height="300" /></a>In this diagram, the DUT is connected to the softswitch through a managed ethernet switch. An old-school hub would work just as well &#8212; the point is that the RCG should be able to sniff the VoIP traffic. If a switch is used, configure it so that it mirrors all of the traffic going to and from the DUT to the RCG&#8217;s port. This also provides an ethernet connection between the DUT and the RCG for syslog traffic, if your DUT supports it.</p>
<p>And then when something breaks you get a pretty picture like this:</p>
<p style="text-align: center;"><a href="http://rimaytech.com/wp-content/uploads/2009/12/sip-484-error.png"><img class="aligncenter size-full wp-image-315" title="Wireshark showing a SIP 484 Address Incomplete error packet." src="http://rimaytech.com/wp-content/uploads/2009/12/sip-484-error.png" alt="Wireshark showing a SIP 484 Address Incomplete error packet." width="510" height="175" /></a></p>
<p>Whoops! The device is sending *67 without a DN and the switch doesn&#8217;t like it. We can give the ZIP file containing this to the development team, and they&#8217;ll be able to get a fix without needing to ask for more information.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=UrGL69DmdTE:c31PvI4v5hs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=UrGL69DmdTE:c31PvI4v5hs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=UrGL69DmdTE:c31PvI4v5hs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=UrGL69DmdTE:c31PvI4v5hs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=UrGL69DmdTE:c31PvI4v5hs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=UrGL69DmdTE:c31PvI4v5hs:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/UrGL69DmdTE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/experts-plan-failure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/experts-plan-failure/</feedburner:origLink></item>
		<item>
		<title>Quick Fix for CID Test Failure</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/4tiz2hXXbYc/</link>
		<comments>http://rimaytech.com/quick-fix-cid-test-failure/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 14:21:42 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Tests]]></category>
		<category><![CDATA[call-script]]></category>
		<category><![CDATA[caller-id]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=303</guid>
		<description><![CDATA[Our *67 script failed when run in an interop scenario for the first time. It was a pretty obvious failure -- our expected CID string should have been all lowercase.

No need to modify the script, just edit /etc/rimay/callgen.conf. Find this line: <p><a href="http://rimaytech.com/quick-fix-cid-test-failure/" title="Continue reading Quick Fix for CID Test Failure">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>Our *67 script failed when run in an interop scenario for the first time:</p>
<pre>bash$ a_calls_b.py
a_calls_b
a_calls_bcd
a_calls_b_hangup
a_calls_b_ring_timeout
a_calls_b_anon_cid
ERROR: caller id string match error. Received 'anonymous', looking for 'Anonymous'. cid_mode=cid_anonymous
run_all_tests:17
 inner:45
  a_calls_b_anon_cid:118
   call:292
    place_call:353
     _check_cid:508
a_calls_b_terminator_hangup
</pre>
<p>Ok, that&#8217;s a pretty obvious failure &#8212; our expected CID string should have been all lowercase. No need to modify the script, just edit /etc/rimay/callgen.conf. Find this line:</p>
<p><code><br />
[DEFAULT]<br />
caller_id_anonymous_call_string = Anonymous<br />
</code></p>
<p>and change it to this:</p>
<p><code><br />
[DEFAULT]<br />
caller_id_anonymous_call_string = anonymous<br />
</code></p>
<p>Rerun the test:</p>
<p><code><br />
bash$ a_calls_b.py  a_calls_b_anon_cid<br />
a_calls_b_anon_cid<br />
bash$<br />
</code></p>
<p>Test passes!</p>
<p>This is in keeping with the overall strategy of keeping switch-specific details and behavior in the config file instead of in the scripts. As we can see here, it makes porting to a new interop scenario much easier.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=4tiz2hXXbYc:ttrYOXcEYVQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=4tiz2hXXbYc:ttrYOXcEYVQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=4tiz2hXXbYc:ttrYOXcEYVQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=4tiz2hXXbYc:ttrYOXcEYVQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=4tiz2hXXbYc:ttrYOXcEYVQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=4tiz2hXXbYc:ttrYOXcEYVQ:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/4tiz2hXXbYc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/quick-fix-cid-test-failure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/quick-fix-cid-test-failure/</feedburner:origLink></item>
		<item>
		<title>Tunable Call Script Delays on the Rimay Call Generator</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/ACNYDDb2TxA/</link>
		<comments>http://rimaytech.com/tunable-call-timing-delays/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 14:24:12 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-generator]]></category>
		<category><![CDATA[call-script]]></category>
		<category><![CDATA[test-strategy]]></category>
		<category><![CDATA[test-suite]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=161</guid>
		<description><![CDATA[One tricky aspect of getting automated call testing to work properly across different switches and deployments is that different delays and timeouts are required in various places throughout the script library. This is even harder when targeting different international phone systems.

For example, when we take a phone port off-hook, we sometimes have to be careful to avoid immediately performing operations on that port. It needs a slight delay when we're on a VoIP system to give the RTP stream a chance to start. Otherwise if we slam it with DTMF right away we'll lose a digit or two. On a pure POTS system, we can reduce the delay.

Sprinkling these delays throughout the script libraries would be a nightmare... <p><a href="http://rimaytech.com/tunable-call-timing-delays/" title="Continue reading Tunable Call Script Delays on the Rimay Call Generator">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>One tricky aspect of getting automated call testing to work properly across different switches and deployments is that different delays and timeouts are required in various places throughout the script library. This is even harder when targeting different international phone systems.</p>
<p>For example, when we take a phone port off-hook, we sometimes have to be careful to avoid immediately performing operations on that port. It needs a slight delay when we&#8217;re on a VoIP system to give the RTP stream a chance to start. Otherwise if we slam it with DTMF right away we&#8217;ll lose a digit or two. On a pure POTS system, we can reduce the delay.</p>
<p>Sprinkling these delays throughout the script libraries would be a nightmare. When we port to a new deployment type, we&#8217;d have to hunt down all of the places with delays and tweak them individually &#8212; and then somehow maintain the two versions.</p>
<p>Instead we maintain the delays in a configuration file on the RCG-4001. The different delays are available as properties on the PhonePort objects used by the scripts in our suite. When we need to port to a new switch, we can create a new config file and tweak the delays in one place. This avoids tedious searching through scripts and keeps all of the tuning centralized.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=ACNYDDb2TxA:MkX2AuN5Va0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=ACNYDDb2TxA:MkX2AuN5Va0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=ACNYDDb2TxA:MkX2AuN5Va0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=ACNYDDb2TxA:MkX2AuN5Va0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=ACNYDDb2TxA:MkX2AuN5Va0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=ACNYDDb2TxA:MkX2AuN5Va0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/ACNYDDb2TxA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/tunable-call-timing-delays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/tunable-call-timing-delays/</feedburner:origLink></item>
		<item>
		<title>Troubleshooting Telephony Failures</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/kNyewuP-AsA/</link>
		<comments>http://rimaytech.com/troubleshooting-telephony-failures/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 16:12:57 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">https://rimaytech.com/wp/?p=15</guid>
		<description><![CDATA[When a telephony call feature is failing, there are several possible categories of causes. The early stages of troubleshooting should try to eliminate some of these broad categories as causes (or find the cause along the way, whichever happens first). <p><a href="http://rimaytech.com/troubleshooting-telephony-failures/" title="Continue reading Troubleshooting Telephony Failures">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>When a telephony call feature is failing, there are several possible categories of causes:</p>
<ul>
<li>physical (e.g. unplugged cable)</li>
<li>misconfiguration (e.g. feature not enabled)</li>
<li>software defect (e.g. mishandled scenario)</li>
<li>protocol exchange (e.g. interpreting a field value differently)</li>
<li>network / transport (e.g. firewall)</li>
</ul>
<p>The early stages of troubleshooting should try to eliminate some of these broad categories as causes (or find the cause along the way, whichever happens first).</p>
<p>First, and usually easiest, is to make sure it is not a network connectivity problem. Ping is your friend. If you can&#8217;t ping the equipment involved in the call, you may have a physical problem. Are the cables plugged in? Is everything powered on?</p>
<p>Does any voice work between the two endpoints? If you&#8217;re running automated tests, is your <a href="http://rimaytech.com/rcg-4001/">call generator</a> reporting failures for every test in the suite or just for a particular feature? Quick A-&gt;B calls between all involved parties proves a lot. Do other features work, especially similar features and those that exercise the same lines and features? If you can&#8217;t make a simple two way voice call between each of the endpoint pairings involved, there&#8217;s a more fundamental problem &#8212; first troubleshoot the simpler version of the problem before tackling the more complex feature. If basic calls work but not advanced features, ensure the failing features are enabled on the switch and activated for the lines in question.</p>
<p>When you have eliminated network and physical problems as the cause, check the configuration. Does the feature work on any lines? Do logs indicate errors like &#8220;permission denied&#8221; or &#8220;feature unavailable&#8221;? Do you get error tones or announcement messages? If the feature works on other lines, compare the config of the working lines to the non-working lines.</p>
<p>Once you&#8217;re sure that neither of those categories are the culprit, it&#8217;s time for deeper digging. If you have access to the entire transport network, a network traffic capture can be very useful. (Even if you only have visibility into part of the network, captures can still help with troubleshooting but there are more limits to what you can uncover.) If at all feasible, it&#8217;s best to capture all traffic, not just the protocol you&#8217;re expecting to troubleshoot (e.g. SIP or MGCP). I&#8217;ve seen failures caused by a misconfigured router that was sending ICMP redirects all over the place. This won&#8217;t show up in a filtered capture.</p>
<p>Armed with a traffic capture, start looking for the unexpected. ARP storms, loads of ICMP redirects, and rapid SIP reregistrations are all things I&#8217;ve seen as symptoms that point to the real problem. (These were mostly misconfigs that weren&#8217;t caught in the previous troubleshooting step.)</p>
<p>In the absence of anything unusual, look at the traffic that makes up the call trace. Filtering is useful here, as are tools that generate a graphical view of the call flow. First look for error packets. If present, these usually have a specific enough error code or even a text explanation of why the call is failing. If there are no error packets, check that the call is being set up as expected. Is audio fully enabled or is an endpoint simply idled? Check for voice path &#8212; is RTP flowing in both directions as expected? Does the RTP payload match what is expected (and do both directions match each other)? (If not RTP, then whatever equivalent protocol is in your trace.)</p>
<p>When signaling and RTP look good, it is often useful to extract the audio streams. In wireshark, you can choose to extract either direction or both directions. I usually start with both directions, and then listen on my PC&#8217;s speakers. Problems with audio here will point you to one end of the other. Often I have to backtrack to examining configs or traffic for that end of the connection.</p>
<p>At this point I&#8217;ve usually found the cause of the problem. If not, it&#8217;s time to ask for help. I&#8217;ve gotten help from coworkers, partner/vendor tech support, and occasionally partner/vendor developers. Another set of eyes looking at the problem is helpful. Sometimes just explaining the issue and symptoms to a new person will trigger an &#8220;Aha!&#8221; moment.</p>
<p>Do you have any troubleshooting techniques I&#8217;ve missed? Leave a comment. Thanks!</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=kNyewuP-AsA:1KYyEPS1B4I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=kNyewuP-AsA:1KYyEPS1B4I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=kNyewuP-AsA:1KYyEPS1B4I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=kNyewuP-AsA:1KYyEPS1B4I:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=kNyewuP-AsA:1KYyEPS1B4I:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=kNyewuP-AsA:1KYyEPS1B4I:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/kNyewuP-AsA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/troubleshooting-telephony-failures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/troubleshooting-telephony-failures/</feedburner:origLink></item>
		<item>
		<title>How to Write Test Scripts for Speed Dial 8</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/7iHdLWe7Gkc/</link>
		<comments>http://rimaytech.com/howto-script-speed-dial/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 16:08:37 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-script]]></category>
		<category><![CDATA[speed-dial]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=277</guid>
		<description><![CDATA[Speed dial 8 is a call feature that allows a subscriber to dial a number using a reduced number of dialed digits. Speed dial is generally a digit between 2 and 9 followed by "#" (pound or hash). Speed dial 8 numbers are usually set by dialing *74 and following the prompts.

Let's outline what the test scripts for speed dial 8 would look like. <p><a href="http://rimaytech.com/howto-script-speed-dial/" title="Continue reading How to Write Test Scripts for Speed Dial 8">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>Speed dial 8 is a call feature that allows a subscriber to dial a number using a reduced number of dialed digits. Speed dial is generally a digit between 2 and 9 followed by &#8220;#&#8221; (pound or hash). Speed dial 8 numbers are usually set by dialing *74 and following the prompts.</p>
<p>Let&#8217;s outline what the test scripts for speed dial 8 would look like:</p>
<p>Once again we follow the <a href="/the-seven-step-strategy-for-testing-telephony-features/">basic strategy for call tests</a>:</p>
<ol>
<li>We will use lines A, B, C, and D.</li>
<li>A will be the originator and the line that uses speed dial.</li>
<li>The happy path for using speed dial is A dials 2#, where 2 is configured to call B, B rings, and A-B have conversation. The happy path for configuring a number is A dials *74, waits for the prompt, enters 2 to set a number for speed dial 2, waits for the prompt (usually stutter tone, could be an announcement), dials the phone number for B, and (sometimes, but not always required) dials # to indicate the end of the phone number. These will be similar for calls to C and D.</li>
<li>The first flow &#8212; using speed dial &#8212; is as easy as it gets. Just dial &#8220;2#&#8221; using <code>CallGenerator</code>&#8216;s <code>call()</code> method. The second flow requires waiting for prompts. Be careful here not to embed switch-specific delays into your script. The <a href="/rcg-4001/">RCG-4001</a> uses a global configuration file to collect all of the delays in one place so that you can easily port your scripts to another switch by changing the delays in the config file. Your script will dial &#8220;*74&#8243;, wait, dial &#8220;2#&#8221;, wait, dial the number for B, dial # if required by the switch, wait, hang up.</li>
<li>Variants would be unconfiguring a speed dial number, configuring  7, 10, 1+10-digit, and international numbers, filling all the speed dial slots, reconfiguring a used slot, dialing using an empty slot, and dialing using each slot when they are all configured.</li>
<li>Edge cases include using an invalid speed dial 8 slot (0, 1, 20, etc), speed dialing an unconfigured slot, entering too many digits for the dialed phone number, too few digits, letting a timeout occur at the dialed number or slot prompt, or hanging up at the dialed number or slot prompt.</li>
<li>A crazy variant would be to configure a VSC as a speed dial number. For example, *70 (cancel call waiting). Maybe this is supposed to be allowed, maybe it&#8217;s not, check your spec. If it&#8217;s allowed, can you configure a speed dial that unconfigures itself? Another crazy variant is to use speed dial when dialing the third leg of a three way call. (This should be allowed by the switch.)</li>
</ol>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=7iHdLWe7Gkc:KlkaPh5QbCg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=7iHdLWe7Gkc:KlkaPh5QbCg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=7iHdLWe7Gkc:KlkaPh5QbCg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=7iHdLWe7Gkc:KlkaPh5QbCg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=7iHdLWe7Gkc:KlkaPh5QbCg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=7iHdLWe7Gkc:KlkaPh5QbCg:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/7iHdLWe7Gkc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/howto-script-speed-dial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/howto-script-speed-dial/</feedburner:origLink></item>
		<item>
		<title>How to Force More Failures</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/MYuAnzBoesM/</link>
		<comments>http://rimaytech.com/force-failures/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 15:35:48 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-generator]]></category>
		<category><![CDATA[call-script]]></category>
		<category><![CDATA[chaining]]></category>
		<category><![CDATA[stacking]]></category>
		<category><![CDATA[test-strategy]]></category>
		<category><![CDATA[test-tactics]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=163</guid>
		<description><![CDATA[The bad news is that the bugs that are left are hard to find. Forcing external failures during call generator testing will help flush them out. <p><a href="http://rimaytech.com/force-failures/" title="Continue reading How to Force More Failures">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>You&#8217;ve taught your <a href="/rcg-4001/">call generator</a> all kinds of tricks, <a href="/how-many-call-features-do-you-have-to-stack-before-you-find-a-failure/">stacking</a> and <a href="/chaining-call-features-or-the-hot-potato-test/">chaining</a> call features left and right. In the process you&#8217;ve found (and fixed!) tons of bugs. This has built up a huge regression test suite.</p>
<p>But running this test suite regularly means that you&#8217;re not finding many bugs any more. This is good news (the product is better) and bad news (there are probably still more bugs to find). The really bad news is that the bugs that are left can be really hard to find, and often require stepping outside your current test framework.</p>
<p>We&#8217;ve talked about <a href="/call-generator-robustness-testing/">forcing errors from the call generator</a>, and making sure that the DUT can handle them &#8212; repeatedly. This builds on that practice and expands it beyond the call generator and into your test network.</p>
<h3>What&#8217;s the Worst Thing That Could Happen?</h3>
<p>This is the question to ask.</p>
<ol>
<li>What is the worst thing that could happen internally? Perhaps a memory leak that uses up all available memory. Or the internal storage (disk, flash) fills up. What if a fan fails and the heat builds up?</li>
<li>What is the worst thing that could happen externally? Loss of connection to the network.  Power failure. Network storm.</li>
<li>What could a malicious person do? Send a flood. Send specially crafted packets.</li>
</ol>
<p>Now take the answers to those questions, and make the worst thing happen.</p>
<ol>
<li>If you&#8217;re testing a VoIP gateway, disconnect it from the network mid-call.</li>
<li>Take that VoIP gateway and run a longevity test. Now run a script that toggles the port on the network switch on-off every 2 minutes. (Don&#8217;t have a managed switch? Get a <a href="http://www.servertech.com/products/switched-pdus/switched-pdu-cw-2h-ipm-2">managed power supply</a> and just toggle power to your hub.)</li>
<li>Using the same gateway and longevity test, this time use your managed power supply to kill power to the gateway at random intervals.</li>
<li>Use a network traffic generator to simulate a network storm.</li>
<li>Write scripts to generate some of those &#8220;specially crafted packets&#8221; that might do bad things.</li>
<li>Cheat if you can: examine the code and look for error paths. Do whatever it takes to hit those error paths. (Hint: this is what malicious people do.)</li>
</ol>
<p>Go do your worst.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=MYuAnzBoesM:QaVSJ-zpsnE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=MYuAnzBoesM:QaVSJ-zpsnE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=MYuAnzBoesM:QaVSJ-zpsnE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=MYuAnzBoesM:QaVSJ-zpsnE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=MYuAnzBoesM:QaVSJ-zpsnE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=MYuAnzBoesM:QaVSJ-zpsnE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/MYuAnzBoesM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/force-failures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/force-failures/</feedburner:origLink></item>
		<item>
		<title>Induce Failures by Varying the DTMF Pulse Width</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/NpWPxU-LT2s/</link>
		<comments>http://rimaytech.com/dtmf-pulse-width/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 16:08:23 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-generator]]></category>
		<category><![CDATA[test-suite]]></category>
		<category><![CDATA[test-tactics]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=138</guid>
		<description><![CDATA[Looking for ideas to find bugs? Configure your call generator to run your entire test suite with DTMF tones near the minimum width. <p><a href="http://rimaytech.com/dtmf-pulse-width/" title="Continue reading Induce Failures by Varying the DTMF Pulse Width">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s something to try if you&#8217;re looking for ideas to find bugs: configure your call generator to run your entire test suite (a) with DTMF tones near the minimum width, and then (b) with very long (one or two second) DTMF tones. You can also try varying the timing between digits &#8212; use both the minimum possible gap and a long delay.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=NpWPxU-LT2s:riegbPv34rM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=NpWPxU-LT2s:riegbPv34rM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=NpWPxU-LT2s:riegbPv34rM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=NpWPxU-LT2s:riegbPv34rM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=NpWPxU-LT2s:riegbPv34rM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=NpWPxU-LT2s:riegbPv34rM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/NpWPxU-LT2s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/dtmf-pulse-width/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/dtmf-pulse-width/</feedburner:origLink></item>
		<item>
		<title>Use a Call Generator for Robustness Testing</title>
		<link>http://feedproxy.google.com/~r/rimaytech/~3/fw1A0iTZzkU/</link>
		<comments>http://rimaytech.com/call-generator-robustness-testing/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 14:23:28 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[call-generator]]></category>
		<category><![CDATA[call-script]]></category>
		<category><![CDATA[test-strategy]]></category>
		<category><![CDATA[test-suite]]></category>

		<guid isPermaLink="false">http://rimaytech.com/?p=157</guid>
		<description><![CDATA[Sometimes a feature is broken in a way that is not immediately detectable by the call generator. For instance, let's say some call flow causes a memory leak in the switch. The call will work hundreds or thousands of times, but at some point the entire switch will stop working — and the cause won't be obvious.

You want your switch to crash and burn in your lab, not in the field. Let's look at three types of robustness testing. <p><a href="http://rimaytech.com/call-generator-robustness-testing/" title="Continue reading Use a Call Generator for Robustness Testing">Click here to read this article...</a></p>]]></description>
			<content:encoded><![CDATA[<p>We know that call generators are handy for finding <a title="How many call features do you have to stack before your switch falls down?" href="http://rimaytech.com/how-many-call-features-do-you-have-to-stack-before-you-find-a-failure/">call flows that break with odd combinations of features</a>.</p>
<p>Sometimes a feature is broken in a way that the call generator can&#8217;t detect right away. For instance, let&#8217;s say the device under test (DUT) leaks memory with a given call flow. The call will work hundreds or thousands of times, but at some point the entire DUT may stop working — and the cause won&#8217;t be obvious.</p>
<p>You want the DUT to melt in your lab, not on your customer. Let&#8217;s look at three types of robustness testing.</p>
<h3>Load Testing</h3>
<p>Load testing is typically performed by bulk call generators with many ports. They specialize in generating high call volume to place a high load on the DUT and verify that it is robust under heavy load. For lab testing, a call volume beyond the rated capacity should be used to verify that the DUT degrades gracefully (i.e. does not crash) under stress. If you are testing a small CPE like a one or two port ATA, then a <a title="RCG-4001 Call Generator" href="http://rimaytech.com/rcg-4001/">small port-count call generator</a> can do the job. <img class="alignright size-medium wp-image-251" title="A real crash" src="http://rimaytech.com/wp-content/uploads/2009/12/car_crash1-300x225.jpg" alt="Automobile crash test." width="300" height="225" /></p>
<p>Much of the load testing I&#8217;ve seen at various companies consists of simple call flows and does not probe the behavior of the DUT with more &#8220;interesting&#8221; calls under load. This is a missed opportunity for finding bugs. <strong>Load tests should include a variety of call flows.</strong></p>
<h3>Longevity Testing</h3>
<p>With longevity testing we want to find out if the DUT can survive a large number of calls that occur at a reasonable rate. For general longevity testing you may want to randomize the test suite so that — as described above — &#8220;interesting&#8221; sets of call flows occur throughout the test.</p>
<p>The point of longevity testing is not to overload the DUT but rather to subject the DUT to a reasonable load over a long period of time. (Where &#8220;reasonable&#8221; is defined for the DUT according to the device&#8217;s performance goals.)</p>
<p>The end goal is to find defects that occur after the DUT has processed a huge number of calls over a period of days or even weeks. Again, too often longevity testing uses a single, simple call flow. It makes sense to perform longevity testing of happy-path calls, but every once in a while it&#8217;s good to mix it up and make sure all of the boundary cases are handled well.</p>
<h3>Repeated Forced Errors</h3>
<p>As someone who has written and read thousands of lines of code I know that the best place to find bugs is in the dark corners of the error handling code. It doesn&#8217;t get exercised often (if at all), so it&#8217;s likely that it is not quite right.</p>
<p>As mentioned above, these failures may not be apparent right away. It may take large numbers of iterations before they rear their head, and then the symptoms may not point to the defect. You can make it easier to diagnose the failure by repeating a test that forces a particular error to occur.</p>
<p>&#8220;Errors&#8221; too can include multiple classes of errors, including some that can&#8217;t be induced at the FXO interface. You may have to create some clever test scripts.</p>
<p>For example, let&#8217;s say the DUT is an ATA. Connect the ATA&#8217;s analog line to the <a title="RCG-4001 Call Generator" href="http://rimaytech.com/rcg-4001/">RCG-4001</a>, and provision the ATA to use the RCG as a switch. On the RCG, your script is the SIP proxy, but it does not always behave properly. Perhaps it drops contact with the ATA, or maybe it returns a 4xx or 5xx response at some point in the flow. If you run this test repeatedly you may find that your production, commercial-quality stack is not as robust to these errors as it should be.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rimaytech?a=fw1A0iTZzkU:TKqr0TmJqG8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=fw1A0iTZzkU:TKqr0TmJqG8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rimaytech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=fw1A0iTZzkU:TKqr0TmJqG8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=fw1A0iTZzkU:TKqr0TmJqG8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rimaytech?a=fw1A0iTZzkU:TKqr0TmJqG8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rimaytech?i=fw1A0iTZzkU:TKqr0TmJqG8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rimaytech/~4/fw1A0iTZzkU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rimaytech.com/call-generator-robustness-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rimaytech.com/call-generator-robustness-testing/</feedburner:origLink></item>
	</channel>
</rss>

