IGNITE-12285 Removes boilerplate code in test PluginProvider implementations. (#6969)

diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
index 1914581..03686db 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
@@ -28,11 +28,14 @@
 /**
  * Pluggable Ignite component.
  * <p>
- * Ignite plugins are loaded using JDK {@link ServiceLoader}.
+ * Ignite plugins can be loaded using JDK {@link ServiceLoader} or set up explicitly via
+ * {@link IgniteConfiguration#setPluginProviders(PluginProvider[])}.
  * First method called to initialize plugin is {@link PluginProvider#initExtensions(PluginContext, ExtensionRegistry)}.
- * If plugin requires configuration it can be set in {@link IgniteConfiguration} using
+ * If {@link ServiceLoader} approach of plugin loading is chosen, fully-qualified {@link PluginProvider} class name is
+ * used as the service type. And required plugin configuration in this case can be set up via
  * {@link IgniteConfiguration#setPluginConfigurations(PluginConfiguration...)}.
  *
+ * @see IgniteConfiguration#setPluginProviders(PluginProvider[])
  * @see IgniteConfiguration#setPluginConfigurations(PluginConfiguration...)
  * @see PluginContext
  */
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java
index 04969c9..2dd6561 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/IgniteStandByClusterTest.java
@@ -17,11 +17,9 @@
 
 package org.apache.ignite.internal.processors.cache.persistence.standbycluster;
 
-import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
@@ -39,15 +37,9 @@
 import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
-import org.apache.ignite.plugin.CachePluginContext;
-import org.apache.ignite.plugin.CachePluginProvider;
-import org.apache.ignite.plugin.ExtensionRegistry;
 import org.apache.ignite.plugin.IgnitePlugin;
-import org.apache.ignite.plugin.PluginContext;
-import org.apache.ignite.plugin.PluginProvider;
-import org.apache.ignite.plugin.PluginValidationException;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.jetbrains.annotations.Nullable;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -417,7 +409,8 @@
     /**
      *
      */
-    public static class StanByClusterTestProvider implements PluginProvider, IgnitePlugin, IgniteChangeGlobalStateSupport {
+    public static class StanByClusterTestProvider extends AbstractTestPluginProvider implements IgnitePlugin,
+        IgniteChangeGlobalStateSupport {
         /** */
         static final String NAME = "StanByClusterTestProvider";
 
@@ -433,69 +426,6 @@
         }
 
         /** {@inheritDoc} */
-        @Override public String version() {
-            return "1.0";
-        }
-
-        /** {@inheritDoc} */
-        @Override public String copyright() {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void initExtensions(
-            PluginContext ctx,
-            ExtensionRegistry registry
-        ) throws IgniteCheckedException {
-
-        }
-
-        /** {@inheritDoc} */
-        @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void start(PluginContext ctx) throws IgniteCheckedException {
-
-        }
-
-        /** {@inheritDoc} */
-        @Override public void stop(boolean cancel) throws IgniteCheckedException {
-
-        }
-
-        /** {@inheritDoc} */
-        @Override public void onIgniteStart() throws IgniteCheckedException {
-
-        }
-
-        /** {@inheritDoc} */
-        @Override public void onIgniteStop(boolean cancel) {
-
-        }
-
-        /** {@inheritDoc} */
-        @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
-
-        }
-
-        /** {@inheritDoc} */
-        @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
-
-        }
-
-        /** {@inheritDoc} */
-        @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) {
-            return null;
-        }
-
-        /** {@inheritDoc} */
         @Override public IgnitePlugin plugin() {
             return this;
         }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java
index d960f51..981f8bc 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTrackerPluginProvider.java
@@ -17,12 +17,9 @@
 
 package org.apache.ignite.internal.processors.cache.persistence.wal.memtracker;
 
-import java.io.Serializable;
-import java.util.UUID;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteEx;
@@ -32,22 +29,19 @@
 import org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager;
 import org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
 import org.apache.ignite.internal.util.typedef.internal.CU;
-import org.apache.ignite.plugin.CachePluginContext;
-import org.apache.ignite.plugin.CachePluginProvider;
 import org.apache.ignite.plugin.ExtensionRegistry;
 import org.apache.ignite.plugin.IgnitePlugin;
 import org.apache.ignite.plugin.PluginConfiguration;
 import org.apache.ignite.plugin.PluginContext;
 import org.apache.ignite.plugin.PluginNotFoundException;
-import org.apache.ignite.plugin.PluginProvider;
-import org.apache.ignite.plugin.PluginValidationException;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * PageMemory tracker plugin provider.
  */
-public class PageMemoryTrackerPluginProvider implements PluginProvider<PageMemoryTrackerConfiguration>,
-    IgniteChangeGlobalStateSupport, DatabaseLifecycleListener {
+public class PageMemoryTrackerPluginProvider extends AbstractTestPluginProvider
+    implements IgniteChangeGlobalStateSupport, DatabaseLifecycleListener {
     /** System property name to implicitly enable page memory tracker . */
     public static final String IGNITE_ENABLE_PAGE_MEMORY_TRACKER = "IGNITE_ENABLE_PAGE_MEMORY_TRACKER";
 
@@ -66,16 +60,6 @@
     }
 
     /** {@inheritDoc} */
-    @Override public String version() {
-        return "1.0";
-    }
-
-    /** {@inheritDoc} */
-    @Override public String copyright() {
-        return "";
-    }
-
-    /** {@inheritDoc} */
     @Override public <T extends IgnitePlugin> T plugin() {
         return (T)plugin;
     }
@@ -128,11 +112,6 @@
     }
 
     /** {@inheritDoc} */
-    @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
     @Override public void start(PluginContext ctx) {
         ((IgniteEx)ctx.grid()).context().internalSubscriptionProcessor().registerDatabaseListener(this);
     }
@@ -144,31 +123,6 @@
     }
 
     /** {@inheritDoc} */
-    @Override public void onIgniteStart() {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void onIgniteStop(boolean cancel) {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
     @Override public void onActivate(GridKernalContext kctx) {
         if (plugin != null) {
             try {
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/configuration/distributed/TestDistibutedConfigurationPlugin.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/configuration/distributed/TestDistibutedConfigurationPlugin.java
index 7d04d08..a5cea9b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/configuration/distributed/TestDistibutedConfigurationPlugin.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/configuration/distributed/TestDistibutedConfigurationPlugin.java
@@ -17,21 +17,13 @@
 
 package org.apache.ignite.internal.processors.configuration.distributed;
 
-import java.io.Serializable;
-import java.util.UUID;
 import java.util.function.Consumer;
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteKernal;
-import org.apache.ignite.plugin.CachePluginContext;
-import org.apache.ignite.plugin.CachePluginProvider;
 import org.apache.ignite.plugin.ExtensionRegistry;
-import org.apache.ignite.plugin.IgnitePlugin;
 import org.apache.ignite.plugin.PluginContext;
-import org.apache.ignite.plugin.PluginProvider;
-import org.apache.ignite.plugin.PluginValidationException;
-import org.jetbrains.annotations.Nullable;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
 
 /**
  * TODO: Add class description.
@@ -39,7 +31,7 @@
  * @author @java.author
  * @version @java.version
  */
-public class TestDistibutedConfigurationPlugin implements PluginProvider {
+public class TestDistibutedConfigurationPlugin extends AbstractTestPluginProvider {
     /** */
     private GridKernalContext igniteCtx;
 
@@ -60,16 +52,6 @@
     }
 
     /** {@inheritDoc} */
-    @Override public String version() {
-        return "1.0";
-    }
-
-    /** {@inheritDoc} */
-    @Override public String copyright() {
-        return "";
-    }
-
-    /** {@inheritDoc} */
     @Override public void initExtensions(PluginContext ctx, ExtensionRegistry registry) {
         igniteCtx = ((IgniteKernal)ctx.grid()).context();
     }
@@ -78,50 +60,4 @@
     @Override public void start(PluginContext ctx) throws IgniteCheckedException {
         supplier.accept(igniteCtx);
     }
-
-    /** {@inheritDoc} */
-    @Override public void stop(boolean cancel) throws IgniteCheckedException {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void onIgniteStart() throws IgniteCheckedException {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void onIgniteStop(boolean cancel) {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
-        // No-op
-    }
-
-    /** {@inheritDoc} */
-    @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public IgnitePlugin plugin() {
-        return new IgnitePlugin() {
-        };
-    }
-
-    /** {@inheritDoc} */
-    @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
-        return null;
-    }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorInitializationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorInitializationTest.java
index 8b64533..461acdb 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorInitializationTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/rest/RestProcessorInitializationTest.java
@@ -17,21 +17,13 @@
 
 package org.apache.ignite.internal.processors.rest;
 
-import java.io.Serializable;
-import java.util.UUID;
-import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
-import org.apache.ignite.plugin.CachePluginContext;
-import org.apache.ignite.plugin.CachePluginProvider;
-import org.apache.ignite.plugin.ExtensionRegistry;
-import org.apache.ignite.plugin.IgnitePlugin;
 import org.apache.ignite.plugin.PluginContext;
 import org.apache.ignite.plugin.PluginProvider;
-import org.apache.ignite.plugin.PluginValidationException;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.Nullable;
 import org.junit.Test;
@@ -72,81 +64,19 @@
     /**
      * Test implementation of {@link PluginProvider} for obtaining {@link TestGridRestProcessorImpl}.
      */
-    private static class TestRestProcessorProvider implements PluginProvider {
+    private static class TestRestProcessorProvider extends AbstractTestPluginProvider {
         /** {@inheritDoc} */
         @Override public String name() {
             return "TEST_REST_PROCESSOR";
         }
 
         /** {@inheritDoc} */
-        @Override public String version() {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String copyright() {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void initExtensions(PluginContext ctx, ExtensionRegistry registry) {
-            // No-op.
-        }
-
-        /** {@inheritDoc} */
-        @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void start(PluginContext ctx) throws IgniteCheckedException {
-            // No-op.
-        }
-
-        /** {@inheritDoc} */
-        @Override public void stop(boolean cancel) throws IgniteCheckedException {
-            // No-op.
-        }
-
-        /** {@inheritDoc} */
-        @Override public void onIgniteStart() {
-            // No-op.
-        }
-
-        /** {@inheritDoc} */
-        @Override public void onIgniteStop(boolean cancel) {
-            // No-op.
-        }
-
-        /** {@inheritDoc} */
-        @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) {
-            return null;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
-            // No-op.
-        }
-
-        /** {@inheritDoc} */
-        @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
-            // No-op.
-        }
-
-        /** {@inheritDoc} */
         @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) {
             if (cls.equals(IgniteRestProcessor.class))
                 return new TestGridRestProcessorImpl(((IgniteEx)ctx.grid()).context());
 
             return null;
         }
-
-        /** {@inheritDoc} */
-        @Override public IgnitePlugin plugin() {
-            return new IgnitePlugin() {
-                // No-op.
-            };
-        }
     }
 
     /**
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/AbstractTestSecurityPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/AbstractTestSecurityPluginProvider.java
index f23c6c1..1bdcc78 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/AbstractTestSecurityPluginProvider.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/AbstractTestSecurityPluginProvider.java
@@ -17,51 +17,22 @@
 
 package org.apache.ignite.internal.processors.security;
 
-import java.io.Serializable;
-import java.util.UUID;
-import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.plugin.CachePluginContext;
-import org.apache.ignite.plugin.CachePluginProvider;
-import org.apache.ignite.plugin.ExtensionRegistry;
-import org.apache.ignite.plugin.IgnitePlugin;
 import org.apache.ignite.plugin.PluginContext;
-import org.apache.ignite.plugin.PluginProvider;
-import org.apache.ignite.plugin.PluginValidationException;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Security processor provider for tests.
  */
-public abstract class AbstractTestSecurityPluginProvider implements PluginProvider {
+public abstract class AbstractTestSecurityPluginProvider extends AbstractTestPluginProvider {
     /** {@inheritDoc} */
     @Override public String name() {
         return "TestSecurityProcessorProvider";
     }
 
     /** {@inheritDoc} */
-    @Override public String version() {
-        return "1.0";
-    }
-
-    /** {@inheritDoc} */
-    @Override public String copyright() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public IgnitePlugin plugin() {
-        return new IgnitePlugin() {
-        };
-    }
-
-    /** {@inheritDoc} */
-    @Override public void initExtensions(PluginContext ctx, ExtensionRegistry registry) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
     @Override public @Nullable Object createComponent(PluginContext ctx, Class cls) {
         if (cls.isAssignableFrom(GridSecurityProcessor.class))
@@ -75,44 +46,4 @@
      * @return {@link GridSecurityProcessor} istance.
      */
     protected abstract GridSecurityProcessor securityProcessor(GridKernalContext ctx);
-
-    /** {@inheritDoc} */
-    @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void start(PluginContext ctx) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public void stop(boolean cancel) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public void onIgniteStart() {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public void onIgniteStop(boolean cancel) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public @Nullable Serializable provideDiscoveryData(UUID nodeId) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
-        // No-op.
-    }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/AbstractTestPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/plugin/AbstractTestPluginProvider.java
new file mode 100644
index 0000000..8497dc1
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/plugin/AbstractTestPluginProvider.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.plugin;
+
+import java.io.Serializable;
+import java.util.UUID;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cluster.ClusterNode;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * No-op test implementation of {@link PluginProvider} which allows to avoid redundant boilerplate code.
+ */
+public abstract class AbstractTestPluginProvider implements PluginProvider<PluginConfiguration> {
+    /** {@inheritDoc} */
+    @Override public String version() {
+        return "1.0";
+    }
+
+    /** {@inheritDoc} */
+    @Override public <T extends IgnitePlugin> T plugin() {
+        return (T) new IgnitePlugin() {
+            // No-op.
+        };
+    }
+
+    /** {@inheritDoc} */
+    @Override public String copyright() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void initExtensions(PluginContext ctx, ExtensionRegistry registry) {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public <T> T createComponent(PluginContext ctx, Class<T> cls) {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void start(PluginContext ctx) throws IgniteCheckedException {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Override public void stop(boolean cancel) throws IgniteCheckedException {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Override public void onIgniteStart() {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Override public void onIgniteStop(boolean cancel) {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
+        // No-op.
+    }
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java
index 979485b..e9b8bd1 100644
--- a/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java
+++ b/modules/core/src/test/java/org/apache/ignite/plugin/NodeValidationPluginProvider.java
@@ -19,7 +19,6 @@
 
 import java.io.Serializable;
 import java.util.UUID;
-import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.jetbrains.annotations.Nullable;
@@ -27,7 +26,7 @@
 /**
  * Validates node on join, it requires nodes to provide token that matches configured on primary node.
  */
-public class NodeValidationPluginProvider implements PluginProvider, IgnitePlugin {
+public class NodeValidationPluginProvider extends AbstractTestPluginProvider implements IgnitePlugin {
     /** */
     private NodeValidationPluginConfiguration pluginConfiguration;
 
@@ -50,16 +49,6 @@
     }
 
     /** {@inheritDoc} */
-    @Override public String version() {
-        return "1.0";
-    }
-
-    /** {@inheritDoc} */
-    @Override public String copyright() {
-        return "";
-    }
-
-    /** {@inheritDoc} */
     @Override public IgnitePlugin plugin() {
         return this;
     }
@@ -83,36 +72,6 @@
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void start(PluginContext ctx) throws IgniteCheckedException {
-        //no-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void stop(boolean cancel) throws IgniteCheckedException {
-        //no-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void onIgniteStart() throws IgniteCheckedException {
-        //no-op
-    }
-
-    /** {@inheritDoc} */
-    @Override public void onIgniteStop(boolean cancel) {
-        //no-op
-    }
-
-    /** {@inheritDoc} */
     @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) {
         if (!enabled)
             return null;
@@ -123,17 +82,6 @@
     }
 
     /** {@inheritDoc} */
-    @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
-        if (!enabled)
-            return;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
-        // no-op
-    }
-
-    /** {@inheritDoc} */
     @Override public void validateNewNode(ClusterNode node, Serializable serializable) {
         if (!enabled)
             return;
diff --git a/modules/extdata/platform/pom.xml b/modules/extdata/platform/pom.xml
index c87e4ba..ac8d1ea 100644
--- a/modules/extdata/platform/pom.xml
+++ b/modules/extdata/platform/pom.xml
@@ -42,5 +42,13 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/modules/extdata/platform/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginProvider.java b/modules/extdata/platform/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginProvider.java
index c34696f..062d1e9 100644
--- a/modules/extdata/platform/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginProvider.java
+++ b/modules/extdata/platform/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginProvider.java
@@ -17,32 +17,21 @@
 
 package org.apache.ignite.platform.plugin;
 
-import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.processors.platform.PlatformPluginExtension;
 import org.apache.ignite.platform.plugin.cache.PlatformTestCachePluginProvider;
 import org.apache.ignite.plugin.*;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.Serializable;
-import java.util.UUID;
 
 /**
  * Plugin provider for platform tests.
  */
-public class PlatformTestPluginProvider implements PluginProvider<PlatformTestPluginConfiguration> {
+public class PlatformTestPluginProvider extends AbstractTestPluginProvider {
     /** {@inheritDoc} */
     @Override public String name() {
         return "TestPlatformPlugin";
     }
 
     /** {@inheritDoc} */
-    @Override public String version() {
-        return "1.0";
-    }
-
-    /** {@inheritDoc} */
     @Override public String copyright() {
         return "-";
     }
@@ -54,44 +43,6 @@
     }
 
     /** {@inheritDoc} */
-    @Override public void start(PluginContext ctx) throws IgniteCheckedException {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public void stop(boolean cancel) throws IgniteCheckedException {
-        // No-op.
-    }
-
-    @Override public void onIgniteStart() throws IgniteCheckedException {
-        // No-op.
-    }
-
-    @Override public void onIgniteStop(boolean cancel) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Nullable @Override public Serializable provideDiscoveryData(UUID nodeId) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Nullable @Override public <T> T createComponent(PluginContext ctx, Class<T> cls) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
     @Override public <T extends IgnitePlugin> T plugin() {
         return (T)new PlatformTestPlugin();
     }