qpid-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Qpid: Interop Testing Specification (page edited)
Date Tue, 25 Sep 2007 10:52:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence" />
    <style type="text/css">
    <!--
    body, p, td, table, tr, .bodytext, .stepfield {
	font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	color: #000000;
	font-weight: normal;
}
#PageContent {
	text-align: left;
	background-color: #fff;
	padding: 0px;
	margin: 0px;
    padding-bottom:20px;
}
/*
** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
** use an id=PageContent or class=wiki-content, so we must
** set the body style to that used for PageContent, and p to that used for wiki-content.
*/

body {
	margin: 0px;
	padding: 0px;
	text-align: center;
    background-color: #f0f0f0;
}

@media print {

body {
    background-color: #fff;
}

}

.monospaceInput {
    font:12px monospace
}

.wiki-content p, .commentblock p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}

.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}

ul, ol {
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}

pre {
    padding: 0px;
    margin-top: 5px;
    margin-left: 15px;
    margin-bottom: 5px;
    margin-right: 5px;
    text-align: left;
}

.helpheading {
    font-weight: bold;
    background-color: #D0D9BD;
        border-bottom: 1px solid #3c78b5;
        padding: 4px 4px 4px 4px;
        margin: 0px;
        margin-top: 10px;
}
.helpcontent {
        padding: 4px 4px 20px 4px;
    background-color: #f5f7f1;
}

.code {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.focusedComment {
    background: #ffffce;
}

.commentBox, .focusedComment {
    padding: 10px;
    margin: 5px 0 5px 0;
    border: 1px #bbb solid;
}

.codeHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.codeContent {
    text-align: left;
    background-color: #f0f0f0;
    padding: 3px;
}

.preformatted {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.preformattedHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.preformattedContent {
    background-color: #f0f0f0;
    padding: 3px;
}

.panel {
 	border: 1px dashed #3c78b5;
    margin: 10px;
    margin-top: 0px;
}

.panelHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.panelContent {
    background-color: #f0f0f0;
    padding: 5px;
}

.anonymousAlert {
    background-color: #f0f0f0;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}

.lockAlert {
    background-color: #f0f0f0;
    width: 50%;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}


.code-keyword {
  color: #000091;
  background-color: inherit;
}

.code-object {
  color: #910091;
  background-color: inherit;
}

.code-quote {
  color: #009100;
  background-color: inherit;
}

.code-comment {
  color: #808080;
  background-color: inherit;
}


.code-xml .code-keyword {
  color: inherit;
  font-weight: bold;
}

.code-tag {
  color: #000091;
  background-color: inherit;
}

.breadcrumbs {
    background-color: #f0f0f0;
 	border-color: #3c78b5;
	border-width: 1px 0px 1px 0px;
	border-style: solid;
    font-size: 11px;
    padding: 3px 0px 3px 0px;
}

.navmenu {
    border: 1px solid #ccc;
}

.menuheading {
    font-weight: bold;
    background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 2px 4px;
}

.menuitems {
	padding: 4px 4px 20px 4px;
}

.rightpanel {
    border-left: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
}

#helpheading {
    text-align: left;
    font-weight: bold;
    background-color: #D0D9BD;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 4px 4px;
	margin: 0px;
}
#helpcontent {
	padding: 4px 4px 4px 4px;
    background-color: #f5f7f1;
}
.helptab-unselected {
    font-weight: bold;
	padding: 5px;
    background-color: #f5f7f1;
}
.helptab-selected {
    font-weight: bold;
    background-color: #D0D9BD;
	padding: 5px;
}
.helptabs {
    margin: 0px;
    background-color: #f5f7f1;
	padding: 5px;
}
.infopanel-heading {
    font-weight: bold;
	padding: 4px 0px 2px 0px;
}

.pagebody {
}

.pageheader {
	padding: 5px 5px 5px 0px;
 	border-bottom: 1px solid #3c78b5;
}

.pagetitle {
	font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.newpagetitle {
    color: #ccc !important;
}

.steptitle {
	font-size: 18px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
	margin-bottom: 7px;
}

.substeptitle {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
    margin: 2px 4px 4px 4px;
    padding: 2px 4px 1px 4px;
}

.stepdesc {
    font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	font-weight: normal;
    color: #666666;
    margin-top: 7px;
    margin-bottom: 7px;
}

.steplabel {
    font-weight: bold;
    margin-right: 4px;
    color: black;
    float: left;
    width: 15%;
    text-align: right;
}

.stepfield {
    background: #f0f0f0;
    padding: 5px;
}

.submitButtons{
    margin-top:5px;
    text-align:right;
}

.formtitle {
	font-size: 12px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.sectionbottom {
    border-bottom: 1px solid #3c78b5;
}

.topRow {
    border-top: 2px solid #3c78b5;
}

.tabletitle {
	font-size: 14px;
	font-weight: bold;
	font-family: Arial, sans-serif;
    padding: 3px 0px 2px 0px;
    margin: 8px 4px 2px 0px;
	color: #003366;
	border-bottom: 2px solid #3c78b5;
}
.pagesubheading {
    color: #666666;
    font-size: 10px;
    padding: 0px 0px 5px 0px;
}

HR {
	color: 3c78b5;
	height: 1;
}

A:link, A:visited, A:active, A:hover {
	color: #003366;
}

h1 A:link, h1 A:visited, h1 A:active {
	text-decoration: none;
}

h1 A:hover {
    border-bottom: 1px dotted #003366;
}

.wiki-content > :first-child, .commentblock > :first-child {
    margin-top: 3px;
}

.logocell {
    padding: 10px;
}

input {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #000000;
}

textarea, textarea.editor {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #333333;
}

/* use logoSpaceLink instead.
.spacenametitle {
	font: 21px/31px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle img {
  margin: 0 0 -4px 0;
}
.spacenametitle a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle a:visited {
    text-decoration: none;
    color: #999999;
}*/

.spacenametitle-printable {
	font: 20px/25px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle-printable a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle-printable a:visited {
    text-decoration: none;
    color: #999999;
}

.blogDate {
	font-weight: bold;
	text-decoration: none;
	color: black;
}

.blogSurtitle {
    background: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.blogHeading {
    font-size: 20px;
    line-height: normal;
    font-weight: bold;
    padding: 0px;
    margin: 0px;
}

.blogHeading a {
   text-decoration: none;
   color: black;
}

.endsection {
	align: right;
	color: #666666;
	margin-top: 10px;
}
.endsectionleftnav {
	align: right;
	color: #666666;
	margin-top: 10px;
}

h1 {
	font-size: 24px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	color: #003366;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 36px 0px 4px 0px;
}

h2 {
	font-size: 18px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 27px 0px 4px 0px;
}

h3 {
	font-size: 14px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 21px 0px 4px 0px;
}

h4 {
	font-size: 12px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 18px 0px 4px 0px;
}

h4.search {
	font-size: 12px;
	line-height: normal;
	font-weight: normal;
	background-color: #f0f0f0;
	padding: 4px;
	margin: 18px 0px 4px 0px;
}

h5 {
	font-size: 10px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

h6 {
	font-size: 8px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

.smallfont {
    font-size: 10px;
}
.descfont {
    font-size: 10px;
    color: #666666;
}
.smallerfont {
    font-size: 9px;
}
.smalltext {
    color: #666666;
    font-size: 10px;
}
.smalltext a {
    color: #666666;
}
.smalltext-blue {
    color: #3c78b5;
    font-size: 10px;
}
.surtitle {
    margin-left: 1px;
    margin-bottom: 5px;
    font-size: 14px;
    color: #666666;
}

/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
.navItem a { color: #ffffff; text-decoration: none; }
.navItem a:hover { color: #ffffff; text-decoration: none; }
.navItem a:visited { color: #ffffff; text-decoration: none; }

div.padded { padding: 4px; }
div.thickPadded { padding: 10px; }
h3.macrolibrariestitle {
    margin: 0px 0px 0px 0px;
}

div.centered { text-align: center; margin: 10px; }
div.centered table {margin: 0px auto; text-align: left; }

.tableview table {
    margin: 0;
}

.tableview th {
    text-align: left;
    color: #003366;
    font-size: 12px;
    padding: 5px 0px 0px 5px;
    border-bottom: 2px solid #3c78b5;
}
.tableview td {
    text-align: left;
    border-color: #ccc;
    border-width: 0px 0px 1px 0px;
    border-style: solid;
    margin: 0;
    padding: 4px 10px 4px 5px;
}

.grid {
    margin: 2px 0px 5px 0px;
    border-collapse: collapse;
}
.grid th  {
    border: 1px solid #ccc;
    padding: 2px 4px 2px 4px;
    background: #f0f0f0;
    text-align: center;
}
.grid td  {
    border: 1px solid #ccc;
    padding: 3px 4px 3px 4px;
}
.gridHover {
	background-color: #f9f9f9;
}

td.infocell {
    background-color: #f0f0f0;
}
.label {
	font-weight: bold;
	color: #003366;
}

label {
	font-weight: bold;
	color: #003366;
}

.error {
	background-color: #fcc;
}

.errorBox {
	background-color: #fcc;
    border: 1px solid #c00;
    padding: 5px;
    margin: 5px;
}

.errorMessage {
	color: #c00;
}

.success {
	background-color: #dfd;
}

.successBox {
	background-color: #dfd;
    border: 1px solid #090;
    padding: 5px;
    margin-top:5px;
    margin-bottom:5px;
}

blockquote {
	padding-left: 10px;
	padding-right: 10px;
	margin-left: 5px;
	margin-right: 0px;
	border-left: 1px solid #3c78b5;
}

table.confluenceTable
{
    margin: 5px;
    border-collapse: collapse;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

DIV.small {
	font-size: 9px;
}

H1.pagename {
	margin-top: 0px;
}

IMG.inline  {}

.loginform {
    margin: 5px;
    border: 1px solid #ccc;
}

/* The text how the "This is a preview" comment should be shown. */
.previewnote { text-align: center;
                font-size: 11px;
                    color: red; }

/* How the preview content should be shown */
.previewcontent { background: #E0E0E0; }

/* How the system messages should be shown (DisplayMessage.jsp) */
.messagecontent { background: #E0E0E0; }

/* How the "This page has been modified..." -comment should be shown. */
.conflictnote { }

.createlink {
    color: maroon;
}
a.createlink {
    color: maroon;
}
.templateparameter {
    font-size: 9px;
    color: darkblue;
}

.diffadded {
    background: #ddffdd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkgreen;
}
.diffdeleted {
    color: #999;
    background: #ffdddd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkred;
}
.diffnochange {
    padding: 1px 1px 1px 4px;
	border-left: 4px solid lightgrey;
}
.differror {
    background: brown;
}
.diff {
    font-family: lucida console, courier new, fixed-width;
	font-size: 12px;
	line-height: 14px;
}
.diffaddedchars {
    background-color:#99ff99;
    font-weight:bolder;
}
.diffremovedchars {
    background-color:#ff9999;
    text-decoration: line-through;
    font-weight:bolder;
}

.greybackground {
    background: #f0f0f0
}

.greybox {
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.borderedGreyBox {
    border: 1px solid #cccccc;
    background-color: #f0f0f0;
    padding: 10px;
}

.greyboxfilled {
 	border: 1px solid #ddd;
    background: #f0f0f0;
    padding: 3px;
	margin: 1px 1px 10px 1px;
}

.navBackgroundBox {
    padding: 5px 5px 5px 5px;
    font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: white;
    background: #3c78b5;
    text-decoration: none;
}

.previewBoxTop {
	background-color: #f0f0f0;
    border-width: 1px 1px 0px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 5px 0px 0px 0px;
    text-align: center;
}
.previewContent {
    background-color: #fff;
 	border-color: #3c78b5;
	border-width: 0px 1px 0px 1px;
	border-style: solid;
	padding: 10px;
	margin: 0px;
}
.previewBoxBottom {
	background-color: #f0f0f0;
    border-width: 0px 1px 1px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 0px 0px 5px 0px;
    text-align: center;
}

.functionbox {
    background-color: #f0f0f0;
 	border: 1px solid #3c78b5;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.functionbox-greyborder {
    background-color: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.search-highlight {
    background-color: #ffffcc;
}

/* normal (white) background */
.rowNormal {
    background-color: #ffffff;
 }

/* alternate (pale yellow) background */
.rowAlternate {
    background-color: #f7f7f7;
}

/* used in the list attachments table */
.rowAlternateNoBottomColor {
    background-color: #f7f7f7;
}

.rowAlternateNoBottomNoColor {
}

.rowAlternateNoBottomColor td {
    border-bottom: 0px;
}

.rowAlternateNoBottomNoColor td {
    border-bottom: 0px;
}

/* row highlight (grey) background */
.rowHighlight {
    background-color: #f0f0f0;

}

TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }

TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }

.toolbar  {
    margin: 0px;
    border-collapse: collapse;
}

.toolbar td  {
    border: 1px solid #ccc;
    padding: 2px 2px 2px 2px;
    color: #ccc;
}

td.noformatting {
    border-width: 0px;
    border-style: none;
    text-align: center;
	padding: 0px;
}

.commentblock {
    margin: 12px 0 12px 0;
}

/*
 * Divs displaying the license information, if necessary.
 */
.license-eval, .license-none, .license-nonprofit {
    border-top: 1px solid #bbbbbb;
    text-align: center;
    font-size: 10px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

.license-eval, .license-none {
    background-color: #ffcccc;
}

.license-eval b, .license-none b {
    color: #990000
}

.license-nonprofit {
    background-color: #ffffff;
}

/*
 * The shadow at the bottom of the page between the main content and the
 * "powered by" section.
 */
.bottomshadow {
    height: 12px;
    background-image: url("$req.contextPath/images/border/border_bottom.gif");
    background-repeat: repeat-x;
}

/*
 * Styling of the operations box
 */
.navmenu .operations li, .navmenu .operations ul {
    list-style: none;
    margin-left: 0;
    padding-left: 0;
}

.navmenu .operations ul {
    margin-bottom: 9px;
}

.navmenu .label {
    font-weight: inherit;
}

/*
 * Styling of ops as a toolbar
 */
.toolbar div {
    display: none;
}

.toolbar .label {
    display: none;
}

.toolbar .operations {
    display: block;
}

.toolbar .operations ul {
    display: inline;
    list-style: none;
    margin-left: 10px;
    padding-left: 0;
}

.toolbar .operations li {
    list-style: none;
    display: inline;
}

/* list page navigational tabs */
#foldertab {
padding: 3px 0px 3px 8px;
margin-left: 0;
border-bottom: 1px solid #3c78b5;
font: bold 11px Verdana, sans-serif;
}

#foldertab li {
list-style: none;
margin: 0;
display: inline;
}

#foldertab li a {
padding: 3px 0.5em;
margin-left: 3px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
text-decoration: none;
}

#foldertab li a:link { color: #ffffff; }
#foldertab li a:visited { color: #ffffff; }

#foldertab li a:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

#foldertab li a.current {
background: white;
border-bottom: 1px solid white;
color: black;
}

#foldertab li a.current:link { color: black; }
#foldertab li a.current:visited { color: black; }
#foldertab li a.current:hover {
background: white;
border-bottom: 1px solid white;
color: black;
}

/* alphabet list */
ul#squaretab {
margin-left: 0;
padding-left: 0;
white-space: nowrap;
font: bold 8px Verdana, sans-serif;
}

#squaretab li {
display: inline;
list-style-type: none;
}

#squaretab a {
padding: 2px 6px;
border: 1px solid #3c78b5;
}

#squaretab a:link, #squaretab a:visited {
color: #fff;
background-color: #3c78b5;
text-decoration: none;
}

#squaretab a:hover {
color: #ffffff;
background-color: #003366;
border-color: #003366;
text-decoration: none;
}

#squaretab li a#current {
background: white;
color: black;
}

.blogcalendar * {
    font-family:verdana, arial, sans-serif;
    font-size:x-small;
    font-weight:normal;
    line-height:140%;
    padding:2px;
}


table.blogcalendar {
    border: 1px solid #3c78b5;
}

.blogcalendar th.calendarhead, a.calendarhead {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    text-transform:uppercase;
    background-color: #3c78b5;
    color: #ffffff;
    letter-spacing: .3em;
    text-transform: uppercase;
}

.calendarhead:visited {color: white;}
.calendarhead:active {color: white;}
.calendarhead:hover {color: white;}

.blogcalendar th {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    background-color:#f0f0f0;
}

.blogcalendar td {
    font-size:x-small;
    font-weight:normal;
}

.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
.searchItem { padding: 1px 4px 1px 4px; }
.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }

/* permissions page styles */
.permissionHeading {
    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
}
.permissionTab {
    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
}
.permissionSuperTab {
    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
}
.permissionCell {
    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
}

/* warning panel */
.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
/* alert panel */
.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
/* info panel */
.infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }

/* side menu highlighting (e.g. space content screen) */
.optionPadded { padding: 2px; }
.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
.optionSelected a { font-weight: bold; text-decoration: none; color: black; }

/* information macros */
.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.informationMacroPadding { padding: 5px 0 0 5px; }

table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
    border: none;
}

table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}

.pagecontent
{
    padding: 10px;
    text-align: left;
}

/* styles for links in the top bar */
.topBarDiv a:link {color: #ffffff;}
.topBarDiv a:visited {color: #ffffff;}
.topBarDiv a:active {color: #ffffff;}
.topBarDiv a:hover {color: #ffffff;}
.topBarDiv {color: #ffffff;}

.topBar {
    background-color: #003366;
}


/* styles for extended operations */
.greyLinks a:link {color: #666666; text-decoration:underline;}
.greyLinks a:visited {color: #666666; text-decoration:underline;}
.greyLinks a:active {color: #666666; text-decoration:underline;}
.greyLinks a:hover {color: #666666; text-decoration:underline;}
.greyLinks {color: #666666; display:block; padding: 10px}

.logoSpaceLink {color: #999999; text-decoration: none}
.logoSpaceLink a:link {color: #999999; text-decoration: none}
.logoSpaceLink a:visited {color: #999999; text-decoration: none}
.logoSpaceLink a:active {color: #999999; text-decoration: none}
.logoSpaceLink a:hover {color: #003366; text-decoration: none}

/* basic panel (basicpanel.vmd) style */
.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
.basicPanelBody {padding: 5px; margin: 0px}

.separatorLinks a:link {color: white}
.separatorLinks a:visited {color: white}
.separatorLinks a:active {color: white}

.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}

div.headerField {
    float: left;
    width: auto;
    height: 100%;
}

.headerFloat {
    margin-left: auto;
    width: 50%;
}

.headerFloatLeft {
    float: left;
    margin-right: 20px;
    margin-bottom: 10px;
}

#headerRow {
    padding: 10px;
}

div.license-personal {
   background-color: #003366;
   color: #ffffff;
}

div.license-personal a {
   color: #ffffff;
}

.greyFormBox {
    border: 1px solid #cccccc;
    padding: 5px;
}

/* IE automatically adds a margin before and after form tags. Use this style to remove that */
.marginlessForm {
    margin: 0px;
}

.openPageHighlight {
    background-color: #ffffcc;
    padding: 2px;
    border: 1px solid #ddd;
}

.editPageInsertLinks, .editPageInsertLinks a
{
    color: #666666;
    font-weight: bold;
    font-size: 10px;
}

/* Style for label heatmap. */
.top10 a {
    font-weight: bold;
    font-size: 2em;
    color: #003366;
}
.top25 a {
    font-weight: bold;
    font-size: 1.6em;
    color: #003366;
}
.top50 a {
    font-size: 1.4em;
    color: #003366;
}
.top100 a {
    font-size: 1.2em;
    color: #003366;
}

.heatmap {
    list-style:none;
    width: 95%;
    margin: 0px auto;
}

.heatmap a {
    text-decoration:none;
}

.heatmap a:hover {
    text-decoration:underline;
}

.heatmap li {
    display: inline;
}

.minitab {
padding: 3px 0px 3px 8px;
margin-left: 0;
margin-top: 1px;
margin-bottom: 0px;
border-bottom: 1px solid #3c78b5;
font: bold 9px Verdana, sans-serif;
text-decoration: none;
float:none;
}
.selectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
background: white;
border-bottom: 1px solid white;
color: #000000;
text-decoration: none;
}
.unselectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
color: #ffffff;
text-decoration: none;
}

a.unselectedminitab:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

a.unselectedminitab:link { color: white; }
a.unselectedminitab:visited { color: white; }

a.selectedminitab:link { color: black; }
a.selectedminitab:visited { color: black; }

.linkerror { background-color: #fcc;}

a.labelOperationLink:link {text-decoration: underline}
a.labelOperationLink:active {text-decoration: underline}
a.labelOperationLink:visited {text-decoration: underline}
a.labelOperationLink:hover {text-decoration: underline}

a.newLabel:link {background-color: #ddffdd}
a.newLabel:active {background-color: #ddffdd}
a.newLabel:visited {background-color: #ddffdd}
a.newLabel:hover {background-color: #ddffdd}

ul.square {list-style-type: square}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
}


.inline-control-link a:link {text-decoration: none}
.inline-control-link a:active {text-decoration: none}
.inline-control-link a:visited {text-decoration: none}
.inline-control-link a:hover {text-decoration: none}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
}

div.auto_complete {
    width: 350px;
    background: #fff;
}
div.auto_complete ul {
    border: 1px solid #888;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style-type: none;
}
div.auto_complete ul li {
    margin: 0;
    padding: 3px;
}
div.auto_complete ul li.selected {
    background-color: #ffb;
}
div.auto_complete ul strong.highlight {
    color: #800;
    margin: 0;
    padding: 0;
}

/******* Edit Page Styles *******/
.toogleFormDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    padding:5px;
    margin-top: 5px;
}

.toogleInfoDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    display:none;
    padding:5px;
    margin-top: 10px;
}

.inputSection{
    margin-bottom:20px;
}

#editBox{
   border:1px solid lightgray;
   background-color:#F0F0F0;
}

/******* Left Navigation Theme Styles ********/
.leftnav li a {
    text-decoration:none;
    color:white;
    margin:0px;
    display:block;
    padding:2px;
    padding-left:5px;
    background-color: #3c78b5;
    border-top:1px solid #3c78b5;
}

.leftnav li a:active {color:white;}
.leftnav li a:visited {color:white;}
.leftnav li a:hover {background-color: #003366; color:white;}

/* Added by Shaun during i18n */
.replaced
{
    background-color: #33CC66;
}

.topPadding
{
    margin-top: 20px;
}

/* new form style */
.form-block {
    padding: 6px;
}
.form-error-block {
    padding: 6px;
    background: #fcc;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-element-large {
    font-size: 16px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-element-small {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-header {
    background: lightyellow;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-header p, .form-block p, .form-error-block p {
    line-height: normal;
    margin: 12px 0 12px 0;
}
.form-example {
    color: #888;
    font-size: 11px;
}
.form-divider {
    border-bottom: #ccc 1px solid;
    margin-bottom: 6px;
}
.form-buttons {
    margin-top: 6px;
    border-top: #ccc 1px solid;
    border-bottom: #ccc 1px solid;
    background: #f0f0f0;
    padding: 10px;
    text-align: center;
}
.form-buttons input {
    width: 100px;
}
.form-block .error {
    padding: 6px;
    margin-bottom: 6px;
}
    -->
    </style>
</head>
<body>

<div id="PageContent">
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr>
<td valign="top" class="pagebody">

    <div class="pageheader">
        <span class="pagetitle">
            Page Edited :
            <a href="http://cwiki.apache.org/confluence/display/qpid">qpid</a> :
            <a href="http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification">Interop Testing Specification</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification">Interop Testing Specification</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~rupertlssmith">Rupert Smith</a>
            <span class="smallfont">(Sep 25, 2007)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=47877&originalVersion=7&revisedVersion=8">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h1><a name="InteropTestingSpecification-QpidInteropTestingSpec.WorkingCopy."></a>Qpid Interop Testing Spec. Working Copy.</h1>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Draft. </th>
<td class='confluenceTd'> Rupert Smith. </td>
<td class='confluenceTd'> 22nd Feb 2007 </td>
<td class='confluenceTd'> Document started. </td>
</tr>
<tr>
<th class='confluenceTh'> Working Copy. </th>
<td class='confluenceTd'> Rupert Smith. </td>
<td class='confluenceTd'> 6th Mar 2007 </td>
<td class='confluenceTd'> Document updated from feedback to draft on qpid-dev list. Last requirement # used: 47 </td>
</tr>
<tr>
<th class='confluenceTh'> Working Copy. </th>
<td class='confluenceTd'> Rupert Smith. </td>
<td class='confluenceTd'> 7th Mar 2007 </td>
<td class='confluenceTd'> Senders and receivers to send reports to coordinator. Reply-to added to broadcast messages. Last requirement # used: 49 </td>
</tr>
<tr>
<th class='confluenceTh'> Working Copy. </th>
<td class='confluenceTd'> Rupert Smith. </td>
<td class='confluenceTd'> 13th Mar 2007 </td>
<td class='confluenceTd'> Added test case names. Last requirement # used: 52 </td>
</tr>
<tr>
<th class='confluenceTh'> Working Copy. </th>
<td class='confluenceTd'> Rupert Smith. </td>
<td class='confluenceTd'> 25th Spet 2007 </td>
<td class='confluenceTd'> Added test cases for message size variation. Last requirement # used: 60 </td>
</tr>
</tbody></table>

<h2><a name="InteropTestingSpecification-Introduction%3A"></a>Introduction:</h2>

<p> The requirements in this specification use a common format, an example of which is given below:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> RE-1. </th>
<th class='confluenceTh'> Sample Requirement. </th>
<td class='confluenceTd'> A brief descritpion of the requirement. </td>
</tr>
</tbody></table>

<p> The requirements are numbered from 1.</p>

<h2><a name="InteropTestingSpecification-Purpose%3A"></a>Purpose:</h2>

<ul>
	<li>Test sending from and receiving by each of the clients in Qpid over both of the broker implementations.</li>
</ul>


<ul>
	<li>Make tests robust enough to run as part of an automated build. The scripts should pass or fail, not hang, wait forever, run out of memory or otherwise cause an automated build process to fail to complete.</li>
</ul>


<ul>
	<li>Be capable of running the full test suite on several machines in a hands free way. In particular C++ tests need to run on unix and .Net on windows, necessitating a multi-box solution for full interop testing.</li>
</ul>


<ul>
	<li>Run just a few tests to begin with; more can be added later. Establish a working test framework as quickly as possible.</li>
</ul>


<h2><a name="InteropTestingSpecification-Constraints%3A"></a>Constraints:</h2>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-1. </th>
<th class='confluenceTh'> Operating System. </th>
<td class='confluenceTd'> The test client scripts must run on Unix and Windows. If a test client implementation is only available on one of these platforms it only needs to run on its supported platform. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-2. </th>
<th class='confluenceTh'> Scripting Language. </th>
<td class='confluenceTd'> Each test client must be startable from a Unix shell script. Tests run on Windows will use Cygwin to run these scripts. There is no need to support Windows .bat scripts. </td>
</tr>
</tbody></table>

<h2><a name="InteropTestingSpecification-FunctionalRequirements%3A"></a>Functional Requirements:</h2>

<h3><a name="InteropTestingSpecification-Introduction."></a>Introduction.</h3>

<p> These requirements describe the behaviour of test clients for interop testing between the different client implementations in Qpid. Each client is expected to be a single program that is capable of sending test messages to other clients and receiving and responding to test messages received from other test clients. The clients are not to be run as seperate programs for the sending and receiving parts for the sake of convenience in being able to run the clients as part of an automated build. The clients will listen for control messages broadcast by a master coordinator client, to enlist them in tests, tell them which test to run, when to begin their tests, and when to shutdown.</p>

<p> A centralized approach has been chosen, using a single coordinator client, as test framework code which would otherwise have to be duplicated amongst all the clients will generally be put in the coordinator. This means that code will only have to be written and maintained in one place. This code will include code for enlisting clients for tests, deciding which test case to run, and formatting and logging out the results. The alternative would be to have a de-centralized approach, where each client broadcasts the test enlist messages, finds out what other clients are available to talk to, choses which tests to run and outputs the test results. One advantage of the centralized approach, is that the coordinator should know which clients are available, and therefore which clients cannot run particular tests, or fail completely to run particular tests, and should therefore be able to log out failures for clients that fail tests in a more reliable way, than if it were up to the clients to log their own failures and ommissions.</p>

<h3><a name="InteropTestingSpecification-CommonRequirements."></a>Common Requirements.</h3>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-3. </th>
<th class='confluenceTh'> Directory Structure. </th>
<td class='confluenceTd'> All scripts to start and stop brokers and run test clients will be placed in a directory structure underneath a top-level directory called 'interop' that sits at the top level of the Qpid project. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-4. </th>
<th class='confluenceTh'> Test Output Format. </th>
<td class='confluenceTd'> Output in junit xml format (because a lot of automated build software understands this format). There doesn't seem to be a schema or DTD for this format but it is simple enough. See Appendix B for an example. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-5. </th>
<th class='confluenceTh'> Terminate On Timeout. </th>
<td class='confluenceTd'> Each client will keep a timeout count. Every time it gets a message it will reset this count. If it does not hear from the broker at all for 60 seconds then it will assume that the broker has died or that the other test clients are failing to communicate with it, and will terminate. Test clients will only wait on this timeout when they are actually expecting messages, for example after enlisting to a test and expecting a role assignment message, or during a test when they are expecting to be sent a test message. If neccessary, this timeout can be extended to a longer time period than 60 secods, its purpose is to ensure eventual termination of all clients during a fully automated build. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-6. </th>
<th class='confluenceTh'> Default Virtual Host. </th>
<td class='confluenceTd'> All test clients will use the default virtual host (no name) for all tests, unless overriden by test parameters for a particular test case, or by command line options when starting the client. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-7. </th>
<th class='confluenceTh'> Broadcast Control Topic. </th>
<td class='confluenceTd'> All test clients will listen to control messages broadcast on the routing key 'iop.control' on the default virtual host on the default topic exchange. This control topic is used for communicating with the test coordinator client. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-48. </th>
<th class='confluenceTh'> Control Message Replies. </th>
<td class='confluenceTd'> All control messages broadcast by the coordinator will include a reply to field. The coordinator will listen on the reply address for responses to its control messages. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-8. </th>
<th class='confluenceTh'> No Environment for Scripts. </th>
<td class='confluenceTd'> In general, start up scripts should be intelligent enough to configure the environment variables that they need in order to run. It should be sufficient to have a path configured for the neccessary run time tools (such as Java) when calling scripts. Environment variables, such as QPID_HOME, should be set by startup scripts themselves, figured out from their installation locations. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-9. </th>
<th class='confluenceTh'> Wait Until Background Process Started. </th>
<td class='confluenceTd'> Scripts that start processes running in the background should not terminate until the process they are starting has succesfully started. This is neccessary for reliable testing, to ensure that subsequent scripts can be run, knowing that previous scripts have completed, with dependant proccesses in a known state. For example, it is important to start all test clients prior to starting the coordinator. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-UseCase1.StartingaBroker."></a>Use Case 1. Starting a Broker.</h3>

<p>  Run the broker start script.<br/>
  The script starts a broker running and tries to connect to it (or otherwise ping it) until it is verified to be running.<br/>
  Once the broker is verified to be running the script terminates with no error code.</p>

<p>  <b>Failure path:</b> The broker fails to start or does not appear to be running after a timeout has passed. The script fails with an error code.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-10. </th>
<th class='confluenceTh'> Broker Start Script. </th>
<td class='confluenceTd'> The Java and C++ brokers will define scripts that can start the broker running on the local machine, and these scripts will be located at interop/java/broker/start and interop/cpp/broker/start. The Java and C++ build processes will generate these scripts (or copy pre-defined ones to the output location) as part of their build processes. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-11. </th>
<th class='confluenceTh'> Broker Start Failure. </th>
<td class='confluenceTd'> If a broker fails to start within 60 seconds its start script will timeout. Script will terminate with error code 1. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-12. </th>
<th class='confluenceTh'> Broker Start Succesfull. </th>
<td class='confluenceTd'> When the broker starts succesfully the script will terminate with error code 0. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-UseCase2.StoppingaBroker."></a>Use Case 2. Stopping a Broker.</h3>

<p>  Run the broker stop script.<br/>
  The script terminates the broker that was started with the start script if it is still running.</p>

<p>  <b>Failure path:</b> The broker won't terminate. The script fails with an error code.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-13. </th>
<th class='confluenceTh'> Broker Stop Script. </th>
<td class='confluenceTd'> The Java and C++ brokers will define scripts that can stop the broker running on the local machine, and these scripts will be located at interop/java/broker/stop and interop/cpp/broker/stop. The Java and C++ build processes will generate these scripts (or copy pre-defined ones to the output location) as part of their build processes. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-14. </th>
<th class='confluenceTh'> Broker Stop Timeout. </th>
<td class='confluenceTd'> If a broker fails to terminate within 60 seconds its stop script will timeout. Script will terminate with error code 1. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-15. </th>
<th class='confluenceTh'> Broker Stop Succesfull. </th>
<td class='confluenceTd'> When the broker stops succesfully the script will terminate with error code 0. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-UseCase3.StartingaTestClient."></a>Use Case 3. Starting a Test Client.</h3>

<p>  Run the client start script. The caller will pass in the address of the broker to connect to.<br/>
  The script starts a client running.<br/>
  The client starts running but waits for further instruction before running its tests.<br/>
  The start script will terminate but leave the client running as a forked process.</p>

<p>  <b>Failure path:</b> The client will not start, or fails to connect to the specified broker. The script will terminate with error code 1.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-16. </th>
<th class='confluenceTh'> Client Start Scripts. </th>
<td class='confluenceTd'> For each client implementation, &lt;client&gt;, there will be a start script located at interop/&lt;client&gt;/client/start. The build processes for each client will generate these scripts and output them to this location as part of their build process. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-17. </th>
<th class='confluenceTh'> Client Start Timeout. </th>
<td class='confluenceTd'> If the client fails to start and connect to the specified broker within 60 seconds the script will terminate with error code 1. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-18. </th>
<th class='confluenceTh'> Client Start Succesfull. </th>
<td class='confluenceTd'> When the client starts successfully its script will terminate with error code 0. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-19. </th>
<th class='confluenceTh'> Client Start Broker and Port. </th>
<td class='confluenceTd'> The -b &lt;hostname&gt; option will be used to instruct the start script to connect to the specified hostname. The -p &lt;port&gt; option will similarly allow the port to be specified. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-20. </th>
<th class='confluenceTh'> Client Virtual Host. </th>
<td class='confluenceTd'> The default virtual host to connect to, may be overridden with the -v &lt;virtual_host&gt; command line option, which will be accepted by all test clients. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-21. </th>
<th class='confluenceTh'> Client Start General Parameters. </th>
<td class='confluenceTd'> General parameters may be passed to the client start scripts using the synax name=value. These name/value pairs may be used by specific test cases to override default test parameters. See Appendix C for a list of test parameters. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-UseCase4.StartingtheCoordinator."></a>Use Case 4. Starting the Coordinator.</h3>

<ul>
	<li>The requirements defined for Use Case 3, also apply to this use case.</li>
</ul>


<p> Run the testall start script. The caller will pass in the address of the broker to connect to.<br/>
 The script starts the coordinator client running.<br/>
 The coordinator will manage the test procedure.<br/>
 The scipt will terminate when the coordinator has completed.</p>

<p> <b>Failure path:</b> The coordinator will not start, or fails to connect to the broker. The script will terminate with error code 1.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-22. </th>
<th class='confluenceTh'> Coordinator Test Script. </th>
<td class='confluenceTd'> There will be a coordinator test script that kicks off the testing process once all clients have been started. It is to be located at interop/testall. It will start a coordinator test client that issues test invites, assigns roles, collects results and terminates test clients when all tests have been run. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-UseCase5.OverallTestProcedure."></a>Use Case 5. Overall Test Procedure.</h3>

<p>  Start a broker running using its start script as described by Use Case 1.<br/>
  Call the start all clients script on each of the machines where there are clients that are to be tested. The caller will pass in address of the broker to connect to, and any additional parameters.<br/>
  The start all script will scan for all start scripts located under interop/&lt;client&gt;/client/start and call each of them forwarding its command line arguments on the call. This performs Use Case 3 for each client.<br/>
  Call the coordinator test client script. This is described as Use Case 4.</p>

<p>  The coordinator test script will broadcast an invite message, with no test name on the control topic. The lack of a test name indicates that this is a compulsory invite, to which all clients must enlist.<br/>
  Each client will respond with an enlist message. This message will contain the routing key on the default topic exchange to which the client has bound its private control queue.<br/>
  The coordinator retains the list of available clients, and the addresses of their control queues.</p>

<p>  The coordinator will broadcast an invite to a named test. This invite may also contain any parameters needed to configure the test, that are relevant to a clients choice to accept the invite or not.<br/>
  All clients that are able to participate in this test will reply to the invite with enlist messages. Clients may opt to participate in the test depending on the test parameters, if desired.<br/>
  The coordinator will send messages to assign roles to the sender and receivers private control topics. These messages will contain the test parameters and roles. The test parameters may also include additional parameters not in the original invite, for test parameters that are to be set on a per test instance basis.<br/>
  The clients will respond with accept role messages.<br/>
  The coordinator will wait until it has received acceptances from both roles.<br/>
  The coordinator will issue a start message to the client with the sender role.<br/>
  The sender client will send its test messages. Once the test has completed the sender will send a report message to the coordinator, giving details about the message that it sent.<br/>
  The coordinator will wait until it receives a report message from the sender.<br/>
  The coordinator will issue a status request message to the reciever role.<br/>
  The receiver will reply with a report, giving details about the messages it has received.<br/>
  The coordinator will wait until it receives a report message from the receiver.<br/>
  The coordinator will compare the sender and receiver reports in order to decide whether the test passed or failed.<br/>
  The coordinator will check its list of available clients and log out failures for any combinations of clients that were not tested because they did not enlist for the test.</p>

<p>  Once all test cases are complete, the coordinator will broadcast a shutdown message.<br/>
  All clients will terminate on receipt of the shutdown message.<br/>
  The coordinator will terminate.<br/>
  Terminate the broker using its stop script.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-23. </th>
<th class='confluenceTh'> Start All Script. </th>
<td class='confluenceTd'> There will be a start all clients script, located at interop/startall. The startall script finds all client starts scripts under interop/&lt;client&gt;/client/start and calls them. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-24. </th>
<th class='confluenceTh'> Start All Script Options Forwarding. </th>
<td class='confluenceTd'> The start all script will take the same command line options as the client start scripts and will pass these command line options on to them. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-25. </th>
<th class='confluenceTh'> Invite Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> For every test case the coordinator will broadcast an invite message on the control topic. This message will be identified by the header field, "CONTROL_TYPE", having the value, "INVITE". This message will also include the name of the test case and may also include some test parameters. (See IOP-48, for the reply to address.)</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "INVITE"
          "TEST_NAME",                  "&lt;test_case&gt;"
          ... optional test parameters.
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-26. </th>
<th class='confluenceTh'> Initial Invite. </th>
<td class='confluenceTd'> At the start of the test procedure the coordinator will broadcast a compulsory invite, to which all available clients must enlist, in order to declare their availability and to enable the coordinator to detect when there are clients that did not participate in some tests. The compulsory invite will be differentiated form an ordinatory invite because it will have no "TEST_NAME" header field. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-27. </th>
<th class='confluenceTh'> Enlist Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> Every test client that receives an invite message will respond by declaring its availability to run interop tests. The client will send an enlist message by replying to the invite message. The enlist message will be identified by the header field, "CONTROL_TYPE", having the value, "ENLIST". The client will declare the routing key on which it expects to be sent private control messages. The client will also declare a unique name by which it can be identified (see IOP-35). The declare available message will contain the following header fields with this information: </p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "ENLIST"
          "CLIENT_NAME",                "&lt;client_name&gt;"             (see IOP-35 for rules about the client name).
          "CLIENT_PRIVATE_CONTROL_KEY", "iop.control.&lt;client_name&gt;" (see IOP-36)
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-28. </th>
<th class='confluenceTh'> Assign Role Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> Having selected clients to participate in a particular test case, the coordinator will send those clients messages to assign the roles they will play in the test case, on the clients private control topics. Each test case has sender and receiver roles. This message will be identified by the header field, "CONTROL_TYPE", having the value, "ASSIGN_ROLE". The full test parameters will be included in this message, allowing tests to be configured on a per test instance basis.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "ASSIGN_ROLE"
          ... full test parameters.
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-29. </th>
<th class='confluenceTh'> Accept Role Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> A client receiving an assign role message, will reply to it with an accept role message. This message also indicates that the client is ready to start the test. This message will be identifier by the header field, "CONTROL_TYPE", having the value, "ACCEPT_ROLE".</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "ACCEPT_ROLE"
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-30. </th>
<th class='confluenceTh'> Start Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> The coordinator will send a start message to begin the test procedure. All test clients will listen for this message on their private control topics. The start message will be identified by the header field, "CONTROL_TYPE", having the value, "START". </p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "START"
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-31. </th>
<th class='confluenceTh'> Report Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> Once the test clients have completed a test case, they will send the coordinator a report about the actions they have performed. In the case of senders, this report will be sent once they have finished sending test messages. In the case of receiver, this report will be sent in response to a status request from the coordinator (see IOP-49). The report message will be identified by the header field, "CONTROL_TYPE", having the value, "REPORT". Its message body, or additional header fields will contain the report, specific to the test case being run.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "REPORT"
          ... test specific parameters.
          Message body,                 Test case specific report.
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-49. </th>
<th class='confluenceTh'> Status Request Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> Once the coordinator has received the senders report, it will send a status request to the receiver, to request the receivers report. This message will be identified by the header field, "CONTROL_TYPE", having the value, "STATUS_REQUEST".</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "STATUS_REQUEST"
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-34. </th>
<th class='confluenceTh'> Terminate Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> The coordinator will wait for all test clients to complete their tests for all test cases at which time it will broadcast a terminate message to the control topic. The terminate message will be identified by the header field, "CONTROL_TOPIC", having the value, "TERMINATE". Upon receipt of this message the test clients will terminate.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "TERMINATE"
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-35. </th>
<th class='confluenceTh'> Client Name. </th>
<td class='confluenceTd'> Each test client will provide a unique name for itself that reflects its implementation language and distinguishes it from the other clients. Clients may append an environment identifier onto this name to cater for the case where the same client is used multiple times in an interop test. For example, the same client might be run on two different operating systems, in order to check that it works correctly on both. Example names in this case might be "java-win" and "java-linux". </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-36. </th>
<th class='confluenceTh'> Private Client Control Topic. </th>
<td class='confluenceTd'> Each test client will listen for test control messages directed specifically to it on the default topic exchange. The routing key for these messages will consist of "iop.control." followed by the client name (see IOP-35). A topic exchange is used, rather than a direct exchange, to cater for the situation where multiple instances of a client are run in parallel and tests are to be scaled accross many clients (not currently in scope, see Waiting Room). It also allows a listener to be attached to the default topic exchange to listen to all control messages using a wildcard selector. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-37. </th>
<th class='confluenceTh'> Seperate Connection for Control Topic. </th>
<td class='confluenceTd'> Test clients should create open a seperate connection to communicate with the control topics on the default topic exchange, to that which they use to perform tests. This is so that a channel level error that results in the closing of a connection during a test, may still allow a client to succesfully send a failure report to the coordinator. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-CommonRequirementsforTestCases."></a>Common Requirements for Test Cases.</h3>

<p> Test cases that use these requirements mention them in the description of the test case.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-38. </th>
<th class='confluenceTh'> Message Counts. </th>
<td class='confluenceTd'> Whenever a test client recieves a message from another test client it will increment the total count of messages received from that client. Test messages will contain the name of the sending client in the header field "CLIENT_NAME", and the count will be held against a combination of that name and the messages correlation id (see IOP-42). </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-39. </th>
<th class='confluenceTh'> Message Count Reset. </th>
<td class='confluenceTd'> Whenever a test client is begining a new test case (when it accepts a role) it will reset its message counts to zero. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-41. </th>
<th class='confluenceTh'> Message Count Report Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> Upon receipt of a status request message, a test client will reply with a report message. The report message will be identified by the header field "CONTROL_TYPE", having the value, "REPORT" (as described by IOP-31). In addition to this, the header field, "MESSAGE_COUNT" will contain the count of messages received since the last reset as a signed 32-bit integer.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "REPORT"
          "MESSAGE_COUNT",              &lt;count&gt;         (signed 32 bit integer)
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-42. </th>
<th class='confluenceTh'> Correlation Id. </th>
<td class='confluenceTd'> When sending test messages, clients will identify all messages using a unique correlation id for the test case instance. This will differentiate test messages in a situation where the same client is scaled up to run a test case many times in parallel (not in scope, see Waiting Room). </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-43. </th>
<th class='confluenceTh'> Test Connections. </th>
<td class='confluenceTd'> Test clients will create connections to send test messages on when they are assigned roles. In many cases this will consist of creating a single connection, and a producer or consumer for the test routing key or queue. In some tests, which simulate the activity of many message receivers, multiple connections may be opened. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-TestCase1.DummyRun."></a>Test Case 1. Dummy Run.</h3>

<p> The sending client will not send any test messages at all. It will send a report message on the control topic, declaring that the test has passed.</p>

<p> The purpose of this test case is to check that clients can interoperate succesfully with the test coordinator and participate in the sequencing of the tests.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-50. </th>
<th class='confluenceTh'> Test Case 1 Name. </th>
<td class='confluenceTd'> The "TEST_NAME" field in the test invite (IOP-25) will be "TC1_DummyRun" for this test. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-TestCase2.BasicP2PTest."></a>Test Case 2. Basic P2P Test.</h3>

<ul>
	<li>This test case uses requirements IOP-38 to 43 inclusive.</li>
</ul>


<p> The sending client creates a fresh correlation id, and the entire test case conversation uses this id.<br/>
 The sending client will send the required number of test messages to the test routing key on the default direct exchange.<br/>
 The sending client will send a message count report to the coordinator.<br/>
 In response to a status request from the coordinator, the receiving client will reply with a message count report.<br/>
 The coordinator will compare the messages received to the messages sent and pass or fail the test accordingly.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-44. </th>
<th class='confluenceTh'> Basic P2P Setup. </th>
<td class='confluenceTd'> Prior to assigning roles, the coordinator will bind a queue to the default direct exchange with a routing key, the same as the queue name. It will create a fresh queue and key for every test case instance. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-45. </th>
<th class='confluenceTh'> Basic P2P Assign Role Parameters. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> In addition to the invite message format defined in IOP-26, the basic p2p test invite will also include the following parameters.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "P2P_QUEUE_AND_KEY_NAME",     "&lt;name&gt;"
          "P2P_NUM_MESSAGES",           &lt;count&gt;  (signed 32 bit int), P2P_NUM_MESSAGES property.
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-51. </th>
<th class='confluenceTh'> Test Case 2 Name. </th>
<td class='confluenceTd'> The "TEST_NAME" field in the test invite (IOP-25) will be "TC2_BasicP2P" for this test. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-TestCase3.BasicPub%2FSubTest."></a>Test Case 3. Basic Pub/Sub Test.</h3>

<ul>
	<li>This test case uses requirements IOP-38 to 43 inclusive.</li>
</ul>


<p> The sending client creates a fresh correlation id, and the entire test case conversation uses this id.<br/>
 The sending client will send the required number of test messages to the test routing key on the default topic exchange.<br/>
 The sending client will send a message count report to the coordinator.<br/>
 In response to a status request from the coordinator, the receiving client will reply with a message count report. This number will be the number of messages sent multiplied by the number of receivers being simulated by the receiving client.<br/>
 The coordinator will compare the messages received to the messages sent and pass or fail the test accordingly.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-46. </th>
<th class='confluenceTh'> Basic Pub/Sub Setup. </th>
<td class='confluenceTd'> Prior to assigning roles, the coordinator will choose a routing key for the test. If will create a fresh key for every test case instance. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-47. </th>
<th class='confluenceTh'> Basic Pub/Sub Invite Parameters. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> In addition to the invite message format defined in IOP-26, the basic pub/sub test invite will also include the following parameters.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "PUBSUB_KEY",                  "&lt;key&gt;"
          "PUBSUB_NUM_RECEIVERS",        &lt;count&gt; (signed 32 bit int), PUBSUB_NUM_RECEIVERS property.
          "PUBSUB_NUM_MESSAGES",         &lt;count&gt; (signed 32 bit int), PUBSUB_NUM_MESSAGES property.
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-52. </th>
<th class='confluenceTh'> Test Case 3 Name. </th>
<td class='confluenceTd'> The "TEST_NAME" field in the test invite (IOP-25) will be "TC3_BasicPubSub" for this test. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-TestCase4.P2PTestwithDifferentMessageSizes."></a>Test Case 4. P2P Test with Different Message Sizes.</h3>

<ul>
	<li>This test case uses requirements IOP-38 to 43 inclusive.</li>
</ul>


<p> The sending client creates a fresh correlation id, and the entire test case conversation uses this id.<br/>
 The sending client will send the required number of test messages to the test routing key on the default direct exchange.<br/>
 The sending client will send a message count report to the coordinator.<br/>
 In response to a status request from the coordinator, the receiving client will reply with a message count report.<br/>
 The coordinator will compare the messages received to the messages sent and pass or fail the test accordingly.<br/>
 The above test cycle will be repeated for each message size to test.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-53. </th>
<th class='confluenceTh'> P2P Message Size Test Setup. </th>
<td class='confluenceTd'> Prior to assigning roles, the coordinator will bind a queue to the default direct exchange with a routing key, the same as the queue name. It will create a fresh queue and key for every test case instance. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-54. </th>
<th class='confluenceTh'> P2P Message Size Test Assign Role Parameters. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> In addition to the invite message format defined in IOP-26, the basic p2p test invite will also include the following parameters.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "P2P_QUEUE_AND_KEY_NAME",     "&lt;name&gt;"
          "P2P_NUM_MESSAGES",           &lt;count&gt;  (signed 32 bit int), P2P_NUM_MESSAGES property.
          "messageSize",                &lt;count&gt;  (signed 32-bit int).
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-55. </th>
<th class='confluenceTh'> P2P Message Size Test Sizes </th>
<td class='confluenceTd'> The following values for the message size parameter will be tested: 0K, 63K, 64K, 65K, 127K, 128K, 129K, 255K, 256K, 257K. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-56. </th>
<th class='confluenceTh'> Test Case 4 Name. </th>
<td class='confluenceTd'> The "TEST_NAME" field in the test invite (IOP-25) will be "TC4_P2PMessageSize" for this test. </td>
</tr>
</tbody></table>

<h3><a name="InteropTestingSpecification-TestCase5.Pub%2FSubTestwithDifferentMessageSizes."></a>Test Case 5. Pub/Sub Test with Different Message Sizes.</h3>

<ul>
	<li>This test case uses requirements IOP-38 to 43 inclusive.</li>
</ul>


<p> The sending client creates a fresh correlation id, and the entire test case conversation uses this id.<br/>
 The sending client will send the required number of test messages to the test routing key on the default topic exchange.<br/>
 The sending client will send a message count report to the coordinator.<br/>
 In response to a status request from the coordinator, the receiving client will reply with a message count report. This number will be the number of messages sent multiplied by the number of receivers being simulated by the receiving client.<br/>
 The coordinator will compare the messages received to the messages sent and pass or fail the test accordingly.<br/>
 The above test cycle will be repeated for each message size to test.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP-57. </th>
<th class='confluenceTh'> Pub/Sub Message Size Test Setup. </th>
<td class='confluenceTd'> Prior to assigning roles, the coordinator will choose a routing key for the test. If will create a fresh key for every test case instance. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-58. </th>
<th class='confluenceTh'> Pub/Sub Message Size Test Invite Parameters. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> In addition to the invite message format defined in IOP-26, the basic pub/sub test invite will also include the following parameters.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "PUBSUB_KEY",                 "&lt;key&gt;"
          "PUBSUB_NUM_RECEIVERS",       &lt;count&gt; (signed 32 bit int), PUBSUB_NUM_RECEIVERS property.
          "PUBSUB_NUM_MESSAGES",        &lt;count&gt; (signed 32 bit int), PUBSUB_NUM_MESSAGES property.
          "messageSize",                &lt;count&gt; (signed 32-bit int).
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-59. </th>
<th class='confluenceTh'> P2P Message Size Test Sizes </th>
<td class='confluenceTd'> The following values for the message size parameter will be tested: 0K, 63K, 64K, 65K, 127K, 128K, 129K, 255K, 256K, 257K. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP-60. </th>
<th class='confluenceTh'> Test Case 5 Name. </th>
<td class='confluenceTd'> The "TEST_NAME" field in the test invite (IOP-25) will be "TC5_PubSubMessageSize" for this test. </td>
</tr>
</tbody></table>

<h2><a name="InteropTestingSpecification-WaitingRoom%3A"></a>Waiting Room:</h2>

<p> Contains ideas for possible future directions relating to this spec.</p>

<p> <ins>Command processor.</ins> Test cases to be written using a command language (perhaps in XML) on top of a common client API. Interpreter for this to be implemented using each client library. Test cases need only be written once and can be run by the interpreters. Command language rich enough to exercise the whole AMQP protocol. May not handle client specific edge cases. Good for ensuring test consistency, but may take a fair amount of time to do.</p>

<p> <ins>How I anticipate this being run as part of a fully automated build.</ins> Will try to get a free licence for Anthill Pro 3 as they offer free licences for open source projects. Viewtier Parabuild is another possibility. Anthill Pro runs a central build server that does all its work through build agents that can run on many boxes. It also lets you define build workflows. I imagine running a Unix agent to build the c++, java and python stuff, and a Windows agent for the .net stuff. Will define a workflow that starts a broker on the unix box, then starts all clients built on the unix and windows boxes in parallel, then runs the entire test procedure across all clients, then terminates the broker on the unix box. The agents send back the test results to the central server.</p>

<p> <ins>Full testing of field tables.</ins> Make sure that every possible data type is tested and confirmed to encode and decode correctly between all client implementations.</p>

<p> <ins>Testing more of the protocol.</ins> Add tests to more fully exercise the complete AMQP protocol.</p>

<p> <ins>Allow scaling of test clients.</ins> Each test client should only be run once (in each environment) and they create unique names for themselves. Tests are only run between pairs of single clients, with a single sender and number of receivers defined by the test case (often 1). Clients listen for control messages on topics, and use correlation id's in all tests messages to differentiate themselves, were multiple senders to be active. This has been done deliberately to allow for future expansion of the test framework to allow scaling up of the tests by starting more clients in parallel on the same environment. To do this each client might also create a sequence number, to unqiuely identify itself, as the client names will no longer be unique. Reports from senders will include client name, sequence number and correlation id. Status requests to receivers may specify client name, sequence number and correlation id to get specific reports, or ommit correlation id or sequence number to get a bulk report of all messages with a particular client.</p>

<p> <ins>More sophisticated reporting.</ins> Message count reports are fairly minimal. Might also put an entire list of messages send/recieved in a report, in order to check that there were no ommissions or duplicates.</p>

<h2><a name="InteropTestingSpecification-AppendixA%2CGeneralNotes%3A"></a>Appendix A, General Notes:</h2>

<p> Brokers that need to be interop tested: C++ and Java</p>

<p> Clients that need to be interop tested: C++ , Java, Java 1.4 retrotranslation, C++, .Net 2.0, .Net 1.1, (Mono?), Python, Ruby.</p>

<h2><a name="InteropTestingSpecification-AppendixB%2CExampleofXMLFormatforTestOuput%3A"></a>Appendix B, Example of XML Format for Test Ouput:</h2>

<p> I don't think there is a DTD or schema for this but the XML output from JUnit looks like the example below. This is a convenient choice for the output format from these test results even if the code does not actually use JUnit (or cppunit or nunit) iternally, because automated build servers generally understand and are able to produce test reports from it.</p>

<p> Example:</p>

<div class="preformatted"><div class="preformattedContent">
<pre>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;testsuite errors="0" skipped="0" tests="18" time="0.02" failures="0" name="org.apache.qpid.framing.BasicContentHeaderPropertiesTest"&gt;
  &lt;properties&gt;
    &lt;property value="Java(TM) 2 Runtime Environment, Standard Edition" name="java.runtime.name"/&gt;
    ... (there were lots of properties).
  &lt;/properties&gt;
  &lt;testcase time="0.02" name="testRejectedExecution"/&gt;
  ... (there were lots of test cases).
&lt;/testsuite&gt;
</pre>
</div></div>

<h2><a name="InteropTestingSpecification-AppendixC%2CCommandlineoptions."></a>Appendix C, Command line options.</h2>

<p> IOP-21 states that general parameters can be passed on the command line using name=value syntax. The coordinator understands the following parameters, and will use them to override the default values for the tests. Individual test cases refer to the command line parameter that they take their test parameters from.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Parameter           </th>
<th class='confluenceTh'> Default </th>
</tr>
<tr>
<td class='confluenceTd'> P2P_NUM_MESSAGES     </td>
<td class='confluenceTd'> 50       </td>
</tr>
<tr>
<td class='confluenceTd'> PUBSUB_NUM_RECEIVERS </td>
<td class='confluenceTd'> 5        </td>
</tr>
<tr>
<td class='confluenceTd'> PUBSUB_NUM_MESSAGES  </td>
<td class='confluenceTd'> 10       </td>
</tr>
</tbody></table>

<h2><a name="InteropTestingSpecification-AppendixD%2CDeletedRequirements%3A"></a>Appendix D, Deleted Requirements:</h2>

<p> Put deleted requirements here, in case they can be re-used.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> IOP. </th>
<th class='confluenceTh'> Client Start Messages Per Test. </th>
<td class='confluenceTd'> The -m &lt;num_messages&gt; option will be used to tell the client how many messages to send per test. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP. </th>
<th class='confluenceTh'> Client Number of Receivers. </th>
<td class='confluenceTd'> For topic testing each client will simulate the behaviour of many clients listening to the same topic. The number of receivers per test client for topic tests will be sepcified by the -r &lt;num_receivers&gt; command line option. </td>
</tr>
<tr>
<th class='confluenceTh'> IOP. </th>
<th class='confluenceTh'> Client Default P2P Test Direct Key. </th>
<td class='confluenceTd'> Each test client will listen for test messages on the default direct exchange. The routing key for these messages will consist of the client name (see IOP-35) followed by ".direct". </td>
</tr>
<tr>
<th class='confluenceTh'> IOP. </th>
<th class='confluenceTh'> Client Default Pub/Sub Test Direct Key. </th>
<td class='confluenceTd'> Each test client will listen for test messages on the default topic exchange. The routing key for these messages will consist of the client name (see IOP-35) followed by ".topic". </td>
</tr>
<tr>
<th class='confluenceTh'> IOP. </th>
<th class='confluenceTh'> Test Done Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> Once a test client has completed its role, it will send the coordinator a test done message on the control topic. This message will be identified by the header field, "CONTROL_TYPE", having the value, "TEST_DONE". The client will also post its name in the "CLIENT_NAME" header field.</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "TEST_DONE"
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP. </th>
<th class='confluenceTh'> End Role Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> Once the coordinator receives a report for a test case, it will send end role messages to the private control topics of all clients participating in the test case. This message will be identified by the header field, "CONTROL_TYPE", having the value, "END_ROLE".</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "END_ROLE"
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
<tr>
<th class='confluenceTh'> IOP. </th>
<th class='confluenceTh'> Client Status Request Message. </th>
<td class='confluenceTd'> <table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><p> When a test client has completed sending test messages it may request the count of actual messages receieved from the test client to which it sent the messages. The status request message will be send to the receving test clients individual control topic. This message will be identified by the header field, "CONTROL_TYPE", having the value, "STATUS_REQUEST", and will contain the name of the sending client in the header field "CLIENT_NAME".</p>
<div class="preformatted"><div class="preformattedContent">
<pre>          "CONTROL_TYPE",               "STATUS_REQUEST"
          "CLIENT_NAME",                "&lt;client_name&gt;"
</pre>
</div></div> </tr></tbody></table> </td>
</tr>
</tbody></table></div>


</td></tr></table></div>
<p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td>
    </tr>
</table>

<div class="smalltext">
    Powered by
    <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a>
    (Version: 2.2.9 Build:#527 Sep 07, 2006)
    -
    <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/>
    <br>
    <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a>

</div>

</body>
</html>


Mime
View raw message