The SystemSetup annotation is used to run import data, synchronize catalogues, migrate CMS components and execute Java code during every project or essential data creation step.
In all hybris version up to 1905 the essential and project data steps aren't run during the initialization of the junit tenant. This prevents the import of common test data for complex integration tests if you weren't using the Areco deployment script manager as patch system. To get an updated picture of the current situation, I ran a test on the latest SAP hybris version 1905 and here are the results are the same as with old versions:
SystemSetup.Process | INIT | UPDATE | ALL | . | ||||||
---|---|---|---|---|---|---|---|---|---|---|
SystemSetup.Type | ESSENTIAL | PROJECT | ALL | ESSENTIAL | PROJECT | ALL | ESSENTIAL | PROJECT | ALL | What Hybris impexes are imported? |
ant initialize -Dtenant=master | Called once with process INIT and type ESSENTIAL | Called once with process INIT and type PROJECT | Called twice with process INIT and type ESSENTIAL and with process INIT and type PROJECT | No call | Called once with process INIT and type ESSENTIAL | Called once with process INIT and type PROJECT | Called twice with process INIT and type ESSENTIAL and with process INIT and type PROJECT | Project and essential scripts | ||
ant initialize -Dtenant=junit | No call | None | ||||||||
ant yunitinit | No call | None | ||||||||
ant updatesystem -Dtenant=master1) | No call | Called once with process UPDATE and type ESSENTIAL | Called once with process UPDATE and type PROJECT | Called twice with process UPDATE and type ESSENTIAL and with process UPDATE and type PROJECT | Called once with process UPDATE and type ESSENTIAL | Called once with process UPDATE and type PROJECT | Called twice with process INIT and type ESSENTIAL and with process INIT and type PROJECT | Project and essential scripts | ||
ant updatesystem -Dtenant=junit2) | No call | None | ||||||||
ant yunitupdate | No call | None |
When @SystemSetup(extension = ArecosystemsetuptestConstants.EXTENSIONNAME), the field hybrisContext.getExtensionName() always contains the name of the current extension.
When @SystemSetup(extension = “ALL_EXTENSIONS”) is used, the methods annotated with @SystemSetup are called as above once or twice per each hybris and custom extension. Each time the field hybrisContext.getExtensionName() contains the name of a different extension.
Because the majority of the SAP hybris projects use Jenkins and ant targets to deploy, update system and initialization using HAC wasn't tested.
The method de.hybris.ant.taskdefs.InitPlatformAntPerformableImpl#performImpl checks if the current tenant is named junit and runs an initialization without essential and project data. This also happens with the update system. Please see the code of UpdatePlatformAntPerformableImpl.
I created a new extension based on the templa yempty and added the property initialpassword.admin=nimda to the local.properies. Then I created a class for the test and annotated at class level with:
@SystemSetup(extension = ArecosystemsetuptestConstants.EXTENSIONNAME) public class SystemSetupAnnotationCallsTest {
Each method contains the following code for all possible combinations of process and type:
@SystemSetup(process = SystemSetup.Process.UPDATE, type = SystemSetup.Type.ESSENTIAL) public void logUpdateEssential(final SystemSetupContext hybrisContext) { LOG.error(String.format("Called Update Essential with extension %s, process %s and type %s", hybrisContext.getExtensionName(), hybrisContext.getProcess(), hybrisContext.getType())); }
To make hybris call the methods, I had to create a bean definition in the spring application context. Autowiring without the XML bean definition wasn't working.
<bean id="systemSetupAnnotationCallsTest" class="org.areco.ecommerce.tests.systemsetup.setup.SystemSetupAnnotationCallsTest" />
I created a JSON configuration for the update running system which runs the create project data step: updatesystemconfigfile.json
I ran the following commands and I analysed the log afterwards:
rm -rf hybris/data/ ant clean all ant initialize -Dtenant=master | tee initializeMaster.log | grep SystemSetupAnnotationCallsTest ant initialize -Dtenant=junit | tee initializeJunit.log | grep SystemSetupAnnotationCallsTest ant yunitinit | tee yunitinit.log | grep SystemSetupAnnotationCallsTest ant updatesystem -Dtenant=master -DconfigFile=/home/arobirosa/no_backup/areco/arecodeploymentscriptsmanager-1905/hybris/bin/custom/arecosystemsetuptest/resources/updateSystemConfigFile.json | tee updateMaster.log | grep SystemSetupAnnotationCallsTest ant updatesystem -Dtenant=yunit -DconfigFile=/home/arobirosa/no_backup/areco/arecodeploymentscriptsmanager-1905/hybris/bin/custom/arecosystemsetuptest/resources/updateSystemConfigFile.json | tee updateJunit.log | grep SystemSetupAnnotationCallsTest ant yunitupdate -DconfigFile=/home/arobirosa/no_backup/areco/arecodeploymentscriptsmanager-1905/hybris/bin/custom/arecosystemsetuptest/resources/updateSystemConfigFile.json | tee yunitUpdate.log | grep SystemSetupAnnotationCallsTest
Source code: SystemSetupAnnotationCallsTest.java updatesystemconfigfile.json
– Based on SAP hybris 1905