[jboss-cvs] JBossAS SVN: r99689 - in projects/joram-tests/trunk: docs and 23 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jan 20 19:14:17 EST 2010


Author: clebert.suconic at jboss.com
Date: 2010-01-20 19:14:16 -0500 (Wed, 20 Jan 2010)
New Revision: 99689

Added:
   projects/joram-tests/trunk/.classpath
   projects/joram-tests/trunk/.project
   projects/joram-tests/trunk/LICENSE
   projects/joram-tests/trunk/README.txt
   projects/joram-tests/trunk/docs/
   projects/joram-tests/trunk/docs/TEST_SUITE.pdf
   projects/joram-tests/trunk/pom.xml
   projects/joram-tests/trunk/src/
   projects/joram-tests/trunk/src/etc/
   projects/joram-tests/trunk/src/etc/default.mf
   projects/joram-tests/trunk/src/main/
   projects/joram-tests/trunk/src/main/java/
   projects/joram-tests/trunk/src/main/java/org/
   projects/joram-tests/trunk/src/main/java/org/jboss/
   projects/joram-tests/trunk/src/main/java/org/jboss/test/
   projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/
   projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/AbstractAdmin.java
   projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/GenericAdmin.java
   projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramTestDelegate.java
   projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramUnitTestCase.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/Admin.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/AdminFactory.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/ConnectionTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/TopicConnectionTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageBodyTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageDefaultTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageTypeTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/MessageHeaderTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/JMSXPropertyTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyConversionTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/QueueBrowserTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/TemporaryQueueTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorSyntaxTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/QueueSessionTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/SessionTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/TopicSessionTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/UnifiedSessionTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/TemporaryTopicTest.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/package.html
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/JMSTestCase.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PTPTestCase.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PubSubTestCase.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/TestConfig.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/UnifiedTestCase.java
   projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/package.html
   projects/joram-tests/trunk/src/resources/
   projects/joram-tests/trunk/src/resources/provider.properties
   projects/joram-tests/trunk/src/resources/test.properties
Modified:
   projects/joram-tests/trunk/
Log:
Initial import from cvs.forge.jboss.com:/cvsroot/jboss
cvs co joram-tests



Property changes on: projects/joram-tests/trunk
___________________________________________________________________
Name: svn:ignore
   + output


Added: projects/joram-tests/trunk/.classpath
===================================================================
--- projects/joram-tests/trunk/.classpath	                        (rev 0)
+++ projects/joram-tests/trunk/.classpath	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry exported="true" kind="lib" path="src/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="var" path="MVN_REPO/apache-log4j/log4j/1.2.8/log4j-1.2.8.jar"/>
+	<classpathentry kind="var" path="MVN_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
+	<classpathentry kind="var" path="MVN_REPO/jboss/jboss-test/1.0.1.GA/jboss-test-1.0.1.GA.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3.8.1"/>
+	<classpathentry kind="var" path="MVN_REPO/jboss/jboss-common-core/2.0.3.GA/jboss-common-core-2.0.3.GA.jar"/>
+	<classpathentry kind="var" path="MVN_REPO/jboss/jboss-logging-spi/2.0.3.GA/jboss-logging-spi-2.0.3.GA.jar"/>
+	<classpathentry kind="var" path="MVN_REPO/jboss/jboss-logging-log4j/2.0.3.GA/jboss-logging-log4j-2.0.3.GA.jar"/>
+	<classpathentry kind="var" path="MVN_REPO/jboss/jboss-j2ee/4.0.2/jboss-j2ee-4.0.2.jar"/>
+	<classpathentry kind="var" path="MVN_REPO/jboss/jboss-j2se/5.0-SNAPSHOT/jboss-j2se-5.0-SNAPSHOT.jar"/>
+	<classpathentry kind="output" path="output/eclipse-classes"/>
+</classpath>

Added: projects/joram-tests/trunk/.project
===================================================================
--- projects/joram-tests/trunk/.project	                        (rev 0)
+++ projects/joram-tests/trunk/.project	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>joramtests</name>
+	<comment></comment>
+	<projects>
+		<project>common</project>
+		<project>j2ee</project>
+		<project>j2se</project>
+		<project>test</project>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: projects/joram-tests/trunk/LICENSE
===================================================================
--- projects/joram-tests/trunk/LICENSE	                        (rev 0)
+++ projects/joram-tests/trunk/LICENSE	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+

Added: projects/joram-tests/trunk/README.txt
===================================================================
--- projects/joram-tests/trunk/README.txt	                        (rev 0)
+++ projects/joram-tests/trunk/README.txt	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,5 @@
+this project depends on maven2.
+
+cvs co joramtests
+cd joramtests
+mvn clean package

Added: projects/joram-tests/trunk/docs/TEST_SUITE.pdf
===================================================================
--- projects/joram-tests/trunk/docs/TEST_SUITE.pdf	                        (rev 0)
+++ projects/joram-tests/trunk/docs/TEST_SUITE.pdf	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,1253 @@
+%PDF-1.2 
+%âãÏÓ
+ 
+8 0 obj
+<<
+/Length 9 0 R
+/Filter /FlateDecode 
+>>
+stream
+H‰ÍWËnã0üÿÙƒU’’,ùØ&)ÐMPÔA? è{X`÷²¿¿z9ë4­q]vxÄSCÒ¾ê*n0i¡ºU…¢þüó
+ÕÅ5‚²îÖK…îú5
+jÙýýøÝϪ&·–âz pø•é.úøu¸úû(˜Èúw*ÒæÛ´ÿÁ‡b&"4(¾ˆ¯Ö*Cç‚`’Œ1¿·YúÛúˆåVð!øX€UAÁâ.Ë}WÀ±óÜÎV:>üâ!KýP@±’G¨'7v-Q
+Ú~²÷¾ÎdëLؠ˪é
+ÔD,ûbÿ<^JtŠW<òâvfU².P±LïÁG†”y[P›Mƒ[¤dd>ûШ]Ö
+êiÜhóå0°bí‹Ö½xîM`UâDÙèd†]VÇ®@ÇpÔhõM–ú¦€:bIuÆyŒ8kå³*@VÃ*Xeµ¬
+´D¬<ç
+ÁÉ!·e›²-²Må8²-ÎM²Ä2˽,à^ž<æªß©ç>÷«ÑØîÏ=‚Ù˜d·M–|S@¾9Ñn3Í`!Ù¦g¾Ì_G,ËïÙîçq³u´Iý½îªßPif’65qí>Ã<Â/¨®º=@¥¿rãϱõÓþàŸ‰tð™âHîCnW¥PŠ¢0îH3Œ„P«´.®y°¢Ÿ¾¬Ý³“M	mLC˜‘d~§ë„|>Ê
+endstream
+endobj
+9 0 obj
+539
+endobj
+4 0 obj
+<<
+/Type /Page
+/Parent 5 0 R
+/Resources <<
+/Font <<
+/F0 6 0 R 
+/F1 10 0 R 
+/F2 12 0 R 
+/F3 14 0 R 
+>>
+/ProcSet 2 0 R
+>>
+/Contents 8 0 R
+>>
+endobj
+21 0 obj
+<<
+/Length 22 0 R
+/Filter /FlateDecode 
+>>
+stream
+H‰Õ—aoÛ6†ÿ?fÀ¬wGRúØ´
+ÐbÃÄèw×V2m©åIvŠýû‘")ÉvdÉž´b(u<>|ïøên1#H¦ÉØâÃŒ3ûW<³Ùí=1ææÓlÎ#¡„°böZ“½þÎn>ÿúÈi¹cûl—þÄÌtIÁÄb·÷2Dàá]Då^eÕè¹²ÓÏFUá7·ª'­{îÆ\„v†$ÒÒÍAœÈvtô‰Tù+QåÀÝ€oË¢¬Æ€°ï»q.ËóqôAà.3^/º~{Ån~>xûšè}’cR²Y”¿%éðHâ:g33Òí©çÿ6u7©Ý¨Á!®Ëa.ÌJÌjU¬‚,Ì ÿS^ÊÀ€»§V'œW5!PÙs
+"´Bå‚ÚÉ,ÞÝýòÑ)›Í®«%dwLPE4‹íªøÞR<bGú‚	Ò¿‘ÛcцÛTm=lt­³aí"zþæRSSâï>±×´(³|Sz½ÓéαÆíVÍÞú‡5Nr(ß yÄgU“$¨¹r肋Qª…a.%¸å<î·Û¼Ø¥kfym‹ü5[§¾ÃÉO[Ì	,HÚåxŒK^Œëãbv¼”8±Ë1ØtÌ{&^‘²§ÙÝb–TIJ%<_ó¶éÕ/€PM¯µ F7!DA’ê‚Û=êì\f*Šq-]ŠH±ŽeÔ×p ѝ]Kžv­a²lzÏpl016ܤ†67ƒåëº$é?Áigt|Ý­û ªqªªæ	¯ý
+qé{ø§M¹[¾¼d›g¶û=e;kuÊÚê⺠ñî²V#–5¯’y»¬I'ðeS—5'ÏÜý‰#òþË£É}›—Ù./þvx ÏB´ìש(ÕÕ5M4N]Д;zn–«?—ÏN†Ä{{LÀ犞‡NŒeâ!	á–ø!-WE¶ÝÿÂò§ª”Ë|_¬LEi¨åߦ–ϵ¿«Hò¸Mòö^tpÙ`óňÁTu…l¥Ø­,VnÍq=îp¿Œ­	’~v骮JzÃ^rÔžÀ:ƒ¨jÔsÖä%Ò:ÿŸRêC„£!zɾþxDz!Ñh”m–¤©Y)1*«>Pr4P«|ó”=G›ˆ’N&RÔQ¾JÆ
++ùs¤Í¢ã̃NH5ð¶é7s¦5†,uZÓz
+H‰ÍVÛnÛ0ýÿƒ;`V%êþØbËCb[ã0:§ñ€&…ã®ØßO7;vÒÚnÒAÄ‘)’çˆäÑu–pÅ0¤Œ@(û–ä>ÕJ.gQ°‹‹$%˜Jêî‘{VÜ=¿ ‹›Û9ÊŠMæÏe]|AÙŸD,¬ë]ÎDã4{“a+òÖ©
+>8UâNZÝäRŽ;° w
+ÕŠt²·œÿJ!¤Œ
+endstream
+endobj
+30 0 obj
+766
+endobj
+28 0 obj
+<<
+/Type /Page
+/Parent 5 0 R
+/Resources <<
+/Font 31 0 R
+/ProcSet 2 0 R
+>>
+/Contents 29 0 R
+>>
+endobj
+31 0 obj
+<<
+/F1 10 0 R
+/F2 12 0 R
+/F3 14 0 R
+/F4 17 0 R
+/F5 19 0 R
+/F6 23 0 R
+>>
+endobj
+33 0 obj
+<<
+/Length 34 0 R
+/Filter /FlateDecode 
+>>
+stream
+H‰½VÛjÛ@ýÿÃ<¦mvW{Sß’´
+…˜>‚,¯c[
++¹nÿ¾{ÕÅ%i¡øE^ÍÎœ9sήn–&sD9È‚,?,0¸Ÿy‚ÅÕBíâf‘aDq¸gÉÜó.>¹‡¥îz¸?Ô½~Ëç…,·l.¸ºã)N{ó\„­à£3N™+Ÿ‘y
+K·Þë¦/{'x1í÷zmYIC‰sÎz3bI>Ê	¡I¡v&P
+M»Ö²jü@mîÕNñâ4ìQ	QÚ<Go™/A‘É:žá@EJÒHðÍ¡¿tº©Úƒé,É«ÖV’wëý\ŠÇz·³±M_7ídUµúGÝõ®ae¬ ·àt³Òº‰2‹×xpÔŸÃEØЇ"!¬2ºì-ÃQo·ßîÁè—¶«ûÖü|ŸôÇÞ>‡2BD¸‰äx»SÍXÎTó@™ô[Ù	ÏéôÈ'7á‰|d‘æ-T„áàïKÛG$Ȳ꺩§–yÅüXÊ	WS\$\;ꜞ•Dÿ«e!Eš2&¾ÿØtì7ä=÷¤xÞws‡ÆÛB¤¿ä?ÒU8KÄ«˜¸Hsà‰™áîXD§ß5¯»)}̨P$¨v˜5U鼺µÖ0õꎉ²YC£ñ
+H‰½WÛnÛFýýÃ>Ú€¹Ú½P4PÔb?ÚFzPâJ¦a‰
+¹ŠÒ¿ï^y‘ÓHqP#@“»3sfÎœ}˜xÊ0”f¡ùÇAö_½A£ñ#GÌËõ(!˜Jj¬}N¹}>¢«?¦34WF³C©Õ5š?ÒcÁØBãG-x—1é¯"w:À­û„2숈yå¾ôÞùI
+?XN…÷a’‰¾uqñKêb þÀ6¯w¨½ïÏù(l'˜â##-èöö
+]Ýn¿Å:a!ÈmÄL‰Tx%øðoÈ&mÌÆ3p™ö]'¿ºðNm¡.6ñ¶.˜E+'2Ò‘È€Ë"KBj±ÏïU2¾iJ{ñcÂ)4&2rvØï«Z«ÙfØ×ÕײP[Œe¯Éuê$aÚSI&Úø1ÿe‡€ø¯¶ÁÔCù¾/—Ñã°ƒZ@‚t€8ã]OSLO PC—³æà ø¦jKÑêIÛ«Ö£He°Ã¸#±s¯‘~RÆ·jÔÎ<—[uãÞ4ƒ4âCy­nC5'ç	—
+NÍ>÷Ý•¢ÕÛ‹•Ö8ýÚS‘
+endstream
+endobj
+41 0 obj
+1111
+endobj
+39 0 obj
+<<
+/Type /Page
+/Parent 5 0 R
+/Resources <<
+/Font <<
+/F2 12 0 R 
+/F4 17 0 R 
+/F5 19 0 R 
+/F9 37 0 R 
+>>
+/ProcSet 2 0 R
+>>
+/Contents 40 0 R
+>>
+endobj
+43 0 obj
+<<
+/Length 44 0 R
+/Filter /FlateDecode 
+>>
+stream
+H‰ÅWÉnÛHýÿC ¤z!ÙMŸfI<H€
+#ýÓ®ÐÕâ6A„ÂÃåU„c’ýA‰ôß<ÑÐõÇOŸÑìzôy_÷ò
+º{¸âyœ‚°…·©·€ýYÆ2{™¯£”&úúˆ°Ø8à_`xdÞŒžÙ§Ô¿Ð7ä1Oí1y:¶Îœ#ÆÿŒ°ý`[´ù†}Þ~g½<o‡OÌPl=Ã!èpºD×o'§_c3çämøL¥CPîQšLÿ§¹>ÃÍ4ÉøøêèoºžÙKu¡^lâu>DIÊt´™È<,ˆãSdŠ
+¤¤èŒ’—Pa‰ä_Ãsçg˜N“O’¬§P(K©:G–¹ï¾\¯û~w³X‡)d,R¦¾g¼î·›/ob¤Ý_Ö‰jíá/Ö»¸{W´æ)hž2Bp¨7›Á2BXâ³J¹KJ#ÁȽê×öL’N¦"‚òrìÆðÜŒŠ¦B=\½ïëMÝײÓÚ£v Fu»¢³äò,tÅ‚¯À{=þè0£°Ô	÷;Ù•m½ëkÕ µ4eïÔ¾-3­ts›O–GèdП.Ï+&Ÿ,3:ìª%Ã;0BëÈ
+€AÞóñö$Nëè ¡Ïg(Æ|µÎ%TÕ- ƶ}èQ©š¾¨'É9ÙÝ÷ûzSÅ߶›é^q4Ãùvʹð(ÙwŸO!½$ðkÚÎÌ–Lný±éV›ù•4õÝŒf‰Ÿ¡Ê%†U+Ùȶ€èŒ?E¥Jà`¿%êÞ"Ù—®ë3z¹ýÑDé5›­‰ùÕÕ$NâÐPw9¸86m6 ”mZ¤ódEº¶\L»êÔ	P7n˜ÌrŸ›
+H‰µVÛnÛ8ýÿÃ<¦@¤)JûÖ¢›‡E­ûÂØŒ­À’‘Ž×¿Ã‹®Mí´ÛÂ0`Sù3gôa½â2K™
+€õÇ÷év°º»ç@>®’Òœ:ƒ
+¸ß’»ß'¸ùôù+¬µ±ðõXYýÖO+Y¦= /¸»½ÒßͲ<\oÆ]ø„f©O @ðÈ?™œ…ƒD2Ö?pÊTŠ#eE)¦Þ³˜ˆÏ?§>jÕoè»ìB–—ýÈ™FBfd(z¸½›ÛÙí_ñN²˜ä}ôcQñHðùVCΙñ\NC'ÿ3u‚: Þìâ×rH8ñÕJÒs‚BOG
+ÊÄÔi–º¿ÉÙ̵Ï@dSß¼¨Lé”itæóP=Ü…¦òÑ~’z&²Æ'—,ÙVÞض;‡Ñ×òIhQBÂò‘ÿ|š!2ºÄbõ¾2c Ø´UUc@€‰wª«´Fë­Þ‚mÑ ~®ì¿8Û&4‹Iž^Ã2	FI&Ư‚Á3Ï]ûRmug$9ùÐ0§IL¤¯ â‚p–û«,%Yž_†ä58ŽFƒ“Ù¡¬îÛô¿ª~>è[S“œNç™0f‰¦$±¸NVqðøÌ^ΚøÔvªžSúÇóÇœX³Á®‡hš‘¼¦æø0Ö{ªìÞÓïIuðˆ\3®Ê-<œáÓ—ÞVò‰xŒ¢Lߦ
+´”~gü#Åof$âûXíîæNÿ‰üIOˆÂsãCÆÇNÙªmõº
+. ÑH‚í4bìƘÀé!ÎŽ4„rã=6&f»Q‹Þ³3xD)»H¨È'̼mgP‘P‘ý<'³nŽBt‘¶ªu{´Ë\*w¨J`ÿDÿÒK:ßÆŠŒ¶&\‹:u˜•Ó^7€£¥«—ªÙA­Q;ìEÕ\.u¦§Y‘÷zÊŠØ^sn6û®mÚ£ÁFmuP¬B\_ÑÞ&ñoáoÃü§ÅÐÓ8gƒ˜ñ2&ýÅaéå&ˆY1¨;Rh®˜(Gý<	¾|A}3gvi}3)–	Å€¸š·Ž¢V¶Ç0¼!†·ž§L¤íN7Ú	$þsxR/jÛnâ^ùu
+û{½úÚ	?ò
+endstream
+endobj
+53 0 obj
+1006
+endobj
+50 0 obj
+<<
+/Type /Page
+/Parent 51 0 R
+/Resources <<
+/Font <<
+/F1 10 0 R 
+/F4 17 0 R 
+/F5 19 0 R 
+/F8 35 0 R 
+/F11 47 0 R 
+>>
+/ProcSet 2 0 R
+>>
+/Contents 52 0 R
+>>
+endobj
+55 0 obj
+<<
+/Length 56 0 R
+/Filter /FlateDecode 
+>>
+stream
+H‰ÅWkoÛ6ýùü0`)É|‰’Ša@¶µØ
+t0``l:–gKž('È¿ßåÓ’±’uŠ¢®Mò^ž{î9—?L¯xÎRš¡¼Ìšþt…‘ùÓ> «ÉGŽ…/W	N‰ fÁ™Ï97ŸŸÐõ§Ï¿£©Òú}Wuêš®®ò2Íà8M>fáö2&ÜVdW'å&|BXj?`øÊþÒûÎ}‘䔆L„2Í3#¥E™õOg>›¿ 6ìld«íJÌ~·Îeùò9ùàŠ]f8^:îž¡ë›Áî·œŽ™Orä©l)ÿUƇÿ§es†È”‹¼:ù—©.¨)Ôè#Þ–CÂ3fn+
+haIœf˜z"S,,q{yêPà½ê§´4!½üSLËؘæVþØl¶Õºª¬çh§Í§n©PgÚÂ%èy˲˜ìÒQÇþyzÙaZ	·y%eï@îÿŠý•±ûÕ´o?O‰»;+™±-ÁÓ°å"²þ­U­ú{WiH^ûõʼnô‡g&SX”¸Î‹õŠ¢ÓkhL¨HR‘cø´A3ºBMˆ«=Þƛм§DïϵrÀ³þMnëî¨q¹˜šœûdx^„+Ý]/»nû~2YÉ¿dÛÉTnål©Ò¦}˜Èº»{‡*j¥æjž¢)$
+¡Ì	)	ìȱS@ªib‰‚ÙX°ç>Ö£juÕÔæÀVǘ’ôXJíNÔ²,ÝÎÚFÿ£Ù¡§j½Fr­›“E®Ùvpª\£N¶ªÓh]Ý·²}¾ñB|ºíh&zðýª‘´»‰Ó B®·Eø¯øÃ@uÐÐÀ”k‹œ£/>sV¸Oº’­³$z®¢9aþzLàPѧe5[¢¹ZTµÒ¼ë®®ºavG1-CL0?ÓAo%ªkë#eµ–÷†åµ%Í“º7–z ŠËÚš°›Ð	ÀèÁ¹OÓ’aïÅ_ê™ã¥ª«¶©7
+>CÛ¶ÙªvýŒªZwr½ÂÜ]kåÖΛÙÎ,”í»w7èèµ”ÐŠ
+Úî:tßtË… 8xî³þ¿#Q\`Èãe?~5\ñf*&‚Rñ<3@ò-
+T­kÚg£™>Í,ð›Û_§þüåó‡IŸmèCdÊ£†ÇÈŽœyØQgÿOxZ_ç¿ôÍþË‹ÿ~€6t.À.Ÿ“HnõÀºêYß5*¨W/ídçŒ÷AÕª•³\~¨¨YؽC!#h6p×
+jÌ\¿ £Ö C~”d‡u¼AÝóV½was2F)iA&'óó©È Uw!b‚ðÖ)ûc¦	D†a`õ>Êäœï©tòÜ:`>G˜y´³ð{e5¶/ÉØHxWNHIÒýuÎâýÕhO,‰9KÊ€vÌ;¢™”V'ù5kà’àÑzÖVV£ÑfA“—7ª[6sÈïÔ‡cD46YrᦥOGoÕ¬ZT3›‚F%»]kjtÕD…
+݃Wv©¯GI/?-¿*á!þk”„½]I<Ùþ¬ð
+îÞ2ƒ6ޏÕ.ɏ›éHf˜k¹Ë2®¹7‚ð¢ú¥/£ô„\”˜‡Ž,Kr¬ºÚlaÐéÉÁ£Ê—•ý	ë¢tø—ËW–QµfY(&LaóéÆSdÔ¸h½ŠüÍT¤42$ì,îoôBôÓ€õ±šÃ3ÉW!«(G¼EMv™Ï9+¢NµÊ@S}šZ¡ÙZj½—£’™Š}ñßÛû©mJÇBõŠ¡Ù>ø˜£¶¡+öz%盪®t׺ëºSíBÎTŠ>˜¤@cb†v˜áÝ*z’Ï6ÓV—7ëzG©ùåÔè^Öí»Õ<Dsb‘ƒuÍý
+:NÃD
+2^ÃG+ÝÒ4arjcõ®ªÐÞ½KL­Ú4æ]±œçj«ê¹¬Û8Ёpê¡Èh <mm³Ù«™/»ÛÚÃÒÐI8(	LÏÌ÷Qd:´Ó&E_$Oe‚Gð·ÆOCšûìI›?–®W¸Š†g¡Ã:ɦØ30õá£>÷šAÒLdž6û`éJÏ
+>(þ¢z˜
+¦þ< €ŸdÄI?§[œœð"at5“S0ëzn|<š·ë׈_U?ôåF|­ÚrœŽ±Ð
+®¸>Ò€È8^…_H
+³CJ郡~DÿÃDïF•ÄýósN¿wÿÞёјò£6Ë÷Ný&aÄYîˆ<º{(<
+H‰ÍWÙnÛ8ý‚ü˜ˆd’â"2KÍ´Óø1€¡ÈR¬À’\IÎò÷å*JŽm)NäűɻñÜsÏýc~Fxàc
+xD˜ÿuü«ïÀÙì‹/³3úˆ!y ò3'òó#8ÿtu
+æiÓ‚ëmÞ¦ïÀüþŒG>„-0û@­hïÓW:íQL¤{¾
+Àþ
+»˜…gLï»öÞz¤Ê‡šlâ´<U¶ZL `¡#A0í%>ñ‘¯n<0­" Aß6	»WE+Ÿ¾|»¼Ò)ò]üì±#°¬Žy˜9è]qòÐ$0nœW ©ŠM¾Nr¨…¼ë¯°þa„—Ë"/uawžôÏC$0¡]"L‰7/6ë´HË6nóª¼
+{ÅÖQÔ·Ÿ´Uýü^£™Œw±AÜ=?~\¶¶üþ}UÇ…iuÜå"ÈÍݶ¥ú”Ç=Åy“‰OAfDmsÙ¬Êøê_ÍÆ É$.©
+OUAƒ*õ†ÛZÇ/î”5 ¶×LLj_ÍÛ€f“&y–' YÇM#Þ9mQV]TKð˜·+UqYEÐÈUˆvÙlëMÕh-òPåK°L7i¹LËäy
+®Ò¦1pan`Ë(£ 06 ±¥ŠïRpÖâÕe3%ÕæYÕ?«Öëê1/ï€P~y+vÐDéš}ӫȁf?¼lb¸Ká$ÔŒ$V<††’-duU¥hDÙÄ~ù*–ÀËùÇÅǮ痟?/¾}ù2ŸÝÍLÐå,}2‚!:¤è×&´LäÈX”zT]ƒßc¿ôï/½-P΍öb£ÂËÁNRë÷qÜÈ
+âÂØÆ}!¹«5 %À÷IŠx¤	`m°)¯'nÖnw¡{wƒ~òÆø¨Ð=¿/žêüõ†¹?f·\æýJ¡î‚ø)u©½x;É£ ø×›õˆÐÇÁyn€·@\$Ã-£84Ž4–@ßÍSì\À©¹¼ÆÅSR•¥ó±Û<R¯ãíÒ9*c!šïNÈE͏I¹4i²­óöÙ9ÁdЛœÈÉË ÷öÿÈškÇhj"Ç9¤³½móµ3Î~Žñ§ÂÙ$£Ý UI°×$Ø«þ°X4ü¼Ë³œØ‹8"ÀÏ=ršQÈOÓÓFX±	ÊŽ“Ôô@†œ ¦f/ŒéHz’Ždh #¯ó¬5;£n(ӑꘇ™«Íð
+0×Ò‰‰çàæ
+†BÒxuzP~éÖ<?èpÈUèXA¥Â´Ø¤¾6F°Šñ‰gh”@³~~mŽK5ÜÐ#*£Ö¦ðV†È,¼"RÌÃ]ü‰´Õ¨,3›ÜYæÔo#3-¾­º½–dÌhŸý+.‡ÿ¿žÄ$ê­›rP™W5äßó³<lÝ•
+endstream
+endobj
+62 0 obj
+1748
+endobj
+60 0 obj
+<<
+/Type /Page
+/Parent 51 0 R
+/Resources <<
+/Font 63 0 R
+/ProcSet 2 0 R
+>>
+/Contents 61 0 R
+>>
+endobj
+63 0 obj
+<<
+/F1 10 0 R
+/F4 17 0 R
+/F5 19 0 R
+/F7 25 0 R
+/F8 35 0 R
+/F12 57 0 R
+>>
+endobj
+65 0 obj
+<<
+/Length 66 0 R
+/Filter /FlateDecode 
+>>
+stream
+H‰½WÛnÛFýýÃ>hR˜ÔÞ—4Š·	¢:©Tä%@AK+‹©Eª$mÅßÙ¯–,Ú-ŠÀ1½Ü™9;sæÌòÍb©@*-~ž`dþ7h2½äˆPX\OĬ%2ÏŠ›ç=zõ~6G]Vh~—Vú5Z|¨8à|¡é¥¨=àÚ–1éL‘ÝÊMø€°Ð¨_`X²o:kn!P”Ö/L„8TÂÅi‹®wæXü’XØmØ&Ei÷PbìÝ>‡òi?ªç†b‡7‡n¬—èÕYÏú%Þ1ó Gú¨3%ÚCù%ÁûÓØÖ½	M¹TÝØÁ¿ÄNg洏—¸`æ¼2’51,C©§2EÀ³š'ÎV„.¼Sÿãˆv]Ò&	Ž‘¸m¦ÜÎy•UšÝ j£QÝà‰Åñ
+ƲŒfpcIn4šÛFþ¾„;Ïòn«³
+^æÙy‡FÓʤ‰Ú¿Ìoªjw>î÷ûpçB…KWî¸÷%"å¿Ÿòíb—@=%ÔËéFßî¦i¶ÒßH¸©Ü]
+H‰µWËnã6ýÿÃÝ5DI‰¤T´]¦Y
+t\ ‹Ù02m+±%C”ãúï˧qlOSa‹"ïãÜsÏe>Ïg™He 
+0ÿ2Ã`ÿÚÌîî3 Ô,.g	F„»¡û[dö÷n¿Â\é¾î«N}‚ùóLˆÆÜݳhdziÊýQp»F3ë>!)rÄØ,¹7£5¿Jãë¡@‚yˆæC .~N\ØoØÊV»=”Øó~Ÿò²11C±÷I÷§K¸¹œþˆuœ† ¿ÓFDŠ
+I…%–MŸiáêÞ»¦cßÉŒd®ÛøXI†]¾¼È#10ʇ2S Ø¿µ|;aˆ"ï§8¥Æ.¢Ã”ƒ±ÔXðHlÌ‹Ôoœ¯[¥à º:Óp\ŒŽž1ŸPîÊ’xZú­ãŽìÙn]2N‚pÁDô®ZÒ|ºI{mW”‹´mW¿×¥_´}¼k›×j¡ÚÀŽlH2e<„›º&²ÑVt'ÛN-náØì¡”5tǝ‚¦V1c#!$–ÄLb¢³ ÍÒ† c¼e³ÝÊz¡áG7᧨ ìJÌW1† ]¡à²îàIv庯Èßx Sûæ}Bò€Ç©±ç}]uhµ¯¾ß˜˜zjÏÕèM×úVàññ‹ÝóóOng¹‘ZC-·êY#˜0æ<zŐž«¡‚óV°¬ZãÍØ•^ƒÜlzNið…œÌžÒªlêÅøØß.Xµr·®J¨êNµKYªAø'œÁ)$ÏRAZÀFužyëƐç`L­C võ`pô`1èf,¦ÆXìWÛí¾öÑ(}ŠÑ¼yãž=ÒÒ¸ZU¯ªv©øŒ‡71{'L žF¬my<D¦uœo7˦õ·Üî6*äÄ$ãxR"
+
+ÍÏ»iW¨yzVewPOèÙ¡ž·m•Ör¥Ð£ÿþÜ,Žó^—òwÙbÓÈDî̧fl‹€Ö·OP--2?´¶Ù7G_ at cM-’—óH¬³˜ŠS–ÈI¯ž>;UVKC+LK%»½q€‚“üêHIü¦$£½Šþ«~| °ÑDÈóÐ<ý	þP»¦
+Ì,Øuó	Í\f \ž±c3Vøó÷†\®A{â:PúŒVÿõø´.–FN'לæ4˜Ì©!æ®T­ZijíÚŶ¬_ü ‹
+A2ÑêYh¶œ¿+Zˆ¦$ŽÌD{Vê—Û
+!cbf7‰CÁ@@VMmñ\XÉ”û®Ùš¥ÒÐðT#ÞB^Êä¥Zx:†« Ý‘ÎÌp¿2ãr<í&³#J9§pçE°šyò7€Å{e>Þ+7ŠÿihþȯUŽb{ñÊc3ô·äɽãî>@Ar1±âv“a÷{1MæS>vöë|ö{
667 667 667 333 333 660 660 660 611 
+740 778 778 778 778 722 667 833 833 389 667 833 667 944 833 833 
+722 833 778 722 722 833 778 1000 778 778 722 389 278 389 660 500 
+333 667 667 667 667 667 389 667 667 333 333 667 333 1000 667 667 
+667 667 444 611 444 667 611 944 667 611 556 389 278 389 660 750 
+667 750 278 667 500 1000 667 667 333 1000 722 333 1000 750 722 750 
+750 278 278 500 500 500 500 1000 333 950 611 333 1000 750 556 778 
+333 333 667 667 660 667 278 667 333 800 400 667 660 333 800 500 
+400 660 400 400 333 667 850 333 333 400 400 667 1000 1000 1000 611 
+778 778 778 778 778 778 1000 778 722 722 722 722 389 389 389 389 
+778 833 833 833 833 833 833 660 833 833 833 833 833 778 722 667 
+667 667 667 667 667 667 1000 667 667 667 667 667 333 333 333 333 
+667 667 667 667 667 667 667 660 667 667 667 667 667 611 667 611 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 11 0 R
+>>
+endobj
+11 0 obj
+<<
+/Type /FontDescriptor
+/FontName /ArialBlack
+/Flags 32
+/FontBBox!
  [ -250 -310 1200 1101 ]
+/MissingWidth 389
+/StemV 100
+/StemH 100
+/ItalicAngle 0
+/CapHeight 1101
+/XHeight 551
+/Ascent 1101
+/Descent -310
+/Leading 410
+/MaxWidth 1000
+/AvgWidth 552
+>>
+endobj
+12 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F2
+/BaseFont /ArialBlack,Italic
+/FirstChar 32
+/LastChar 255
+/Widths [ 333 333 500 660 667 1000 889 278 389 389 556 660 333 333 333 278 
+667 667 667 667 667 667 667 667 667 667 333 333 660 660 660 611 
+740 778 778 778 778 722 667 833 833 389 667 833 667 944 833 833 
+722 833 778 722 722 833 778 1000 778 778 722 389 278 389 660 500 
+333 667 667 667 667 667 389 667 667 333 333 667 333 1000 667 667 
+667 667 444 611 444 667 611 944 667 611 556 389 278 389 660 1000 
+1000 1000 278 667 500 1000 667 667 333 1458 722 333 1000 1000 722 1000 
+1000 278 278 500 500 500 500 1000 333 950 611 333 1000 1000 556 778 
+333 333 667 667 660 667 278 667 333 800 400 667 660 333 800 500 
+400 660 400 400 333 667 850 333 333 400 400 667 1!
 000 1000 1000 611 
+778 778 778 778 778 778 1000 778 722 722 7!
 22 722 3
89 389 389 389 
+778 833 833 833 833 833 833 660 833 833 833 833 833 778 722 667 
+667 667 667 667 667 667 1000 667 667 667 667 667 333 333 333 333 
+667 667 667 667 667 667 667 660 667 667 667 667 667 611 667 611 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 13 0 R
+>>
+endobj
+13 0 obj
+<<
+/Type /FontDescriptor
+/FontName /ArialBlack,Italic
+/Flags 96
+/FontBBox [ -250 -310 1752 1101 ]
+/MissingWidth 390
+/StemV 100
+/StemH 100
+/ItalicAngle -11
+/CapHeight 1101
+/XHeight 551
+/Ascent 1101
+/Descent -310
+/Leading 410
+/MaxWidth 1460
+/AvgWidth 552
+>>
+endobj
+14 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F3
+/BaseFont /TimesNewRoman
+/FirstChar 32
+/LastChar 255
+/Widths [ 250 333 408 500 500 833 778 180 333 333 500 564 250 333 250 278 
+500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 
+921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 
+556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 
+333 444 500 444 500 444 333!
  500 500 278 278 500 278 778 500 500 
+500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 778 
+500 778 333 500 444 1000 500 500 333 1000 556 333 889 778 611 778 
+778 333 333 444 444 350 500 1000 333 980 389 333 722 778 444 722 
+250 333 500 500 500 500 200 500 333 760 276 500 564 333 760 500 
+400 549 300 300 333 576 453 250 333 300 310 500 750 750 750 444 
+722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 
+722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 
+444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 
+500 500 500 500 500 500 500 549 500 500 500 500 500 500 500 500 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 15 0 R
+>>
+endobj
+15 0 obj
+<<
+/Type /FontDescriptor
+/FontName /TimesNewRoman
+/Flags 34
+/FontBBox [ -250 -216 1158 1000 ]
+/MissingWidth 321
+/StemV 73
+/StemH 73
+/ItalicAngle 0
+/CapHeight 891
+/XHeight 446
+/Ascent 891
+/Descent -216
+/Leading 149
+/MaxWidth 965
+/AvgWidth 401
+>>
+endobj
+17 0 !
 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F4
+/BaseFont!
  /Arial
+/FirstChar 32
+/LastChar 255
+/Widths [ 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 
+556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 
+1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 
+667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 
+333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 
+556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 750 
+556 750 222 556 333 1000 556 556 333 1000 667 333 1000 750 611 750 
+750 222 222 333 333 350 556 1000 333 1000 500 333 944 750 500 667 
+278 333 556 556 556 556 260 556 333 737 370 556 584 333 737 552 
+400 549 333 333 333 576 537 278 333 333 365 556 834 834 834 611 
+667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 
+722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 
+556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 
+556 556 556 556 556 556 556 549 611 556 556 556 556 500 556 500 
+]
+/Encoding /Win!
 AnsiEncoding
+/FontDescriptor 18 0 R
+>>
+endobj
+18 0 obj
+<<
+/Type /FontDescriptor
+/FontName /Arial
+/Flags 32
+/FontBBox [ -250 -212 1208 1000 ]
+/MissingWidth 276
+/StemV 80
+/StemH 80
+/ItalicAngle 0
+/CapHeight 905
+/XHeight 453
+/Ascent 905
+/Descent -212
+/Leading 150
+/MaxWidth 1007
+/AvgWidth 441
+>>
+endobj
+19 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F5
+/BaseFont /Arial,Italic
+/FirstChar 32
+/LastChar 255
+/Widths [ 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 
+556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 
+1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 
+667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 
+333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 
+556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 750 
+556 750 222 556 333 1000 556 556 333 1000 667 333 1000 750 611 750 
+750 222 222 333 333 350 556 1000 333 1000 500 333 944 750 500 667 
+278 333 !
 556 556 556 556 260 556 333 737 370 556 584 333 737 552 
+400 !
 549 333 
333 333 576 537 278 333 333 365 556 834 834 834 611 
+667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 
+722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 
+556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 
+556 556 556 556 556 556 556 549 611 556 556 556 556 500 556 500 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 20 0 R
+>>
+endobj
+20 0 obj
+<<
+/Type /FontDescriptor
+/FontName /Arial,Italic
+/Flags 96
+/FontBBox [ -250 -212 1208 1000 ]
+/MissingWidth 276
+/StemV 80
+/StemH 80
+/ItalicAngle -11
+/CapHeight 905
+/XHeight 453
+/Ascent 905
+/Descent -212
+/Leading 150
+/MaxWidth 1007
+/AvgWidth 441
+>>
+endobj
+23 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F6
+/BaseFont /Arial,BoldItalic
+/FirstChar 32
+/LastChar 255
+/Widths [ 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 
+556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 
+975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 77!
 8 
+667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 
+333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 
+611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 750 
+556 750 278 556 500 1000 556 556 333 1000 667 333 1000 750 611 750 
+750 278 278 500 500 350 556 1000 333 1000 556 333 944 750 500 667 
+278 333 556 556 556 556 280 556 333 737 370 556 584 333 737 552 
+400 549 333 333 333 576 556 278 333 333 365 556 834 834 834 611 
+722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 
+722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 
+556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 
+611 611 611 611 611 611 611 549 611 611 611 611 611 556 611 556 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 24 0 R
+>>
+endobj
+24 0 obj
+<<
+/Type /FontDescriptor
+/FontName /Arial,BoldItalic
+/Flags 16480
+/FontBBox [ -250 -212 1184 1000 ]
+/MissingWidth 329
+/StemV 153
+/StemH 153
+/ItalicAngle -11
+/CapHeigh!
 t 905
+/XHeight 453
+/Ascent 905
+/Descent -212
+/Leading 150
!
 +/MaxWid
th 987
+/AvgWidth 479
+>>
+endobj
+25 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F7
+/BaseFont /CourierNew,BoldItalic
+/FirstChar 32
+/LastChar 255
+/Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 60!
 0 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 26 0 R
+>>
+endobj
+26 0 obj
+<<
+/Type /FontDescriptor
+/FontName /CourierNew,BoldItalic
+/Flags 16482
+/FontBBox [ -250 -300 712 1000 ]
+/MissingWidth 593
+/StemV 191
+/StemH 191
+/ItalicAngle -11
+/CapHeight 833
+/XHeight 417
+/Ascent 833
+/Descent -300
+/Leading 133
+/MaxWidth 593
+/AvgWidth 600
+>>
+endobj
+35 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F8
+/BaseFont /CourierNew
+/FirstChar 32
+/LastChar 255
+/Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 !
 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 !
 600 600 
600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 36 0 R
+>>
+endobj
+36 0 obj
+<<
+/Type /FontDescriptor
+/FontName /CourierNew
+/Flags 34
+/FontBBox [ -250 -300 767 1000 ]
+/MissingWidth 639
+/StemV 109
+/StemH 109
+/ItalicAngle 0
+/CapHeight 833
+/XHeight 417
+/Ascent 833
+/Descent -300
+/Leading 133
+/MaxWidth 639
+/AvgWidth 600
+>>
+endobj
+37 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F9
+/BaseFont /CGAIJH+Wingdings
+/FirstChar 30
+/LastChar 255
+/Widths [ 500 500 1000 1030 1145 1301 1344 894 1217 458 1084 892 1132 1132 11!
 71 1171 
+1441 1443 1096 1343 699 699 892 554 602 1072 948 1078 939 891 892 892 
+891 910 910 587 793 674 674 942 942 549 549 892 843 843 843 1111 
+660 849 1089 888 880 650 813 747 747 723 693 794 885 892 896 891 
+1156 1054 964 1090 941 933 946 1025 929 1096 1065 780 1050 1271 747 953 
+747 891 891 891 891 458 747 986 891 578 1060 1060 891 892 892 530 
+530 500 892 892 892 892 892 892 892 892 892 892 892 892 892 892 
+892 892 892 892 892 892 892 892 1000 1000 1000 1000 1000 1000 1000 1000 
+313 458 313 891 891 891 891 891 953 458 891 891 891 891 891 891 
+891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 
+891 891 891 891 891 891 891 891 891 1048 1048 1048 1048 1000 1000 1000 
+1000 1000 1000 1000 1000 1000 1000 1253 1253 794 794 891 891 891 891 891 
+891 979 979 891 891 776 776 776 776 1067 1067 891 891 873 873 873 
+873 891 891 811 811 1060 811 782 782 782 782 482 385 635 786 892 
+892 1035 ]
+/FontDescriptor 38 0 R
+>>
+endobj
+38 0 obj
+<<
+/Type /FontDe!
 scriptor
+/FontName /CGAIJH+Wingdings
+/Flags 4
+/FontBBox [ -!
 250 -211
 1742 1000 ]
+/MissingWidth 897
+/StemV 162
+/StemH 162
+/ItalicAngle 0
+/CapHeight 899
+/XHeight 450
+/Ascent 899
+/Descent -211
+/Leading 110
+/MaxWidth 1452
+/AvgWidth 890
+/FontFile2 72 0 R
+>>
+endobj
+72 0 obj
+<<
+/Filter /FlateDecode 
+/Length 73 0 R
+/Length1 75 0 R
+>>
+stream
+H‰ÄUyP”Gÿu—¢\"x|8‚(—ã…"Ę̂Tâp
+‚`^Eƒ‚hâF
+žù5hŒ1¨ˆñ$‰‰Æ+V±k*Y6¦Ö¬[µµË¾o0®n•oÿj¦û½~ßëwvƒè„2˜29.d±©µ’8÷è7=-/¥ ü×K
+h4xÈÐa¡##GEm2[ÆŽ3ፉ“&O‰ºhÙŠw+V¯Z³¶jKålkÊ´éqñHMKÏÈœ“•=7'7o^~Áü¢o¿˜4cæ¬ä7K._¼dié;eå+×½·~Ãû«7mþàí۶ïع«f÷žöîÛÿq큃‡9ú‰Vw¬þø‰“Ÿ6œ:ýÙ™ÏÏ~qîËÆó.6]j¾üÕ•«×®ß¸Ùòõ7ßÞúîûÛw~¸{ïþƒ‡?þ"û3y*C$où“Ò'ííí
+¾v°‡áD5ØÎè‚®p+EÖèOt‡¼Ñ=ѽ¡Â}`@_øÂýàþ€
+k°UØ‚J̆)˜†éˆ…iHG21YÈÆ\ä y˜‡|`>
+Q„xÅx	HDf`&f!o¢±‹±KQŠw¨ïʱëðÖcÞÇFTc6ã|ˆ­Ø†í؁Ø…ìÆ|„½Ø‡ýøµ8€ƒ8„Ã8‚£øêpõ8Ž8‰OÑ€S8ÏpŸã,¾À9|I‘?¸ˆ&\B3.ã+\ÁU\ÃuÜÀM´àk|ƒoqßá{ÜÆü€»tÜÇ<ďŽC8½¶iþ_£åµ;FBKäËøZm£Ì)ªFÊž‘òZj^ß!C“F14RM<–š©‚
+müÁ”'#ÕÌ?X-U…Ή@*íëp‘æHÚK£™ÙtT³5¶y)ÕP5~ãõ¼‘7ÚvG‘Þ]¢¼^j&¾®¯œ²÷€#™Å¶ÜŸB‹þi®¦Ì>cþ„*ö'ÖƧ—éç“ž’®&{ÏR–þÆÜX$«dgHÆ…/³ÙÒqZÉ\$´Ø´è˜ÈrY>+d«Ig+øPÒšÏWñ®ñF!IŒ”še9TÉ%-ÔÁÔ§]ÉC]Û$ªüTÂüZ;p“qËâYÛÌjȆ‹¬ð”ñQu›«è$þ$åH{Íò4e‡Lºõþ÷¢~ö¥^ ®Œ¡Ôûj.u¡ŽÅÏ»dùóê?@~šª˜Î¤º|€gg‚îW(ÁI„BVÊVP<ª^ÂZ¶Õ³Ódßv‹÷&¯;KÞwXYηòãü
+¿ÊòVþ3ÿM€`/ÌR…"aŸpP¸!Ülj5ânñžxOb’f‹”‹ì&'ËU„5Š½’£¬P6(;”“ÁtsùҝA^%WÉ“%t£TÚ²VGÐûôuáϺ„öçžèÁL̦’Øfey¬ˆ•¼ðh/ÛÏjÙqòåá6»Ë±_Ø_mxÆeîÁ^ø7…ÇñžÃ7ó-|;?DYÏÏðÛüùØÊ'Á]è%˜!^˜)”å¡Q¸+´Qޜđb¤8ML&ß›ÄVñ'Ê$—ÉW*…²¤yR©T%í¤Šn“Úd'[T\dW9\®wÉõòù_Š»â¡ô!+F%NÉUŠ•ƒJ«òØî°ýhûlûB‡@ºËÒ­õê8AÕ}ž'Ë!ðbw©æÎ$¥ê½Ç”\ûl^¯[§Ä1ÊÔ}<ì1AlB‚0¹Rªà¨üµ¬H\Æ	º)÷)ÅìŒ`Ú„}’¯ÞO¾U8¨,T¬Êc²ô©°QÊR‚Ùh©ŠÕòQÔÑ…,g¿ÓÍ=ø
+œ!Ðl°XUÍϪ‰~†qã‚tڐBŒ”—VM%–åUMµÚÄÔW%£H2ó$£:$£^H².j"‚U³AÕ®™j››Hëµ&C’ªµÙÖmkÑÏFt"ÂLJ¾PÍžY&UcVÕ¬YŠ³*ÍVé«stˆ6Dg8¢ÎÁ‘–Ž´Ò,†‚:f‰d¶·˜Ãê8ì:‘UZŒÁdÖÆLº	šàkNIצÄ&šMÞ>>IA‹N3¤j0ŒÑœl"ˆ¶£ÉÑšb;FÍÖÝA•Zx®rMC¤ZœÒ
+é)³5!%I?£k€6Ö`ÒÆ.jõ
+l`ûã5ûè†øÄSˆi/«_f2%駹D'VØÄ»‘x·E­ÞB¥Ù3[ÕÉÊÊ
+U«‰M|y×GÿOJ"¥A¦&úÕóد¶Ø6²2|;¾$iãÒ&Zm@œ`RJãÚMK´mmZÓ6—­ÒÐM„P3ž9¶g3žãÇ5ËCVÜò€¶hqS‘"9[„ZiÑ¡J•V­¨@€Ð®x@ÚòV¡ÚðýgÆÎ…Ò€à‰¦ÿÌwþóŸÿ~ŽÏ\åÆÌœŠ
+íüu™ïkÆ÷¶ÿ÷&ûwŸ.k†úŸ0-üylŸÓ|5Ò9Ô˜žÛ«5®ì]h\GiÎ`+6gRüLc¡¡Ý\[Χx2ÕXšjTN/´Bº¹vûÊ@sìê|)„¤6ûÙhîÎÍ…:æ}Ô1ž?€ÕeÜ­—qµãjëÝEî…¾…ïŸ5Ö¹¾úcÙG÷“÷Ù‰?á9rðð®Á]Cƒ»—Ãìár{Ä:ïþåÈrä.]ÕWB¯u<Œô@מ±PÇ3ˆ1Ò¡à>þ܍¥+Óš~Øô?w:–Ùð³Cß½Øûññ¸:ÿ³òò#z¯¾»Çأ鮷b#öŸGxÆFM3Ö}•±µŸu½õŸMïDEE_Œ‘Îøq6™ØÇ®u™ Ûl2¶—]K¼ÆVÂßgwâ¸Ç>ÄV½]ô©û2è*[‰ßa+]¯³•ÎW|"Ùˆ½‰9\¸b_c“ño@ç€ýyE„Ï‚ŠÜ`+Ñ9¬>žìSÄð‰ä£¯³-Šÿrãà½?Äü
+ï~_ߟÞC2ý	…hmŸÂPü!…?LkûGÇûÿáe·*'+uÇ,–<~=zè
+KÖ[¾a^6b«	GpC¸fÑÏ×ù6:¸iïè¢Ô©IJ_†“Þ
+Ú$JbÚšeÕ¹­•¡õÙªnŸÐUvO:‚M«õç=Íq¹'¹.ËK”…íqÚ‚ž¸ä)ͼ •Mèƒ4íBmËiÇÍ @ÊPš;B:EÍ6?G2àKh.|0mÕ!\s7䳝Œ}³ç>šVª½’#ZÑT¹dõ@ÊÒ6eÕ…íl¹Â£ú˜,Uô‰íAŸÒ„°FE&mAú [¿¹Qìª'îÖ]O”ý\Ó2á§AI«ªš:Ä«è@Ä€M®Ê9R­|óéðé\š“›žtÒ|QÔóRsbaušzJ_Ì£,i
+Çà†c.m˜î¢ð<а
+tÍuýaÅQöÒÈý¥4žžISöjïu³Ó¢ŒYbƒ>©WU
+./(}yYÎcº$ôED¶!1e‰¢ltÊ,kEøÝv at h¨³ïž2ka» Dè„r>‘2Ï‘8Tå1a릣[è:éu4%‡´„Nf¨[´2u£ÂRÕsd^CöPM ÝÝ„Q%\Å–/QSMKÓï_½ü!"*8â…*íÏBÕV&©$:t½9‘kIsAh{k¨6Ò&w+-cAþ½ÇœNSB¶€tiêØ ½:Ü)T-²mh¾'PWꇀ<7LZA¾¦#giÂõêÅy]»¤9¦ðê~¨åŠ¦{Tœ|Õ²„ç×@ -‹ÁA%:aTWÓi­\\wŽŽl¥¯}&…,Ï1u’òBŽS)¤U/ª£§_Ñ·¦œÃY˜)y^åX6[«Õ2åÖ9•AKg=§
+w+"«2“­µ2•Ý~Eû¤Ì¢ŒR–ÙL2‡•™Æ,vžyxÛ¸kà,‡¹
+«›¬ÈJ˜åì:h—œ£ì; QðÎAF‡¤d.¨ dsJw…e€OB¿…÷L[—«Fo©%<
+%¹ná`ÛÂx³ð¤)?%tU¡Ã²¡!
+îþoÙʱ³`“lœ
+³ç mCÞÞ®ZQ„Kåc;éíæ/(Ûnà3Gþ2ÈÜè¶ëfEíÏX]SñX at EŸÆȃ
+2BUÔa‹àQ5ž\©Vµ²™y¬¬Ÿ}²H²øTgSª3Èö¸ªHYe˜=DúKÊ+àŸRõÊóÚ–¸6FÌa“<ñëVSy#ICé!¶ª gyxÁÿC?¸²»ƒuµ»n}e«û2g½:Û#9Š°Þ»ÓíJ‡MÎ"Û Nœn-ŒIgÂqÛÁ˜zw‡MÏ쮎`rÎ9ç&˜drÎ9çøG ªº{vVÒñðéÑtuwuu…·ªZâ£ïÁº¥6KX–'øc͘[]/'$´J¤.#zŽÝKétn#»Q»ßdd.wk>5&ÿÇc%šðžÑmñŽ‚Öf²ïtfŠ5Š¬~Æî´¶Úîõ4ßÌfÐÜ"Ö“mgË¢q´t¶ÚqäâgEsmý	ú]
+Y—ƒñ¹P®XºPnpZóÈ·ìM&Ò&â
+eóÃà`,\Œö’8'öc‹õ-ªü‰ªx›2ùj£ß\'¥±Ít³Td;ýŒÜÌú7µ¸™s—¿\4Ù¥¿B"^ǵ»M- a.{ž«¬½‘^Úhâ`n`LbÍç¹õ™ëÖ÷%âëKg(¯8Λ…¬óʈÎì¶RÛG—¹{£ªSqú6[6ªè„
+Φ‰å%»G¢’àÙn‚ôÂn&ç}÷3¡˜ûÄF…½©x0®æYÛ—œq‹/¹ÍV®ÉY7€±Ø“3uš}2OoȽõŠ¾!¶Ä´–íñ‹÷Tôc›|¡ŒGŽÙÞ·.•?”H˜J¾qŽêI§äÚŠX·x*†RRK¹¾2—íYͬɥH<g`££¥J
+kþÏ­d—E©ø¸Žõ¡¥tUw¼Ê&Fz\¡`Ñ“YÅ£¥2jÉ59ßF~ÃZ;¦¯9Í9Hÿ\ŒÙÁˆ‹Lõ_<	Ößû= ¤÷xonml»‹É"SÆ¢[\Ó¬šg^óœ_”¦$q‚èPú”Ao.'œ<Scñ„³ÆÕOâmrÀEf­yî±>¾¬¬ÜL§«ºez‡éM¦#+Ûñœ4³^Ú.?¬*ÕZêoýþÐz ¾›Ûæq‡$ªêæR¼2Qº>uP
+!
 =¨r\§Õ¹E¸îíÙü
+m¿=—w³}–-â¿øßN&š©•Û·èòj¯
+§o`½Ó—÷®³;¬½ç}…#4ÿÀù<”\ïÛÞaü
+ÎÔϺŒ×]û*ãxž²µv"ºDRÝv¢Ê˜óDšË_ô…·žÊ¢e´çEÅ7¸7̼V_]!Æyñ ϹWö\¿ý¼ˆÆ²–fÖ²Í!…ÑçÙ7ƍ8¿DµW¡yû
+l›{γﲡô½lé’¥MúÊï1yã-¾§ŽÙ*½)š•Ö»œÃ›5ÌlÚ®TÇÔæÿåŽýoÊM[B’¿¹teí?Ñ9íIå;xýYÿŸÕt̃xÿI4ߺ¸çI$CÚIÏyá%ùù÷ÅÄwÐÏ¿Ì€C8Œ#XFM´ÐÆ
+:èbk8Šà<œâF¸1n‚›âf¸9n[âV¸5nƒÛb·ÃíqÜwq\€qWÜ
+¸;Ža÷Àqláz¸Û¸'.ƽp	îûྸ¸Àñ <§ðœÆex(†Ëq®ÄÃqÀ#ñ(<Wá1¸Åãðx<OÄ“ðd<O…B(ô1Àž†bŒ‘ E†äÐ(Pb‚)fØÅY<ÏÀ3ñ,\ƒgã9x.ž‡çãx!^„ã%x)^†—ãx%^…Wã5x-^‡×ã
+x#Þ„7ã-x+Þ†·ãx'Þ…wã=x/Þ‡÷ãø >„ã#ø(>†ãZ|ŸÄ§ði\‡Ïà³ø>/àz|_—ñ|_Ã×ñ
+|ß·ñ|ßÃ÷ñü?ñü?ÃÏñü¿Â¯ñü¿ÃïñüŸñüÃßñeyjd*	¢¸¥ƒHë4×G”E%ƒµ\y!ƒØÓZé#¾Šã#~šŽ—„±Z+T¬²aš(ÆQÈÓ!mhUQtU2Qqš)ßF«nÒÏÓ¤X{Q짳~ì
+Âi²Z›–™Ùœ¥Yҏiz´>%æF?C•¯˜$&«ý(V…Ç…šÇ»õÙÂÖ‰ÏϏU´‡i™‹a­‘ÚõS/»ã´ÔjË'ãÓ¤íÓ©,’âP´†´FzÔì“
+Ùî	;^Ô*¼LåJÅm6|šG…Z­¨Xõ‹ežMüMGÍbXŽý2k˦Ód…7²‚9;†Ì£Á°hš8
+AfËÒЋ‹¶“}
+_'Qe‘{1Ómòë4aŠ4öêQÇAžjísxŽ°k›ä«ÄKŠ–åYì%ª¥ËDÉ͐IŽjë$ëHµfc/ùqØ
+†*`¢Cr‹L»õ®Ü’–EL‚:2ÑCŒ3t â"
+Ó˜ÔWZutáåi?ô&ŸVÄ“¼Ö܍’]/JÇËÓ!yuÙË#¥…Wæ¥nÔ8J"Æ^ òñJ—'Q>H—ãÈϽ¦Ò<‹ÒŽöƒˆ„E¥n^–G´ž´¼R–YD×éUoLqÓäÒ¨ˆƒNm¶¶S¦…
+ý8îdݪ›æ<k’ª(T׎û¶_R.xýDUÔÔQzN©µ	9ˆIŸ›ì™N¦zÏT-Dç
+rá­¤ã1)Û:Kø'­u“CÌc1•9á‹0ÉT«O(7D41<:š	V•¥r”DNÙ긢d²b/aÒÞCd·ºŠ&w›ÐöBæ·w2u-Oª›ù€»\.¨xš\JbµeÇž·—s*L[òíÉw»Ã_“¼[™| Š5ÃlðH¥¤>¥œjjFÉ6cÏŽÛ”B³-þœàOÑîDt+šs2R®•ºçˆíVœžUÉ@õ±Ý¢Œfloµ%˜Z¡<,<![C53»i`—:aR‘búDµÚ£R< 9„RQ±š‹ZA©3.…mGoͬNË;¥ÊwW¬é$k…?Ɔ6Å4
+â4µ)¤†êHD
+½Âu$ÅÓòR8-¯DÓÒLË̱t‚C—ð\qw‹©ŠÀU/ÏÅ¡\wÜ,§b.t™ÉÆŠTë¼Zfv=grµZ§óVR.tw§ŒâÂüh}B ks¦Á”ÒÕRIEiU­©†Éî†Im33‹Z­„dŸ)úCJ)o©‡nñêŠP²Ø’Ë;ÒL|ä´!M#0t™Ù}f¥Î”ûF¢PF¢$QFf3+ÉÔŽÊŒÚÎÉ*{•˜Þ\LÏŠéUbzVLÏŠéY1=ªL>‹hørü05·eÓØdÙÊ,3^:ì'SúS‡}M£V
+?ôôð¸¶:ÓˆZäTÇé =Ù]:uŠÞ˜çŸ×:yzýúCÛםޢá?}ÐÍKTQÇñs®£çq4§a¸t+¦ÝàÆ*šÜ¹)wÑĸ˜+B¦‚®7nDL9Ô:Mzq2ÍcÓË$-‚^ÿ‚²¿£­ýî}BŠ.|çÃ<Ïå0g#ä6ó”y”™Mæ³Á¬3ÃÌs‰ñ—`ú™^¦‰1uŒt/ßè
+½D»hm£2ÚDëh
+ÝC·Ñ"šDW£3wùèf‹yÌ<b2kÌ&ÏœgzÅÔ3#\~G_Ñô}BÑkôUÐ3tÝAóèúPWª1ÕØ­«rÎVzCé»J¯(=£ô´Ò7•¾¡ô˜Ò£JJ—ÔY:CtšNÒ	²)M)JR‚Z¨™âDÔ@1²H0Çë|Ë/zÒ7ï&…?Ña~³U¿2j곞4I_ø#žmzrƺ…ß?RªÊÃ=)W—“,½R.­85ƒ@¤s?ö‘o~aþ­h—ÝBáó\EµPá´ˆ©Ž¦:œêhjËçÑå_[?%þqðŸGþw{äÍ‹Sáu¥=^08ÆV¬¦8î3îd/˜ˆ.×—±œý˜eÑ”LsÖ3ÇP¸êÌwæÃULD«Œ[k+{¡/ãìËrm•À¸
+åo¦œ±
+endstream
+endobj
+73 0 obj
+7457
+endobj
+75 0 obj
+14872
+endobj
+74 0 obj
+0
+endobj
+76 0 obj
+0
+endobj
+45 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F10
+/BaseFont /Arial,Bold
+/FirstChar 32
+/LastChar 255
+/Widths [ 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 
+556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 
+975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 
+667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 
+333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 
+611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 750 
+556 750 278 556 500 100!
 0 556 556 333 1000 667 333 1000 750 611 750 
+750 278 278 500 500 350 556 1000 333 1000 556 333 944 750 500 667 
+278 333 556 556 556 556 280 556 333 737 370 556 584 333 737 552 
+400 549 333 333 333 576 556 278 333 333 365 556 834 834 834 611 
+722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 
+722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 
+556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 
+611 611 611 611 611 611 611 549 611 611 611 611 611 556 611 556 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 46 0 R
+>>
+endobj
+46 0 obj
+<<
+/Type /FontDescriptor
+/FontName /Arial,Bold
+/Flags 16416
+/FontBBox [ -250 -212 1158 1000 ]
+/MissingWidth 321
+/StemV 153
+/StemH 153
+/ItalicAngle 0
+/CapHeight 905
+/XHeight 453
+/Ascent 905
+/Descent -212
+/Leading 150
+/MaxWidth 965
+/AvgWidth 479
+>>
+endobj
+47 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F11
+/BaseFont /CourierNew,Bold
+/FirstChar 32
+/LastChar 255
+/Widths [ 6!
 00 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600!
  
+600 6
00 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 48 0 R
+>>
+endobj
+48 0 obj
+<<
+/Type /FontDescriptor
+/FontName /CourierNew,Bold
+/Fla!
 gs 16418
+/FontBBox [ -250 -300 719 1000 ]
+/MissingWidth 599
+/StemV 191
+/StemH 191
+/ItalicAngle 0
+/CapHeight 833
+/XHeight 417
+/Ascent 833
+/Descent -300
+/Leading 133
+/MaxWidth 599
+/AvgWidth 600
+>>
+endobj
+57 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F12
+/BaseFont /CourierNew,Italic
+/FirstChar 32
+/LastChar 255
+/Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 !
 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 !
 600 600 
600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 
+]
+/Encoding /WinAnsiEncoding
+/FontDescriptor 58 0 R
+>>
+endobj
+58 0 obj
+<<
+/Type /FontDescriptor
+/FontName /CourierNew,Italic
+/Flags 98
+/FontBBox [ -250 -300 739 1000 ]
+/MissingWidth 616
+/StemV 109
+/StemH 109
+/ItalicAngle -11
+/CapHeight 833
+/XHeight 417
+/Ascent 833
+/Descent -300
+/Leading 133
+/MaxWidth 616
+/AvgWidth 600
+>>
+endobj
+2 0 obj
+[ /PDF /Text  ]
+endobj
+5 0 obj
+<<
+/Kids [4 0 R 16 0 R 28 0 R 32 0 R 39 0 R 42 0 R ]
+/Count 6
+/Type /Pages
+/Parent 77 0 R
+>>
+endobj
+51 0 obj
+<<
+/Kids [50 0 R 54 0 R 60 0 R 64 0 R 68 0 R ]
+/Count 5
+/Type /Pages
+/Parent 77 0 R
+>>
+endobj
+77 0 obj
+<<
+/Kids [5 0 R 51 0 R ]
+/Count 11
+/Type /Pages
+/MediaBox [ 0 0 596 842 ]
+>>
+endobj
+1 0 obj
+<<
+/Creator <FEFF0054004500530054005F00530055004900!
 540045002E0064006F00630020002D0020004D006900630072006F0073006F0066007400200057006F00720064>
+/CreationDate (D:20030320094829)
+/Title <FEFF0054004500530054005F00530055004900540045002E005000440046>
+/Author <FEFF006D006100690073007400720065>
+/Producer (Acrobat PDFWriter 4.05 pour Windows NT)
+>>
+endobj
+3 0 obj
+<<
+/Pages 77 0 R
+/Type /Catalog
+>>
+endobj
+xref
+0 78
+0000000000 65535 f 
+0000042075 00000 n 
+0000041740 00000 n 
+0000042433 00000 n 
+0000000653 00000 n 
+0000041771 00000 n 
+0000016366 00000 n 
+0000017472 00000 n 
+0000000019 00000 n 
+0000000634 00000 n 
+0000017745 00000 n 
+0000018843 00000 n 
+0000019106 00000 n 
+0000020218 00000 n 
+0000020490 00000 n 
+0000021581 00000 n 
+0000001975 00000 n 
+0000021842 00000 n 
+0000022929 00000 n 
+0000023183 00000 n 
+0000024277 00000 n 
+0000000807 00000 n 
+0000001954 00000 n 
+0000024540 00000 n 
+0000025637 00000 n 
+0000025908 00000 n 
+0000027004 00000 n 
+0000002085 00000 n 
+0000003048 00000 n 
+00000!
 02184 00000 n 
+0000003028 00000 n 
+0000003158 00000 n 
+0000!
 004188 0
0000 n 
+0000003246 00000 n 
+0000004168 00000 n 
+0000027279 00000 n 
+0000028364 00000 n 
+0000028623 00000 n 
+0000029752 00000 n 
+0000005567 00000 n 
+0000004357 00000 n 
+0000005546 00000 n 
+0000007598 00000 n 
+0000005724 00000 n 
+0000007577 00000 n 
+0000037666 00000 n 
+0000038758 00000 n 
+0000039021 00000 n 
+0000040112 00000 n 
+0000007708 00000 n 
+0000008925 00000 n 
+0000041879 00000 n 
+0000007820 00000 n 
+0000008904 00000 n 
+0000011077 00000 n 
+0000009096 00000 n 
+0000011056 00000 n 
+0000040379 00000 n 
+0000041472 00000 n 
+0000011188 00000 n 
+0000013136 00000 n 
+0000011289 00000 n 
+0000013115 00000 n 
+0000013247 00000 n 
+0000014664 00000 n 
+0000013336 00000 n 
+0000014643 00000 n 
+0000014775 00000 n 
+0000016167 00000 n 
+0000014875 00000 n 
+0000016146 00000 n 
+0000016278 00000 n 
+0000030036 00000 n 
+0000037587 00000 n 
+0000037630 00000 n 
+0000037608 00000 n 
+0000037648 00000 n 
+0000041982 00000 n 
+trailer
+<<
+/Size 78
+/Root 3 0 R
!
 +/Info 1 0 R
+/ID [<493cf9503bed27509463d49cea7fe9e5><493cf9503bed27509463d49cea7fe9e5>]
+>>
+startxref
+42483
+%%EOF
Added: projects/joram-tests/trunk/pom.xml
===================================================================
--- projects/joram-tests/trunk/pom.xml	                        (rev 0)
+++ projects/joram-tests/trunk/pom.xml	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,145 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>jboss</groupId>
+  <artifactId>joramtests</artifactId>
+  <packaging>jar</packaging>
+  <version>1.3</version>
+  <name>JBoss ported Object Joram JMS tests</name>
+  <url>http://www.jboss.org</url>
+  <licenses>
+    <license>
+      <name>lgpl</name>
+      <url>http://repository.jboss.com/licenses/lgpl.txt</url>
+    </license>
+  </licenses>
+  <organization>
+    <name>JBoss, A division of Red Hat</name>
+    <url>http://www.jboss.org</url>
+  </organization>
+
+  <repositories>
+    <repository>
+      <id>jboss</id>
+      <name>JBoss Inc. Repository</name>
+      <layout>default</layout>
+      <url>http://repository.jboss.com/maven2/</url>
+      <snapshots>
+        <enabled>true</enabled>
+      </snapshots>
+    </repository>
+  </repositories>
+  
+  <pluginRepositories>
+    <pluginRepository>
+      <id>jbosspluginrepo</id>
+      <name>jboss plugin repository</name>
+      <url>http://repository.jboss.com/maven2</url>
+      <layout>default</layout>
+      <snapshots>
+        <enabled>false</enabled>
+        <updatePolicy>never</updatePolicy>
+      </snapshots>
+    </pluginRepository>
+  </pluginRepositories>
+
+  <build>
+    <sourceDirectory>src/main/java</sourceDirectory>
+    <finalName>${artifactId}</finalName>
+    <resources>
+      <resource>
+        <directory>src/resources</directory>
+      </resource>
+    </resources>
+    <plugins>
+      
+      <!-- define how we want compilation to take place
+        here, we accept most of the defaults but say that we want the
+        optimization flag set, and define the source and target to be 1.5,
+        these setting will be inherited by child projects -->
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.0</version>
+        <configuration>
+          <debug>true</debug>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+      <!-- define that we wish to create src jars -->
+      <plugin>
+        <artifactId>maven-source-plugin</artifactId>
+        <inherited>true</inherited>
+        <executions>
+          <execution>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <printSummary>true</printSummary>
+          <disableXmlReport>false</disableXmlReport>
+          <testFailureIgnore>true</testFailureIgnore>
+          <forkMode>once</forkMode> <!-- required to correctly run the PojoServer tests -->
+          <systemProperties>
+            <property>
+              <name>java.protocol.handler.pkgs</name>
+              <value>org.jboss.virtual.protocol</value>
+            </property>
+          </systemProperties>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+      
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>jboss</groupId>
+      <artifactId>jboss-common-core</artifactId>
+      <version>2.0.3.GA</version>
+    </dependency>
+    <dependency>
+      <groupId>jboss</groupId>
+      <artifactId>jboss-j2ee</artifactId>
+      <version>4.0.2</version>
+    </dependency>
+    <dependency>
+      <groupId>jboss</groupId>
+      <artifactId>jboss-j2se</artifactId>
+      <version>5.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>jboss</groupId>
+      <artifactId>jboss-logging-log4j</artifactId>
+      <version>2.0.3.GA</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>jboss</groupId>
+      <artifactId>jboss-test</artifactId>
+      <version>1.0.1.GA</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+    </dependency>
+  </dependencies>
+
+  <distributionManagement>
+    <repository>
+      <id>cvs-file-repository</id>
+      <!-- Set maven.cvs.root in your settings.xml -->
+      <url>file://${maven.cvs.root}</url>
+    </repository>
+  </distributionManagement>
+</project>

Added: projects/joram-tests/trunk/src/etc/default.mf
===================================================================
--- projects/joram-tests/trunk/src/etc/default.mf	                        (rev 0)
+++ projects/joram-tests/trunk/src/etc/default.mf	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Created-By: @java.vm.version@ (@java.vm.vendor@)
+Specification-Title: @specification.title@
+Specification-Version: @specification.version@
+Specification-Vendor: @specification.vendor@
+Implementation-Title: @implementation.title@
+Implementation-URL: @implementation.url@
+Implementation-Version: @implementation.version@
+Implementation-Vendor: @implementation.vendor@
+Implementation-Vendor-Id: @implementation.vendor.id@
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/AbstractAdmin.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/AbstractAdmin.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/AbstractAdmin.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,97 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.jms;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.jboss.util.NotImplementedException;
+import org.objectweb.jtests.jms.admin.Admin;
+
+/**
+ * AbstractAdmin.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class AbstractAdmin implements Admin
+{
+   public String getName()
+   {
+      return getClass().getName();
+   }
+
+   public InitialContext createInitialContext() throws NamingException
+   {
+      return new InitialContext();
+   }
+   
+   public void createConnectionFactory(String name)
+   {
+      throw new NotImplementedException("FIXME NYI createConnectionFactory");
+   }
+
+   public void deleteConnectionFactory(String name)
+   {
+      throw new NotImplementedException("FIXME NYI deleteConnectionFactory");
+   }
+
+   public void createQueue(String name)
+   {
+      throw new NotImplementedException("FIXME NYI createQueue");
+   }
+
+   public void deleteQueue(String name)
+   {
+      throw new NotImplementedException("FIXME NYI deleteQueue");
+   }
+
+   public void createQueueConnectionFactory(String name)
+   {
+      createConnectionFactory(name);
+   }
+
+   public void deleteQueueConnectionFactory(String name)
+   {
+      deleteConnectionFactory(name);
+   }
+
+   public void createTopic(String name)
+   {
+      throw new NotImplementedException("FIXME NYI createTopic");
+   }
+
+   public void deleteTopic(String name)
+   {
+      throw new NotImplementedException("FIXME NYI deleteTopic");
+   }
+
+   public void createTopicConnectionFactory(String name)
+   {
+      createConnectionFactory(name);
+   }
+
+   public void deleteTopicConnectionFactory(String name)
+   {
+      deleteConnectionFactory(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/GenericAdmin.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/GenericAdmin.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/GenericAdmin.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,116 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.jms;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.jboss.logging.Logger;
+import org.objectweb.jtests.jms.admin.Admin;
+
+/**
+ * GenericAdmin.
+ * 
+ * @FIXME delegate to a JBoss defined admin class
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class GenericAdmin implements Admin
+{
+   public static final Logger log = Logger.getLogger(GenericAdmin.class);
+   
+   public static Admin delegate = new AbstractAdmin();
+
+   public String getName()
+   {
+      String name = delegate.getName();
+      log.debug("Using admin '" + name + "' delegate=" + delegate);
+      return name;
+   }
+   
+   public InitialContext createInitialContext() throws NamingException
+   {
+      InitialContext ctx = delegate.createInitialContext();
+      log.debug("Using initial context: " + ctx.getEnvironment());
+      return ctx;
+   }
+
+   public void createConnectionFactory(String name)
+   {
+      log.debug("createConnectionFactory '" + name + "'");
+      delegate.createConnectionFactory(name);
+   }
+
+   public void deleteConnectionFactory(String name)
+   {
+      log.debug("deleteConnectionFactory '" + name + "'");
+      delegate.deleteConnectionFactory(name);
+   }
+
+   public void createQueue(String name)
+   {
+      log.debug("createQueue '" + name + "'");
+      delegate.createQueue(name);
+   }
+
+   public void deleteQueue(String name)
+   {
+      log.debug("deleteQueue '" + name + "'");
+      delegate.deleteQueue(name);
+   }
+
+   public void createQueueConnectionFactory(String name)
+   {
+      log.debug("createQueueConnectionFactory '" + name + "'");
+      delegate.createQueueConnectionFactory(name);
+   }
+
+   public void deleteQueueConnectionFactory(String name)
+   {
+      log.debug("deleteQueueConnectionFactory '" + name + "'");
+      delegate.deleteQueueConnectionFactory(name);
+   }
+
+   public void createTopic(String name)
+   {
+      log.debug("createTopic '" + name + "'");
+      delegate.createTopic(name);
+   }
+
+   public void deleteTopic(String name)
+   {
+      log.debug("deleteTopic '" + name + "'");
+      delegate.deleteTopic(name);
+   }
+
+   public void createTopicConnectionFactory(String name)
+   {
+      log.debug("createTopicConnectionFactory '" + name + "'");
+      delegate.createTopicConnectionFactory(name);
+   }
+
+   public void deleteTopicConnectionFactory(String name)
+   {
+      log.debug("deleteTopicConnectionFactory '" + name + "'");
+      delegate.deleteTopicConnectionFactory(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramTestDelegate.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramTestDelegate.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramTestDelegate.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,53 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.jms;
+
+import java.lang.reflect.Constructor;
+
+import org.jboss.test.AbstractTestDelegate;
+import org.objectweb.jtests.jms.admin.Admin;
+
+/**
+ * JoramTestDelegate.
+ * 
+ * @author <a href="adrian at jboss.x`com">Adrian Brock</a>
+ * @version $Revision: 1.2 $
+ */
+public class JoramTestDelegate extends AbstractTestDelegate
+{
+   protected String adminName;
+   
+   public JoramTestDelegate(Class clazz, String adminName)
+   {
+      super(clazz);
+      this.adminName = adminName;
+   }
+
+   public void setUp() throws Exception
+   {
+      super.setUp();
+      Class adminClass = Thread.currentThread().getContextClassLoader().loadClass(adminName);
+      Constructor constructor = adminClass.getConstructor(new Class[] { Class.class });
+      Admin admin = (Admin) constructor.newInstance(new Object[] { clazz } );
+      GenericAdmin.delegate = admin; 
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramUnitTestCase.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramUnitTestCase.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/jboss/test/jms/JoramUnitTestCase.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,199 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.jms;
+
+import java.util.Hashtable;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.jboss.test.AbstractTestCaseWithSetup;
+import org.jboss.test.AbstractTestSetup;
+import org.objectweb.jtests.jms.conform.connection.ConnectionTest;
+import org.objectweb.jtests.jms.conform.connection.TopicConnectionTest;
+import org.objectweb.jtests.jms.conform.message.MessageBodyTest;
+import org.objectweb.jtests.jms.conform.message.MessageDefaultTest;
+import org.objectweb.jtests.jms.conform.message.MessageTypeTest;
+import org.objectweb.jtests.jms.conform.message.headers.MessageHeaderTest;
+import org.objectweb.jtests.jms.conform.message.properties.JMSXPropertyTest;
+import org.objectweb.jtests.jms.conform.message.properties.MessagePropertyConversionTest;
+import org.objectweb.jtests.jms.conform.message.properties.MessagePropertyTest;
+import org.objectweb.jtests.jms.conform.queue.QueueBrowserTest;
+import org.objectweb.jtests.jms.conform.queue.TemporaryQueueTest;
+import org.objectweb.jtests.jms.conform.selector.SelectorSyntaxTest;
+import org.objectweb.jtests.jms.conform.selector.SelectorTest;
+import org.objectweb.jtests.jms.conform.session.QueueSessionTest;
+import org.objectweb.jtests.jms.conform.session.SessionTest;
+import org.objectweb.jtests.jms.conform.session.TopicSessionTest;
+import org.objectweb.jtests.jms.conform.session.UnifiedSessionTest;
+import org.objectweb.jtests.jms.conform.topic.TemporaryTopicTest;
+
+/**
+ * JoramUnitTestCase.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.2 $
+ */
+public class JoramUnitTestCase extends AbstractTestCaseWithSetup
+{
+   public JoramUnitTestCase(String name)
+   {
+      super(name);
+   }
+
+   
+   
+   /** Used to similuate tests while renaming its names. */
+   private static class DummyTestCase extends TestCase
+   {
+       DummyTestCase(String name)
+       {
+           super (name);
+       }
+   }
+   
+   public static JoramTestDelegate getDelegate(Class clazz, String adminName) throws Exception
+   {
+      return new JoramTestDelegate(clazz, adminName);
+   }
+   
+
+   /**
+    * One of the goals of this class also is to keep original classNames into testNames. So, you will realize several proxies existent here to
+    * keep these class names while executing method names.
+    */
+   static class TestProxy extends TestCase
+   {
+       Hashtable hashTests = new Hashtable();
+
+
+
+       public TestProxy(Test testcase, String name)
+       {
+           super(name);
+           this.testcase = testcase;
+       }
+
+       public int countTestCases()
+       {
+           return testcase.countTestCases();
+       }
+
+       /**
+        * Create a dummy test renaming its content
+        * @param test
+        * @return
+        */
+       private Test createDummyTest(Test test)
+       {
+           Test dummyTest = (Test)hashTests.get(test);
+           if (dummyTest==null)
+           {
+               if (test instanceof TestCase)
+               {
+                   dummyTest = new DummyTestCase(this.getName() + ":"+ ((TestCase)test).getName());
+               } else
+               if (test instanceof TestSuite)
+               {
+                   dummyTest = new DummyTestCase(this.getName() + ":"+ ((TestCase)test).getName());
+               }
+               else
+               {
+                   dummyTest = new DummyTestCase(test.getClass().getName());
+               }
+
+               hashTests.put(test,dummyTest);
+           }
+
+           return dummyTest;
+       }
+
+       public void run(final TestResult result)
+       {
+           TestResult subResult = new TestResult();
+           subResult.addListener(new TestListener()
+           {
+               public void addError(Test subtest, Throwable throwable)
+               {
+                   Test dummyTest = createDummyTest(subtest);
+                   result.addError(dummyTest, throwable);
+               }
+
+               public void addFailure(Test subtest, AssertionFailedError assertionFailedError)
+               {
+                   Test dummyTest = createDummyTest(subtest);
+                   result.addFailure(dummyTest, assertionFailedError);
+               }
+
+               public void endTest(Test subtest)
+               {
+                   Test dummyTest = createDummyTest(subtest);
+                   result.endTest(dummyTest);
+               }
+
+               public void startTest(Test subtest)
+               {
+                   Test dummyTest = createDummyTest(subtest);
+                   result.startTest(dummyTest);
+               }
+           });
+           testcase.run(subResult);
+       }
+
+       Test testcase;
+   }
+
+   
+
+   
+
+   public static junit.framework.Test getTestSuite(Class clazz) throws Exception
+   {
+      TestSuite suite = new TestSuite();
+
+      suite.addTest(new TestProxy(TopicConnectionTest.suite(),TopicConnectionTest.class.getName()));
+      suite.addTest(new TestProxy(ConnectionTest.suite(), ConnectionTest.class.getName()));
+      suite.addTest(new TestProxy(MessageBodyTest.suite(), MessageBodyTest.class.getName()));
+      suite.addTest(new TestProxy(MessageDefaultTest.suite(), MessageDefaultTest.class.getName()));
+      suite.addTest(new TestProxy(MessageTypeTest.suite(), MessageTypeTest.class.getName()));
+      suite.addTest(new TestProxy(MessageHeaderTest.suite(), MessageHeaderTest.class.getName()));
+      suite.addTest(new TestProxy(JMSXPropertyTest.suite(), JMSXPropertyTest.class.getName()));
+      suite.addTest(new TestProxy(MessagePropertyConversionTest.suite(), MessagePropertyConversionTest.class.getName()));
+      suite.addTest(new TestProxy(MessagePropertyTest.suite(), MessagePropertyTest.class.getName()));
+      suite.addTest(new TestProxy(QueueBrowserTest.suite(), QueueBrowserTest.class.getName()));
+      suite.addTest(new TestProxy(TemporaryQueueTest.suite(), TemporaryQueueTest.class.getName()));
+      suite.addTest(new TestProxy(SelectorSyntaxTest.suite(), SelectorSyntaxTest.class.getName()));
+      suite.addTest(new TestProxy(SelectorTest.suite(), SelectorTest.class.getName()));
+      suite.addTest(new TestProxy(QueueSessionTest.suite(), QueueSessionTest.class.getName()));
+      suite.addTest(new TestProxy(SessionTest.suite(), SessionTest.class.getName()));
+      suite.addTest(new TestProxy(TopicSessionTest.suite(), TopicSessionTest.class.getName()));
+      suite.addTest(new TestProxy(UnifiedSessionTest.suite(), UnifiedSessionTest.class.getName()));
+      suite.addTest(new TestProxy(TemporaryTopicTest.suite(), TemporaryTopicTest.class.getName()));
+      
+
+      return new AbstractTestSetup(clazz, suite);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/Admin.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/Admin.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/Admin.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,130 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.admin;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+/**
+ * Simple Administration interface.
+ * <br />
+ * JMS Provider has to implement this 
+ * simple interface to be able to use the test suite.
+ */
+public interface Admin
+{
+
+   /**
+    * Returns the name of the JMS Provider.
+    *
+    * @return name of the JMS Provider
+    */
+   public String getName();
+
+   /** 
+    * Returns an <code>InitialContext</code> with correct properties from
+    * the JMS Provider.
+    *
+    * @return an <code>InitialContext</code> with correct properties from the JMS Provider.
+    */
+   public InitialContext createInitialContext() throws NamingException;
+
+   /** 
+    * Creates a <code>ConnectionFactory</code> and makes it available 
+    *from JNDI with name <code>name</code>.
+    *
+    * @since JMS 1.1
+    * @param name JNDI name of the <code>ConnectionFactory</code>
+    */
+   public void createConnectionFactory(String name);
+
+   /** 
+    * Creates a <code>QueueConnectionFactory</code> and makes it available 
+    *from JNDI with name <code>name</code>.
+    *
+    * @param name JNDI name of the <code>QueueConnectionFactory</code>
+    */
+   public void createQueueConnectionFactory(String name);
+
+   /** 
+    * Creates a <code>TopicConnectionFactory</code> and makes it available 
+    *from JNDI with name <code>name</code>.
+    *
+    * @param name JNDI name of the <code>TopicConnectionFactory</code>
+    */
+   public void createTopicConnectionFactory(String name);
+
+   /** 
+    * Creates a <code>Queue</code> and makes it available 
+    *from JNDI with name <code>name</code>.
+    *
+    * @param name JNDI name of the <code>Queue</code>
+    */
+   public void createQueue(String name);
+
+   /** 
+    * Creates a <code>Topic</code> and makes it available 
+    *from JNDI with name <code>name</code>.
+    *
+    * @param name JNDI name of the <code>Topic</code>
+    */
+   public void createTopic(String name);
+
+   /** 
+    * Removes the <code>Queue</code> of name <code>name</code> from JNDI and deletes it
+    *
+    * @param name JNDI name of the <code>Queue</code>
+    */
+   public void deleteQueue(String name);
+
+   /** 
+    * Removes the <code>Topic</code> of name <code>name</code> from JNDI and deletes it
+    *
+    * @param name JNDI name of the <code>Topic</code>
+    */
+   public void deleteTopic(String name);
+
+   /** 
+    * Removes the <code>ConnectionFactory</code> of name <code>name</code> from JNDI and deletes it
+    *
+    * @since JMS 1.1
+    * @param name JNDI name of the <code>ConnectionFactory</code>
+    */
+   public void deleteConnectionFactory(String name);
+
+   /** 
+    * Removes the <code>QueueConnectionFactory</code> of name <code>name</code> from JNDI and deletes it
+    *
+    * @param name JNDI name of the <code>QueueConnectionFactory</code>
+    */
+   public void deleteQueueConnectionFactory(String name);
+
+   /** 
+    * Removes the <code>TopicConnectionFactory</code> of name <code>name</code> from JNDI and deletes it
+    *
+    * @param name JNDI name of the <code>TopicConnectionFactory</code>
+    */
+   public void deleteTopicConnectionFactory(String name);
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/AdminFactory.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/AdminFactory.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/AdminFactory.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,64 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.admin;
+
+import java.util.Properties;
+
+import org.jboss.util.NestedRuntimeException;
+
+public class AdminFactory
+{
+   private static final String PROP_NAME = "jms.provider.admin.class";
+
+   protected static String getAdminClassName(Properties props)
+   {
+      String adminClassName = props.getProperty(PROP_NAME);
+      return adminClassName;
+   }
+
+   public static Admin getAdmin(Properties props)
+   {
+      String adminClassName = getAdminClassName(props);
+      Admin admin = null;
+      if (adminClassName == null)
+      {
+         throw new NestedRuntimeException("Property " + PROP_NAME + " has not been found in input props");
+      }
+      try
+      {
+         Class adminClass = Class.forName(adminClassName);
+         admin = (Admin) adminClass.newInstance();
+      }
+      catch (ClassNotFoundException e)
+      {
+         throw new NestedRuntimeException("Class " + adminClassName + " not found.", e);
+      }
+      catch (Exception e)
+      {
+         throw new NestedRuntimeException(e);
+      }
+      return admin;
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/admin/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,9 @@
+  <body>
+    Administration classes and interfaces used by the test suite to
+    manageJMS administrated object in a provider-independent way. 
+    <br />
+    Each JMS Provider has to implement the very simple Admin interface to be able to
+    use the test suite (see <a
+      href="http://www.objectweb.org/joram/current/doc/tests/index.html">documentation</a>).
+  </body>
+

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/ConnectionTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/ConnectionTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/ConnectionTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,250 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): Andreas Mueller <am at iit.de>.                 
+ */
+
+package org.objectweb.jtests.jms.conform.connection;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test connections.
+ * 
+ * See JMS specifications, �4.3.5 Closing a Connection
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: ConnectionTest.java,v 1.2 2007/06/15 20:55:20 csuconic Exp $
+ */
+public class ConnectionTest extends PTPTestCase
+{
+
+   /**
+    * Test that invoking the <code>acknowledge()</code> method of a received message 
+    * from a closed connection's session must throw an <code>IllegalStateException</code>.
+    */
+   public void testAcknowledge()
+   {
+      try
+      {
+         receiverConnection.stop();
+         receiverSession = receiverConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
+         receiver.close(); // Before assigning a new receiver, we need to close the old one...
+                           // Not closing it could cause load balancing between receivers.
+                           // Not having this close might be valid for JORAM or JBossMQ, but it's not valid for JBossMessaging (and still legal)
+
+         receiver = receiverSession.createReceiver(receiverQueue);
+         receiverConnection.start();
+
+         Message message = senderSession.createMessage();
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         receiverConnection.close();
+         m.acknowledge();
+         fail("�4.3.5 Invoking the acknowledge method of a received message from a closed "
+               + "connection's session must throw a [javax.jms.]IllegalStateException.\n");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("�4.3.5 Invoking the acknowledge method of a received message from a closed "
+               + "connection's session must throw a [javax.jms.]IllegalStateException, not a " + e);
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("�4.3.5 Invoking the acknowledge method of a received message from a closed "
+               + "connection's session must throw an [javax.jms.]IllegalStateException "
+               + "[not a java.lang.IllegalStateException]");
+      }
+   }
+
+   /**
+    * Test that an attempt to use a <code>Connection</code> which has been closed 
+    * throws a <code>javax.jms.IllegalStateException</code>.
+    */
+   public void testUseClosedConnection()
+   {
+      try
+      {
+         senderConnection.close();
+         senderConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
+         fail("Should raise a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a java.lang.IllegalStateException");
+      }
+   }
+
+   /**
+    * Test that a <code>MessageProducer</code> can send messages while a 
+    * <code>Connection</code> is stopped.
+    */
+   public void testMessageSentWhenConnectionClosed()
+   {
+      try
+      {
+         senderConnection.stop();
+         Message message = senderSession.createTextMessage();
+         sender.send(message);
+
+         receiver.receive(TestConfig.TIMEOUT);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that closing a closed connectiondoes not throw an exception.
+    */
+   public void testCloseClosedConnection()
+   {
+      try
+      {
+         // senderConnection is already started
+         // we close it once
+         senderConnection.close();
+         // we close it a second time
+         senderConnection.close();
+      }
+      catch (Exception e)
+      {
+         fail("�4.3.5 Closing a closed connection must not throw an exception.\n");
+      }
+   }
+
+   /**
+    * Test that starting a started connection is ignored
+    */
+   public void testStartStartedConnection()
+   {
+      try
+      {
+         // senderConnection is already started
+         // start it again should be ignored
+         senderConnection.start();
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that stopping a stopped connection is ignored
+    */
+   public void testStopStoppedConnection()
+   {
+      try
+      {
+         // senderConnection is started
+         // we stop it once
+         senderConnection.stop();
+         // stopping it a second time is ignored
+         senderConnection.stop();
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that delivery of message is stopped if the message consumer connection is stopped
+    */
+   public void testStopConsumerConnection()
+   {
+      try
+      {
+         receiverConnection.stop();
+
+         receiver.setMessageListener(new MessageListener()
+         {
+            public void onMessage(Message m)
+            {
+               try
+               {
+                  fail("The message must not be received, the consumer connection is stopped");
+                  assertEquals("test", ((TextMessage) m).getText());
+               }
+               catch (JMSException e)
+               {
+                  fail(e);
+               }
+            }
+         });
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("test");
+         sender.send(message);
+         synchronized (this)
+         {
+            try
+            {
+               wait(1000);
+            }
+            catch (Exception e)
+            {
+               fail(e);
+            }
+         }
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(ConnectionTest.class);
+   }
+
+   public ConnectionTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/TopicConnectionTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/TopicConnectionTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/TopicConnectionTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,183 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): Andreas Mueller <am at iit.de>
+ */
+
+package org.objectweb.jtests.jms.conform.connection;
+
+import javax.jms.InvalidClientIDException;
+import javax.jms.JMSException;
+import javax.jms.TopicConnection;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PubSubTestCase;
+
+/**
+ * Test topic-specific connection features.
+ *
+ * Test setting of client ID which is relevant only for Durable Subscribtion
+ */
+
+public class TopicConnectionTest extends PubSubTestCase
+{
+
+   /**
+    * Test that a call to <code>setClientID</code> will throw an 
+    * <code>IllegalStateException</code> if a client ID has already been set
+    * see JMS javadoc 
+    * http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/Connection.html#setClientID(java.lang.String)
+    */
+   public void testSetClientID_1()
+   {
+      try
+      {
+         // we start from a clean state for the connection
+         subscriberConnection.close();
+         subscriberConnection = null;
+
+         subscriberConnection = subscriberTCF.createTopicConnection();
+         // if the JMS provider does not set a client ID, we do.
+         if (subscriberConnection.getClientID() == null)
+         {
+            subscriberConnection.setClientID("testSetClientID_1");
+            assertEquals("testSetClientID_1", subscriberConnection.getClientID());
+         }
+         // now the connection has a client ID (either "testSetClientID_1" or one set by the provider
+         assertTrue(subscriberConnection.getClientID() != null);
+
+         // a attempt to set a client ID should now throw an IllegalStateException
+         subscriberConnection.setClientID("another client ID");
+         fail("Should raise a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a java.lang.IllegalStateException");
+      }
+   }
+
+   /** 
+    * Test that a call to <code>setClientID</code> can occur only after connection creation 
+    * and before any other action on the connection.
+    * <em>This test is relevant only if the ID is set by the JMS client</em>
+    * see JMS javadoc 
+    * http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/Connection.html#setClientID(java.lang.String)
+    */
+   public void testSetClientID_2()
+   {
+      try
+      {
+         // we start from a clean state for the first connection
+         subscriberConnection.close();
+         subscriberConnection = null;
+
+         subscriberConnection = subscriberTCF.createTopicConnection();
+         // if the JMS provider has set a client ID, this test is not relevant
+         if (subscriberConnection.getClientID() != null)
+         {
+            return;
+         }
+
+         //we start the connection 
+         subscriberConnection.start();
+
+         // an attempt to set the client ID now should throw a IllegalStateException
+         subscriberConnection.setClientID("testSetClientID_2");
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a java.lang.IllegalStateException");
+      }
+   }
+
+   /**
+    * Test that if another connection with the same clientID is already running when 
+    * <code>setClientID</code> is called, the JMS provider should detect the duplicate
+    * ID and throw an <code>InvalidClientIDException</code>
+    * <em>This test is relevant only if the ID is set by the JMS client</em>
+    * see JMS javadoc 
+    * http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/Connection.html#setClientID(java.lang.String)
+    * 
+    *... This test is not valid... as getClientID is caleld before setClientID
+    */
+   /*public void testSetClientID_3()
+   {
+      try
+      {
+         // we start from a clean state for the first connection
+         subscriberConnection.close();
+         subscriberConnection = null;
+
+         subscriberConnection = subscriberTCF.createTopicConnection();
+         // if the JMS provider has set a client ID, this test is not relevant
+         if (subscriberConnection.getClientID() != null)
+         {
+            return;
+         }
+         // the JMS provider has not set a client ID, so we do
+         subscriberConnection.setClientID("testSetClientID_3");
+         assertEquals("testSetClientID_3", subscriberConnection.getClientID());
+
+         // we create a new connection and try to set the same ID than for subscriberConnection
+         TopicConnection connection_2 = subscriberTCF.createTopicConnection();
+         assertTrue(connection_2.getClientID() == null);
+         connection_2.setClientID("testSetClientID_3");
+         fail("Should throw a javax.jms.InvalidClientIDException");
+      }
+      catch (InvalidClientIDException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }*/
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(TopicConnectionTest.class);
+   }
+
+   public TopicConnectionTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/connection/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+  <body>
+    Tests JMS <em>Connection</em> features.
+  </body>
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageBodyTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageBodyTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageBodyTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,126 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.message;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageNotWriteableException;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Tests on message body.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: MessageBodyTest.java,v 1.1 2007/03/29 04:28:37 starksm Exp $
+ */
+public class MessageBodyTest extends PTPTestCase
+{
+
+   /**
+    * Test that the <code>TextMessage.clearBody()</code> method does nto clear the 
+    * message properties.
+    */
+   public void testClearBody_2()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("prop", "foo");
+         message.clearBody();
+         assertEquals("§3.11.1 Clearing a message's body does not clear its property entries.\n", "foo", message
+               .getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>TextMessage.clearBody()</code> effectively clear the body of the message
+    */
+   public void testClearBody_1()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("bar");
+         message.clearBody();
+         assertEquals("§3 .11.1 the clearBody method of Message resets the value of the message body "
+               + "to the 'empty' initial message value as set by the message type's create "
+               + "method provided by Session.\n", null, message.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>TextMessage.setText()</code> method on a 
+    * received message raises a <code>javax.jms.MessageNotWriteableException</code>.
+    */
+   public void testWriteOnReceivedBody()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("foo");
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of TextMessage.\n", m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         msg.setText("bar");
+         fail("should raise a MessageNotWriteableException (§3.11.2)");
+      }
+      catch (MessageNotWriteableException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(MessageBodyTest.class);
+   }
+
+   public MessageBodyTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageDefaultTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageDefaultTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageDefaultTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,75 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.message;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Message;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.JMSTestCase;
+
+/**
+ * Test the default constants of the <code>javax.jms.Message</code> interface.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: MessageDefaultTest.java,v 1.1 2007/03/29 04:28:37 starksm Exp $
+ */
+public class MessageDefaultTest extends JMSTestCase
+{
+
+   /**
+    * test that the <code>DEFAULT_DELIVERY_MODE</code> of <code>javax.jms.Message</code>
+    * corresponds to <code>javax.jms.Delivery.PERSISTENT</code>.
+    */
+   public void testDEFAULT_DELIVERY_MODE()
+   {
+      assertEquals("The delivery mode is persistent by default.\n", DeliveryMode.PERSISTENT,
+            Message.DEFAULT_DELIVERY_MODE);
+   }
+
+   /**
+    * test that the <code>DEFAULT_PRIORITY</code> of <code>javax.jms.Message</code>
+    * corresponds to 4.
+    */
+   public void testDEFAULT_PRIORITY()
+   {
+      assertEquals("The default priority is 4.\n", 4, Message.DEFAULT_PRIORITY);
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(MessageDefaultTest.class);
+   }
+
+   public MessageDefaultTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageTypeTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageTypeTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/MessageTypeTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,420 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.message;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+import javax.jms.BytesMessage;
+import javax.jms.JMSException;
+import javax.jms.MapMessage;
+import javax.jms.Message;
+import javax.jms.ObjectMessage;
+import javax.jms.StreamMessage;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test the different types of messages provided by JMS.
+ * <br />
+ * JMS provides 6 types of messages which differs by the type of their body:
+ * <ol>
+ *   <li><code>Message</code> which doesn't have a body</li>
+ *   <li><code>TextMessage</code> with a <code>String</code> as body</li>
+ *   <li><code>ObjectMessage</code> with any <code>Object</code> as body</li>
+ *   <li><code>BytesMessage</code> with a body made of <code>bytes</code></li>
+ *   <li><code>MapMessage</code> with name-value pairs of Java primitives in its body</li>
+ *   <li><code>StreamMessage</code> with a stream of Java primitives as body</li>
+ *  </ol>
+ * <br />
+ * For each of this type of message, we test that a message can be sent and received
+ * with an empty body or not.
+ * 
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: MessageTypeTest.java,v 1.1 2007/03/29 04:28:37 starksm Exp $
+ */
+public class MessageTypeTest extends PTPTestCase
+{
+
+   /**
+    * Send a <code>StreamMessage</code> with 2 Java primitives in its body (a <code>
+    * String</code> and a <code>double</code>).
+    * <br />
+    * Receive it and test that the values of the primitives of the body are correct
+    */
+   public void testStreamMessage_2()
+   {
+      try
+      {
+         StreamMessage message = senderSession.createStreamMessage();
+         message.writeString("pi");
+         message.writeDouble(3.14159);
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of StreamMessage.\n", m instanceof StreamMessage);
+         StreamMessage msg = (StreamMessage) m;
+         assertEquals("pi", msg.readString());
+         assertEquals(3.14159, msg.readDouble(), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>StreamMessage</code> with an empty body.
+    * <br />
+    * Receive it and test if the message is effectively an instance of 
+    * <code>StreamMessage</code>
+    */
+   public void testStreamMessage_1()
+   {
+      try
+      {
+         StreamMessage message = senderSession.createStreamMessage();
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of StreamMessage.\n", msg instanceof StreamMessage);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test in MapMessage the conversion between <code>getObject("foo")</code> and
+    * <code>getDouble("foo")</code> (the later returning a java.lang.Double and the former a double)
+    */
+   public void testMapMessageConversion()
+   {
+      try
+      {
+         MapMessage message = senderSession.createMapMessage();
+         message.setDouble("pi", 3.14159);
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of MapMessage.\n", m instanceof MapMessage);
+         MapMessage msg = (MapMessage) m;
+         assertTrue(msg.getObject("pi") instanceof Double);
+         assertEquals(3.14159, ((Double) msg.getObject("pi")).doubleValue(), 0);
+         assertEquals(3.14159, msg.getDouble("pi"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the if the name parameter of the set methods of a <code>MapMessage</code> is <code>null</code>, 
+    * the method must throw the error <code>java.lang.IllegalArgumentException</code>.
+    * <br />
+    * @since JMS 1.1
+    */
+   public void testNullInSetMethodsForMapMessage()
+   {
+      try
+      {
+         MapMessage message = senderSession.createMapMessage();
+         message.setBoolean(null, true);
+         fail("Should throw an IllegalArgumentException");
+      }
+      catch (IllegalArgumentException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw an IllegalArgumentException, not a" + e);
+      }
+   }
+
+   /**
+    * Test that the if the name parameter of the set methods of a <code>MapMessage</code> is an empty String,
+    * the method must throw the error <code>java.lang.IllegalArgumentException</code>.
+    * <br />
+    * @since JMS 1.1
+    */
+   public void testEmptyStringInSetMethodsForMapMessage()
+   {
+      try
+      {
+         MapMessage message = senderSession.createMapMessage();
+         message.setBoolean("", true);
+         fail("Should throw an IllegalArgumentException");
+      }
+      catch (IllegalArgumentException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw an IllegalArgumentException, not a" + e);
+      }
+   }
+
+   /**
+    * Test that the <code>MapMessage.getMapNames()</code> method returns an
+    * empty <code>Enumeration</code> when no map has been defined before.
+    * <br />
+    * Also test that the same method returns the correct names of the map.
+    */
+   public void testgetMapNames()
+   {
+      try
+      {
+         MapMessage message = senderSession.createMapMessage();
+         Enumeration e = message.getMapNames();
+         assertTrue("No map yet defined.\n", !e.hasMoreElements());
+         message.setDouble("pi", 3.14159);
+         e = message.getMapNames();
+         assertEquals("pi", (String) (e.nextElement()));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>MapMessage</code> with 2 Java primitives in its body (a <code>
+    * String</code> and a <code>double</code>).
+    * <br />
+    * Receive it and test that the values of the primitives of the body are correct
+    */
+   public void testMapMessage_2()
+   {
+      try
+      {
+         MapMessage message = senderSession.createMapMessage();
+         message.setString("name", "pi");
+         message.setDouble("value", 3.14159);
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of MapMessage.\n", m instanceof MapMessage);
+         MapMessage msg = (MapMessage) m;
+         assertEquals("pi", msg.getString("name"));
+         assertEquals(3.14159, msg.getDouble("value"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>MapMessage</code> with an empty body.
+    * <br />
+    * Receive it and test if the message is effectively an instance of 
+    * <code>MapMessage</code>
+    */
+   public void testMapMessage_1()
+   {
+      try
+      {
+         MapMessage message = senderSession.createMapMessage();
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of MapMessage.\n", msg instanceof MapMessage);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send an <code>ObjectMessage</code> with a <code>Vector</code> (composed of a <code>
+    * String</code> and a <code>double</code>) in its body.
+    * <br />
+    * Receive it and test that the values of the primitives of the body are correct
+    */
+   public void testObjectMessage_2()
+   {
+      try
+      {
+         Vector vector = new Vector();
+         vector.add("pi");
+         vector.add(new Double(3.14159));
+
+         ObjectMessage message = senderSession.createObjectMessage();
+         message.setObject(vector);
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of ObjectMessage.\n", m instanceof ObjectMessage);
+         ObjectMessage msg = (ObjectMessage) m;
+         assertEquals(vector, msg.getObject());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>ObjectMessage</code> with an empty body.
+    * <br />
+    * Receive it and test if the message is effectively an instance of 
+    * <code>ObjectMessage</code>
+    */
+   public void testObjectMessage_1()
+   {
+      try
+      {
+         ObjectMessage message = senderSession.createObjectMessage();
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of ObjectMessage.\n", msg instanceof ObjectMessage);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>BytesMessage</code> with 2 Java primitives in its body (a <code>
+    * String</code> and a <code>double</code>).
+    * <br />
+    * Receive it and test that the values of the primitives of the body are correct
+    */
+   public void testBytesMessage_2()
+   {
+      try
+      {
+         byte[] bytes = new String("pi").getBytes();
+         BytesMessage message = senderSession.createBytesMessage();
+         message.writeBytes(bytes);
+         message.writeDouble(3.14159);
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of BytesMessage.\n", m instanceof BytesMessage);
+         BytesMessage msg = (BytesMessage) m;
+         byte[] receivedBytes = new byte[bytes.length];
+         msg.readBytes(receivedBytes);
+         assertEquals(new String(bytes), new String(receivedBytes));
+         assertEquals(3.14159, msg.readDouble(), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>BytesMessage</code> with an empty body.
+    * <br />
+    * Receive it and test if the message is effectively an instance of 
+    * <code>BytesMessage</code>
+    */
+   public void testBytesMessage_1()
+   {
+      try
+      {
+         BytesMessage message = senderSession.createBytesMessage();
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of BytesMessage.\n", msg instanceof BytesMessage);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>TextMessage</code> with a <code>String</code> in its body.
+    * <br />
+    * Receive it and test that the received <code>String</code> corresponds to
+    * the sent one.
+    */
+   public void testTextMessage_2()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testTextMessage_2");
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of TextMessage.\n", m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         assertEquals("testTextMessage_2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Send a <code>TextMessage</code> with an empty body.
+    * <br />
+    * Receive it and test if the message is effectively an instance of 
+    * <code>TextMessage</code>
+    */
+   public void testTextMessage_1()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("The message should be an instance of TextMessage.\n", msg instanceof TextMessage);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(MessageTypeTest.class);
+   }
+
+   public MessageTypeTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/MessageHeaderTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/MessageHeaderTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/MessageHeaderTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,298 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): Andreas Mueller <am at iit.de>.
+ */
+
+package org.objectweb.jtests.jms.conform.message.headers;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Queue;
+import javax.jms.TemporaryQueue;
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test the headers of a message
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: MessageHeaderTest.java,v 1.1 2007/03/29 04:28:36 starksm Exp $
+ */
+public class MessageHeaderTest extends PTPTestCase
+{
+
+   /**
+    * Test that the <code>MessageProducer.setPriority()</code> changes effectively
+    * priority of the message.
+    */
+   public void testJMSPriority_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         sender.send(message);
+         sender.setPriority(9);
+         sender.send(message);
+         assertEquals("§3.4.9 After completion of the send it holds the value specified by the "
+               + "method sending the message.\n", 9, message.getJMSPriority());
+
+         receiver.receive(TestConfig.TIMEOUT);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the priority set by <code>Message.setJMSPriority()</code> is ignored when a 
+    * message is sent and that it holds the value specified when sending the message (i.e. 
+    * <code>Message.DEFAULT_PRIORITY</code> in this test).
+    */
+   public void testJMSPriority_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setJMSPriority(0);
+         sender.send(message);
+         assertTrue("§3.4.9 When a message is sent this value is ignored.\n", message.getJMSPriority() != 0);
+         assertEquals("§3.4.9 After completion of the send it holds the value specified by the "
+               + "method sending the message.\n", Message.DEFAULT_PRIORITY, message.getJMSPriority());
+
+         receiver.receive(TestConfig.TIMEOUT);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the value of the <code>JMSExpiration<code> header field is the same
+    * for the sent message and the received one.
+    */
+   public void testJMSExpiration()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertEquals("§3.4.9 When a message is received its JMSExpiration header field contains this same "
+               + "value [i.e. set on return of the send method].\n", message.getJMSExpiration(), msg.getJMSExpiration());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>JMSMessageID</code> is set by the provider when the <code>send</code> method returns 
+    * and that it starts with <code>"ID:"</code>.
+    */
+   public void testJMSMessageID_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         sender.send(message);
+         assertTrue("§3.4.3 When the send method returns it contains a provider-assigned value.\n", message
+               .getJMSMessageID() != null);
+         assertTrue("§3.4.3 All JMSMessageID values must start with the prefix 'ID:'.\n", message.getJMSMessageID()
+               .startsWith("ID:"));
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("§3.4.3 All JMSMessageID values must start with the prefix 'ID:'.\n", msg.getJMSMessageID()
+               .startsWith("ID:"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>JMSMessageID</code> header field value is 
+    * ignored when the message is sent.
+    */
+   public void testJMSMessageID_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setJMSMessageID("ID:foo");
+         sender.send(message);
+         assertTrue("§3.4.3 When a message is sent this value is ignored.\n", message.getJMSMessageID() != "ID:foo");
+         receiver.receive(TestConfig.TIMEOUT);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>JMSDeliveryMode</code> header field value is ignored
+    * when the message is sent and that it holds the value specified by the sending 
+    * method (i.e. <code>Message.DEFAULT_DELIVERY_MODE</code> in this test when the message is received.
+    */
+   public void testJMSDeliveryMode()
+   {
+      try
+      {
+         // sender has been created with the DEFAULT_DELIVERY_MODE which is PERSISTENT
+         assertEquals(DeliveryMode.PERSISTENT, sender.getDeliveryMode());
+         Message message = senderSession.createMessage();
+         // send a message specfiying NON_PERSISTENT for the JMSDeliveryMode header field
+         message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
+         sender.send(message);
+         assertTrue("§3.4.2 When a message is sent this value is ignored",
+               message.getJMSDeliveryMode() != DeliveryMode.NON_PERSISTENT);
+         assertEquals("§3.4.2 After completion of the send it holds the delivery mode specified "
+               + "by the sending method (persistent by default).\n", Message.DEFAULT_DELIVERY_MODE, message
+               .getJMSDeliveryMode());
+
+         receiver.receive(TestConfig.TIMEOUT);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>JMSDestination</code> header field value is ignored when the message
+    * is sent and that after completion of the sending method, it holds the <code>Destination</code>
+    * specified by the sending method.
+    * Also test that the value of the header on the received message is the same that on the sent message.
+    */
+   public void testJMSDestination()
+   {
+      try
+      {
+         admin.createQueue("anotherQueue");
+         Context ctx = admin.createInitialContext();
+         Queue anotherQueue = (Queue) ctx.lookup("anotherQueue");
+         assertTrue(anotherQueue != senderQueue);
+
+         // set the JMSDestination header field to the anotherQueue Destination
+         Message message = senderSession.createMessage();
+         message.setJMSDestination(anotherQueue);
+         sender.send(message);
+         assertTrue("§3.4.1 When a message is sent this value is ignored.\n",
+               message.getJMSDestination() != anotherQueue);
+         assertEquals("§3.4.1 After completion of the send it holds the destination object specified "
+               + "by the sending method.\n", senderQueue, message.getJMSDestination());
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         assertEquals("§3.4.1 When a message is received, its destination value must be equivalent  "
+               + " to the value assigned when it was sent.\n", ((Queue) message.getJMSDestination()).getQueueName(),
+               ((Queue) msg.getJMSDestination()).getQueueName());
+
+         admin.deleteQueue("anotherQueue");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+      catch (NamingException e)
+      {
+         fail(e.getMessage());
+      }
+   }
+
+   /**
+    * Test that a <code>Destination</code> set by the <code>setJMSReplyTo()</code>
+    * method on a sended message corresponds to the <code>Destination</code> get by 
+    * the </code>getJMSReplyTo()</code> method.
+    */
+   public void testJMSReplyTo_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setJMSReplyTo(senderQueue);
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         Destination dest = msg.getJMSReplyTo();
+         assertTrue("JMS ReplyTo header field should be a Queue", dest instanceof Queue);
+         Queue replyTo = (Queue) dest;
+         assertEquals("JMS ReplyTo header field should be equals to the sender queue",
+               replyTo.getQueueName(), senderQueue.getQueueName());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that if the JMS ReplyTo header field has been set as a <code>TemporaryQueue</code>,
+    * it will be rightly get also as a <code>TemporaryQueue</code> 
+    * (and not only as a <code>Queue</code>).
+    */
+   public void testJMSReplyTo_2()
+   {
+      try
+      {
+         TemporaryQueue tempQueue = senderSession.createTemporaryQueue();
+         Message message = senderSession.createMessage();
+         message.setJMSReplyTo(tempQueue);
+         sender.send(message);
+
+         Message msg = receiver.receive(TestConfig.TIMEOUT);
+         Destination dest = msg.getJMSReplyTo();
+         assertTrue("JMS ReplyTo header field should be a TemporaryQueue", dest instanceof TemporaryQueue);
+         Queue replyTo = (Queue) dest;
+         assertEquals("JMS ReplyTo header field should be equals to the temporary queue", replyTo.getQueueName(), tempQueue.getQueueName());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(MessageHeaderTest.class);
+   }
+
+   public MessageHeaderTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/headers/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+ <body>
+    Tests JMS <em>Message Header Fields</em> features.
+  </body>
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+ <body>
+    Tests JMS <em>Message</em> features.
+  </body>
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/JMSXPropertyTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/JMSXPropertyTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/JMSXPropertyTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,240 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.message.properties;
+
+import java.util.Enumeration;
+
+import javax.jms.ConnectionMetaData;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test the JMSX defined properties.
+ * <br />
+ *  See JMS Specification, �3.5.9 JMS Defined Properties
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: JMSXPropertyTest.java,v 1.2 2007/06/19 23:32:34 csuconic Exp $
+ */
+public class JMSXPropertyTest extends PTPTestCase
+{
+
+   /**
+    * Test that the JMSX property <code>JMSXGroupID</code> is supported.
+    */
+   public void testSupportsJMSXGroupID()
+   {
+      try
+      {
+         boolean found = false;
+         ConnectionMetaData metaData = senderConnection.getMetaData();
+         Enumeration enumeration = metaData.getJMSXPropertyNames();
+         while (enumeration.hasMoreElements())
+         {
+            String jmsxPropertyName = (String) enumeration.nextElement();
+            if (jmsxPropertyName.equals("JMSXGroupID"))
+            {
+               found = true;
+            }
+         }
+         assertTrue("JMSXGroupID property is not supported", found);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the JMSX property <code>JMSXGroupID</code> works
+    */
+   public void testJMSXGroupID_1()
+   {
+      try
+      {
+         String groupID = "testSupportsJMSXGroupID_1:group";
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("JMSXGroupID", groupID);
+         message.setText("testSupportsJMSXGroupID_1");
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue(m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         assertEquals(groupID, msg.getStringProperty("JMSXGroupID"));
+         assertEquals("testSupportsJMSXGroupID_1", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the JMSX property <code>JMSXGroupSeq</code> is supported.
+    */
+   public void testSupportsJMSXGroupSeq()
+   {
+      try
+      {
+         boolean found = false;
+         ConnectionMetaData metaData = senderConnection.getMetaData();
+         Enumeration enumeration = metaData.getJMSXPropertyNames();
+         while (enumeration.hasMoreElements())
+         {
+            String jmsxPropertyName = (String) enumeration.nextElement();
+            if (jmsxPropertyName.equals("JMSXGroupSeq"))
+            {
+               found = true;
+            }
+         }
+         assertTrue("JMSXGroupSeq property is not supported", found);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the JMSX property <code>JMSXDeliveryCount</code> is supported.
+    */
+   public void testSupportsJMSXDeliveryCount()
+   {
+      try
+      {
+         boolean found = false;
+         ConnectionMetaData metaData = senderConnection.getMetaData();
+         Enumeration enumeration = metaData.getJMSXPropertyNames();
+         while (enumeration.hasMoreElements())
+         {
+            String jmsxPropertyName = (String) enumeration.nextElement();
+            if (jmsxPropertyName.equals("JMSXDeliveryCount"))
+            {
+               found = true;
+            }
+         }
+         assertTrue("JMSXDeliveryCount property is not supported", found);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the JMSX property <code>JMSXDeliveryCount</code> works.
+    */
+   public void testJMSXDeliveryCount()
+   {
+      try
+      {
+         senderConnection.stop();
+         // senderSession has been created as non transacted
+         // we create it again but as a transacted session
+         senderSession = senderConnection.createQueueSession(true, 0);
+         assertEquals(true, senderSession.getTransacted());
+         // we create again the sender
+         sender = senderSession.createSender(senderQueue);
+         senderConnection.start();
+
+         receiverConnection.stop();
+         // receiverSession has been created as non transacted
+         // we create it again but as a transacted session
+         receiverSession = receiverConnection.createQueueSession(true, 0);
+         assertEquals(true, receiverSession.getTransacted());
+         // we create again the receiver
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue);
+         receiverConnection.start();
+
+         // we send a message...
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testJMSXDeliveryCount");
+         sender.send(message);
+         // ... and commit the *producer* transaction
+         senderSession.commit();
+
+         // we receive a message...
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue(m != null);
+         assertTrue(m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         // ... which is the one which was sent...
+         assertEquals("testJMSXDeliveryCount", msg.getText());
+         // ...and has not been redelivered
+         assertEquals(false, msg.getJMSRedelivered());
+         // ... so it has been delivered once
+         int jmsxDeliveryCount = msg.getIntProperty("JMSXDeliveryCount");
+         assertEquals(1, jmsxDeliveryCount);
+         // we rollback the *consumer* transaction
+         receiverSession.rollback();
+
+         // we receive again a message
+         m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue(m != null);
+         assertTrue(m instanceof TextMessage);
+         msg = (TextMessage) m;
+         // ... which is still the one which was sent...
+         assertEquals("testJMSXDeliveryCount", msg.getText());
+         // .. but this time, it has been redelivered
+         assertEquals(true, msg.getJMSRedelivered());
+         // ... so it has been delivered a second time
+         jmsxDeliveryCount = msg.getIntProperty("JMSXDeliveryCount");
+         assertEquals(2, jmsxDeliveryCount);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+      catch (Exception e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(JMSXPropertyTest.class);
+   }
+
+   public JMSXPropertyTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyConversionTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyConversionTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyConversionTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,1577 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.message.properties;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageFormatException;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+
+/**
+ * Test the conversion of primitive types for the <code>javax.jms.Message</code> properties.
+ * <br />
+ * See JMS Specification, §3.5.4 Property Value Conversion and the corresponding table (p.33-34).
+ * <br />
+ * The method name <code>testXXX2YYY</code> means that we test if a property
+ * which has been set as a <code>XXX</code> type can be read as a <code>YYY</code> type, 
+ * where <code>XXX</code> and <code>YYY</code> can be <code>boolean, byte, short, long, float
+ * double</code> or <code>String</code>.
+ *
+ * <pre>
+ *          ---------------------------------------------------------------|
+ *          | boolean | byte | short | int | long | float | double | String| 
+ * |-----------------------------------------------------------------------|
+ * |boolean |    X                                                     X   |
+ * |byte    |            X       X      X     X                        X   |
+ * |short   |                    X      X     X                        X   |
+ * |int     |                           X     X                        X   |
+ * |long    |                                 X                        X   |
+ * |float   |                                         X       X        X   |
+ * |double  |                                                 X        X   |
+ * |String  |    Y       Y       Y      Y     Y       Y       Y        X   |
+ * |-----------------------------------------------------------------------|
+ * </pre>
+ * A value set as the row type can be read as the column type.
+ * <br />
+ * The unmarked cases must throw a <code>javax.jms.MessageFormatException</code>
+ * <br />
+ * The cases marked with a Y should throw a <code>java.lang.MessageFormatException</code> <strong>if</strong> the
+ * String is not a correct representation of the column type (otherwise, it returns the property). 
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: MessagePropertyConversionTest.java,v 1.1 2007/03/29 04:28:34 starksm Exp $
+ */
+public class MessagePropertyConversionTest extends PTPTestCase
+{
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>java.lang.String</code>.
+    */
+   public void testString2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "3.14159");
+         assertEquals("3.14159", message.getStringProperty("pi"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * to get it as a <code>double</code> throws a <code>java.lang.NuberFormatException</code>
+    * if the <code>String</code> is not a correct representation for a <code>double</code> 
+    * (e.g. <code>"not a number"</code>).
+    */
+   public void testString2Double_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "not_a_number");
+         message.getDoubleProperty("pi");
+         fail("§3.5.4 The String to numeric conversions must throw the java.lang.NumberFormatException "
+               + " if the numeric's valueOf() method does not accept the String value as a valid representation.\n");
+      }
+      catch (java.lang.NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>double</code> as long as the <code>String</code>
+    * is a correct representation of a <code>double</code> (e.g. <code>"3.14159"</code>).
+    */
+   public void testString2Double_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "3.14159");
+         assertEquals(3.14159, message.getDoubleProperty("pi"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * to get it as a <code>float</code> throws a <code>java.lang.NuberFormatException</code>
+    * if the <code>String</code> is not a correct representation for a <code>float</code> 
+    * (e.g. <code>"not_a_number"</code>).
+    */
+   public void testString2Float_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "not_a_number");
+         message.getFloatProperty("pi");
+         fail("§3.5.4 The String to numeric conversions must throw the java.lang.NumberFormatException "
+               + " if the numeric's valueOf() method does not accept the String value as a valid representation.\n");
+      }
+      catch (java.lang.NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>float</code> as long as the <code>String</code>
+    * is a correct representation of a <code>float</code> (e.g. <code>"3.14159"</code>).
+    */
+   public void testString2Float_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "3.14159");
+         assertEquals(3.14159F, message.getFloatProperty("pi"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * to get it as a <code>long</code> throws a <code>java.lang.NuberFormatException</code>
+    * if the <code>String</code> is not a correct representation for a <code>long</code> 
+    * (e.g. <code>"3.14159"</code>).
+    */
+   public void testString2Long_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "3.14159");
+         message.getLongProperty("pi");
+         fail("§3.5.4 The String to numeric conversions must throw the java.lang.NumberFormatException "
+               + " if the numeric's valueOf() method does not accept the String value as a valid representation.\n");
+      }
+      catch (java.lang.NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>long</code> as long as the <code>String</code>
+    * is a correct representation of a <code>long</code> (e.g. <code>"0"</code>).
+    */
+   public void testString2Long_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("prop", "0");
+         assertEquals(0l, message.getLongProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * to get it as a <code>int</code> throws a <code>java.lang.NuberFormatException</code>
+    * if the <code>String</code> is not a correct representation for a <code>int</code> 
+    * (e.g. <code>"3.14159"</code>).
+    */
+   public void testString2Int_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "3.14159");
+         message.getIntProperty("pi");
+         fail("§3.5.4 The String to numeric conversions must throw the java.lang.NumberFormatException "
+               + " if the numeric's valueOf() method does not accept the String value as a valid representation.\n");
+      }
+      catch (java.lang.NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>int</code> as long as the <code>String</code>
+    * is a correct representation of a <code>int</code> (e.g. <code>"0"</code>).
+    */
+   public void testString2Int_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("prop", "0");
+         assertEquals(0, message.getIntProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * to get it as a <code>short</code> throws a <code>java.lang.NuberFormatException</code>
+    * if the <code>String</code> is not a correct representation for a <code>short</code> 
+    * (e.g. <code>"3.14159"</code>).
+    */
+   public void testString2Short_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "3.14159");
+         message.getShortProperty("pi");
+         fail("§3.5.4 The String to numeric conversions must throw the java.lang.NumberFormatException "
+               + " if the numeric's valueOf() method does not accept the String value as a valid representation.\n");
+      }
+      catch (java.lang.NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>short</code> as long as the <code>String</code>
+    * is a correct representation of a <code>short</code> (e.g. <code>"0"</code>).
+    */
+   public void testString2Short_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("prop", "0");
+         assertEquals((short) 0, message.getShortProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * to get it as a <code>byte</code> throws a <code>java.lang.NuberFormatException</code>
+    * if the <code>String</code> is not a correct representation for a <code>byte</code> 
+    * (e.g. <code>"3.14159"</code>).
+    */
+   public void testString2Byte_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("pi", "3.14159");
+         message.getByteProperty("pi");
+         fail("§3.5.4 The String to numeric conversions must throw the java.lang.NumberFormatException "
+               + " if the numeric's valueOf() method does not accept the String value as a valid representation.\n");
+      }
+      catch (java.lang.NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>byte</code> if the <code>String</code>
+    * is a correct representation of a <code>byte</code> (e.g. <code>"0"</code>).
+    */
+   public void testString2Byte_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("prop", "0");
+         assertEquals((byte) 0, message.getByteProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * to get it as a <code>boolean</code> returns <code>true</code> if the property is not 
+    * null and is equal, ignoring case, to the string "true" (.eg. "True" is ok), else it
+    * returns <code>false</code> (e.g. "test")
+    */
+   public void testString2Boolean_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("prop", "test");
+         assertEquals(false, message.getBooleanProperty("prop"));
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>java.lang.String</code>, 
+    * it can also be read as a <code>boolean</code> if the <code>String</code>
+    * is a correct representation of a <code>boolean</code> (e.g. <code>"true"</code>).
+    */
+   public void testString2Boolean_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setStringProperty("prop", "true");
+         assertEquals(true, message.getBooleanProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * it can also be read as a <code>java.lang.String</code>.
+    */
+   public void testDouble2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setDoubleProperty("prop", 127.0);
+         assertEquals("127.0", message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * it can also be read as a <code>double</code>.
+    */
+   public void testDouble2Double()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setDoubleProperty("prop", 127.0);
+         assertEquals(127.0, message.getDoubleProperty("prop"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * to get is as a <code>float</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testDouble2Float()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setDoubleProperty("prop", 127.0);
+         message.getFloatProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * to get is as a <code>long</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testDouble2Long()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setDoubleProperty("prop", 127.0);
+         message.getLongProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * to get is as an <code>int</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testDouble2Int()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setDoubleProperty("prop", 127.0);
+         message.getIntProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * to get is as a <code>short</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testDouble2Short()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to short
+         message.setDoubleProperty("prop", 127.0);
+         message.getShortProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * to get is as a <code>byte</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testDouble2Byte()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to byte
+         message.setDoubleProperty("prop", 127.0);
+         message.getByteProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>double</code>, 
+    * to get is as a <code>boolean</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testDouble2Boolean()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can be converted to boolean
+         message.setDoubleProperty("prop", 127.0);
+         message.getBooleanProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * it can also be read as a <code>String</code>.
+    */
+   public void testFloat2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setFloatProperty("prop", 127.0F);
+         assertEquals("127.0", message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * it can also be read as a <code>double</code>.
+    */
+   public void testFloat2Double()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setFloatProperty("prop", 127.0F);
+         assertEquals(127.0, message.getDoubleProperty("prop"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * it can also be read as a <code>float</code>.
+    */
+   public void testFloat2Float()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setFloatProperty("prop", 127.0F);
+         assertEquals(127.0F, message.getFloatProperty("prop"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * to get is as a <code>long</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testFloat2Long()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setFloatProperty("prop", 127.0F);
+         message.getLongProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * to get is as a <code>int</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testFloat2Int()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setFloatProperty("prop", 127.0F);
+         message.getIntProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * to get is as a <code>short</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testFloat2Short()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to short
+         message.setFloatProperty("prop", 127.0F);
+         message.getShortProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * to get is as a <code>byte</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testFloat2Byte()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to byte
+         message.setFloatProperty("prop", 127.0F);
+         message.getByteProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>float</code>, 
+    * to get is as a <code>boolean</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testFloat2Boolean()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can be converted to boolean
+         message.setFloatProperty("prop", 127.0F);
+         message.getBooleanProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * it can also be read as a <code>String</code>.
+    */
+   public void testLong2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setLongProperty("prop", 127L);
+         assertEquals("127", message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * to get is as a <code>double</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testLong2Double()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setLongProperty("prop", 127L);
+         message.getDoubleProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * to get is as a <code>float</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testLong2Float()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setLongProperty("prop", 127L);
+         message.getFloatProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * it can also be read as a <code>long</code>.
+    */
+   public void testLong2Long()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setLongProperty("prop", 127L);
+         assertEquals(127L, message.getLongProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * to get is as an <code>int</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testLong2Int()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setLongProperty("prop", 127L);
+         message.getIntProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * to get is as a <code>short</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testLong2Short()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to short
+         message.setLongProperty("prop", 127L);
+         message.getShortProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * to get is as a <code>byte</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testLong2Byte()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to byte
+         message.setLongProperty("prop", 127L);
+         message.getByteProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>long</code>, 
+    * to get is as a <code>boolean</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testLong2Boolean()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can be converted to boolean
+         message.setLongProperty("prop", 127L);
+         message.getBooleanProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as an <code>int</code>, 
+    * it can also be read as a <code>String</code>.
+    */
+   public void testInt2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setIntProperty("prop", 127);
+         assertEquals("127", message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>int</code>, 
+    * to get is as a <code>double</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testInt2Double()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setIntProperty("prop", 127);
+         message.getDoubleProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>int</code>, 
+    * to get is as a <code>float</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testInt2Float()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setIntProperty("prop", 127);
+         message.getFloatProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as an <code>int</code>, 
+    * it can also be read as a <code>long</code>.
+    */
+   public void testInt2Long()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setIntProperty("prop", 127);
+         assertEquals(127L, message.getLongProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as an <code>int</code>, 
+    * it can also be read as an <code>int</code>.
+    */
+   public void testInt2Int()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setIntProperty("prop", 127);
+         assertEquals(127, message.getIntProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>int</code>, 
+    * to get is as a <code>short</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testInt2Short()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to short
+         message.setIntProperty("prop", Integer.MAX_VALUE);
+         message.getShortProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>int</code>, 
+    * to get is as a <code>byte</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testInt2Byte()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to byte
+         message.setIntProperty("prop", Integer.MAX_VALUE);
+         message.getByteProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>int</code>, 
+    * to get is as a <code>boolean</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testInt2Boolean()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can be converted to boolean
+         message.setIntProperty("prop", Integer.MAX_VALUE);
+         message.getBooleanProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * it can also be read as a <code>String</code>.
+    */
+   public void testShort2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setShortProperty("prop", (short) 127);
+         assertEquals("127", message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * to get is as a <code>double</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testShort2Double()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setShortProperty("prop", (short) 127);
+         message.getDoubleProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * to get is as a <code>float</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testShort2Float()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setShortProperty("prop", (short) 127);
+         message.getFloatProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * it can also be read as a <code>long</code>.
+    */
+   public void testShort2Long()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setShortProperty("prop", (short) 127);
+         assertEquals(127L, message.getLongProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * it can also be read as an <code>int</code>.
+    */
+   public void testShort2Int()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setShortProperty("prop", (short) 127);
+         assertEquals(127, message.getIntProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * it can also be read as a <code>short</code>.
+    */
+   public void testShort2Short()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setShortProperty("prop", (short) 127);
+         assertEquals((short) 127, message.getShortProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * to get is as a <code>byte</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testShort2Byte()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setShortProperty("prop", (short) 127);
+         message.getByteProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>short</code>, 
+    * to get is as a <code>boolean</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testShort2Boolean()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to boolean
+         message.setShortProperty("prop", (short) 127);
+         message.getBooleanProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * it can also be read as a <code>String</code>.
+    */
+   public void testByte2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setByteProperty("prop", (byte) 127);
+         assertEquals("127", message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * to get is as a <code>double</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testByte2Double()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setByteProperty("prop", (byte) 127);
+         message.getDoubleProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * to get is as a <code>float</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testByte2Float()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setByteProperty("prop", (byte) 127);
+         message.getFloatProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * it can also be read as a <code>long</code>.
+    */
+   public void testByte2Long()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setByteProperty("prop", (byte) 127);
+         assertEquals(127L, message.getLongProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * it can also be read as an <code>int</code>.
+    */
+   public void testByte2Int()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setByteProperty("prop", (byte) 127);
+         assertEquals(127, message.getIntProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * it can also be read as a <code>short</code>.
+    */
+   public void testByte2Short()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setByteProperty("prop", (byte) 127);
+         assertEquals((short) 127, message.getShortProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * it can also be read as a <code>byte</code>.
+    */
+   public void testByte2Byte()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setByteProperty("prop", (byte) 127);
+         assertEquals((byte) 127, message.getByteProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>byte</code>, 
+    * to get is as a <code>boolean</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testByte2Boolean()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to boolean
+         message.setByteProperty("prop", (byte) 127);
+         message.getBooleanProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * it can also be read as a <code>String</code>.
+    */
+   public void testBoolean2String()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setBooleanProperty("prop", true);
+         assertEquals("true", message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * to get is as a <code>double</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testBoolean2Double()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to double
+         message.setBooleanProperty("prop", true);
+         message.getDoubleProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * to get is as a <code>float</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testBoolean2Float()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to float
+         message.setBooleanProperty("prop", true);
+         message.getFloatProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * to get is as a <code>long</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testBoolean2Long()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to long
+         message.setBooleanProperty("true", true);
+         message.getLongProperty("true");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * to get is as a <code>int</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testBoolean2Int()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to int
+         message.setBooleanProperty("prop", true);
+         message.getIntProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * to get is as a <code>short</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testBoolean2Short()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to short
+         message.setBooleanProperty("prop", true);
+         message.getShortProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * to get is as a <code>byte</code> throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testBoolean2Byte()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         // store a value that can't be converted to byte
+         message.setBooleanProperty("prop", true);
+         message.getByteProperty("prop");
+         fail("§3.5.4 The unmarked cases [of Table 0-4] should raise a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>boolean</code>, 
+    * it can also be read as a <code>boolean</code>.
+    */
+   public void testBoolean2Boolean()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setBooleanProperty("prop", true);
+         assertEquals(true, message.getBooleanProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(MessagePropertyConversionTest.class);
+   }
+
+   public MessagePropertyConversionTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/MessagePropertyTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,368 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.message.properties;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageFormatException;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+
+/**
+ * Test the <code>javax.jms.Message</code> properties.
+ * <br />
+ *  See JMS Specification, §3.5 Message Properties (p.32-37)
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: MessagePropertyTest.java,v 1.1 2007/03/29 04:28:34 starksm Exp $
+ */
+public class MessagePropertyTest extends PTPTestCase
+{
+
+   /**
+    * Test that any other class than <code>Boolean, Byte, Short, Integer, Long,
+    * Float, Double</code> and <code>String</code> used in the <code>Message.setObjectProperty()</code>
+    * method throws a <code>javax.jms.MessageFormatException</code>.
+    */
+   public void testSetObjectProperty_2()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setObjectProperty("prop", new Vector());
+         fail("§3.5.5 An attempt to use any other class [than Boolean, Byte,...,String] must throw "
+               + "a JMS MessageFormatException.\n");
+      }
+      catch (MessageFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.MessageFormatException, not a " + e);
+      }
+   }
+
+   /**
+    * if a property is set as a <code>Float</code> with the <code>Message.setObjectProperty()</code>
+    * method, it can be retrieve directly as a <code>double</code> by <code>Message.getFloatProperty()</code>
+    */
+   public void testSetObjectProperty_1()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setObjectProperty("pi", new Float(3.14159f));
+         assertEquals(3.14159f, message.getFloatProperty("pi"), 0);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a <code>null</code> value is returned by the <code>Message.getObjectProperty()</code> method
+    * if a property by the specified name does not exits.
+    */
+   public void testGetObjectProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         assertEquals(
+               "§3.5.5 A null value is returned [by the getObjectProperty method] if a property by the specified "
+                     + "name does not exits.\n", null, message.getObjectProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a <code>null</code> value is returned by the <code>Message.getStringProperty()</code> method
+    * if a property by the specified name does not exits.
+    */
+   public void testGetStringProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         assertEquals(
+               "§3.5.5 A null value is returned [by the getStringProperty method] if a property by the specified "
+                     + "name does not exits.\n", null, message.getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that an attempt to get a <code>double</code> property which does not exist throw
+    * a <code>java.lang.NullPointerException</code>
+    */
+   public void testGetDoubleProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.getDoubleProperty("prop");
+         fail("Should raise a NullPointerException.\n");
+      }
+      catch (NullPointerException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that an attempt to get a <code>float</code> property which does not exist throw
+    * a <code>java.lang.NullPointerException</code>
+    */
+   public void testGetFloatProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.getFloatProperty("prop");
+         fail("Should raise a NullPointerException.\n");
+      }
+      catch (NullPointerException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that an attempt to get a <code>long</code> property which does not exist throw
+    * a <code>java.lang.NumberFormatException</code>
+    */
+   public void testGetLongProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.getLongProperty("prop");
+         fail("Should raise a NumberFormatException.\n");
+      }
+      catch (NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that an attempt to get a <code>int</code> property which does not exist throw
+    * a <code>java.lang.NumberFormatException</code>
+    */
+   public void testGetIntProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.getIntProperty("prop");
+         fail("Should raise a NumberFormatException.\n");
+      }
+      catch (NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that an attempt to get a <code>short</code> property which does not exist throw
+    * a <code>java.lang.NumberFormatException</code>
+    */
+   public void testGetShortProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.getShortProperty("prop");
+         fail("Should raise a NumberFormatException.\n");
+      }
+      catch (NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that an attempt to get a <code>byte</code> property which does not exist throw
+    * a <code>java.lang.NumberFormatException</code>
+    */
+   public void testGetByteProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.getByteProperty("prop");
+         fail("Should raise a NumberFormatException.\n");
+      }
+      catch (NumberFormatException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Test that an attempt to get a <code>boolean</code> property which does not exist 
+    * returns <code>false</code>
+    */
+   public void testGetBooleanProperty()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         assertEquals(false, message.getBooleanProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>Message.getPropertyNames()</code> method does not return
+    * the name of the JMS standard header fields (e.g. <code>JMSCorrelationID</code>.
+    */
+   public void testGetPropertyNames()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         message.setJMSCorrelationID("foo");
+         Enumeration enumeration = message.getPropertyNames();
+         assertTrue("§3.5.6 The getPropertyNames method does not return the names of "
+               + "the JMS standard header field [e.g. JMSCorrelationID].\n", !enumeration.hasMoreElements());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>Message.getPropertyNames()</code> method returns an empty
+    * <code>java.util.Enumeration</code> if there is no properties.
+    * <br />
+    * If there are some, test that it properly return their names.
+    */
+   public void testPropertyIteration()
+   {
+      try
+      {
+         Message message = senderSession.createMessage();
+         Enumeration enumeration = message.getPropertyNames();
+         assertTrue("No property yet defined.\n", !enumeration.hasMoreElements());
+         message.setDoubleProperty("pi", 3.14159);
+         enumeration = message.getPropertyNames();
+         assertEquals("One property defined of name 'pi'.\n", "pi", (String) enumeration.nextElement());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>Message.clearProperties()</code> method does not clear the
+    * value of the Message's body.
+    */
+   public void testClearProperties_2()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("foo");
+         message.clearProperties();
+         assertEquals("§3.5.7 Clearing a message's  property entries does not clear the value of its body.\n", "foo",
+               message.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the <code>Message.clearProperties()</code> method deletes all the 
+    * properties of the Message.
+    */
+   public void testClearProperties_1()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("prop", "foo");
+         message.clearProperties();
+         assertEquals("§3.5.7 A message's properties are deleted by the clearProperties method.\n", null, message
+               .getStringProperty("prop"));
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(MessagePropertyTest.class);
+   }
+
+   public MessagePropertyTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/message/properties/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+  <body>
+    Tests JMS <em>Message Properties</em> features.
+  </body>
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/QueueBrowserTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/QueueBrowserTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/QueueBrowserTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,206 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.queue;
+
+import java.util.Enumeration;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.QueueBrowser;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.jboss.util.NestedRuntimeException;
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test the <code>javax.jms.QueueBrowser</code> features.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: QueueBrowserTest.java,v 1.2 2007/06/19 23:32:35 csuconic Exp $
+ */
+public class QueueBrowserTest extends PTPTestCase
+{
+
+   /**
+    * The <code>QueueBrowser</code> of the receiver's session
+    */
+   protected QueueBrowser receiverBrowser;
+
+   /**
+    * The <code>QueueBrowser</code> of the sender's session
+    */
+   protected QueueBrowser senderBrowser;
+
+   /**
+    * Test the <code>QueueBrowser</code> of the sender.
+    */
+   public void testSenderBrowser()
+   {
+      try
+      {
+         TextMessage message_1 = senderSession.createTextMessage();
+         message_1.setText("testBrowser:message_1");
+         TextMessage message_2 = senderSession.createTextMessage();
+         message_2.setText("testBrowser:message_2");
+         
+         receiver.close();
+
+         // send two messages...
+         sender.send(message_1);
+         sender.send(message_2);
+         
+         // ask the browser to browse the sender's session
+         Enumeration enumeration = senderBrowser.getEnumeration();
+         int count = 0;
+         while (enumeration.hasMoreElements())
+         {
+            // one more message in the queue
+            count++;
+            // check that the message in the queue is one of the two which where sent
+            Object obj = enumeration.nextElement();
+            assertTrue(obj instanceof TextMessage);
+            TextMessage msg = (TextMessage) obj;
+            assertTrue(msg.getText().startsWith("testBrowser:message_"));
+         }
+         // check that there is effectively 2 messages in the queue
+         assertEquals(2, count);
+
+         
+         receiver = receiverSession.createReceiver(receiverQueue);
+         // receive the first message...
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         // ... and check it is the first which was sent.
+         assertTrue(m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         assertEquals("testBrowser:message_1", msg.getText());
+
+         // receive the second message...
+         m = receiver.receive(TestConfig.TIMEOUT);
+         // ... and check it is the second which was sent.
+         assertTrue(m instanceof TextMessage);
+         msg = (TextMessage) m;
+         assertEquals("testBrowser:message_2", msg.getText());
+
+         // ask the browser to browse the sender's session
+         enumeration = receiverBrowser.getEnumeration();
+         // check that there is no messages in the queue
+         // (the two messages have been acknowledged and so removed
+         // from the queue)
+         assertTrue(!enumeration.hasMoreElements());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a <code>QueueBrowser</cdeo> created with a message selector
+    * browses only the messages matching this selector.
+    */
+   public void testBrowserWithMessageSelector()
+   {
+      try
+      {
+         senderBrowser = senderSession.createBrowser(senderQueue, "pi = 3.14159");
+
+         receiver.close();
+         
+         TextMessage message_1 = senderSession.createTextMessage();
+         message_1.setText("testBrowserWithMessageSelector:message_1");
+         TextMessage message_2 = senderSession.createTextMessage();
+         message_2.setDoubleProperty("pi", 3.14159);
+         message_2.setText("testBrowserWithMessageSelector:message_2");
+
+         sender.send(message_1);
+         sender.send(message_2);
+
+         Enumeration enumeration = senderBrowser.getEnumeration();
+         int count = 0;
+         while (enumeration.hasMoreElements())
+         {
+            count++;
+            Object obj = enumeration.nextElement();
+            assertTrue(obj instanceof TextMessage);
+            TextMessage msg = (TextMessage) obj;
+            assertEquals("testBrowserWithMessageSelector:message_2", msg.getText());
+         }
+         assertEquals(1, count);
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   public void setUp()
+   {
+      try
+      {
+         super.setUp();
+         receiverBrowser = receiverSession.createBrowser(receiverQueue);
+         senderBrowser = senderSession.createBrowser(senderQueue);
+      }
+      catch (JMSException e)
+      {
+         throw new NestedRuntimeException(e);
+      }
+   }
+
+   public void tearDown()
+   {
+      try
+      {
+         receiverBrowser.close();
+         senderBrowser.close();
+         super.tearDown();
+      }
+      catch (JMSException ignored)
+      {
+      }
+      finally
+      {
+         receiverBrowser = null;
+         senderBrowser = null;
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(QueueBrowserTest.class);
+   }
+
+   public QueueBrowserTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/TemporaryQueueTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/TemporaryQueueTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/TemporaryQueueTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,99 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.queue;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.QueueReceiver;
+import javax.jms.TemporaryQueue;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test the <code>javax.jms.TemporaryQueue</code> features.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: TemporaryQueueTest.java,v 1.1 2007/03/29 04:28:37 starksm Exp $
+ */
+public class TemporaryQueueTest extends PTPTestCase
+{
+
+   private TemporaryQueue tempQueue;
+
+   private QueueReceiver tempReceiver;
+
+   /**
+    * Test a TemporaryQueue
+    */
+   public void testTemporaryQueue()
+   {
+      try
+      {
+         // we stop both sender and receiver connections
+         senderConnection.stop();
+         receiverConnection.stop();
+         // we create a temporary queue to receive messages
+         tempQueue = receiverSession.createTemporaryQueue();
+         // we recreate the sender because it has been 
+         // already created with a Destination as parameter
+         sender = senderSession.createSender(null);
+         // we create a receiver on the temporary queue
+         tempReceiver = receiverSession.createReceiver(tempQueue);
+         receiverConnection.start();
+         senderConnection.start();
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testTemporaryQueue");
+         sender.send(tempQueue, message);
+
+         Message m = tempReceiver.receive(TestConfig.TIMEOUT);
+         assertTrue(m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         assertEquals("testTemporaryQueue", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(TemporaryQueueTest.class);
+   }
+
+   public TemporaryQueueTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/queue/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+  <body>
+    Tests JMS <em>Queue</em> features.
+  </body>
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorSyntaxTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorSyntaxTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorSyntaxTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,437 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.selector;
+
+import javax.jms.InvalidSelectorException;
+import javax.jms.JMSException;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+
+/**
+ * Test the syntax of of message selector of JMS
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: SelectorSyntaxTest.java,v 1.1 2007/03/29 04:28:35 starksm Exp $
+ */
+public class SelectorSyntaxTest extends PTPTestCase
+{
+
+   /**
+    * Test that identifiers that start with a valid Java identifier start character are valid.
+    * A valid identifier means that the method <code>Character.isJavaIdentifierStart</code> returns 
+    * <code>true</code> for this identifier first character.
+    * 
+    * @see <a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/Character.html#isJavaIdentifierStart(char)">Character.isJavaIdentifierStart(char)</a>
+    */
+   public void testValidIdentifiersStart()
+   {
+      String identifier = null;
+      try
+      {
+         identifier = "_correct";
+         assertTrue(identifier + " starts with an invalid Java identifier start character", Character
+               .isJavaIdentifierStart(identifier.charAt(0)));
+         receiver = receiverSession.createReceiver(receiverQueue, identifier + " IS NULL");
+
+         identifier = "$correct";
+         assertTrue(identifier + " starts with an invalid Java identifier start character", Character
+               .isJavaIdentifierStart(identifier.charAt(0)));
+         receiver = receiverSession.createReceiver(receiverQueue, identifier + " IS NULL");
+      }
+      catch (JMSException e)
+      {
+         fail(identifier + " is a correct identifier. \n" + e);
+      }
+   }
+
+   /**
+    * Test that identifiers that start with an invalid Java identifier start character are invalid.       
+    * 
+    * @see #testValidIdentifiersStart()
+    */
+   public void testInvalidIdentifiersStart()
+   {
+      String identifier = null;
+      try
+      {
+         identifier = "1uncorrect";
+
+         assertTrue(identifier + " starts with an invalid Java identifier start character", !Character
+               .isJavaIdentifierStart(identifier.charAt(0)));
+         receiver = receiverSession.createReceiver(receiverQueue, identifier + " IS NULL");
+         fail(identifier + " starts with an invalid Java identifier start character");
+      }
+      catch (JMSException e)
+      {
+      }
+
+      try
+      {
+         identifier = "%uncorrect";
+
+         assertTrue(identifier + " starts with an invalid Java identifier start character", !Character
+               .isJavaIdentifierStart(identifier.charAt(0)));
+         receiver = receiverSession.createReceiver(receiverQueue, identifier + " IS NULL");
+         fail(identifier + " starts with an invalid Java identifier start character");
+      }
+      catch (JMSException e)
+      {
+      }
+
+   }
+
+   /**
+    * Test that message selector can be an empty string.
+    */
+   public void testEmptyStringAsSelector()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>NULL</code>.
+    */
+   public void testIdentifierNULL()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "NULL = ZERO");
+         fail("NULL is not a valid identifier");
+      }
+      catch (InvalidSelectorException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>TRUE</code>.
+    */
+   public void testIdentifierTRUE()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "TRUE > 0");
+         fail("TRUE is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>FALSE</code>.
+    */
+   public void testIdentifierFALSE()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "FALSE > 0");
+         fail("FALSE is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>NOT</code>.
+    */
+   public void testIdentifierNOT()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "NOT > 0");
+         fail("NOT is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>AND</code>.
+    */
+   public void testIdentifierAND()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "AND > 0");
+         fail("AND is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>OR</code>.
+    */
+   public void testIdentifierOR()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "OR > 0");
+         fail("OR is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>BETWEEN</code>.
+    */
+   public void testIdentifierBETWEEN()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "BETWEEN > 0");
+         fail("BETWEEN is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>LIKE</code>.
+    */
+   public void testIdentifierLIKE()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "LIKE > 0");
+         fail("LIKE is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>IN</code>.
+    */
+   public void testIdentifierIN()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "IN > 0");
+         fail("IN is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>IS</code>.
+    */
+   public void testIdentifierIS()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "IS > 0");
+         fail("IS is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test that identifiers can't be <code>ESCAPE</code>.
+    */
+   public void testIdentifierESCAPE()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "ESCAPE > 0");
+         fail("ESCAPE is not a valid identifier");
+      }
+      catch (JMSException e)
+      {
+      }
+   }
+
+   /**
+    * Test syntax of "<em>identifier</em> IS [NOT] NULL"
+    */
+   public void testNull()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "prop_name IS NULL");
+         receiver = receiverSession.createReceiver(receiverQueue, "prop_name IS NOT NULL");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test syntax of "<em>identifier</em> [NOT] LIKE <em>pattern-value</em> [ESCAPE <em>escape-character</em>]"
+    */
+   public void testLike()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "phone LIKE '12%3'");
+         receiver = receiverSession.createReceiver(receiverQueue, "word LIKE 'l_se'");
+         receiver = receiverSession.createReceiver(receiverQueue, "underscored LIKE '\\_%' ESCAPE '\\'");
+         receiver = receiverSession.createReceiver(receiverQueue, "phone NOT LIKE '12%3'");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test syntax of "<em>identifier</em> [NOT] IN (<em>string-literal1</em>, <em>string-literal2</em>,...)"
+    */
+   public void testIn()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "Country IN ('UK', 'US', 'France')");
+         receiver = receiverSession.createReceiver(receiverQueue, "Country NOT IN ('UK', 'US', 'France')");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test syntax of "<em>arithmetic-expr1</em> [NOT] BETWEEN <em>arithmetic-expr2</em> and <em>arithmetic-expr3</em>"
+    */
+   public void testBetween()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "age BETWEEN 15 and 19");
+         receiver = receiverSession.createReceiver(receiverQueue, "age NOT BETWEEN 15 and 19");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test diffent syntax for approximate numeric literal (+6.2, -95.7, 7.)
+    */
+   public void testApproximateNumericLiteral()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "average = +6.2");
+         receiver = receiverSession.createReceiver(receiverQueue, "average = -95.7");
+         receiver = receiverSession.createReceiver(receiverQueue, "average = 7.");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test diffent syntax for exact numeric literal (+62, -957, 57)
+    */
+   public void testExactNumericLiteral()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "average = +62");
+         receiver = receiverSession.createReceiver(receiverQueue, "max = -957");
+         receiver = receiverSession.createReceiver(receiverQueue, "max = 57");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test diffent syntax for zero as an exact or an approximate numeric literal (0, 0.0, 0.)
+    */
+   public void testZero()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "max = 0");
+         receiver = receiverSession.createReceiver(receiverQueue, "max = 0.0");
+         receiver = receiverSession.createReceiver(receiverQueue, "max = 0.");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test diffent syntax for string literal ('literal' and 'literal''s')
+    */
+   public void testString()
+   {
+      try
+      {
+         receiver = receiverSession.createReceiver(receiverQueue, "string = 'literal'");
+         receiver = receiverSession.createReceiver(receiverQueue, "string = 'literal''s'");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(SelectorSyntaxTest.class);
+   }
+
+   public SelectorSyntaxTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/SelectorTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,602 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.selector;
+
+import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test the message selector features of JMS
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: SelectorTest.java,v 1.2 2007/06/19 23:32:35 csuconic Exp $
+ */
+public class SelectorTest extends PTPTestCase
+{
+
+   /**
+    * Test that an empty string as a message selector indicates that there
+    * is no message selector for the message consumer.
+    */
+   public void testEmptyStringAsSelector()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "");
+         receiverConnection.start();
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testEmptyStringAsSelector");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("No message was received", msg != null);
+         assertEquals("testEmptyStringAsSelector", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Tats that String literals are well handled by the message selector.
+    * <br />
+    * <ul>
+    *   <li><code>"string = 'literal''s;"</code> is <code>true</code> for "literal's" and <code>false</code> for "literal"</li>
+    * </ul>
+    */
+
+   public void testStringLiterals()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "string = 'literal''s'");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setStringProperty("string", "literal");
+         dummyMessage.setText("testStringLiterals:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("string", "literal's");
+         message.setText("testStringLiterals:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("No message was received", msg != null);
+         assertEquals("testStringLiterals:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that the JMS property <code>JMSDeliveryMode</code> is treated as having the values <code>'PERSISTENT'</code>
+    * or <code>'NON_PERSISTENT'</code> when used in a message selector (chapter 3.8.1.3).
+    */
+   public void testJMSDeliveryModeInSelector()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "JMSDeliveryMode = 2");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setText("testJMSDeliveryModeInSelector:1");
+         // send a dummy message in *non persistent* mode
+         sender.send(dummyMessage, DeliveryMode.NON_PERSISTENT, sender.getPriority(), sender.getTimeToLive());
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testJMSDeliveryModeInSelector:2");
+         // send a message in *persistent*
+         sender.send(message, DeliveryMode.PERSISTENT, sender.getPriority(), sender.getTimeToLive());
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("No message was received", msg != null);
+         // only the message sent in persistent mode should be received.
+         assertEquals(DeliveryMode.PERSISTENT, msg.getJMSDeliveryMode());
+         assertEquals("testJMSDeliveryModeInSelector:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that conversions that apply to the <code>get</code> methods for properties do not
+    * apply when a property is used in a message selector expression.
+    * Based on the example of chapter 3.8.1.1 about identifiers.
+    */
+   public void testIdentifierConversion()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "NumberOfOrders > 1");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setStringProperty("NumberOfOrders", "2");
+         dummyMessage.setText("testIdentifierConversion:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setIntProperty("NumberOfOrders", 2);
+         message.setText("testIdentifierConversion:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertEquals("testIdentifierConversion:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the message selector using the filter example provided by the JMS specifications.
+    * <br />
+    * <ul>
+    *   <li><code>"JMSType = 'car' AND color = 'blue' AND weight > 2500"</code></li>
+    * </ul>
+    */
+   public void testSelectorExampleFromSpecs()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue,
+               "JMSType = 'car' AND color = 'blue' AND weight > 2500");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setJMSType("car");
+         dummyMessage.setStringProperty("color", "red");
+         dummyMessage.setLongProperty("weight", 3000);
+         dummyMessage.setText("testSelectorExampleFromSpecs:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setJMSType("car");
+         message.setStringProperty("color", "blue");
+         message.setLongProperty("weight", 3000);
+         message.setText("testSelectorExampleFromSpecs:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertEquals("testSelectorExampleFromSpecs:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the ">" condition in message selector.
+    * <br />
+    * <ul>
+    *   <li><code>"weight > 2500"</code> is <code>true</code> for 3000 and <code>false</code> for 1000</li>
+    * </ul>
+    */
+   public void testGreaterThan()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "weight > 2500");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setLongProperty("weight", 1000);
+         dummyMessage.setText("testGreaterThan:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setLongProperty("weight", 3000);
+         message.setText("testGreaterThan:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertEquals("testGreaterThan:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the "=" condition in message selector.
+    * <br />
+    * <ul>
+    *   <li><code>"weight > 2500"</code>  is <code>true</code> for 2500 and <code>false</code> for 1000</li>
+    * </ul>
+    */
+   public void testEquals()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "weight = 2500");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setLongProperty("weight", 1000);
+         dummyMessage.setText("testEquals:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setLongProperty("weight", 2500);
+         message.setText("testEquals:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertEquals("testEquals:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the "<>" (not equal) condition in message selector.
+    * <br />
+    * <ul>
+    *   <li><code>"weight <> 2500"</code>  is <code>true</code> for 1000 and <code>false</code> for 2500</li>
+    * </ul>
+    */
+   public void testNotEquals()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "weight <> 2500");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setLongProperty("weight", 2500);
+         dummyMessage.setText("testEquals:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setLongProperty("weight", 1000);
+         message.setText("testEquals:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertEquals("testEquals:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the BETWEEN condition in message selector.
+    * <br />
+    * <ul>
+    *   <li>"age BETWEEN 15 and 19" is <code>true</code> for 17 and <code>false</code> for 20</li>
+    * </ul>
+    */
+   public void testBetween()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "age BETWEEN 15 and 19");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setIntProperty("age", 20);
+         dummyMessage.setText("testBetween:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setIntProperty("age", 17);
+         message.setText("testBetween:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("Message not received", msg != null);
+         assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testBetween"));
+         assertEquals("testBetween:2", msg.getText());
+
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the IN condition in message selector.
+    * <br />
+    * <ul>
+    *   <li>"Country IN ('UK', 'US', 'France')" is <code>true</code> for 'UK' and <code>false</code> for 'Peru'</li>
+    * </ul>
+    */
+   public void testIn()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "Country IN ('UK', 'US', 'France')");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setStringProperty("Country", "Peru");
+         dummyMessage.setText("testIn:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("Country", "UK");
+         message.setText("testIn:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("Message not received", msg != null);
+         assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testIn"));
+         assertEquals("testIn:2", msg.getText());
+
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the LIKE ... ESCAPE condition in message selector
+    * <br />
+    * <ul>
+    *   <li>"underscored LIKE '\_%' ESCAPE '\'" is <code>true</code> for '_foo' and <code>false</code> for 'bar'</li>
+    * </ul>
+    */
+   public void testLikeEscape()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "underscored LIKE '\\_%' ESCAPE '\\'");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setStringProperty("underscored", "bar");
+         dummyMessage.setText("testLikeEscape:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("underscored", "_foo");
+         message.setText("testLikeEscape:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("Message not received", msg != null);
+         assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testLikeEscape"));
+         assertEquals("testLikeEscape:2", msg.getText());
+
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the LIKE condition with '_' in the pattern.
+    * <br />
+    * <ul>
+    *   <li>"word LIKE 'l_se'" is <code>true</code> for 'lose' and <code>false</code> for 'loose'</li>
+    * </ul>
+    */
+   public void testLike_2()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "word LIKE 'l_se'");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setStringProperty("word", "loose");
+         dummyMessage.setText("testLike_2:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("word", "lose");
+         message.setText("testLike_2:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("Message not received", msg != null);
+         assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testLike_2"));
+         assertEquals("testLike_2:2", msg.getText());
+
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the LIKE condition with '%' in the pattern.
+    * <br />
+    * <ul>
+    *   <li>"phone LIKE '12%3'" is <code>true</code> for '12993' and <code>false</code> for '1234'</li>
+    * </ul>
+    */
+   public void testLike_1()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "phone LIKE '12%3'");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setStringProperty("phone", "1234");
+         dummyMessage.setText("testLike_1:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setStringProperty("phone", "12993");
+         message.setText("testLike_1:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue("Message not received", msg != null);
+         assertTrue("Message of another test: " + msg.getText(), msg.getText().startsWith("testLike_1"));
+         assertEquals("testLike_1:2", msg.getText());
+
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the <code>NULL</code> value in message selector.
+    * <br />
+    * <ul>
+    *   <li><code>"prop IS NULL"</code></li>
+    * </ul>
+    */
+   public void testNull()
+   {
+      try
+      {
+         receiverConnection.stop();
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         receiver = receiverSession.createReceiver(receiverQueue, "prop_name IS NULL");
+         receiverConnection.start();
+
+         TextMessage dummyMessage = senderSession.createTextMessage();
+         dummyMessage.setStringProperty("prop_name", "not null");
+         dummyMessage.setText("testNull:1");
+         sender.send(dummyMessage);
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testNull:2");
+         sender.send(message);
+
+         TextMessage msg = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue(msg != null);
+         assertEquals("testNull:2", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(SelectorTest.class);
+   }
+
+   public SelectorTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/selector/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+  <body>
+    Tests JMS <em>Selector</em> features.
+  </body>
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/QueueSessionTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/QueueSessionTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/QueueSessionTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,211 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.session;
+
+import javax.jms.InvalidDestinationException;
+import javax.jms.InvalidSelectorException;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Queue;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test queue sessions
+ * <br />
+ * See JMS specifications, �4.4 Session
+ * 
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: QueueSessionTest.java,v 1.2 2007/06/19 23:32:35 csuconic Exp $
+ */
+public class QueueSessionTest extends PTPTestCase
+{
+
+   /**
+    * Test that if we rollback a transaction which has consumed a message,
+    * the message is effectively redelivered.
+    */
+   public void testRollbackRececeivedMessage()
+   {
+      try
+      {
+         senderConnection.stop();
+         // senderSession has been created as non transacted
+         // we create it again but as a transacted session
+         senderSession = senderConnection.createQueueSession(true, 0);
+         assertEquals(true, senderSession.getTransacted());
+         // we create again the sender
+         sender = senderSession.createSender(senderQueue);
+         senderConnection.start();
+
+         receiverConnection.stop();
+         // receiverSession has been created as non transacted
+         // we create it again but as a transacted session
+         receiverSession = receiverConnection.createQueueSession(true, 0);
+         assertEquals(true, receiverSession.getTransacted());
+         
+         if (receiver!=null)
+         {
+        	 receiver.close();
+         }
+         // we create again the receiver
+         receiver = receiverSession.createReceiver(receiverQueue);
+         receiverConnection.start();
+
+         // we send a message...
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testRollbackRececeivedMessage");
+         sender.send(message);
+         // ... and commit the *producer* transaction
+         senderSession.commit();
+
+         // we receive a message...
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue(m != null);
+         assertTrue(m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         // ... which is the one which was sent...
+         assertEquals("testRollbackRececeivedMessage", msg.getText());
+         // ...and has not been redelivered
+         assertEquals(false, msg.getJMSRedelivered());
+
+         // we rollback the *consumer* transaction
+         receiverSession.rollback();
+
+         // we receive again a message
+         m = receiver.receive(TestConfig.TIMEOUT);
+         assertTrue(m != null);
+         assertTrue(m instanceof TextMessage);
+         msg = (TextMessage) m;
+         // ... which is still the one which was sent...
+         assertEquals("testRollbackRececeivedMessage", msg.getText());
+         // .. but this time, it has been redelivered
+         assertEquals(true, msg.getJMSRedelivered());
+
+      }
+      catch (Exception e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createBrowser()</code> method with an invalid
+    * messaeg session throws a <code>javax.jms.InvalidSelectorException</code>.
+    */
+   public void testCreateBrowser_2()
+   {
+      try
+      {
+         senderSession.createBrowser(senderQueue, "definitely not a message selector!");
+         fail("Should throw a javax.jms.InvalidSelectorException.\n");
+      }
+      catch (InvalidSelectorException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidSelectorException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createBrowser()</code> method with an invalid
+    * <code>Queue</code> throws a <code>javax.jms.InvalidDestinationException</code>.
+    */
+   public void testCreateBrowser_1()
+   {
+      try
+      {
+         senderSession.createBrowser((Queue) null);
+         fail("Should throw a javax.jms.InvalidDestinationException.\n");
+      }
+      catch (InvalidDestinationException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidDestinationException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createReceiver()</code> method with an invalid
+    * message selector throws a <code>javax.jms.InvalidSelectorException</code>.
+    */
+   public void testCreateReceiver_2()
+   {
+      try
+      {
+         receiver = senderSession.createReceiver(senderQueue, "definitely not a message selector!");
+         fail("Should throw a javax.jms.InvalidSelectorException.\n");
+      }
+      catch (InvalidSelectorException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidSelectorException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createReceiver()</code> method with an invalid
+    * <code>Queue</code> throws a <code>javax.jms.InvalidDestinationException</code>>
+    */
+   public void testCreateReceiver_1()
+   {
+      try
+      {
+         receiver = senderSession.createReceiver((Queue) null);
+         fail("Should throw a javax.jms.InvalidDestinationException.\n");
+      }
+      catch (InvalidDestinationException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidDestinationException, not a " + e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(QueueSessionTest.class);
+   }
+
+   public QueueSessionTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/SessionTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/SessionTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/SessionTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,340 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.session;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PTPTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test sessions
+ * <br />
+ * See JMS specifications, �4.4 Session
+ * 
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: SessionTest.java,v 1.2 2007/06/19 23:32:35 csuconic Exp $
+ */
+public class SessionTest extends PTPTestCase
+{
+
+   /**
+    * Test that an attempt to call the <code>recover()</code> method on a 
+    * <strong>transacted </strong> <code>Session</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    */
+   public void testRecoverTransactedSession()
+   {
+      try
+      {
+         // senderSession has been created as non transacted
+         assertEquals(false, senderSession.getTransacted());
+         // we create it again but as a transacted session
+         senderSession = senderConnection.createQueueSession(true, 0);
+         assertEquals(true, senderSession.getTransacted());
+         senderSession.recover();
+         fail("Should raise an IllegalStateException, the session is not transacted.\n");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a java.lang.IllegalStateException.\n");
+      }
+      catch (Exception e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>rollback()</code> method on a 
+    * <strong>transacted</strong> <code>Session</code> rollbacks all
+    * the messages sent in the transaction.
+    */
+   public void testRollbackTransactedSession()
+   {
+      try
+      {
+         // re-create senderSession as a transacted session
+         senderSession = senderConnection.createQueueSession(true, 0);
+         sender = senderSession.createSender(senderQueue);
+         assertEquals(true, senderSession.getTransacted());
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testRollbackTransactedSession");
+         // send a message within a transacted session
+         sender.send(message);
+
+         // rollback the transaction -> the sent message shouldn't be received
+         senderSession.rollback();
+
+         TextMessage m = (TextMessage) receiver.receiveNoWait();
+         // test that no message has been received
+         assertEquals(null, m);
+      }
+      catch (Exception e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>rollback()</code> method on a 
+    * <strong>transacted</strong> <code>Session</code> rollbacks all
+    * the messages sent in the transaction.
+    */
+   public void testCommitTransactedSession()
+   {
+      try
+      {
+         // re-create senderSession as a transacted session
+         senderSession = senderConnection.createQueueSession(true, 0);
+         sender = senderSession.createSender(senderQueue);
+         assertEquals(true, senderSession.getTransacted());
+
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testCommitTransactedSession");
+         // send a message within a transacted session
+         sender.send(message);
+
+         TextMessage m = (TextMessage) receiver.receiveNoWait();
+         // test that no message has been received (the transaction has not been committed yet)
+         assertEquals(null, m);
+
+         // commit the transaction -> the sent message should be received
+         senderSession.commit();
+
+         m = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         assertTrue(m != null);
+         assertEquals("testCommitTransactedSession", m.getText());
+      }
+      catch (Exception e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that an attempt to call the <code>roolback()</code> method on a 
+    * <strong>non transacted</strong> <code>Session</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    */
+   public void testRollbackNonTransactedSession()
+   {
+      try
+      {
+         // senderSession has been created as non transacted in the setUp() method
+         assertEquals(false, senderSession.getTransacted());
+         senderSession.rollback();
+         fail("Should raise an IllegalStateException, the session is not transacted.\n");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a java.lang.IllegalStateException.\n");
+      }
+      catch (Exception e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that an attempt to call the <code>commit()</code> method on a 
+    * <strong>non transacted</strong> <code>Session</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    */
+   public void testCommitNonTransactedSession()
+   {
+      try
+      {
+         // senderSession has been created as non transacted in the setUp() method
+         assertEquals(false, senderSession.getTransacted());
+         senderSession.commit();
+         fail("Should raise an IllegalStateException, the session is not transacted.\n");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a java.lang.IllegalStateException.\n");
+      }
+      catch (Exception e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that the <code>getTransacted()</code> method of a <code>Session</code> returns <code>true</code>
+    * if the session is transacted, <code>false</code> else.
+    */
+   public void testGetTransacted()
+   {
+      try
+      {
+         // senderSession has been created as non transacted
+         assertEquals(false, senderSession.getTransacted());
+         // we re-create senderSession as a transacted session
+         senderSession = senderConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
+         assertEquals(true, senderSession.getTransacted());
+      }
+      catch (Exception e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that invoking the <code>acknowledge()</code> method of a received message 
+    * from a closed session must throw an <code>IllegalStateException</code>.
+    */
+   public void testAcknowledge()
+   {
+      try
+      {
+    	 if (receiverSession!=null)
+    	 {
+    		 receiverSession.close();
+    	 }
+         receiverSession = receiverConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
+         receiver = receiverSession.createReceiver(receiverQueue);
+
+         Message message = senderSession.createMessage();
+         sender.send(message);
+
+         Message m = receiver.receive(TestConfig.TIMEOUT);
+         receiverSession.close();
+         m.acknowledge();
+         fail("�4.4.1 Invoking the acknowledge method of a received message from a closed "
+               + " session must throw an [javax.jms.]IllegalStateException.\n");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("�4.4.1 Invoking the acknowledge method of a received message from a closed "
+               + "session must throw an [javax.jms.]IllegalStateException, "
+               + "[not a java.lang.IllegalStateException]");
+      }
+   }
+
+   /** 
+    * Test that it is valid to use message objects created or received via the [closed] session with the
+    * exception of a received message <code>acknowledge()</code> method.
+    */
+   public void testUseMessage()
+   {
+      try
+      {
+         TextMessage message = senderSession.createTextMessage();
+         message.setText("testUseMessage");
+         sender.send(message);
+
+         TextMessage m = (TextMessage) receiver.receive(TestConfig.TIMEOUT);
+         receiverSession.close();
+         assertEquals("testUseMessage", m.getText());
+      }
+      catch (Exception e)
+      {
+         fail("�4.4.1 It is valid to continue to use message objects created or received via "
+               + "the [closed] session.\n");
+      }
+   }
+
+   /**
+    * Test that an attempt to use a <code>Session</code> which has been closed
+    * throws a <code>javax.jms.IllegalStateException</code>.
+    */
+   public void testUsedClosedSession()
+   {
+      try
+      {
+         senderSession.close();
+         senderSession.createMessage();
+         fail("�4.4.1 An attempt to use [a closed session] must throw a [javax.jms.]IllegalStateException.\n");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a " + e);
+      }
+      catch (java.lang.IllegalStateException e)
+      {
+         fail("Should raise a javax.jms.IllegalStateException, not a java.lang.IllegalStateException");
+      }
+   }
+
+   /**
+    * Test that closing a closed session does <strong>not</strong> throw
+    * an exception.
+    */
+   public void testCloseClosedSession()
+   {
+      try
+      {
+         // senderSession is already started
+         // we close it once
+         senderSession.close();
+         // we close it a second time
+         senderSession.close();
+      }
+      catch (Exception e)
+      {
+         fail("�4.4.1 Closing a closed session must NOT throw an exception.\n");
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(SessionTest.class);
+   }
+
+   public SessionTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/TopicSessionTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/TopicSessionTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/TopicSessionTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,253 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): Andreas Mueller <am at iit.de>.
+ */
+
+package org.objectweb.jtests.jms.conform.session;
+
+import javax.jms.InvalidDestinationException;
+import javax.jms.InvalidSelectorException;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PubSubTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test topic sessions
+ * <br />
+ * See JMS specifications, �4.4 Session
+ * 
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: TopicSessionTest.java,v 1.2 2007/06/19 23:32:35 csuconic Exp $
+ */
+public class TopicSessionTest extends PubSubTestCase
+{
+
+   /**
+    * Test that if we rollback a transaction which has consumed a message,
+    * the message is effectively redelivered.
+    */
+   public void testRollbackReceivedMessage()
+   {
+      try
+      {
+         publisherConnection.stop();
+         // publisherSession has been declared has non transacted
+         // we recreate it as a transacted session
+         publisherSession = publisherConnection.createTopicSession(true, 0);
+         assertEquals(true, publisherSession.getTransacted());
+         // we also recreate the publisher
+         publisher = publisherSession.createPublisher(publisherTopic);
+         publisherConnection.start();
+
+         subscriberConnection.stop();
+         // subscriberSession has been declared has non transacted
+         // we recreate it as a transacted session
+         subscriberSession = subscriberConnection.createTopicSession(true, 0);
+         assertEquals(true, subscriberSession.getTransacted());
+         // we also recreate the subscriber
+         subscriber = subscriberSession.createSubscriber(subscriberTopic);
+         subscriberConnection.start();
+
+         // we create a message...
+         TextMessage message = publisherSession.createTextMessage();
+         message.setText("testRollbackReceivedMessage");
+         // ... publish it ...
+         publisher.publish(message);
+         // ... and commit the transaction
+         publisherSession.commit();
+
+         // we receive it
+         Message msg1 = subscriber.receive(TestConfig.TIMEOUT);
+         assertTrue("no message received", msg1 != null);
+         assertTrue(msg1 instanceof TextMessage);
+         assertEquals("testRollbackReceivedMessage", ((TextMessage) msg1).getText());
+
+         // we rollback the transaction of subscriberSession
+         subscriberSession.rollback();
+
+         // we expect to receive a second time the message
+         Message msg2 = subscriber.receive(TestConfig.TIMEOUT);
+         assertTrue("no message received after rollbacking subscriber session.", msg2 != null);
+         assertTrue(msg2 instanceof TextMessage);
+         assertEquals("testRollbackReceivedMessage", ((TextMessage) msg2).getText());
+
+         // finally we commit the subscriberSession transaction
+         subscriberSession.commit();
+      }
+      catch (Exception e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a durable subscriber effectively receives the messages sent to its
+    * topic while it was inactive.
+    */
+   public void testDurableSubscriber()
+   {
+      try
+      {
+         subscriber = subscriberSession.createDurableSubscriber(subscriberTopic, "testTopic");
+         subscriberConnection.close();
+         subscriberConnection = null;
+
+         TextMessage message = publisherSession.createTextMessage();
+         message.setText("test");
+         publisher.publish(message);
+
+         subscriberConnection = subscriberTCF.createTopicConnection();
+         subscriberConnection.setClientID("subscriberConnection");
+         subscriberSession = subscriberConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
+         subscriber = subscriberSession.createDurableSubscriber(subscriberTopic, "testTopic");
+         subscriberConnection.start();
+
+         TextMessage m = (TextMessage) subscriber.receive(TestConfig.TIMEOUT);
+         assertTrue(m != null);
+         assertEquals("test", m.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test the unsubscription of a durable subscriber.
+    */
+   public void testUnsubscribe()
+   {
+      try
+      {
+         subscriber = subscriberSession.createDurableSubscriber(subscriberTopic, "topic");
+         subscriber.close();
+         // nothing should happen when unsubscribing the durable subscriber
+         subscriberSession.unsubscribe("topic");
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createDurableSubscriber()</code> method with an invalid
+    * message selector throws a <code>javax.jms.InvalidSelectorException</code>.
+    */
+   public void testCreateDurableSubscriber_2()
+   {
+      try
+      {
+         subscriberSession
+               .createDurableSubscriber(subscriberTopic, "topic", "definitely not a message selector!", true);
+         fail("Should throw a javax.jms.InvalidSelectorException.\n");
+      }
+      catch (InvalidSelectorException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidSelectorException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createDurableSubscriber()</code> method with an invalid
+    * <code>Topic</code> throws a <code>javax.jms.InvalidDestinationException</code>.
+    */
+   public void testCreateDurableSubscriber_1()
+   {
+      try
+      {
+         subscriberSession.createDurableSubscriber((Topic) null, "topic");
+         fail("Should throw a javax.jms.InvalidDestinationException.\n");
+      }
+      catch (InvalidDestinationException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidDestinationException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createSubscriber()</code> method with an invalid
+    * message selector throws a <code>javax.jms.InvalidSelectorException</code>.
+    */
+   public void testCreateSubscriber_2()
+   {
+      try
+      {
+         subscriberSession.createSubscriber(subscriberTopic, "definitely not a message selector!", true);
+         fail("Should throw a javax.jms.InvalidSelectorException.\n");
+      }
+      catch (InvalidSelectorException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidSelectorException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to the <code>createSubscriber()</code> method with an invalid
+    * <code>Topic</code> throws a <code>javax.jms.InvalidDestinationException</code>.
+    */
+   public void testCreateSubscriber_1()
+   {
+      try
+      {
+         subscriberSession.createSubscriber((Topic) null);
+         fail("Should throw a javax.jms.InvalidDestinationException.\n");
+      }
+      catch (InvalidDestinationException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.InvalidDestinationException, not a " + e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(TopicSessionTest.class);
+   }
+
+   public TopicSessionTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/UnifiedSessionTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/UnifiedSessionTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/UnifiedSessionTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,316 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.session;
+
+import javax.jms.JMSException;
+import javax.jms.QueueConnection;
+import javax.jms.QueueSession;
+import javax.jms.ServerSessionPool;
+import javax.jms.Session;
+import javax.jms.TopicConnection;
+import javax.jms.TopicSession;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.jboss.util.NestedRuntimeException;
+import org.objectweb.jtests.jms.framework.UnifiedTestCase;
+
+/**
+ * Test unified JMS 1.1 sessions.
+ * <br />
+ * See JMS 1.1 specifications
+ * 
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: UnifiedSessionTest.java,v 1.1 2007/03/29 04:28:37 starksm Exp $
+ * @since JMS 1.1
+ */
+public class UnifiedSessionTest extends UnifiedTestCase
+{
+
+   /**
+    * QueueConnection
+    */
+   protected QueueConnection queueConnection;
+
+   /**
+    * QueueSession (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected QueueSession queueSession;
+
+   /**
+    * TopicConnection
+    */
+   protected TopicConnection topicConnection;
+
+   /**
+    * TopicSession (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected TopicSession topicSession;
+
+   /**
+    * Test that a call to <code>createDurableConnectionConsumer()</code> method 
+    * on a <code>QueueConnection</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testCreateDurableConnectionConsumerOnQueueConnection()
+   {
+      try
+      {
+         queueConnection.createDurableConnectionConsumer(topic, "subscriptionName", "", (ServerSessionPool) null, 1);
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to <code>createDurableSubscriber()</code> method 
+    * on a <code>QueueSession</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testCreateDurableSubscriberOnQueueSession()
+   {
+      try
+      {
+         queueSession.createDurableSubscriber(topic, "subscriptionName");
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to <code>createTemporaryTopic()</code> method 
+    * on a <code>QueueSession</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testCreateTemporaryTopicOnQueueSession()
+   {
+      try
+      {
+         queueSession.createTemporaryTopic();
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to <code>createTopic()</code> method 
+    * on a <code>QueueSession</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testCreateTopicOnQueueSession()
+   {
+      try
+      {
+         queueSession.createTopic("topic_name");
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to <code>unsubscribe()</code> method 
+    * on a <code>QueueSession</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testUnsubscribeOnQueueSession()
+   {
+      try
+      {
+         queueSession.unsubscribe("subscriptionName");
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to <code>createBrowser()</code> method 
+    * on a <code>TopicSession</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testCreateBrowserOnTopicSession()
+   {
+      try
+      {
+         topicSession.createBrowser(queue);
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to <code>createQueue()</code> method 
+    * on a <code>TopicSession</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testCreateQueueOnTopicSession()
+   {
+      try
+      {
+         topicSession.createQueue("queue_name");
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   /**
+    * Test that a call to <code>createTemporaryQueue()</code> method 
+    * on a <code>TopicSession</code> throws a 
+    * <code>javax.jms.IllegalStateException</code>.
+    * (see JMS 1.1 specs, table 4-1).
+    * 
+    * @since JMS 1.1
+    */
+   public void testCreateTemporaryQueueOnTopicSession()
+   {
+      try
+      {
+         topicSession.createTemporaryQueue();
+         fail("Should throw a javax.jms.IllegalStateException");
+      }
+      catch (javax.jms.IllegalStateException e)
+      {
+      }
+      catch (JMSException e)
+      {
+         fail("Should throw a javax.jms.IllegalStateException, not a " + e);
+      }
+   }
+
+   public void setUp()
+   {
+      super.setUp();
+      try
+      {
+         queueConnection = queueConnectionFactory.createQueueConnection();
+         queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
+         topicConnection = topicConnectionFactory.createTopicConnection();
+         topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
+
+         queueConnection.start();
+         topicConnection.start();
+      }
+      catch (Exception e)
+      {
+         throw new NestedRuntimeException(e);
+      }
+   }
+
+   public void tearDown()
+   {
+      try
+      {
+         queueConnection.close();
+         topicConnection.close();
+      }
+      catch (Exception ignored)
+      {
+      }
+      finally
+      {
+         queueConnection = null;
+         queueSession = null;
+         topicConnection = null;
+         topicSession = null;
+         super.tearDown();
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(UnifiedSessionTest.class);
+   }
+
+   public UnifiedSessionTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/session/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,4 @@
+  <body>
+    Tests JMS <em>Session</em> features.
+  </body>
+  

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/TemporaryTopicTest.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/TemporaryTopicTest.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/TemporaryTopicTest.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,99 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.conform.topic;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.TemporaryTopic;
+import javax.jms.TextMessage;
+import javax.jms.TopicSubscriber;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.objectweb.jtests.jms.framework.PubSubTestCase;
+import org.objectweb.jtests.jms.framework.TestConfig;
+
+/**
+ * Test the <code>javax.jms.TemporaryTopic</code> features.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: TemporaryTopicTest.java,v 1.1 2007/03/29 04:28:34 starksm Exp $
+ */
+public class TemporaryTopicTest extends PubSubTestCase
+{
+
+   private TemporaryTopic tempTopic;
+
+   private TopicSubscriber tempSubscriber;
+
+   /**
+    * Test a TemporaryTopic
+    */
+   public void testTemporaryTopic()
+   {
+      try
+      {
+         // we stop both publisher and subscriber connections
+         publisherConnection.stop();
+         subscriberConnection.stop();
+         // we create a temporary topic to receive messages
+         tempTopic = subscriberSession.createTemporaryTopic();
+         // we recreate the sender because it has been 
+         // already created with another Destination as parameter
+         publisher = publisherSession.createPublisher(tempTopic);
+         // we create a temporary subscriber on the temporary topic
+         tempSubscriber = subscriberSession.createSubscriber(tempTopic);
+         subscriberConnection.start();
+         publisherConnection.start();
+
+         TextMessage message = publisherSession.createTextMessage();
+         message.setText("testTemporaryTopic");
+         publisher.publish(message);
+
+         Message m = tempSubscriber.receive(TestConfig.TIMEOUT);
+         assertTrue(m instanceof TextMessage);
+         TextMessage msg = (TextMessage) m;
+         assertEquals("testTemporaryTopic", msg.getText());
+      }
+      catch (JMSException e)
+      {
+         fail(e);
+      }
+   }
+
+   /** 
+    * Method to use this class in a Test suite
+    */
+   public static Test suite()
+   {
+      return new TestSuite(TemporaryTopicTest.class);
+   }
+
+   public TemporaryTopicTest(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/conform/topic/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+  <body>
+    Tests JMS <em>Topic</em> features.
+  </body>
\ No newline at end of file

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/JMSTestCase.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/JMSTestCase.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/JMSTestCase.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,91 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.framework;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.jms.JMSException;
+
+import junit.framework.TestCase;
+
+/**
+ * Class extending <code>junit.framework.TestCase</code> to
+ * provide a new <code>fail()</code> method with an <code>Exception</code>
+ * as parameter.
+ *<br />
+ * Every Test Case for JMS should extend this class instead of <code>junit.framework.TestCase</code>
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: JMSTestCase.java,v 1.2 2007/07/19 21:20:08 csuconic Exp $
+ */
+public class JMSTestCase extends TestCase
+{
+    private static final String PROP_FILE_NAME = "provider.properties";
+	   
+   /**
+    * Fails a test with an exception which will be used for a message.
+    * 
+    * If the exception is an instance of <code>javax.jms.JMSException</code>, the
+    * message of the failure will contained both the JMSException and its linked exception
+    * (provided there's one).
+    */
+   public void fail(Exception e)
+   {
+      if (e instanceof javax.jms.JMSException)
+      {
+         JMSException exception = (JMSException) e;
+         String message = e.toString();
+         Exception linkedException = exception.getLinkedException();
+         if (linkedException != null)
+         {
+            message += " [linked exception: " + linkedException + "]";
+         }
+         super.fail(message);
+      }
+      else
+      {
+         super.fail(e.getMessage());
+      }
+   }
+
+   public JMSTestCase(String name)
+   {
+      super(name);
+   }
+
+   /**
+    * Should be overriden 
+    * @return
+    */
+   protected Properties getProviderProperties()
+   throws IOException
+   {
+       Properties props = new Properties();
+       props.load(ClassLoader.getSystemResourceAsStream(PROP_FILE_NAME));
+	   return props;
+   }
+
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PTPTestCase.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PTPTestCase.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PTPTestCase.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,194 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.framework;
+
+import java.util.Properties;
+
+import javax.jms.Queue;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.QueueReceiver;
+import javax.jms.QueueSender;
+import javax.jms.QueueSession;
+import javax.jms.Session;
+import javax.naming.InitialContext;
+
+import org.jboss.util.NestedRuntimeException;
+import org.objectweb.jtests.jms.admin.Admin;
+import org.objectweb.jtests.jms.admin.AdminFactory;
+
+/**
+ * Creates convenient Point to Point JMS objects which can be needed for tests.
+ * <br />
+ * This class defines the setUp and tearDown methods so
+ * that JMS administrated objects and  other "ready to use" PTP objects (that is to say queues,
+ * sessions, senders and receviers) are available conveniently for the test cases.
+ * <br />
+ * Classes which want that convenience should extend <code>PTPTestCase</code> instead of 
+ * <code>JMSTestCase</code>.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: PTPTestCase.java,v 1.1 2007/03/29 04:28:35 starksm Exp $
+ */
+public class PTPTestCase extends JMSTestCase
+{
+
+   protected Admin admin;
+
+   protected InitialContext ctx;
+
+   private static final String QCF_NAME = "testQCF";
+
+   private static final String QUEUE_NAME = "testJoramQueue";
+
+   /**
+    * Queue used by a sender
+    */
+   protected Queue senderQueue;
+
+   /**
+    * Sender on queue
+    */
+   protected QueueSender sender;
+
+   /**
+    * QueueConnectionFactory of the sender
+    */
+   protected QueueConnectionFactory senderQCF;
+
+   /**
+    * QueueConnection of the sender
+    */
+   protected QueueConnection senderConnection;
+
+   /**
+    * QueueSession of the sender (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected QueueSession senderSession;
+
+   /**
+    * Queue used by a receiver
+    */
+   protected Queue receiverQueue;
+
+   /**
+    * Receiver on queue
+    */
+   protected QueueReceiver receiver;
+
+   /**
+    * QueueConnectionFactory of the receiver
+    */
+   protected QueueConnectionFactory receiverQCF;
+
+   /**
+    * QueueConnection of the receiver
+    */
+   protected QueueConnection receiverConnection;
+
+   /**
+    * QueueSession of the receiver (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected QueueSession receiverSession;
+
+   /**
+    * Create all administrated objects connections and sessions ready to use for tests.
+    * <br />
+    * Start connections.
+    */
+   protected void setUp()
+   {
+      try
+      {
+         // Admin step
+         // gets the provider administration wrapper...
+    	 Properties props = getProviderProperties();
+         admin = AdminFactory.getAdmin(props);
+         // ...and creates administrated objects and binds them
+         admin.createQueueConnectionFactory(QCF_NAME);
+         admin.createQueue(QUEUE_NAME);
+
+         // end of admin step, start of JMS client step
+         ctx = admin.createInitialContext();
+
+         senderQCF = (QueueConnectionFactory) ctx.lookup(QCF_NAME);
+         senderQueue = (Queue) ctx.lookup(QUEUE_NAME);
+         senderConnection = senderQCF.createQueueConnection();
+         senderSession = senderConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
+         sender = senderSession.createSender(senderQueue);
+
+         receiverQCF = (QueueConnectionFactory) ctx.lookup(QCF_NAME);
+         receiverQueue = (Queue) ctx.lookup(QUEUE_NAME);
+         receiverConnection = receiverQCF.createQueueConnection();
+         receiverSession = receiverConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
+         receiver = receiverSession.createReceiver(receiverQueue);
+
+         senderConnection.start();
+         receiverConnection.start();
+         //end of client step
+      }
+      catch (Exception e)
+      {
+         throw new NestedRuntimeException(e);
+      }
+   }
+
+   /**
+    *  Close connections and delete administrated objects
+    */
+   protected void tearDown()
+   {
+      try
+      {
+         senderConnection.close();
+         receiverConnection.close();
+
+         admin.deleteQueueConnectionFactory(QCF_NAME);
+         admin.deleteQueue(QUEUE_NAME);
+      }
+      catch (Exception ignored)
+      {
+      }
+      finally
+      {
+         senderQueue = null;
+         sender = null;
+         senderQCF = null;
+         senderSession = null;
+         senderConnection = null;
+
+         receiverQueue = null;
+         receiver = null;
+         receiverQCF = null;
+         receiverSession = null;
+         receiverConnection = null;
+      }
+   }
+
+   public PTPTestCase(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PubSubTestCase.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PubSubTestCase.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/PubSubTestCase.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,196 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.framework;
+
+import java.util.Properties;
+
+import javax.jms.Session;
+import javax.jms.Topic;
+import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
+import javax.jms.TopicPublisher;
+import javax.jms.TopicSession;
+import javax.jms.TopicSubscriber;
+import javax.naming.InitialContext;
+
+import org.jboss.util.NestedRuntimeException;
+import org.objectweb.jtests.jms.admin.Admin;
+import org.objectweb.jtests.jms.admin.AdminFactory;
+
+/**
+ * Creates convenient JMS Publish/Subscribe objects which can be needed for tests.
+ * <br />
+ * This class defines the setUp and tearDown methods so
+ * that JMS administrated objects and  other "ready to use" Pub/Sub objects (that is to say topics,
+ * sessions, publishers and subscribers) are available conveniently for the test cases.
+ * <br />
+ * Classes which want that convenience should extend <code>PubSubTestCase</code> instead of 
+ * <code>JMSTestCase</code>.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: PubSubTestCase.java,v 1.2 2007/06/19 23:32:35 csuconic Exp $
+ */
+public class PubSubTestCase extends JMSTestCase
+{
+
+   private Admin admin;
+
+   private InitialContext ctx;
+
+   private static final String TCF_NAME = "testTCF";
+
+   private static final String TOPIC_NAME = "testJoramTopic";
+
+   /**
+    * Topic used by a publisher
+    */
+   protected Topic publisherTopic;
+
+   /**
+    * Publisher on queue
+    */
+   protected TopicPublisher publisher;
+
+   /**
+    * TopicConnectionFactory of the publisher
+    */
+   protected TopicConnectionFactory publisherTCF;
+
+   /**
+    * TopicConnection of the publisher
+    */
+   protected TopicConnection publisherConnection;
+
+   /**
+    * TopicSession of the publisher (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected TopicSession publisherSession;
+
+   /**
+    * Topic used by a subscriber
+    */
+   protected Topic subscriberTopic;
+
+   /**
+    * Subscriber on queue
+    */
+   protected TopicSubscriber subscriber;
+
+   /**
+    * TopicConnectionFactory of the subscriber
+    */
+   protected TopicConnectionFactory subscriberTCF;
+
+   /**
+    * TopicConnection of the subscriber
+    */
+   protected TopicConnection subscriberConnection;
+
+   /**
+    * TopicSession of the subscriber (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected TopicSession subscriberSession;
+
+   /**
+    * Create all administrated objects connections and sessions ready to use for tests.
+    * <br />
+    * Start connections.
+    */
+   protected void setUp()
+   {
+      try
+      {
+         // Admin step
+         // gets the provider administration wrapper...
+     	 Properties props = getProviderProperties();
+         admin = AdminFactory.getAdmin(props);
+         // ...and creates administrated objects and binds them
+         admin.createTopicConnectionFactory(TCF_NAME);
+         admin.createTopic(TOPIC_NAME);
+
+         // end of admin step, start of JMS client step
+         ctx = admin.createInitialContext();
+
+         publisherTCF = (TopicConnectionFactory) ctx.lookup(TCF_NAME);
+         publisherTopic = (Topic) ctx.lookup(TOPIC_NAME);
+         publisherConnection = publisherTCF.createTopicConnection();
+         publisherConnection.setClientID("publisherConnection");
+         publisherSession = publisherConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
+         publisher = publisherSession.createPublisher(publisherTopic);
+
+         subscriberTCF = (TopicConnectionFactory) ctx.lookup(TCF_NAME);
+         subscriberTopic = (Topic) ctx.lookup(TOPIC_NAME);
+         subscriberConnection = subscriberTCF.createTopicConnection();
+         subscriberConnection.setClientID("subscriberConnection");
+         subscriberSession = subscriberConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
+         subscriber = subscriberSession.createSubscriber(subscriberTopic);
+
+         publisherConnection.start();
+         subscriberConnection.start();
+         //end of client step
+      }
+      catch (Exception e)
+      {
+         throw new NestedRuntimeException(e);
+      }
+   }
+
+   /**
+    *  Close connections and delete administrated objects
+    */
+   protected void tearDown()
+   {
+      try
+      {
+         publisherConnection.close();
+         subscriberConnection.close();
+
+         admin.deleteTopicConnectionFactory(TCF_NAME);
+         admin.deleteTopic(TOPIC_NAME);
+      }
+      catch (Exception ignored)
+      {
+      }
+      finally
+      {
+         publisherTopic = null;
+         publisher = null;
+         publisherTCF = null;
+         publisherSession = null;
+         publisherConnection = null;
+
+         subscriberTopic = null;
+         subscriber = null;
+         subscriberTCF = null;
+         subscriberSession = null;
+         subscriberConnection = null;
+      }
+   }
+
+   public PubSubTestCase(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/TestConfig.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/TestConfig.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/TestConfig.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,70 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.framework;
+
+import java.util.Properties;
+
+/**
+ * Class used to provide configurable options in a convenient way
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: TestConfig.java,v 1.2 2007/06/14 18:39:51 csuconic Exp $
+ */
+public class TestConfig
+{
+   // name of the configuration file
+   private static final String PROP_FILE_NAME = "test.properties";
+
+   // name of the timeout property
+   private static final String PROP_NAME = "timeout";
+
+   /**
+    * timeout value used by <code>receive</code> method in the tests. 
+    * the value is specified in the <code>config/test.properties</code> file.
+    */
+   public static final long TIMEOUT;
+
+   static
+   {
+      // load tests.properties	 
+      long tempTimeOut = 0;
+      try
+      {
+         Properties props = new Properties();
+         props.load(ClassLoader.getSystemResourceAsStream(PROP_FILE_NAME));
+         System.out.println("Found " + PROP_FILE_NAME);
+         tempTimeOut = Long.parseLong(props.getProperty(PROP_NAME, "0"));
+      }
+      catch (Exception e)
+      {
+    	 e.printStackTrace();
+         tempTimeOut = 30000;
+      }
+      finally
+      {
+         TIMEOUT = tempTimeOut;
+      }
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/UnifiedTestCase.java
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/UnifiedTestCase.java	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/UnifiedTestCase.java	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,263 @@
+/*
+ * JORAM: Java(TM) Open Reliable Asynchronous Messaging
+ * Copyright (C) 2002 INRIA
+ * Contact: joram-team at objectweb.org
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+ * USA
+ * 
+ * Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+ * Contributor(s): ______________________________________.
+ */
+
+package org.objectweb.jtests.jms.framework;
+
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.Session;
+import javax.jms.Topic;
+import javax.jms.TopicConnectionFactory;
+import javax.naming.InitialContext;
+
+import org.jboss.util.NestedRuntimeException;
+import org.objectweb.jtests.jms.admin.Admin;
+import org.objectweb.jtests.jms.admin.AdminFactory;
+
+/**
+ * Creates convenient Unified JMS 1.1 objects which can be needed for tests.
+ * <br />
+ * This class defines the setUp and tearDown methods so
+ * that JMS administrated objects and  other "ready to use" JMS objects (that is to say destinations,
+ * sessions, producers and consumers) are available conveniently for the test cases.
+ * <br />
+ * Classes which want that convenience should extend <code>UnifiedTestCase</code> instead of 
+ * <code>JMSTestCase</code>.
+ *
+ * @author Jeff Mesnil (jmesnil at inrialpes.fr)
+ * @version $Id: UnifiedTestCase.java,v 1.1 2007/03/29 04:28:35 starksm Exp $
+ * @since JMS 1.1
+ */
+public class UnifiedTestCase extends JMSTestCase
+{
+
+   protected Admin admin;
+
+   protected InitialContext ctx;
+
+   private static final String CF_NAME = "testCF";
+
+   private static final String TCF_NAME = "testTCF";
+
+   private static final String QCF_NAME = "testQCF";
+
+   private static final String DESTINATION_NAME = "testDestination";
+
+   private static final String QUEUE_NAME = "testJoramQueue";
+
+   private static final String TOPIC_NAME = "testJoramTopic";
+
+   ////////////////////
+   // Unified Domain //
+   ////////////////////
+
+   /**
+    * Destination used by a producer
+    */
+   protected Destination producerDestination;
+
+   /**
+    * Producer
+    */
+   protected MessageProducer producer;
+
+   /**
+    * ConnectionFactory of the producer
+    */
+   protected ConnectionFactory producerCF;
+
+   /**
+    * Connection of the producer
+    */
+   protected Connection producerConnection;
+
+   /**
+    * Session of the producer (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected Session producerSession;
+
+   /**
+    * Destination used by a consumer
+    */
+   protected Destination consumerDestination;
+
+   /**
+    * Consumer on destination
+    */
+   protected MessageConsumer consumer;
+
+   /**
+    * ConnectionFactory of the consumer
+    */
+   protected ConnectionFactory consumerCF;
+
+   /**
+    * Connection of the consumer
+    */
+   protected Connection consumerConnection;
+
+   /**
+    * Session of the consumer (non transacted, AUTO_ACKNOWLEDGE)
+    */
+   protected Session consumerSession;
+
+   ////////////////
+   // PTP Domain //
+   ////////////////
+
+   /**
+    * QueueConnectionFactory
+    */
+   protected QueueConnectionFactory queueConnectionFactory;
+
+   /**
+    * Queue
+    */
+   protected Queue queue;
+
+   ////////////////////
+   // Pub/Sub Domain //
+   ////////////////////
+
+   /**
+    * TopicConnectionFactory
+    */
+   protected TopicConnectionFactory topicConnectionFactory;
+
+   /**
+    * Topic
+    */
+   protected Topic topic;
+
+   /**
+    * Create all administrated objects connections and sessions ready to use for tests.
+    * <br />
+    * Start connections.
+    */
+   protected void setUp()
+   {
+      try
+      {
+         // Admin step
+         // gets the provider administration wrapper...
+      	 Properties props = getProviderProperties();
+         admin = AdminFactory.getAdmin(props);
+         // ...and creates administrated objects and binds them
+         admin.createConnectionFactory(CF_NAME);
+         admin.createQueueConnectionFactory(QCF_NAME);
+         admin.createTopicConnectionFactory(TCF_NAME);
+         // destination for unified domain is a queue
+         admin.createQueue(DESTINATION_NAME);
+         admin.createQueue(QUEUE_NAME);
+         admin.createTopic(TOPIC_NAME);
+
+         // end of admin step, start of JMS client step
+         ctx = admin.createInitialContext();
+
+         producerCF = (ConnectionFactory) ctx.lookup(CF_NAME);
+         // we see destination of the unified domain as a javax.jms.Destination
+         // instead of a javax.jms.Queue to be more generic
+         producerDestination = (Destination) ctx.lookup(DESTINATION_NAME);
+         producerConnection = producerCF.createConnection();
+         producerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+         producer = producerSession.createProducer(producerDestination);
+
+         consumerCF = (ConnectionFactory) ctx.lookup(CF_NAME);
+         // we see destination of the unified domain as a javax.jms.Destination
+         // instead of a javax.jms.Queue to be more generic
+         consumerDestination = (Destination) ctx.lookup(DESTINATION_NAME);
+         consumerConnection = consumerCF.createConnection();
+         consumerSession = consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+         consumer = consumerSession.createConsumer(consumerDestination);
+
+         queueConnectionFactory = (QueueConnectionFactory) ctx.lookup(QCF_NAME);
+         queue = (Queue) ctx.lookup(QUEUE_NAME);
+
+         topicConnectionFactory = (TopicConnectionFactory) ctx.lookup(TCF_NAME);
+         topic = (Topic) ctx.lookup(TOPIC_NAME);
+
+         producerConnection.start();
+         consumerConnection.start();
+         //end of client step
+      }
+      catch (Exception e)
+      {
+         throw new NestedRuntimeException(e);
+      }
+   }
+
+   /**
+    *  Close connections and delete administrated objects
+    */
+   protected void tearDown()
+   {
+      try
+      {
+         consumerConnection.close();
+         producerConnection.close();
+
+         admin.deleteConnectionFactory(CF_NAME);
+         admin.deleteQueueConnectionFactory(QCF_NAME);
+         admin.deleteTopicConnectionFactory(TCF_NAME);
+         admin.deleteQueue(DESTINATION_NAME);
+         admin.deleteQueue(QUEUE_NAME);
+         admin.deleteTopic(TOPIC_NAME);
+      }
+      catch (Exception ignored)
+      {
+      }
+      finally
+      {
+         producerDestination = null;
+         producer = null;
+         producerCF = null;
+         producerSession = null;
+         producerConnection = null;
+
+         consumerDestination = null;
+         consumer = null;
+         consumerCF = null;
+         consumerSession = null;
+         consumerConnection = null;
+
+         queueConnectionFactory = null;
+         queue = null;
+
+         topicConnectionFactory = null;
+         topic = null;
+      }
+   }
+
+   public UnifiedTestCase(String name)
+   {
+      super(name);
+   }
+}

Added: projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/package.html
===================================================================
--- projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/package.html	                        (rev 0)
+++ projects/joram-tests/trunk/src/main/java/org/objectweb/jtests/jms/framework/package.html	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,3 @@
+<body>
+Extension of JUnit Testing framework to take into account JMS specific features.
+</body>

Added: projects/joram-tests/trunk/src/resources/provider.properties
===================================================================
--- projects/joram-tests/trunk/src/resources/provider.properties	                        (rev 0)
+++ projects/joram-tests/trunk/src/resources/provider.properties	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,35 @@
+## 
+# JORAM: Java(TM) Open Reliable Asynchronous Messaging
+# Copyright (C) 2002 INRIA
+# Contact: joram-team at objectweb.org
+# 
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+# USA
+#
+# Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+# Contributor(s): ______________________________________.
+##
+
+##
+# This property is used to chose which provider is to be tested
+# Uncomment the chosen provider and comment the other ones
+##
+
+jms.provider.admin.class = org.jboss.test.jms.GenericAdmin
+#jms.provider.admin.class = org.objectweb.jtests.providers.admin.JoramAdmin
+#jms.provider.admin.class = org.objectweb.jtests.providers.admin.AshnaMQAdmin
+#jms.provider.admin.class = org.objectweb.jtests.providers.admin.FioranoMQAdmin
+#jms.provider.admin.class = org.objectweb.jtests.providers.admin.PramatiAdmin
+#jms.provider.admin.class = org.objectweb.jtests.providers.admin.SwiftMQAdmin
\ No newline at end of file

Added: projects/joram-tests/trunk/src/resources/test.properties
===================================================================
--- projects/joram-tests/trunk/src/resources/test.properties	                        (rev 0)
+++ projects/joram-tests/trunk/src/resources/test.properties	2010-01-21 00:14:16 UTC (rev 99689)
@@ -0,0 +1,29 @@
+## 
+# JORAM: Java(TM) Open Reliable Asynchronous Messaging
+# Copyright (C) 2002 INRIA
+# Contact: joram-team at objectweb.org
+# 
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+# USA
+#
+# Initial developer(s): Jeff Mesnil (jmesnil at inrialpes.fr)
+# Contributor(s): ______________________________________.
+##
+
+# Timeout specified for receive(long time) method
+# Time in milliseconds or 0 for never expiring
+# Default is set to 30 seconds (long enough to receive slow messages
+# and won't hang up tests infinitely)
+timeout = 30000
\ No newline at end of file




More information about the jboss-cvs-commits mailing list