directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Directory Server v1.5: 4.2. Using ApacheDS for unit tests (page edited)
Date Wed, 19 Nov 2008 22:21:03 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/DIRxSRVx11">DIRxSRVx11</a> :
            <a href="http://cwiki.apache.org/confluence/display/DIRxSRVx11/4.2.+Using+ApacheDS+for+unit+tests">4.2. Using ApacheDS for unit tests</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/DIRxSRVx11/4.2.+Using+ApacheDS+for+unit+tests">4.2. Using ApacheDS for unit tests</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~elecharny">Emmanuel Lécharny</a>
            <span class="smallfont">(Nov 19, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=55238&originalVersion=8&revisedVersion=9">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Work in progress</b><br />
<p>This site is in the process of being reviewed and updated.</p></td></tr></table>

<h1><a name="4.2.UsingApacheDSforunittests-UsingApacheDSforunittests"></a>Using ApacheDS for unit tests</h1>

<p>The idea is to use ADS as an embedded server for Ldap junit tests. We will build an environment in which it will be convenient to test Ldap applications.</p>

<h3><a name="4.2.UsingApacheDSforunittests-Firststeps"></a>First steps</h3>

<p>We have two choices : either we launch the server totally embedded, without having to communicate with it using the Ldap Protocol, or we want to use the server as a remote server, with Ldap protocol in the middle (it can be useful if one want to test specific applications)</p>

<p>Anyway, we will simply launch only one server (if one want to test referrals, it might be necessary to initialize 2 or more servers)</p>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>We are using JUnit 4.4</p></td></tr></table>
<p>A unit test is following this sequence</p>
<ol>
	<li>the beforeClass method is called for the TestCase</li>
	<li>for each test in the TestCase</li>
	<li>the beforeTest method is called</li>
	<li>the test is launched</li>
	<li>the afterTest method is called</li>
	<li>the afterClass method is called</li>
</ol>


<p>Each time &#42;beforeClass is called, a new instance of the server will be initialized, and it can take some time (2 to 5 seconds, depending on your processor). This is important to initialize the server globally, to save a lot of time if more than one test is to be run.<br/>
The price to pay is that you will have to clean the server yourself, either globally (in the afterTest method), or locally in each test. That means you will have to define for the whole TestCase a set of data which will have to be valid whatever the test order is.</p>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>This is a temporary burden, as we are working on a changeLog interceptor in the server which will be able to register the modification, and to rollback them, leaving the server in a clean state. More to come in the next version ...</p></td></tr></table>
<p>ApacheDS sources provide a common class to initialize the server into unit tests : <b>AbstractServerFastTest</b>. This class can be found in the <b>apacheds-server-unit</b> jar file.  This class is very usefull, it alleviates you from the burden of initializing the server.</p>

<p>We also have to define a layout for the files and directory we will use in this tutorial. Let's use the <b>maven</b> layout :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/
|
+--src
    |
    +--test
        |
        +--java      : we will put all the sources into <span class="code-keyword">this</span> directory
        |
        +--resources : we will put the resources files into <span class="code-keyword">this</span> directory</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>You will need some jars file in order to compile and run this sample :</p>

<p>&#42; antlr-2.7.7.jar<br/>
&#42; commons-collections-3.2.jar<br/>
&#42; commons-io-1.3.2.jar<br/>
&#42; commons-lang-2.3.jar<br/>
&#42; commons-net-1.4.1.jar<br/>
&#42; jdbm-1.0.jar</p>

<p>&#42; log4j-1.2.14.jar<br/>
&#42; slf4j-api-1.4.3.jar<br/>
&#42; slf4j-log4j12-1.4.3.jar</p>

<p>&#42; mina-core-1.1.4.jar<br/>
&#42; mina-filter-ssl-1.1.4.jar</p>

<p>&#42; apacheds-btree-base-1.5.2.jar<br/>
&#42; apacheds-constants-1.5.2.jar<br/>
&#42; apacheds-core-1.5.1.jar<br/>
&#42; apacheds-core-constants-1.5.2.jar<br/>
&#42; apacheds-core-shared-1.5.2.jar</p>

<p>&#42; apacheds-bootstrap-extract-1.5.2.jar<br/>
&#42; apacheds-bootstrap-partition-1.5.2.jar<br/>
&#42; apacheds-jdbm-store-1.5.2.jar<br/>
&#42; apacheds-protocol-ldap-1.5.2.jar<br/>
&#42; apacheds-protocol-shared-1.5.2.jar<br/>
&#42; apacheds-schema-bootstrap-1.5.2.jar<br/>
&#42; apacheds-schema-extras-1.5.2.jar<br/>
&#42; apacheds-schema-registries-1.5.2.jar<br/>
&#42; apacheds-server-jndi-1.5.2.jar<br/>
&#42; apacheds-server-unit-1.5.2.jar<br/>
&#42; apacheds-utils-1.5.2.jar<br/>
&#42; apacheds-xbean-spring-1.5.2.jar</p>

<p>&#42; shared-asn1-0.9.8.jar<br/>
&#42; shared-asn1-codec-0.9.8.jar<br/>
&#42; shared-ldap-0.9.8.jar<br/>
&#42; shared-ldap-constants-0.9.8.jar</p>

<p>The apacheds-server-unit-1.5.1.jar file can't be found in the binary distribution. You will have to download it here :<br/>
<span class="nobr"><a href="http://people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/directory/server/apacheds-server-unit/1.5.1/" title="Visit page outside Confluence" rel="nofollow">http://people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/directory/server/apacheds-server-unit/1.5.1/<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<p>Source for this test : <span class="error">&#91;^DemoTest.java&#93;</span><br/>
Ldif file for this test : <span class="error">&#91;^demo.ldif&#93;</span></p></td></tr></table>

<h3><a name="4.2.UsingApacheDSforunittests-Creatingablanktest"></a>Creating a blank test</h3>

<p>So let's declare the framework for a simple unit test, using a server which will be used through socket (the first free port above 1023 will be used) :</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> org.apache.directory.demo;

<span class="code-keyword">import</span> org.apache.directory.server.unit.AbstractServerTest;

/**
 * Testcase using an embedded Apache Directory Server.
 *
 * @author &lt;a href=<span class="code-quote">"mailto:dev@directory.apache.org"</span>&gt;Apache Directory Project&lt;/a&gt;
 */

<span class="code-keyword">public</span> class DemoTest <span class="code-keyword">extends</span> AbstractServerTest
{
    /**
     * Initialize the server.
     */
    <span class="code-keyword">public</span> void setUp() <span class="code-keyword">throws</span> Exception
    {
        <span class="code-keyword">super</span>.setUp();
    }

    /**
     * Empty test just to avoid a warning to be thrown when launching the test
     */
    <span class="code-keyword">public</span> void testEmpty()
    {
        <span class="code-comment">// Do nothing
</span>    }

    /**
     * Shutdown the server.
     */
    <span class="code-keyword">public</span> void tearDown() <span class="code-keyword">throws</span> Exception
    {
        <span class="code-keyword">super</span>.tearDown();
    }
}</pre>
</div></div>
<p>This is totally empty, we will fill the blanks now. But let's launch the test as is :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">838 [main] WARN org.apache.directory.server.core.DefaultDirectoryService - ApacheDS shutdown hook has NOT
been registered with the runtime.  This <span class="code-keyword">default</span> setting <span class="code-keyword">for</span> standalone operation has been overriden.
1695 [main] WARN org.apache.directory.server.core.schema.bootstrap.BootstrapAttributeTypeRegistry -
Attribute dynamicSubtrees does not have normalizer : using NoopNormalizer
1696 [main] WARN org.apache.directory.server.core.schema.bootstrap.BootstrapAttributeTypeRegistry -
Attribute javaSerializedData does not have normalizer : using NoopNormalizer
...
<span class="code-comment">// Lot of lines ...
</span>...
2996 [main] WARN org.apache.directory.server.core.DefaultDirectoryService -
You didn't change the admin password of directory service instance '<span class="code-keyword">default</span>'.
Please update the admin password as soon as possible to prevent a possible security breach.
2996 [main] INFO org.apache.directory.server.jndi.ServerContextFactory -
LDIF load directory not specified.  No LDIF files will be loaded.
3285 [main] INFO org.apache.directory.server.jndi.ServerContextFactory -
Successful bind of an LDAP Service (1024) is complete.
3409 [main] INFO org.apache.directory.server.jndi.ServerContextFactory -
Unbind of an LDAP service (1024) is complete.
3409 [main] INFO org.apache.directory.server.jndi.ServerContextFactory -
Sending notice of disconnect to existing clients sessions.</pre>
</div></div>
<p>We can see that the server is launched, some initialization is done, then server is listening on port 1024, and is immediatly shutdown.</p>

<h3><a name="4.2.UsingApacheDSforunittests-Creatingourownpartition"></a>Creating our own partition</h3>

<p>At the moment, we have created a server which is not totally empty : one partition is created by default, the system partition. We won't use it for our tests, so we will need to create our own partition to play with. Let's call it 'o=sevenseas' (<b>o</b> stands for <b>organization</b>)</p>

<p>The setUp() method will be completed with all the needed instruction to create a new partition</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">import</span> java.io.File;
<span class="code-keyword">import</span> java.util.HashSet;
<span class="code-keyword">import</span> java.util.Hashtable;
<span class="code-keyword">import</span> java.util.Set;

<span class="code-keyword">import</span> javax.naming.Context;
<span class="code-keyword">import</span> javax.naming.InitialContext;
<span class="code-keyword">import</span> javax.naming.NamingException;
<span class="code-keyword">import</span> javax.naming.directory.Attribute;
<span class="code-keyword">import</span> javax.naming.directory.Attributes;
<span class="code-keyword">import</span> javax.naming.directory.BasicAttribute;
<span class="code-keyword">import</span> javax.naming.directory.BasicAttributes;
<span class="code-keyword">import</span> javax.naming.directory.DirContext;

<span class="code-keyword">import</span> org.apache.directory.server.core.configuration.MutablePartitionConfiguration;
<span class="code-keyword">import</span> org.apache.directory.server.unit.AbstractServerTest;
...

    /**
     * Initialize the server.
     */
    <span class="code-keyword">public</span> void setUp() <span class="code-keyword">throws</span> Exception
    {
        <span class="code-comment">// Add partition 'sevenSeas'
</span>        MutablePartitionConfiguration pcfg = <span class="code-keyword">new</span> MutablePartitionConfiguration();
        pcfg.setName( <span class="code-quote">"sevenSeas"</span> );
        pcfg.setSuffix( <span class="code-quote">"o=sevenseas"</span> );

        <span class="code-comment">// Create some indices
</span>        Set&lt;<span class="code-object">String</span>&gt; indexedAttrs = <span class="code-keyword">new</span> HashSet&lt;<span class="code-object">String</span>&gt;();
        indexedAttrs.add( <span class="code-quote">"objectClass"</span> );
        indexedAttrs.add( <span class="code-quote">"o"</span> );
        pcfg.setIndexedAttributes( indexedAttrs );

        <span class="code-comment">// Create a first entry associated to the partition
</span>        Attributes attrs = <span class="code-keyword">new</span> BasicAttributes( <span class="code-keyword">true</span> );

        <span class="code-comment">// First, the objectClass attribute
</span>        Attribute attr = <span class="code-keyword">new</span> BasicAttribute( <span class="code-quote">"objectClass"</span> );
        attr.add( <span class="code-quote">"top"</span> );
        attr.add( <span class="code-quote">"organization"</span> );
        attrs.put( attr );

        <span class="code-comment">// The the 'Organization' attribute
</span>        attr = <span class="code-keyword">new</span> BasicAttribute( <span class="code-quote">"o"</span> );
        attr.add( <span class="code-quote">"sevenseas"</span> );
        attrs.put( attr );

        <span class="code-comment">// Associate <span class="code-keyword">this</span> entry to the partition
</span>        pcfg.setContextEntry( attrs );

        <span class="code-comment">// As we can create more than one partition, we must store
</span>        <span class="code-comment">// each created partition in a Set before initialization
</span>        Set&lt;MutablePartitionConfiguration&gt; pcfgs = <span class="code-keyword">new</span> HashSet&lt;MutablePartitionConfiguration&gt;();
        pcfgs.add( pcfg );

        configuration.setContextPartitionConfigurations( pcfgs );

        <span class="code-comment">// Create a working directory
</span>        File workingDirectory = <span class="code-keyword">new</span> File( <span class="code-quote">"server-work"</span> );
        configuration.setWorkingDirectory( workingDirectory );

        <span class="code-comment">// Now, let's call the upper class which is responsible <span class="code-keyword">for</span> the
</span>        <span class="code-comment">// partitions creation
</span>        <span class="code-keyword">super</span>.setUp();
   }</pre>
</div></div>
<p>Ok, now the partition <b>sevenseas</b> should be created. How can we be sure of that ? let's write a test to replace the emptytest() method :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/**
     * Test that the partition has been correctly created
     */
    <span class="code-keyword">public</span> void testPartition() <span class="code-keyword">throws</span> NamingException
    {
        Hashtable&lt;<span class="code-object">Object</span>, <span class="code-object">Object</span>&gt; env = <span class="code-keyword">new</span> Hashtable&lt;<span class="code-object">Object</span>, <span class="code-object">Object</span>&gt;( configuration.toJndiEnvironment() );

        <span class="code-comment">// Create a <span class="code-keyword">new</span> context pointing to the overseas partition
</span>        env.put( Context.PROVIDER_URL, <span class="code-quote">"o=sevenSeas"</span> );
        env.put( Context.SECURITY_PRINCIPAL, <span class="code-quote">"uid=admin,ou=system"</span> );
        env.put( Context.SECURITY_CREDENTIALS, <span class="code-quote">"secret"</span> );
        env.put( Context.SECURITY_AUTHENTICATION, <span class="code-quote">"simple"</span> );
        env.put( Context.INITIAL_CONTEXT_FACTORY, <span class="code-quote">"org.apache.directory.server.jndi.ServerContextFactory"</span> );

        <span class="code-comment">// Let's open a connection on <span class="code-keyword">this</span> partition
</span>        InitialContext initialContext = <span class="code-keyword">new</span> InitialContext( env );

        <span class="code-comment">// We should be able to read it
</span>        DirContext appRoot = ( DirContext ) initialContext.lookup( "" );
        assertNotNull( appRoot );

        <span class="code-comment">// Let's get the entry associated to the top level
</span>        Attributes attributes = appRoot.getAttributes( "" );
        assertNotNull( attributes );
        assertEquals( <span class="code-quote">"sevenseas"</span>, attributes.get( <span class="code-quote">"o"</span> ).get() );

        Attribute attribute = attributes.get( <span class="code-quote">"objectClass"</span> );
        assertNotNull( attribute );
        assertTrue( attribute.contains( <span class="code-quote">"top"</span> ) );
        assertTrue( attribute.contains( <span class="code-quote">"organization"</span> ) );
        <span class="code-comment">// Ok, everything is fine
</span>    }</pre>
</div></div>
<p>The test should succeed. Is that all ? Well, almost. As you can see, a working space has been created ( "server-work", at the end of the setup). Do we have to take care of this working space? No. It has been cleaned by the super class &#33;</p>

<p>So everything is fine, the partition is up and running, you are ready to add more tests.</p>

<p>One line in the logs is interesting :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">3879 [main] INFO org.apache.directory.server.jndi.ServerContextFactory -
LDIF load directory not specified.  No LDIF files will be loaded.</pre>
</div></div>
<p>The setup has tried to load an LDIF file to inject some data into the partition, but as we didn't specify any Ldif file to be loaded, nothing has been done. let's add some data &#33;</p>

<h3><a name="4.2.UsingApacheDSforunittests-Addingsomedataintothepartition"></a>Adding some data into the partition</h3>

<p>The <b>AbstractServerTest</b> class provide a method called <b>importLdif( InputStream in )</b>. It allows you to inject some entries into the newly created partition. How d we use it?</p>

<p>First, we need to have a valid LDIF file containing your entries. We will create two branches in our <b>sevenseas</b> organization :</p>
<ul>
	<li>one for groups</li>
	<li>one for people</li>
</ul>


<p>Here is the ldif file we will create :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">dn: ou=groups,o=sevenSeas
objectClass: organizationalUnit
objectClass: top
ou: groups
description: Contains entries which describe groups (crews, <span class="code-keyword">for</span> instance)

dn: ou=people,o=sevenSeas
objectClass: organizationalUnit
objectClass: top
ou: people
description: Contains entries which describe persons (seamen)</pre>
</div></div>
<p>Save it as a text file into a directory where we will be able to read it directly. But where?</p>

<p>We have created the test into a directory src/test/java/org/apache/directory/demo. This is the <b>maven</b> way to organized the sources, as seen before. Let's create another directory for the resources : src/test/resources/org/apache/directory/demo. Tis is the place where we will save the ldif file.</p>

<p>Now, to let the server know about the ldif file, just add this line <em>after</em> the call to the <b>setup()</b> method :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">...
        <span class="code-comment">// Now, let's call the upper class which is responsible <span class="code-keyword">for</span> the
</span>        <span class="code-comment">// partitions creation
</span>        <span class="code-keyword">super</span>.setUp();

        <span class="code-comment">// Load a demo ldif file
</span>        importLdif( <span class="code-keyword">this</span>.getClass().getResourceAsStream( <span class="code-quote">"demo.ldif"</span> ) );
    }</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>This is important to add the import after the setup : you can't import data while the partition has not been created ...</p></td></tr></table>
<p>The <b>getResourceAsStream</b> call will automatically read the file from the resources directory, based on the current class package.</p>

<p>How can we be sure that the data has been imported ? Let's do a search request &#33;</p>

<h3><a name="4.2.UsingApacheDSforunittests-Cleanupthecode"></a>Cleanup the code</h3>

<p>Before that, let's do some cleanup. The context creation is something we will have to do in each test. We should create a common method called every time to avoid duplicating this code. Let's create this method :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/**
     * Create a context pointing to a partition
     */
    <span class="code-keyword">private</span> DirContext createContext( <span class="code-object">String</span> partition ) <span class="code-keyword">throws</span> NamingException
    {
        <span class="code-comment">// Create a environment container
</span>        Hashtable&lt;<span class="code-object">Object</span>, <span class="code-object">Object</span>&gt; env =
            <span class="code-keyword">new</span> Hashtable&lt;<span class="code-object">Object</span>, <span class="code-object">Object</span>&gt;( configuration.toJndiEnvironment() );

        <span class="code-comment">// Create a <span class="code-keyword">new</span> context pointing to the partition
</span>        env.put( Context.PROVIDER_URL, partition );
        env.put( Context.SECURITY_PRINCIPAL, <span class="code-quote">"uid=admin,ou=system"</span> );
        env.put( Context.SECURITY_CREDENTIALS, <span class="code-quote">"secret"</span> );
        env.put( Context.SECURITY_AUTHENTICATION, <span class="code-quote">"simple"</span> );
        env.put( Context.INITIAL_CONTEXT_FACTORY,
                    <span class="code-quote">"org.apache.directory.server.jndi.ServerContextFactory"</span> );

        <span class="code-comment">// Let's open a connection on <span class="code-keyword">this</span> partition
</span>        InitialContext initialContext = <span class="code-keyword">new</span> InitialContext( env );

        <span class="code-comment">// We should be able to read it
</span>        DirContext appRoot = ( DirContext ) initialContext.lookup( "" );
        assertNotNull( appRoot );

        <span class="code-keyword">return</span> appRoot;
    }</pre>
</div></div>
<p>This method is added into the body of the test class. This method is very simple and quite straightforward : we just create an initial context pointing to the requested partition, and return a directory context on this partition. It takes a parameter, the partition name.</p>

<p>Let's modify the test partition method :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/**
     * Test that the partition has been correctly created
     */
    <span class="code-keyword">public</span> void testPartition() <span class="code-keyword">throws</span> NamingException
    {
        DirContext appRoot = createContext( <span class="code-quote">"o=sevenSeas"</span> );

        <span class="code-comment">// Let's get the entry associated to the top level
</span>        Attributes attributes = appRoot.getAttributes( "" );
        ...</pre>
</div></div>
<p>We just replaced the first lines by a call to the newly created createContext() method.</p>

<p>If you launch the unit test, it should still be ok.</p>

<h3><a name="4.2.UsingApacheDSforunittests-Searchingforentries"></a>Searching for entries</h3>

<p>This is really simple. What we will do is to search for the imported entries. Let's go directly to the code. We will  add a new unit test</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/**
     * Test that the ldif data has correctly been imported
     */
    <span class="code-keyword">public</span> void testImport() <span class="code-keyword">throws</span> NamingException
    {
        <span class="code-comment">// Searching <span class="code-keyword">for</span> all
</span>        Set&lt;<span class="code-object">String</span>&gt; result = searchDNs( <span class="code-quote">"(ObjectClass=*)"</span>, <span class="code-quote">"o=sevenSeas"</span>, "",
                                          SearchControls.ONELEVEL_SCOPE );

        assertTrue( result.contains( <span class="code-quote">"ou=groups,o=sevenSeas"</span> ) );
        assertTrue( result.contains( <span class="code-quote">"ou=people,o=sevenSeas"</span> ) );
    }</pre>
</div></div>
<p>Here, we are looking for all the entries starting at the top level of the partition, within the level. We should only get two entries.</p>

<p>It's not enough : the searchDNs() method does not exist. It is a private method we have created to avoid duplicating some code all over the unit tests. Here is its code :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/**
     * Performs a single level search from a root base and
     * returns the set of DNs found.
     */
    <span class="code-keyword">private</span> Set&lt;<span class="code-object">String</span>&gt; searchDNs( <span class="code-object">String</span> filter, <span class="code-object">String</span> partition, <span class="code-object">String</span> base, <span class="code-object">int</span> scope )
       <span class="code-keyword">throws</span> NamingException
    {
        DirContext appRoot = createContext( partition );

        SearchControls controls = <span class="code-keyword">new</span> SearchControls();
        controls.setSearchScope( scope );
        NamingEnumeration result = appRoot.search( base, filter, controls );

        <span class="code-comment">// collect all results
</span>        HashSet&lt;<span class="code-object">String</span>&gt; entries = <span class="code-keyword">new</span> HashSet&lt;<span class="code-object">String</span>&gt;();

        <span class="code-keyword">while</span> ( result.hasMore() )
        {
            SearchResult entry = ( SearchResult ) result.next();
            entries.add( entry.getName() );
        }

        <span class="code-keyword">return</span> entries;
    }</pre>
</div></div>
<p>As for the test partiton, we call the createContext() method, then we just do some JNDI magic :</p>
<ul>
	<li>creating a SearchControl,</li>
	<li>setting the scope,</li>
	<li>calling the serach</li>
	<li>and gathering the returned DN if any</li>
</ul>


<p>If the test is successful, you get the imported DNs &#33;</p>

<h3><a name="4.2.UsingApacheDSforunittests-Addingyourownschema"></a>Adding your own schema</h3>

<table cellpadding='5' width='85%' cellspacing='8px' class='warningMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/forbidden.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Work in progress</b><br />
<p>This paragraph is totally outdated. It should be rewriten from scratch &#33;</p></td></tr></table>
<p>Ok, let's go deeper into the server configuration. Working with default schema is fine, but some point, you may want to use your own ObjectClasses and AttributeTypes. let's assume you have created them, and that you have been throw the process of generating the class files for it (this process is described in <span class="nobr"><a href="http://cwiki.apache.org/confluence/display/DIRxSRVx10/Custom+Schema" title="Visit page outside Confluence" rel="nofollow">Custom Schema<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>) into a new package (org.apache.directory.demo.schema) where all the generated files will be put.</p>

<p>You will just have to add those lines at the end of the setUp() method (just before the call to the super() method) :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">...
<span class="code-keyword">import</span> org.apache.directory.server.core.configuration.MutablePartitionConfiguration;
<span class="code-keyword">import</span> org.apache.directory.server.core.schema.bootstrap.AbstractBootstrapSchema;
<span class="code-keyword">import</span> org.apache.directory.server.unit.AbstractServerTest;

<span class="code-keyword">import</span> org.apache.directory.demo.schema.DemoSchema;

...
        ...
        <span class="code-comment">///
</span>        <span class="code-comment">/// add the Demo schema
</span>        <span class="code-comment">///
</span>        Set&lt;AbstractBootstrapSchema&gt; schemas = configuration.getBootstrapSchemas();
        schemas.add( <span class="code-keyword">new</span> DemoSchema() );

        configuration.setBootstrapSchemas(schemas);


        <span class="code-comment">// Now, let's call the upper class which is responsible <span class="code-keyword">for</span> the
</span>        <span class="code-comment">// partitions creation
</span>        <span class="code-keyword">super</span>.setUp();
    }</pre>
</div></div>
<p>If we launch the test, nothing special will happen, except that the test will succeed. That's not very impressive...</p>

<h2><a name="4.2.UsingApacheDSforunittests-Conclusion"></a>Conclusion</h2>

<p>Ok, this tutorial was a short one, but you get everything you need to play with Apache Directory Server as a Unit Test Engine for your Ldap application. Just create your own partition, define your schema, import your ldif file, and add all the tests you need. it's as simple as explained <img class="emoticon" src="/confluence/images/icons/emoticons/smile.gif" height="20" width="20" align="absmiddle" alt="" border="0"/></p>

<p>If you have any problem, just feel free to post a mail to users@directory.apache.org, we will be there to help &#33;</p>

<h2><a name="4.2.UsingApacheDSforunittests-Resources"></a>Resources</h2>

<ul>
	<li><span class="nobr"><a href="http://directory.apache.org/community%26resources/embedding-apacheds.html" title="Visit page outside Confluence" rel="nofollow">Embedding ApacheDS - Conference Materials <sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
</ul>
</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