diff --git a/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/JpaCleaner.java b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/JpaCleaner.java new file mode 100644 index 0000000000..a6171b6f51 --- /dev/null +++ b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/JpaCleaner.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2012-2016 Codenvy, S.A. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Codenvy, S.A. - initial API and implementation + *******************************************************************************/ +package org.eclipse.che.commons.test.tck; + +import javax.inject.Inject; +import javax.persistence.EntityManagerFactory; + +/** + * This class is designed to close {@link EntityManagerFactory} + * on finish of tck test with jpa implementation. + * + *

+ * Examples of usage:
+ * bind(TckResourcesCleaner.class).to(JpaCleaner.class)
+ * bind(TckResourcesCleaner.class).annotatedWith(Names.named(MyTckTest.class.getName())).to(JpaCleaner.class); + * + * @author Sergii Leschenko + */ +public class JpaCleaner implements TckResourcesCleaner { + @Inject + private EntityManagerFactory entityManagerFactory; + + @Override + public void clean() { + entityManagerFactory.close(); + } +} diff --git a/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModuleFactory.java b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckListener.java similarity index 52% rename from core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModuleFactory.java rename to core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckListener.java index 8802f12b25..4735583c1d 100644 --- a/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModuleFactory.java +++ b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckListener.java @@ -11,23 +11,35 @@ package org.eclipse.che.commons.test.tck; import com.google.inject.AbstractModule; +import com.google.inject.ConfigurationException; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Key; import com.google.inject.Module; +import com.google.inject.name.Names; -import org.testng.IModuleFactory; import org.testng.ITestContext; +import org.testng.ITestNGMethod; import java.util.Iterator; import java.util.ServiceLoader; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static java.lang.String.format; /** - * The factory is designed to instantiate {@link TckModule tck modules} - * using {@link ServiceLoader} mechanism. The components - * provided by those modules will be injected into a test class - * whether it's necessary to do so. + * The listener is designed to instantiate {@link TckModule tck modules} + * using {@link ServiceLoader} mechanism. The components provided by those + * modules will be injected into a test class whether it's necessary to do so. + * For each test class will be used new instance of injector. + * Listener requires tck test to be in own separated suite, if it finds more tests + * in suite it'll throw {@link IllegalArgumentException} on suite start. + * After test suite is finished listener'll try to find test specific or common + * instance of {@link TckResourcesCleaner}. It is optional and can be bound in modules. * - *

The factory expects at least one implementation of {@code TckModule} + *

The listener expects at least one implementation of {@code TckModule} * to be configured, if it doesn't find any of the {@code TckModule} * implementations then it will report an appropriate exception * and TckTest will fail(as it requires components to be injected into it). @@ -38,9 +50,8 @@ import static java.lang.String.format; *

  * package org.eclipse.mycomponent;
  *
- * @org.testng.annotations.Guice(moduleFactory = TckModuleFactory.class)
- * // Good practice to define suiteName for TCK tests as it makes easier
- * // to implement logic related to certain tests in ITestNGListener implementations
+ * @org.testng.annotations.Listeners(TckListener)
+ * // Tck test must have own suite because of cleaning resources on suite finishing
  * @org.testng.annotations.Test(suiteName = "MySuite")
  * class SubjectTest {
  *
@@ -59,6 +70,8 @@ import static java.lang.String.format;
  *     public void configure() {
  *         bind(Component1.class).to(...);
  *         bind(Component2.class).toInstance(new Component2(() -> testContext.getAttribute("server_url").toString()));
+ *         bind(TckResourcesCleaner.class).to(...);
+ *         bind(TckResourcesCleaner.class).annotatedWith(Names.named(SubjectTest.class.getName())).to(...);
  *     }
  * }
  *
@@ -87,22 +100,69 @@ import static java.lang.String.format;
  * 
* * @author Yevhenii Voevodin - * @see org.testng.annotations.Guice - * @see IModuleFactory + * @author Sergii Leschenko + * @see org.testng.annotations.Listeners + * @see org.testng.IInvokedMethodListener + * @see TckResourcesCleaner */ -public class TckModuleFactory implements IModuleFactory { +public class TckListener extends AbstractTestListener { + private Injector injector; + private Object instance; @Override - public Module createModule(ITestContext context, Class testClass) { + public void onStart(ITestContext context) { + final Set instances = Stream.of(context.getAllTestMethods()) + .map(ITestNGMethod::getInstance) + .collect(Collectors.toSet()); + + if (instances.size() != 1) { + throw new IllegalStateException("Tck test should be one and only one in suite."); + } + + instance = instances.iterator().next(); + + injector = Guice.createInjector(createModule(context, instance.getClass().getName())); + injector.injectMembers(instance); + } + + @Override + public void onFinish(ITestContext context) { + if (injector == null || instance == null) { + throw new IllegalStateException("Looks like onFinish method is invoked before onStart."); + } + + // try to get test specific resources cleaner + TckResourcesCleaner resourcesCleaner = getResourcesCleaner(injector, + Key.get(TckResourcesCleaner.class, + Names.named(instance.getClass().getName()))); + if (resourcesCleaner == null) { + // try to get common resources cleaner + resourcesCleaner = getResourcesCleaner(injector, Key.get(TckResourcesCleaner.class)); + } + + if (resourcesCleaner != null) { + resourcesCleaner.clean(); + } + } + + private TckResourcesCleaner getResourcesCleaner(Injector injector, Key key) { + try { + return injector.getInstance(key); + } catch (ConfigurationException ignored) { + } + return null; + } + + private Module createModule(ITestContext testContext, String name) { final Iterator moduleIterator = ServiceLoader.load(TckModule.class).iterator(); if (!moduleIterator.hasNext()) { throw new IllegalStateException(format("Couldn't find a TckModule configuration. " + "You probably forgot to configure resources/META-INF/services/%s, or even " + "provide an implementation of the TckModule which is required by the tck test class %s", TckModule.class.getName(), - testClass.getName())); + name)); } - return new CompoundModule(context, moduleIterator); + return new CompoundModule(testContext, moduleIterator); } private static class CompoundModule extends AbstractModule { diff --git a/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModule.java b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModule.java index 26dcb8bbdb..b63ae2fcaa 100644 --- a/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModule.java +++ b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckModule.java @@ -13,7 +13,6 @@ package org.eclipse.che.commons.test.tck; import com.google.inject.AbstractModule; import com.google.inject.Module; -import org.testng.IModuleFactory; import org.testng.ITestContext; import java.util.ServiceLoader; @@ -26,20 +25,18 @@ import java.util.ServiceLoader; * and for injecting them later. So each module which is TCK module must * provide the implementations list(as described by {@code ServiceLoader} mechanism) * in the file named org.eclipse.che.commons.test.tck.TckModule usually under - * test/resources/META-INF/services directory, then the {@link TckModuleFactory} + * test/resources/META-INF/services directory, then the {@link TckListener} * will recognise and load it. * * @author Yevhenii Voevodin - * @see TckModuleFactory + * @see TckListener */ public abstract class TckModule extends AbstractModule { /** * It is guaranteed that this field is always present and - * can be reused by implementation, the value is equal to the - * {@link IModuleFactory#createModule(ITestContext, Class)} first - * parameter and will be set by {@link TckModuleFactory} immediately after module - * implementation is loaded by {@link ServiceLoader}. + * can be reused by implementation, it will be set by {@link TckListener} immediately + * after module implementation is loaded by {@link ServiceLoader}. */ private ITestContext testContext; @@ -50,7 +47,7 @@ public abstract class TckModule extends AbstractModule { /** * Sets the context of currently executing test suite. - * This method designed to be used by {@link TckModuleFactory} for setting + * This method designed to be used by {@link TckListener} for setting * the context before installing modules. */ void setTestContext(ITestContext testContext) { diff --git a/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckResourcesCleaner.java b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckResourcesCleaner.java new file mode 100644 index 0000000000..17fc661236 --- /dev/null +++ b/core/commons/che-core-commons-test/src/main/java/org/eclipse/che/commons/test/tck/TckResourcesCleaner.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2012-2016 Codenvy, S.A. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Codenvy, S.A. - initial API and implementation + *******************************************************************************/ +package org.eclipse.che.commons.test.tck; + +/** + * This class is designed to clean up resources after tck test. + * + *

Implementation should be defined in {@link TckModule}. + * It can be defined common for all tests or test specific by using @Named annotation. + * Cleaning of resources is invoked after finish of all tests methods from one test suite + * that should contains one and only one tck test class. + * + *

The usage example: + *

+ * class MyTckModule extends TckModule {
+ *     public void configure() {
+ *         bind(TckResourcesCleaner.class).to(...);
+ *         bind(TckResourcesCleaner.class).annotatedWith(Names.named(SomeTest.class.getName())).to(...);
+ *     }
+ * }
+ * 
+ * + * @author Sergii Leschenko + * @see TckListener + */ +public interface TckResourcesCleaner { + /** + * Clean up resources. + * + *

Note: it is invoked after finish of all methods from one test suite. + */ + void clean(); +} diff --git a/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/DBServerListener.java b/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/DBServerListener.java index 9930b24a4f..7b8b7a8ce8 100644 --- a/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/DBServerListener.java +++ b/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/DBServerListener.java @@ -11,8 +11,6 @@ package org.eclipse.che.commons.test.tck; import org.testng.ITestContext; -import org.testng.ITestListener; -import org.testng.ITestResult; /** * Listener representing fake db server url injection for testing "attributes sharing" diff --git a/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/TckComponentsTest.java b/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/TckComponentsTest.java index 706ac50b0e..285f25fb83 100644 --- a/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/TckComponentsTest.java +++ b/core/commons/che-core-commons-test/src/test/java/org/eclipse/che/commons/test/tck/TckComponentsTest.java @@ -11,7 +11,7 @@ package org.eclipse.che.commons.test.tck; import org.eclipse.che.commons.test.tck.repository.TckRepository; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -24,7 +24,7 @@ import static org.testng.Assert.assertNotNull; * * @author Yevhenii Voevodin */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) public class TckComponentsTest { @Inject diff --git a/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/AccountDaoTest.java b/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/AccountDaoTest.java index 261feb370d..3482b32a15 100644 --- a/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/AccountDaoTest.java +++ b/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/AccountDaoTest.java @@ -14,12 +14,12 @@ import org.eclipse.che.account.spi.AccountDao; import org.eclipse.che.account.spi.AccountImpl; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.commons.lang.NameGenerator; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepositoryException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -32,7 +32,7 @@ import static org.testng.Assert.assertEquals; * * @author Sergii Leschenko */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = AccountDaoTest.SUITE_NAME) public class AccountDaoTest { public static final String SUITE_NAME = "AccountDaoTck"; diff --git a/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/jpa/AccountJpaTckModule.java b/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/jpa/AccountJpaTckModule.java index 8267a015a9..73079213d8 100644 --- a/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/jpa/AccountJpaTckModule.java +++ b/wsmaster/che-core-api-account/src/test/java/org/eclipse/che/account/spi/tck/jpa/AccountJpaTckModule.java @@ -18,7 +18,9 @@ import org.eclipse.che.account.spi.AccountImpl; import org.eclipse.che.account.spi.jpa.JpaAccountDao; import org.eclipse.che.api.core.jdbc.jpa.eclipselink.EntityListenerInjectionManagerInitializer; import org.eclipse.che.api.core.jdbc.jpa.guice.JpaInitializer; +import org.eclipse.che.commons.test.tck.JpaCleaner; import org.eclipse.che.commons.test.tck.TckModule; +import org.eclipse.che.commons.test.tck.TckResourcesCleaner; import org.eclipse.che.commons.test.tck.repository.JpaTckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepository; @@ -31,6 +33,8 @@ public class AccountJpaTckModule extends TckModule { install(new JpaPersistModule("main")); bind(JpaInitializer.class).asEagerSingleton(); bind(EntityListenerInjectionManagerInitializer.class).asEagerSingleton(); + bind(TckResourcesCleaner.class).to(JpaCleaner.class); + bind(new TypeLiteral>() {}).toInstance(new JpaTckRepository<>(AccountImpl.class)); bind(AccountDao.class).to(JpaAccountDao.class); diff --git a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/jpa/JpaTckModule.java b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/jpa/JpaTckModule.java index ae0932b0ee..18ac04fa8d 100644 --- a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/jpa/JpaTckModule.java +++ b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/jpa/JpaTckModule.java @@ -24,7 +24,9 @@ import org.eclipse.che.api.user.server.model.impl.ProfileImpl; import org.eclipse.che.api.user.server.model.impl.UserImpl; import org.eclipse.che.api.user.server.spi.ProfileDao; import org.eclipse.che.api.user.server.spi.UserDao; +import org.eclipse.che.commons.test.tck.JpaCleaner; import org.eclipse.che.commons.test.tck.TckModule; +import org.eclipse.che.commons.test.tck.TckResourcesCleaner; import org.eclipse.che.commons.test.tck.repository.JpaTckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.security.PasswordEncryptor; @@ -40,6 +42,7 @@ public class JpaTckModule extends TckModule { install(new JpaPersistModule("main")); bind(JpaInitializer.class).asEagerSingleton(); bind(EntityListenerInjectionManagerInitializer.class).asEagerSingleton(); + bind(TckResourcesCleaner.class).to(JpaCleaner.class); bind(new TypeLiteral>() {}).toInstance(new JpaTckRepository<>(UserImpl.class)); bind(new TypeLiteral>() {}).toInstance(new JpaTckRepository<>(FactoryImpl.class)); @@ -51,5 +54,6 @@ public class JpaTckModule extends TckModule { bind(FactoryDao.class).to(JpaFactoryDao.class); bind(PasswordEncryptor.class).to(SHA512PasswordEncryptor.class).in(Singleton.class); + } } diff --git a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/spi/tck/FactoryDaoTest.java b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/spi/tck/FactoryDaoTest.java index d02ecc0b04..c9df5b6dbd 100644 --- a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/spi/tck/FactoryDaoTest.java +++ b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/spi/tck/FactoryDaoTest.java @@ -39,11 +39,11 @@ import org.eclipse.che.api.workspace.server.model.impl.ServerConf2Impl; import org.eclipse.che.api.workspace.server.model.impl.SourceStorageImpl; import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl; import org.eclipse.che.commons.lang.Pair; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -65,7 +65,7 @@ import static org.testng.Assert.assertEquals; * * @author Anton Korneta */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = FactoryDaoTest.SUITE_NAME) public class FactoryDaoTest { diff --git a/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/jpa/JpaTckModule.java b/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/jpa/JpaTckModule.java index ff7e3c920b..d66a26bc59 100644 --- a/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/jpa/JpaTckModule.java +++ b/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/jpa/JpaTckModule.java @@ -19,7 +19,9 @@ import org.eclipse.che.api.machine.server.model.impl.SnapshotImpl; import org.eclipse.che.api.machine.server.recipe.RecipeImpl; import org.eclipse.che.api.machine.server.spi.RecipeDao; import org.eclipse.che.api.machine.server.spi.SnapshotDao; +import org.eclipse.che.commons.test.tck.JpaCleaner; import org.eclipse.che.commons.test.tck.TckModule; +import org.eclipse.che.commons.test.tck.TckResourcesCleaner; import org.eclipse.che.commons.test.tck.repository.JpaTckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepository; @@ -32,7 +34,7 @@ public class JpaTckModule extends TckModule { protected void configure() { install(new JpaPersistModule("main")); bind(JpaInitializer.class).asEagerSingleton(); - + bind(TckResourcesCleaner.class).to(JpaCleaner.class); bind(EntityListenerInjectionManagerInitializer.class).asEagerSingleton(); bind(new TypeLiteral>() {}).toInstance(new JpaTckRepository<>(RecipeImpl.class)); diff --git a/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/RecipeDaoTest.java b/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/RecipeDaoTest.java index d8c87154d8..6383aa8ab8 100644 --- a/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/RecipeDaoTest.java +++ b/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/RecipeDaoTest.java @@ -18,11 +18,11 @@ import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.machine.server.recipe.RecipeImpl; import org.eclipse.che.api.machine.server.spi.RecipeDao; import org.eclipse.che.commons.lang.NameGenerator; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -31,7 +31,6 @@ import java.util.HashSet; import java.util.List; import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -40,7 +39,7 @@ import static org.testng.Assert.assertTrue; * * @author Anton Korneta */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = RecipeDaoTest.SUITE_NAME) public class RecipeDaoTest { diff --git a/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/SnapshotDaoTest.java b/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/SnapshotDaoTest.java index 651fdad1be..28a8f6fab5 100644 --- a/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/SnapshotDaoTest.java +++ b/wsmaster/che-core-api-machine/src/test/java/org/eclipse/che/api/machine/server/spi/tck/SnapshotDaoTest.java @@ -18,13 +18,13 @@ import org.eclipse.che.api.machine.server.exception.SnapshotException; import org.eclipse.che.api.machine.server.model.impl.MachineSourceImpl; import org.eclipse.che.api.machine.server.model.impl.SnapshotImpl; import org.eclipse.che.api.machine.server.spi.SnapshotDao; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepositoryException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import java.util.HashSet; @@ -40,7 +40,7 @@ import static org.testng.Assert.fail; * * @author Yevhenii Voevodin */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = SnapshotDaoTest.SUITE_NAME) public class SnapshotDaoTest { diff --git a/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/jpa/SshTckModule.java b/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/jpa/SshTckModule.java index e70495dd86..1597e84437 100644 --- a/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/jpa/SshTckModule.java +++ b/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/jpa/SshTckModule.java @@ -18,7 +18,9 @@ import org.eclipse.che.api.core.jdbc.jpa.guice.JpaInitializer; import org.eclipse.che.api.ssh.server.model.impl.SshPairImpl; import org.eclipse.che.api.ssh.server.spi.SshDao; import org.eclipse.che.api.user.server.model.impl.UserImpl; +import org.eclipse.che.commons.test.tck.JpaCleaner; import org.eclipse.che.commons.test.tck.TckModule; +import org.eclipse.che.commons.test.tck.TckResourcesCleaner; import org.eclipse.che.commons.test.tck.repository.JpaTckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepository; @@ -37,5 +39,6 @@ public class SshTckModule extends TckModule { bind(JpaInitializer.class).asEagerSingleton(); bind(EntityListenerInjectionManagerInitializer.class).asEagerSingleton(); bind(org.eclipse.che.api.core.h2.jdbc.jpa.eclipselink.H2ExceptionHandler.class); + bind(TckResourcesCleaner.class).to(JpaCleaner.class); } } diff --git a/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/spi/tck/SshDaoTest.java b/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/spi/tck/SshDaoTest.java index ab046262c0..32afd6c1e6 100644 --- a/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/spi/tck/SshDaoTest.java +++ b/wsmaster/che-core-api-ssh/src/test/java/org/eclipse/che/api/ssh/server/spi/tck/SshDaoTest.java @@ -16,12 +16,12 @@ import org.eclipse.che.api.ssh.server.model.impl.SshPairImpl; import org.eclipse.che.api.ssh.server.spi.SshDao; import org.eclipse.che.api.user.server.model.impl.UserImpl; import org.eclipse.che.commons.lang.NameGenerator; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepositoryException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -41,10 +41,11 @@ import static org.testng.Assert.fail; * @author Mihail Kuznyetsov. * @author Yevhenii Voevodin */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = SshDaoTest.SUITE_NAME) public class SshDaoTest { - public static final String SUITE_NAME = "SshDaoTck"; + public static final String SUITE_NAME = "SshDaoTck"; + private static final int COUNT_OF_PAIRS = 6; private static final int COUNT_OF_USERS = 3; @@ -73,8 +74,8 @@ public class SshDaoTest { pairs = new SshPairImpl[COUNT_OF_PAIRS]; for (int i = 0; i < COUNT_OF_PAIRS; i++) { - pairs[i] = new SshPairImpl("owner" + i/3, // 3 each pairs share the same owner - "service" + i/2, // each 2 pairs share the same service + pairs[i] = new SshPairImpl("owner" + i / 3, // 3 each pairs share the same owner + "service" + i / 2, // each 2 pairs share the same service "name" + i, NameGenerator.generate("publicKey-", 20), NameGenerator.generate("privateKey-", 20)); @@ -107,8 +108,9 @@ public class SshDaoTest { public void shouldThrowNpeOnCreateIfSshPairIsNull() throws Exception { sshDao.create(null); } + @Test - public void shouldGetSshPairByNameOwnerAndService() throws Exception{ + public void shouldGetSshPairByNameOwnerAndService() throws Exception { SshPairImpl sshPair = pairs[0]; sshDao.get(sshPair.getOwner(), sshPair.getService(), sshPair.getName()); @@ -122,22 +124,22 @@ public class SshDaoTest { } @Test(expectedExceptions = NullPointerException.class) - public void shouldThrowNpeOnGetSshPairWhenOwnerIsNull() throws Exception{ + public void shouldThrowNpeOnGetSshPairWhenOwnerIsNull() throws Exception { sshDao.get(null, "service", "name"); } @Test(expectedExceptions = NullPointerException.class) - public void shouldThrowNpeOnGetSshPairWhenServiceIsNull() throws Exception{ + public void shouldThrowNpeOnGetSshPairWhenServiceIsNull() throws Exception { sshDao.get("owner", null, "name"); } @Test(expectedExceptions = NullPointerException.class) - public void shouldThrowNpeOnGetSshPairWhenNameIsNull() throws Exception{ + public void shouldThrowNpeOnGetSshPairWhenNameIsNull() throws Exception { sshDao.get("owner", "service", null); } @Test - public void shouldGetSshPairListByNameAndService() throws Exception{ + public void shouldGetSshPairListByNameAndService() throws Exception { SshPairImpl sshPair1 = pairs[0]; SshPairImpl sshPair2 = pairs[1]; assertEquals(sshPair1.getOwner(), sshPair2.getOwner(), "Owner must be the same"); @@ -153,12 +155,12 @@ public class SshDaoTest { } @Test(expectedExceptions = NullPointerException.class) - public void shouldThrowNpeOnGetSshPairsListWhenOwnerIsNull() throws Exception{ + public void shouldThrowNpeOnGetSshPairsListWhenOwnerIsNull() throws Exception { sshDao.get(null, "service"); } @Test(expectedExceptions = NullPointerException.class) - public void shouldThrowNpeOnGetSshPairsListWhenServiceIsNull() throws Exception{ + public void shouldThrowNpeOnGetSshPairsListWhenServiceIsNull() throws Exception { sshDao.get("owner", null); } diff --git a/wsmaster/che-core-api-user/pom.xml b/wsmaster/che-core-api-user/pom.xml index 10b970c56d..fd898ac870 100644 --- a/wsmaster/che-core-api-user/pom.xml +++ b/wsmaster/che-core-api-user/pom.xml @@ -72,10 +72,6 @@ org.eclipse.che.core che-core-commons-lang - - org.eclipse.che.core - che-core-commons-test - org.slf4j slf4j-api @@ -120,6 +116,11 @@ che-core-commons-json test + + org.eclipse.che.core + che-core-commons-test + test + org.eclipse.persistence eclipselink diff --git a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/jpa/JpaTckModule.java b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/jpa/JpaTckModule.java index ba380f2571..86bc5c50ac 100644 --- a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/jpa/JpaTckModule.java +++ b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/jpa/JpaTckModule.java @@ -12,6 +12,7 @@ package org.eclipse.che.api.user.server.jpa; import com.google.inject.Singleton; import com.google.inject.TypeLiteral; +import com.google.inject.name.Names; import com.google.inject.persist.jpa.JpaPersistModule; import org.eclipse.che.api.core.jdbc.jpa.eclipselink.EntityListenerInjectionManagerInitializer; @@ -21,13 +22,19 @@ import org.eclipse.che.api.user.server.model.impl.UserImpl; import org.eclipse.che.api.user.server.spi.PreferenceDao; import org.eclipse.che.api.user.server.spi.ProfileDao; import org.eclipse.che.api.user.server.spi.UserDao; +import org.eclipse.che.api.user.server.spi.tck.PreferenceDaoTest; +import org.eclipse.che.api.user.server.spi.tck.ProfileDaoTest; +import org.eclipse.che.api.user.server.spi.tck.UserDaoTest; import org.eclipse.che.commons.lang.Pair; +import org.eclipse.che.commons.test.tck.JpaCleaner; import org.eclipse.che.commons.test.tck.TckModule; +import org.eclipse.che.commons.test.tck.TckResourcesCleaner; import org.eclipse.che.commons.test.tck.repository.JpaTckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.security.PasswordEncryptor; import org.eclipse.che.security.SHA512PasswordEncryptor; +import javax.inject.Named; import java.util.Map; /** @@ -40,6 +47,7 @@ public class JpaTckModule extends TckModule { install(new JpaPersistModule("main")); bind(JpaInitializer.class).asEagerSingleton(); bind(EntityListenerInjectionManagerInitializer.class).asEagerSingleton(); + bind(TckResourcesCleaner.class).to(JpaCleaner.class); bind(new TypeLiteral>() {}).to(UserJpaTckRepository.class); bind(new TypeLiteral>() {}).toInstance(new JpaTckRepository<>(ProfileImpl.class)); diff --git a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/model/impl/DataObjectsTest.java b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/model/impl/DataObjectsTest.java index 4dafc5f7f0..a05a7ca6c1 100644 --- a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/model/impl/DataObjectsTest.java +++ b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/model/impl/DataObjectsTest.java @@ -124,7 +124,7 @@ public class DataObjectsTest { assertFalse(copy.getAttributes().containsKey("new-attribute")); } - @Test(dataProvider = "singleObjectProvider") + @Test(dataProvider = "reflexivenessProvider") @SuppressWarnings("all") public void testReflexiveness(Object obj) throws Exception { assertTrue(obj.equals(obj)); @@ -148,7 +148,7 @@ public class DataObjectsTest { assertTrue(object1.equals(object2)); } - @Test(dataProvider = "singleObjectProvider") + @Test(dataProvider = "reflexivenessProvider") @SuppressWarnings("all") public void testNotEqualityToNull(Object object) throws Exception { assertFalse(object.equals(null)); diff --git a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/PreferenceDaoTest.java b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/PreferenceDaoTest.java index 7a33c9121a..7f7b535b61 100644 --- a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/PreferenceDaoTest.java +++ b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/PreferenceDaoTest.java @@ -15,11 +15,11 @@ import com.google.common.collect.ImmutableMap; import org.eclipse.che.api.user.server.model.impl.UserImpl; import org.eclipse.che.api.user.server.spi.PreferenceDao; import org.eclipse.che.commons.lang.Pair; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -39,7 +39,7 @@ import static org.testng.Assert.assertTrue; * * @author Anton Korneta */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = PreferenceDaoTest.SUITE_NAME) public class PreferenceDaoTest { diff --git a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/ProfileDaoTest.java b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/ProfileDaoTest.java index 201d76b2cd..ef3541b37f 100644 --- a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/ProfileDaoTest.java +++ b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/ProfileDaoTest.java @@ -19,12 +19,12 @@ import org.eclipse.che.api.user.server.model.impl.ProfileImpl; import org.eclipse.che.api.user.server.model.impl.UserImpl; import org.eclipse.che.api.user.server.spi.ProfileDao; import org.eclipse.che.commons.lang.NameGenerator; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepositoryException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -40,7 +40,7 @@ import static org.testng.Assert.assertEquals; * * @author Yevhenii Voevodin */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = ProfileDaoTest.SUITE_NAME) public class ProfileDaoTest { @@ -56,7 +56,7 @@ public class ProfileDaoTest { @Inject private TckRepository profileTckRepository; @Inject - private TckRepository userTckRepository; + private TckRepository userTckRepository; @BeforeMethod private void setUp() throws TckRepositoryException { diff --git a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/UserDaoTest.java b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/UserDaoTest.java index 12a2ffaf4b..c61e8ccc3c 100644 --- a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/UserDaoTest.java +++ b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/spi/tck/UserDaoTest.java @@ -18,12 +18,12 @@ import org.eclipse.che.api.user.server.Constants; import org.eclipse.che.api.user.server.model.impl.UserImpl; import org.eclipse.che.api.user.server.spi.UserDao; import org.eclipse.che.commons.lang.NameGenerator; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepositoryException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -42,7 +42,7 @@ import static org.testng.AssertJUnit.assertTrue; * * @author Yevhenii Voevodin */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = UserDaoTest.SUITE_NAME) public class UserDaoTest { diff --git a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/jpa/WorkspaceTckModule.java b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/jpa/WorkspaceTckModule.java index dc3e5187bd..fa800fde80 100644 --- a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/jpa/WorkspaceTckModule.java +++ b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/jpa/WorkspaceTckModule.java @@ -20,7 +20,9 @@ import org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl; import org.eclipse.che.api.workspace.server.model.impl.stack.StackImpl; import org.eclipse.che.api.workspace.server.spi.StackDao; import org.eclipse.che.api.workspace.server.spi.WorkspaceDao; +import org.eclipse.che.commons.test.tck.JpaCleaner; import org.eclipse.che.commons.test.tck.TckModule; +import org.eclipse.che.commons.test.tck.TckResourcesCleaner; import org.eclipse.che.commons.test.tck.repository.JpaTckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepository; @@ -35,6 +37,7 @@ public class WorkspaceTckModule extends TckModule { bind(JpaInitializer.class).asEagerSingleton(); bind(EntityListenerInjectionManagerInitializer.class).asEagerSingleton(); bind(org.eclipse.che.api.core.h2.jdbc.jpa.eclipselink.H2ExceptionHandler.class); + bind(TckResourcesCleaner.class).to(JpaCleaner.class); bind(new TypeLiteral>() {}).toInstance(new JpaTckRepository<>(AccountImpl.class)); bind(new TypeLiteral>() {}).toInstance(new JpaTckRepository<>(WorkspaceImpl.class)); diff --git a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/StackDaoTest.java b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/StackDaoTest.java index 3b4948ceb9..d64f7d496e 100644 --- a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/StackDaoTest.java +++ b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/StackDaoTest.java @@ -24,12 +24,12 @@ import org.eclipse.che.api.workspace.server.model.impl.stack.StackImpl; import org.eclipse.che.api.workspace.server.model.impl.stack.StackSourceImpl; import org.eclipse.che.api.workspace.server.spi.StackDao; import org.eclipse.che.api.workspace.server.stack.image.StackIcon; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepositoryException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import java.util.Collections; @@ -46,7 +46,7 @@ import static org.testng.Assert.assertTrue; * * @author Yevhenii Voevodin */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = StackDaoTest.SUITE_NAME) public class StackDaoTest { @@ -228,7 +228,7 @@ public class StackDaoTest { @Test public void shouldPublishStackPersistedEventAfterStackIsPersisted() throws Exception { - final boolean[] isNotified = new boolean[] { false }; + final boolean[] isNotified = new boolean[] {false}; eventService.subscribe(event -> isNotified[0] = true, StackPersistedEvent.class); stackDao.create(createStack("test", "test")); @@ -244,19 +244,19 @@ public class StackDaoTest { private static StackImpl createStack(String id, String name) { final StackImpl stack = StackImpl.builder() - .setId(id) - .setName(name) - .setCreator("user123") - .setDescription(id + "-description") - .setScope(id + "-scope") - .setTags(asList(id + "-tag1", id + "-tag2")) - .setComponents(asList(new StackComponentImpl(id + "-component1", id + "-component1-version"), - new StackComponentImpl(id + "-component2", id + "-component2-version"))) - .setSource(new StackSourceImpl(id + "-type", id + "-origin")) - .setStackIcon(new StackIcon(id + "-icon", - id + "-media-type", - "0x1234567890abcdef".getBytes())) - .build(); + .setId(id) + .setName(name) + .setCreator("user123") + .setDescription(id + "-description") + .setScope(id + "-scope") + .setTags(asList(id + "-tag1", id + "-tag2")) + .setComponents(asList(new StackComponentImpl(id + "-component1", id + "-component1-version"), + new StackComponentImpl(id + "-component2", id + "-component2-version"))) + .setSource(new StackSourceImpl(id + "-type", id + "-origin")) + .setStackIcon(new StackIcon(id + "-icon", + id + "-media-type", + "0x1234567890abcdef".getBytes())) + .build(); final WorkspaceConfigImpl config = createWorkspaceConfig("test"); stack.setWorkspaceConfig(config); return stack; diff --git a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/WorkspaceDaoTest.java b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/WorkspaceDaoTest.java index 6baeec5b4c..254afc946f 100644 --- a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/WorkspaceDaoTest.java +++ b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/spi/tck/WorkspaceDaoTest.java @@ -28,12 +28,12 @@ import org.eclipse.che.api.workspace.server.model.impl.SourceStorageImpl; import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl; import org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl; import org.eclipse.che.api.workspace.server.spi.WorkspaceDao; -import org.eclipse.che.commons.test.tck.TckModuleFactory; +import org.eclipse.che.commons.test.tck.TckListener; import org.eclipse.che.commons.test.tck.repository.TckRepository; import org.eclipse.che.commons.test.tck.repository.TckRepositoryException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Guice; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import javax.inject.Inject; @@ -54,7 +54,7 @@ import static org.testng.Assert.assertTrue; * * @author Yevhenii Voevodin */ -@Guice(moduleFactory = TckModuleFactory.class) +@Listeners(TckListener.class) @Test(suiteName = WorkspaceDaoTest.SUITE_NAME) public class WorkspaceDaoTest { @@ -188,7 +188,7 @@ public class WorkspaceDaoTest { @Test public void shouldPublicRemoveWorkspaceEventAfterRemoveWorkspace() throws Exception { - final boolean[] isNotified = new boolean[] { false }; + final boolean[] isNotified = new boolean[] {false}; eventService.subscribe(event -> isNotified[0] = true, WorkspaceRemovedEvent.class); workspaceDao.remove(workspaces[0].getId());