What I think is important is that any java code should be in a Java source
file that is compiled as part of a build. Don't put java source or bytecode
in as resource or as a constant.

For testing deploy jar I thought what Helena and I ended up doing in
StartServerCommandDUnitTest worked pretty well - build a jar from a class
on the classpath:

File jar = temporaryFolder.newFile(jarName);
new ClassBuilder().writeJarFromClass(RunOutOfMemoryFunction.class, jar);

-Dan

On Fri, Oct 12, 2018 at 3:32 PM Patrick Rhomberg <prhomb...@apache.org>
wrote:

> Hello, all!
>
>   There are a number of classes that require some number of "toy" classes
> as part of their testing framework, e.g., to be used as custom data
> containers.  Many of these classes involve testing or use of the `deploy
> jar` command, and so are packaged into jars for this purpose.
>   In an effort to promote good coding habits and, as importantly, consensus
> throughout this community and our codebase, I would like to ask which of
> these are considered the preferred method to maintain these additional
> classes.
>   I realize a priori that none of these options will be applicable in all
> cases, but am curious of how the prioritization of these options are
> ordered among you all.
>
> -- Class definition --
> For definition of the classes consumed, we observe all of the following in
> the Geode codebase.
>
> Option C-1:  Toy classes are defined as a proper class in a reasonable
> package.
> -- suboption (a): The class is defined in the module in which it is
> consumed, as a resource.  [1]
> -- suboption (b): The class is defined in the module in which it is
> consumed, as a neighboring file.  [2]
> -- suboption (c): The class is defined in geode-dunit or geode-junit.  [3]
>
> Option C-2:  Toy classes are defined as inner classes of the test class.
> [4]
>
> Option C-3:  Sufficiently small toy classes are defined as raw String
> fields in the test class that consumed it and is compiled by the test JVM
> via the JavaCompiler class.  [5]
>
> -- Resource exposure --
> For those tests that require classes placed in Jars for use in the `deploy
> jar` command, we observe the following in the Geode codebase:
>
> Option J-1: Jars are a resource and are built or downloaded as necessary
> during the build steps, before test execution. [6]
>
> Option J-2:  Sufficiently small classes that are defined as raw String
> fields in the test class that consumes it (C-3 above) are packaged into
> resources via the JarBuilder class. [7]
>
>
> I look forward to hearing your opinions.
>
> Imagination is Change.
> ~Patrick Rhomberg
>
> Examples:
> [1]
>
> geode-core_test/resources:org.apache.geode.management.internal.deployment.ConcreteExtendsAbstractExtendsFunctionAdapter.java
> is found by the FunctionScannerTest to be a user-defined function.
> [2]
>
> geode-core_distributedTest:org.apache.geode.internal.cache.SerializableMonth
> defines a simple DataSerializable containing an int for the month, to be
> consumed by *.MonthBasedPartitionResolver
> in PRCustomPartitioningDistributedTest.
> [3] geode-junit_main:org.apache.geode.cache.query.transaction.Person
> defines a simple DataSerilazable container class for a String name and int
> age.
> [4]
>
> geode-core_distributedTest:java.org.apache.geode.internal.statistics.StatisticsDistributedTest$PubSubStats
> is consumed by its parent class
> [5]
>
> geode-assembly_acceptanceTest:org.apache.geode.management.internal.cli.commands.PutCommandWithJsonTest
> defines a Customer class in a raw string in the test's @Before method.
> [6] See our own consumption of geode-dependencies.jar et al via the
> StartMemberUtils.java, or our historic consumption of tools.jar
> [7] See again [5] or other uses of the JarBuilder class.
>

Reply via email to