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 Fri, 21 Nov 2008 16:56: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/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 21, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=55238&originalVersion=10&revisedVersion=11">(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>

<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>
<p>This page describes how to define your own unit tests, using the trunk. It won't work with 1.5.4 as there is a problem in the way we built the apacheds-all-1.5.4.jar. A workaround is to load all the included jars, but it's a bit painfull, as there are 32 jars to define (this list will be given at the end of this page}</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>

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

<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>We 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 when used with 1.5.4. If you are using the trunk, don't worry, a pom.xml with all the needed dependencies is attached.</p>

<p>&#42; antlr-2.7.7.jar<br/>
&#42; apacheds-bootstrap-extract-1.5.4.jar<br/>
&#42; apacheds-bootstrap-partition-1.5.4.jar<br/>
&#42; apacheds-core-1.5.4-sources.jar<br/>
&#42; apacheds-core-avl-1.5.4.jar<br/>
&#42; apacheds-core-cursor-1.5.4.jar<br/>
&#42; apacheds-core-entry-1.5.4.jar<br/>
&#42; apacheds-core-integ-1.5.4.jar<br/>
&#42; apacheds-core-shared-1.5.4.jar<br/>
&#42; apacheds-jdbm-1.5.4.jar<br/>
&#42; apacheds-jdbm-store-1.5.4.jar<br/>
&#42; apacheds-protocol-ldap-1.5.4-sources.jar<br/>
&#42; apacheds-protocol-shared-1.5.4.jar<br/>
&#42; apacheds-schema-bootstrap-1.5.4.jar<br/>
&#42; apacheds-schema-registries-1.5.4.jar<br/>
&#42; apacheds-server-integ-1.5.4.jar<br/>
&#42; apacheds-utils-1.5.4.jar<br/>
&#42; apacheds-xdbm-base-1.5.4.jar<br/>
&#42; apacheds-xdbm-search-1.5.4.jar<br/>
&#42; bcprov-jdk15-140.jar<br/>
&#42; commons-collections-3.2.1.jar<br/>
&#42; commons-io-1.3.2.jar<br/>
&#42; commons-lang-2.4.jar<br/>
&#42; junit-4.4-sources.jar<br/>
&#42; log4j-1.2.14-sources.jar<br/>
&#42; mina-core-1.1.7.jar<br/>
&#42; mina-filter-ssl-1.1.7.jar<br/>
&#42; shared-asn1-0.9.13.jar<br/>
&#42; shared-asn1-codec-0.9.13.jar<br/>
&#42; shared-ldap-0.9.13.jar<br/>
&#42; shared-ldap-constants-0.9.13.jar<br/>
&#42; slf4j-api-1.5.2-sources.jar<br/>
&#42; slf4j-log4j12-1.5.2-sources.jar</p></td></tr></table>

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

<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). This first test will do a search operation on a server.</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> org.apache.directory.server.unittests.search;

<span class="code-keyword">import</span> <span class="code-keyword">static</span> org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext;
<span class="code-keyword">import</span> <span class="code-keyword">static</span> org.junit.Assert.assertNotNull;
<span class="code-keyword">import</span> <span class="code-keyword">static</span> org.junit.Assert.assertTrue;
<span class="code-keyword">import</span> <span class="code-keyword">static</span> org.junit.Assert.fail;

<span class="code-keyword">import</span> javax.naming.NamingEnumeration;
<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.SearchControls;
<span class="code-keyword">import</span> javax.naming.directory.SearchResult;
<span class="code-keyword">import</span> javax.naming.ldap.LdapContext;

<span class="code-keyword">import</span> org.apache.directory.server.core.integ.Level;
<span class="code-keyword">import</span> org.apache.directory.server.core.integ.annotations.ApplyLdifs;
<span class="code-keyword">import</span> org.apache.directory.server.core.integ.annotations.CleanupLevel;
<span class="code-keyword">import</span> org.apache.directory.server.integ.SiRunner;
<span class="code-keyword">import</span> org.apache.directory.server.ldap.LdapService;
<span class="code-keyword">import</span> org.junit.Test;
<span class="code-keyword">import</span> org.junit.runner.RunWith;


/**
 * Test a single search.
 */
@RunWith ( SiRunner.class ) 
@CleanupLevel ( Level.CLASS )
@ApplyLdifs( {
    
    <span class="code-comment">// The added entry
</span>    <span class="code-quote">"dn: cn=Kim Wilde,ou=system\n"</span> +
    <span class="code-quote">"objectClass: person\n"</span> +
    <span class="code-quote">"objectClass: top\n"</span> +
    <span class="code-quote">"cn: Kim Wilde\n"</span> +
    <span class="code-quote">"sn: Wilde\n\n"</span>
    }
)
<span class="code-keyword">public</span> class SimpleTest
{

    <span class="code-keyword">private</span> <span class="code-keyword">static</span> <span class="code-keyword">final</span> <span class="code-object">String</span> BASE = <span class="code-quote">"ou=system"</span>;
    <span class="code-keyword">public</span> <span class="code-keyword">static</span> LdapService ldapService;
    <span class="code-keyword">private</span> <span class="code-keyword">static</span> <span class="code-keyword">final</span> <span class="code-object">String</span> FILTER = <span class="code-quote">"(objectclass=*)"</span>;


    /**
     * Test a simple search operation
     */
    @Test
    <span class="code-keyword">public</span> void testSimpleSearch() <span class="code-keyword">throws</span> Exception
    {
        LdapContext ctx = ( LdapContext ) getWiredContext( ldapService ).lookup( BASE );

        SearchControls ctls = <span class="code-keyword">new</span> SearchControls();
        ctls.setSearchScope( SearchControls.OBJECT_SCOPE );
        ctls.setReturningAttributes( <span class="code-keyword">new</span> <span class="code-object">String</span>[]
            { <span class="code-quote">"objectclass"</span> } );
        <span class="code-object">String</span> rdn = <span class="code-quote">"cn=Kim Wilde"</span>;

        NamingEnumeration&lt;SearchResult&gt; result = ctx.search( rdn, FILTER, ctls );
        
        <span class="code-keyword">if</span> ( result.hasMore() )
        {
            SearchResult entry = result.next();
            Attributes heatherReloaded = entry.getAttributes();
            Attribute loadedOcls = heatherReloaded.get( <span class="code-quote">"objectClass"</span> );
            assertNotNull( loadedOcls );
            assertTrue( loadedOcls.contains( <span class="code-quote">"person"</span> ) );
            assertTrue( loadedOcls.contains( <span class="code-quote">"top"</span> ) );
        }
        <span class="code-keyword">else</span>
        {
            fail( <span class="code-quote">"entry "</span> + rdn + <span class="code-quote">" not found"</span> );
        }
    }
}</pre>
</div></div>

<p>In order to have this test running, you will need to declare some libraries. The best solution is clearly to define a pom.xml file for that purpose. Here it is :</p>

<div class="code"><div class="codeContent">
<pre class="code-java">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;
&lt;project xmlns=<span class="code-quote">"http:<span class="code-comment">//maven.apache.org/POM/4.0.0"</span> xmlns:xsi=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span> xsi:schemaLocation=<span class="code-quote">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"</span>&gt;
</span>  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;org.apache.directory.server&lt;/groupId&gt;
  &lt;artifactId&gt;apacheds-unit-test&lt;/artifactId&gt;
  &lt;version&gt;1.5.5-SNAPSHOT&lt;/version&gt;
  &lt;name&gt;ApacheDS Server Unit&lt;/name&gt;
  &lt;packaging&gt;jar&lt;/packaging&gt;  

  &lt;description&gt;
    Unit test <span class="code-keyword">for</span> ApacheDS Server JNDI Provider
  &lt;/description&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;junit&lt;/groupId&gt;
      &lt;artifactId&gt;junit&lt;/artifactId&gt;
      &lt;version&gt;4.4&lt;/version&gt;
      &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
      &lt;groupId&gt;log4j&lt;/groupId&gt;
      &lt;artifactId&gt;log4j&lt;/artifactId&gt;
      &lt;version&gt;1.2.14&lt;/version&gt;
      &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
      &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
      &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;
      &lt;version&gt;1.5.2&lt;/version&gt;
      &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.directory.server&lt;/groupId&gt;
      &lt;artifactId&gt;apacheds-core-integ&lt;/artifactId&gt;
      &lt;version&gt;1.5.5-SNAPSHOT&lt;/version&gt;
    &lt;/dependency&gt;  

    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.directory.server&lt;/groupId&gt;
      &lt;artifactId&gt;apacheds-server-integ&lt;/artifactId&gt;
      &lt;version&gt;1.5.5-SNAPSHOT&lt;/version&gt;
    &lt;/dependency&gt;  

    &lt;dependency&gt;
      &lt;groupId&gt;org.apache.directory.server&lt;/groupId&gt;
      &lt;artifactId&gt;apacheds-all&lt;/artifactId&gt;
      &lt;version&gt;1.5.5-SNAPSHOT&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;

  &lt;build&gt;
    &lt;pluginManagement&gt;
      &lt;plugins&gt;
        &lt;plugin&gt;
          &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
          &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
          &lt;version&gt;2.0.2&lt;/version&gt;
          &lt;configuration&gt;
            &lt;source&gt;1.5&lt;/source&gt;
            &lt;target&gt;1.5&lt;/target&gt;

            &lt;optimize&gt;<span class="code-keyword">true</span>&lt;/optimize&gt;
            &lt;showDeprecations&gt;<span class="code-keyword">true</span>&lt;/showDeprecations&gt;
            &lt;encoding&gt;ISO-8859-1&lt;/encoding&gt;
          &lt;/configuration&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
          &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
          &lt;configuration&gt;
            &lt;argLine&gt;-Xmx1024m&lt;/argLine&gt;
          &lt;/configuration&gt;
        &lt;/plugin&gt;
      &lt;/plugins&gt;
    &lt;/pluginManagement&gt;
  &lt;/build&gt;
&lt;/project&gt;</pre>
</div></div>

<p>Is that it ? Pretty much. All you have to do now is to run the test, using a Java 5 JVM and Maven 2.0.9 :</p>

<div class="code"><div class="codeContent">
<pre class="code-java">#user:~/ws-ads-1.5.4/UnitTest$ mvn test
[INFO] Scanning <span class="code-keyword">for</span> projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building ApacheDS Server Unit
[INFO]    task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources]
[INFO] Using <span class="code-keyword">default</span> encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] No sources to compile
[INFO] [resources:testResources]
[INFO] Using <span class="code-keyword">default</span> encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test]
[INFO] Surefire report directory: /home/elecharny/ws-ads-1.5.4/UnitTest/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running SimpleTest
log4j:WARN No appenders could be found <span class="code-keyword">for</span> logger (org.apache.directory.server.integ.SiRunner).
log4j:WARN Please initialize the log4j system properly.
Ldap service started.
Ldap service stopped.
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.114 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10 seconds
[INFO] Finished at: Fri Nov 21 15:40:32 CET 2008
[INFO] Final Memory: 11M/83M
[INFO] ------------------------------------------------------------------------
#user:~/ws-ads-1.5.4/UnitTest$</pre>
</div></div>

<p>You have written your very first test using the test framework provided in ADS 1.5.5 !</p>

<p>Here are the test files :<br/>
<span class="nobr"><a href="/confluence/download/attachments/55238/SimpleTest.java?version=1" title="SimpleTest.java attached to 4.2. Using ApacheDS for unit tests">SimpleTest.java<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span><br/>
<span class="nobr"><a href="/confluence/download/attachments/55238/pom.xml?version=1" title="pom.xml attached to 4.2. Using ApacheDS for unit tests">pom.xml<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<h3><a name="4.2.UsingApacheDSforunittests-Testdescription"></a>Test description</h3>

<p>Ok, we have a running test, but when it comes to write your own, you need a bit more information. Let's try to explain the different parts of this test.</p>

<h4><a name="4.2.UsingApacheDSforunittests-Annotations"></a>Annotations</h4>
<p>The first interesting part is the annotations we are using. As we said, the server is launched automatically, and we are using the ChangeLog mechanism to restore the base in a pristine state between each test. This is done with annotations.</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation </th>
<th class='confluenceTh'> Parameter </th>
<th class='confluenceTh'> Default value </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> @RunWith </td>
<td class='confluenceTd'> SiRunner.class </td>
<td class='confluenceTd'> none </td>
<td class='confluenceTd'> Run the test with the defined Runner, instead of the default JUNIT one.<br/>
This is mandatory to add this annotation, as it determinate the way the server<br/>
will be clean when each test has run </td>
</tr>
<tr>
<td class='confluenceTd'> @CleanupLevel </td>
<td class='confluenceTd'> level.CLASS </td>
<td class='confluenceTd'> Level.CLASS </td>
<td class='confluenceTd'> Define when we should start and stop the server. Usually,<br/>
we want to do that when entering the test class, but we may want to do that for each method<br/>
(using the Level.METHOD value ) or at the opposite, on the Suite level (Level.SUITE), or even on the global <br/>
level (Level.SYSTEM) </td>
</tr>
<tr>
<td class='confluenceTd'> @ApplyLdifs </td>
<td class='confluenceTd'> A list of entries in a LDIF format </td>
<td class='confluenceTd'> none </td>
<td class='confluenceTd'> This is one of the most interesting new feature :<br/>
you can define the data you need to be present when the server is started, they will be injected<br/>
before the first test is run (it will also depend on the CleanupLevel). </td>
</tr>
<tr>
<td class='confluenceTd'> @ApplyLdifFiles </td>
<td class='confluenceTd'> A list of files containing LDIF entries </td>
<td class='confluenceTd'> none </td>
<td class='confluenceTd'> Give sthe list of files to be injected<br/>
into the server before the tests are run. </td>
</tr>
<tr>
<td class='confluenceTd'> @Factory </td>
<td class='confluenceTd'> A factory instanciating a server </td>
<td class='confluenceTd'> none </td>
<td class='confluenceTd'> This annotation helps you to define your own <br/>
server initialization. We haven't used one in the simple test. </td>
</tr>
</tbody></table>

<h4><a name="4.2.UsingApacheDSforunittests-Serverstartup"></a>Server startup</h4>

<p>As you can see in the test, there is no place where you tell the server to be started. This is done by the SiRunner. When the tests are all done, the server is also automatically shutdown, and all the created files are removed. </p>

<p>The initialization will update the <b>ldapService</b> instance which has been added at the beginning of the code. You will use this instance to access to the underlying LDAP base.</p>

<p>You just have to focus on writing your own tests !</p>

<h5><a name="4.2.UsingApacheDSforunittests-WritingyourowntestusingJNDI"></a>Writing your own test using JNDI</h5>

<p>All the LDAP operation are supported, you just have to use the JNDI API to write your tests. The only difference is the way you get a context : you have to use one of those methods :</p>

<div class="code"><div class="codeContent">
<pre class="code-java">/**
 * Creates a JNDI LdapContext with a connection over the wire using the 
 * SUN LDAP provider.  The connection is made using the administrative 
 * user as the principalDN.  The context is to the rootDSE.
 *
 * @param ldapService the LDAP server to get the connection to
 * @<span class="code-keyword">return</span> an LdapContext as the administrative user to the RootDSE
 * @<span class="code-keyword">throws</span> Exception <span class="code-keyword">if</span> there are problems creating the context
 */
<span class="code-keyword">public</span> <span class="code-keyword">static</span> LdapContext getWiredContext( LdapService ldapService )

/**
 * Creates a JNDI LdapContext with a connection over the wire using the 
 * SUN LDAP provider.  The connection is made using the administrative 
 * user as the principalDN.  The context is to the rootDSE.
 *
 * @param ldapService the LDAP server to get the connection to
 * @<span class="code-keyword">return</span> an LdapContext as the administrative user to the RootDSE
 * @<span class="code-keyword">throws</span> Exception <span class="code-keyword">if</span> there are problems creating the context
 */
<span class="code-keyword">public</span> <span class="code-keyword">static</span> LdapContext getWiredContext( LdapService ldapService, Control[] controls )

/**
 * Creates a JNDI LdapContext with a connection over the wire using the 
 * SUN LDAP provider.  The connection is made using the administrative 
 * user as the principalDN.  The context is to the rootDSE.
 *
 * @param ldapService the LDAP server to get the connection to
 * @<span class="code-keyword">return</span> an LdapContext as the administrative user to the RootDSE
 * @<span class="code-keyword">throws</span> Exception <span class="code-keyword">if</span> there are problems creating the context
 */
<span class="code-keyword">public</span> <span class="code-keyword">static</span> LdapContext getWiredContext( LdapService ldapService, <span class="code-object">String</span> principalDn, <span class="code-object">String</span> password )</pre>
</div></div>

<p>That's it ! Everything else is just pure JNDI</p>

<h5><a name="4.2.UsingApacheDSforunittests-WritingyourowntestsusingtheNetscapeAPI"></a>Writing your own tests using the Netscape API</h5>

<p>If you don't like JNDI, or prefer to use the Netscape API (LdapSdk-4.1), you have two major differences :</p>
<ul class="alternate" type="square">
	<li>first you have to add this API jar into the dependencies in the pom.xml file</li>
	<li>second you will use the getWiredConnection() method instead of the getWiredContext().</li>
</ul>


<p>The API is :</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">static</span> LDAPConnection getWiredConnection( LdapService ldapService )
<span class="code-keyword">public</span> <span class="code-keyword">static</span> LDAPConnection getWiredConnection( LdapService ldapService, <span class="code-object">String</span> principalDn, <span class="code-object">String</span> password )</pre>
</div></div>

<p>Both methods are similar to the getWiredContext which has been described before, except that they return a LdapConnection instance.</p>


<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>
<p>Starting here, the document has to be reviewed...</p></td></tr></table>

<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