You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2020/07/16 14:39:01 UTC

[lucene-solr] 01/02: all irrelevant files classes and tests removed

This is an automated email from the ASF dual-hosted git repository.

noble pushed a commit to branch jira/solr14654
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 2f4fe42ed93e7b9b224d2a7708baeec4e2516b31
Author: noblepaul <no...@gmail.com>
AuthorDate: Fri Jul 17 00:35:25 2020 +1000

    all irrelevant files classes and tests removed
---
 .../java/org/apache/solr/core/MemClassLoader.java  | 203 ---------------
 .../src/java/org/apache/solr/core/PluginBag.java   | 197 +-------------
 .../src/java/org/apache/solr/core/SolrConfig.java  |   1 -
 .../src/java/org/apache/solr/core/SolrCore.java    |  19 --
 .../org/apache/solr/handler/SolrConfigHandler.java |  15 --
 .../org/apache/solr/handler/StreamHandler.java     |   2 +-
 .../org/apache/solr/cloud/TestConfigSetsAPI.java   |   6 +-
 .../test/org/apache/solr/cloud/TestCryptoKeys.java | 209 ---------------
 .../solr/core/BlobRepositoryMockingTest.java       |   2 +-
 .../org/apache/solr/core/TestDynamicLoading.java   | 290 ---------------------
 .../apache/solr/core/TestDynamicLoadingUrl.java    | 128 ---------
 .../test/org/apache/solr/core/TestDynamicURP.java  | 111 --------
 .../apache/solr/core/TestSolrConfigHandler.java    |  55 +++-
 .../solr/filestore/TestDistribPackageStore.java    |   2 +-
 .../src/test/org/apache/solr/pkg/TestPackages.java |   2 +-
 .../apache/solr/update/processor/RuntimeUrp.java   |  40 ---
 .../processor/TestNamedUpdateProcessors.java       | 163 ------------
 17 files changed, 62 insertions(+), 1383 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/core/MemClassLoader.java b/solr/core/src/java/org/apache/solr/core/MemClassLoader.java
deleted file mode 100644
index 03e4de2..0000000
--- a/solr/core/src/java/org/apache/solr/core/MemClassLoader.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * 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.solr.core;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.invoke.MethodHandles;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.ByteBuffer;
-import java.security.CodeSource;
-import java.security.ProtectionDomain;
-import java.security.cert.Certificate;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.lucene.analysis.util.ResourceLoader;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.CollectionAdminParams;
-import org.apache.solr.common.util.StrUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-public class MemClassLoader extends ClassLoader implements AutoCloseable, ResourceLoader {
-  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-  private boolean allJarsLoaded = false;
-  private final SolrResourceLoader parentLoader;
-  private List<PluginBag.RuntimeLib> libs = new ArrayList<>();
-  @SuppressWarnings("rawtypes")
-  private Map<String, Class> classCache = new HashMap<>();
-  private List<String> errors = new ArrayList<>();
-
-
-  public MemClassLoader(List<PluginBag.RuntimeLib> libs, SolrResourceLoader resourceLoader) {
-    this.parentLoader = resourceLoader;
-    this.libs = libs;
-  }
-
-  synchronized void loadRemoteJars() {
-    if (allJarsLoaded) return;
-    int count = 0;
-    for (PluginBag.RuntimeLib lib : libs) {
-      if (lib.getUrl() != null) {
-        try {
-          lib.loadJar();
-          lib.verify();
-        } catch (Exception e) {
-          log.error("Error loading runtime library", e);
-        }
-        count++;
-      }
-    }
-    if (count == libs.size()) allJarsLoaded = true;
-  }
-
-  public synchronized void loadJars() {
-    if (allJarsLoaded) return;
-
-    for (PluginBag.RuntimeLib lib : libs) {
-      try {
-        lib.loadJar();
-        lib.verify();
-      } catch (Exception exception) {
-        errors.add(exception.getMessage());
-        if (exception instanceof SolrException) throw (SolrException) exception;
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Atleast one runtimeLib could not be loaded", exception);
-      }
-    }
-    allJarsLoaded = true;
-  }
-
-
-  @Override
-  protected Class<?> findClass(String name) throws ClassNotFoundException {
-    if(!allJarsLoaded ) loadJars();
-    try {
-      return parentLoader.findClass(name, Object.class);
-    } catch (Exception e) {
-      return loadFromRuntimeLibs(name);
-    }
-  }
-
-  @SuppressWarnings({"rawtypes"})
-  private synchronized  Class<?> loadFromRuntimeLibs(String name) throws ClassNotFoundException {
-    Class result = classCache.get(name);
-    if(result != null)
-      return result;
-    AtomicReference<String> jarName = new AtomicReference<>();
-    ByteBuffer buf = null;
-    try {
-      buf = getByteBuffer(name, jarName);
-    } catch (Exception e) {
-      throw new ClassNotFoundException("class could not be loaded " + name + (errors.isEmpty()? "": "Some dynamic libraries could not be loaded: "+ StrUtils.join(errors, '|')), e);
-    }
-    if (buf == null) throw new ClassNotFoundException("Class not found :" + name);
-    ProtectionDomain defaultDomain = null;
-    //using the default protection domain, with no permissions
-    try {
-      defaultDomain = new ProtectionDomain(new CodeSource(new URL("http://localhost/" + CollectionAdminParams.SYSTEM_COLL + "/blob/" + jarName.get()), (Certificate[]) null),
-          null);
-    } catch (MalformedURLException mue) {
-      throw new ClassNotFoundException("Unexpected exception ", mue);
-      //should not happen
-    }
-    log.info("Defining_class {} from runtime jar {} ", name, jarName);
-
-    result = defineClass(name, buf.array(), buf.arrayOffset(), buf.limit(), defaultDomain);
-    classCache.put(name, result);
-    return result;
-  }
-
-  private ByteBuffer getByteBuffer(String name, AtomicReference<String> jarName) throws Exception {
-    if (!allJarsLoaded) {
-      loadJars();
-
-    }
-
-    String path = name.replace('.', '/').concat(".class");
-    ByteBuffer buf = null;
-    for (PluginBag.RuntimeLib lib : libs) {
-      try {
-        buf = lib.getFileContent(path);
-        if (buf != null) {
-          jarName.set(lib.getName());
-          break;
-        }
-      } catch (Exception exp) {
-        throw new ClassNotFoundException("Unable to load class :" + name, exp);
-      }
-    }
-
-    return buf;
-  }
-
-  @Override
-  public void close() {
-    for (PluginBag.RuntimeLib lib : libs) {
-      try {
-        lib.close();
-      } catch (Exception e) {
-        log.error("Error closing lib {}", lib.getName(), e);
-      }
-    }
-  }
-
-  @Override
-  public InputStream openResource(String resource) throws IOException {
-    AtomicReference<String> jarName = new AtomicReference<>();
-    try {
-      ByteBuffer buf = getByteBuffer(resource, jarName);
-      if (buf == null) throw new IOException("Resource could not be found " + resource);
-    } catch (Exception e) {
-      throw new IOException("Resource could not be found " + resource, e);
-    }
-    return null;
-  }
-
-  @Override
-  public <T> Class<? extends T> findClass(String cname, Class<T> expectedType) {
-    if(!allJarsLoaded ) loadJars();
-    try {
-      return findClass(cname).asSubclass(expectedType);
-    } catch (Exception e) {
-      if (e instanceof SolrException) {
-        throw (SolrException) e;
-      } else {
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "error loading class " + cname, e);
-      }
-    }
-
-  }
-
-  @Override
-  public <T> T newInstance(String cname, Class<T> expectedType) {
-    try {
-      return findClass(cname, expectedType).getConstructor().newInstance();
-    } catch (SolrException e) {
-      throw e;
-    } catch (Exception e) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "error instantiating class :" + cname, e);
-    }
-  }
-
-
-}
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index d2442a1..cd4a5e7 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -130,22 +130,11 @@ public class PluginBag<T> implements AutoCloseable {
 
   @SuppressWarnings({"unchecked"})
   public PluginHolder<T> createPlugin(PluginInfo info) {
-    if ("true".equals(String.valueOf(info.attributes.get("runtimeLib")))) {
-      if (log.isDebugEnabled()) {
-        log.debug(" {} : '{}'  created with runtimeLib=true ", meta.getCleanTag(), info.name);
-      }
-      LazyPluginHolder<T> holder = new LazyPluginHolder<>(meta, info, core, RuntimeLib.isEnabled() ?
-          core.getMemClassLoader() :
-          core.getResourceLoader(), true);
-
-      return meta.clazz == UpdateRequestProcessorFactory.class ?
-          (PluginHolder<T>) new UpdateRequestProcessorChain.LazyUpdateProcessorFactoryHolder(holder) :
-          holder;
-    } else if ("lazy".equals(info.attributes.get("startup")) && meta.options.contains(SolrConfig.PluginOpts.LAZY)) {
+   if ("lazy".equals(info.attributes.get("startup")) && meta.options.contains(SolrConfig.PluginOpts.LAZY)) {
       if (log.isDebugEnabled()) {
         log.debug("{} : '{}' created with startup=lazy ", meta.getCleanTag(), info.name);
       }
-      return new LazyPluginHolder<T>(meta, info, core, core.getResourceLoader(), false);
+      return new LazyPluginHolder<T>(meta, info, core, core.getResourceLoader());
     } else {
       if (info.pkgName != null) {
         PackagePluginHolder<T> holder = new PackagePluginHolder<>(info, core, meta);
@@ -433,22 +422,13 @@ public class PluginBag<T> implements AutoCloseable {
     protected SolrException solrException;
     private final SolrCore core;
     protected ResourceLoader resourceLoader;
-    private final boolean isRuntimeLib;
 
 
-    LazyPluginHolder(SolrConfig.SolrPluginInfo pluginMeta, PluginInfo pluginInfo, SolrCore core, ResourceLoader loader, boolean isRuntimeLib) {
+    LazyPluginHolder(SolrConfig.SolrPluginInfo pluginMeta, PluginInfo pluginInfo, SolrCore core, ResourceLoader loader) {
       super(pluginInfo);
       this.pluginMeta = pluginMeta;
-      this.isRuntimeLib = isRuntimeLib;
       this.core = core;
       this.resourceLoader = loader;
-      if (loader instanceof MemClassLoader) {
-        if (!RuntimeLib.isEnabled()) {
-          String s = "runtime library loading is not enabled, start Solr with -Denable.runtime.lib=true";
-          log.warn(s);
-          solrException = new SolrException(SolrException.ErrorCode.SERVER_ERROR, s);
-        }
-      }
     }
 
     @Override
@@ -474,24 +454,14 @@ public class PluginBag<T> implements AutoCloseable {
       if (log.isInfoEnabled()) {
         log.info("Going to create a new {} with {} ", pluginMeta.getCleanTag(), pluginInfo);
       }
-      if (resourceLoader instanceof MemClassLoader) {
-        MemClassLoader loader = (MemClassLoader) resourceLoader;
-        loader.loadJars();
-      }
+
       @SuppressWarnings({"unchecked"})
       Class<T> clazz = (Class<T>) pluginMeta.clazz;
       T localInst = null;
       try {
         localInst = SolrCore.createInstance(pluginInfo.className, clazz, pluginMeta.getCleanTag(), null, resourceLoader);
       } catch (SolrException e) {
-        if (isRuntimeLib && !(resourceLoader instanceof MemClassLoader)) {
-          throw new SolrException(SolrException.ErrorCode.getErrorCode(e.code()),
-              e.getMessage() + ". runtime library loading is not enabled, start Solr with -Denable.runtime.lib=true",
-              e.getCause());
-        }
         throw e;
-
-
       }
       initInstance(localInst, pluginInfo);
       if (localInst instanceof SolrCoreAware) {
@@ -511,165 +481,6 @@ public class PluginBag<T> implements AutoCloseable {
     }
   }
 
-  /**
-   * This represents a Runtime Jar. A jar requires two details , name and version
-   */
-  public static class RuntimeLib implements PluginInfoInitialized, AutoCloseable {
-    private String name, version, sig, sha512, url;
-    private BlobRepository.BlobContentRef<ByteBuffer> jarContent;
-    private final CoreContainer coreContainer;
-    private boolean verified = false;
-
-    @Override
-    public void init(PluginInfo info) {
-      name = info.attributes.get(NAME);
-      url = info.attributes.get("url");
-      sig = info.attributes.get("sig");
-      if(url == null) {
-        Object v = info.attributes.get("version");
-        if (name == null || v == null) {
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "runtimeLib must have name and version");
-        }
-        version = String.valueOf(v);
-      } else {
-        sha512 = info.attributes.get("sha512");
-        if(sha512 == null){
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "runtimeLib with url must have a 'sha512' attribute");
-        }
-        ByteBuffer buf = null;
-        buf = coreContainer.getBlobRepository().fetchFromUrl(name, url);
-
-        String digest = BlobRepository.sha512Digest(buf);
-        if(!sha512.equals(digest))  {
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, StrUtils.formatString(BlobRepository.INVALID_JAR_MSG, url, sha512, digest)  );
-        }
-        log.info("dynamic library verified {}, sha512: {}", url, sha512);
-      }
-    }
-
-    public RuntimeLib(SolrCore core) {
-      coreContainer = core.getCoreContainer();
-    }
-
-    public String getUrl(){
-      return url;
-    }
-
-    @SuppressWarnings({"unchecked"})
-    void loadJar() {
-      if (jarContent != null) return;
-      synchronized (this) {
-        if (jarContent != null) return;
-
-        jarContent = url == null?
-            coreContainer.getBlobRepository().getBlobIncRef(name + "/" + version):
-            coreContainer.getBlobRepository().getBlobIncRef(name, null,url,sha512);
-
-      }
-    }
-
-    public static boolean isEnabled() {
-      return Boolean.getBoolean("enable.runtime.lib");
-    }
-
-    public String getName() {
-      return name;
-    }
-
-    public String getVersion() {
-      return version;
-    }
-
-    public String getSig() {
-      return sig;
-
-    }
-
-    public ByteBuffer getFileContent(String entryName) throws IOException {
-      if (jarContent == null)
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "jar not available: " + name  );
-      return getFileContent(jarContent.blob, entryName);
-
-    }
-
-    public ByteBuffer getFileContent(BlobRepository.BlobContent<ByteBuffer> blobContent,  String entryName) throws IOException {
-      ByteBuffer buff = blobContent.get();
-      ByteArrayInputStream zipContents = new ByteArrayInputStream(buff.array(), buff.arrayOffset(), buff.limit());
-      ZipInputStream zis = new ZipInputStream(zipContents);
-      try {
-        ZipEntry entry;
-        while ((entry = zis.getNextEntry()) != null) {
-          if (entryName == null || entryName.equals(entry.getName())) {
-            SimplePostTool.BAOS out = new SimplePostTool.BAOS();
-            byte[] buffer = new byte[2048];
-            int size;
-            while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
-              out.write(buffer, 0, size);
-            }
-            out.close();
-            return out.getByteBuffer();
-          }
-        }
-      } finally {
-        zis.closeEntry();
-      }
-      return null;
-    }
-
-
-    @Override
-    public void close() {
-      if (jarContent != null) coreContainer.getBlobRepository().decrementBlobRefCount(jarContent);
-    }
-
-    public static List<RuntimeLib> getLibObjects(SolrCore core, List<PluginInfo> libs) {
-      List<RuntimeLib> l = new ArrayList<>(libs.size());
-      for (PluginInfo lib : libs) {
-        RuntimeLib rtl = new RuntimeLib(core);
-        try {
-          rtl.init(lib);
-        } catch (Exception e) {
-          log.error("error loading runtime library", e);
-        }
-        l.add(rtl);
-      }
-      return l;
-    }
-
-    public void verify() throws Exception {
-      if (verified) return;
-      if (jarContent == null) {
-        log.error("Calling verify before loading the jar");
-        return;
-      }
-
-      if (!coreContainer.isZooKeeperAware())
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Signing jar is possible only in cloud");
-      Map<String, byte[]> keys = CloudUtil.getTrustedKeys(coreContainer.getZkController().getZkClient(), "exe");
-      if (keys.isEmpty()) {
-        if (sig == null) {
-          verified = true;
-          return;
-        } else {
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "No public keys are available in ZK to verify signature for runtime lib  " + name);
-        }
-      } else if (sig == null) {
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, StrUtils.formatString("runtimelib {0} should be signed with one of the keys in ZK /keys/exe ", name));
-      }
-
-      try {
-        String matchedKey = new CryptoKeys(keys).verify(sig, jarContent.blob.get());
-        if (matchedKey == null)
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "No key matched signature for jar : " + name + " version: " + version);
-        log.info("Jar {} signed with {} successfully verified", name, matchedKey);
-      } catch (Exception e) {
-        if (e instanceof SolrException) throw e;
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error verifying key ", e);
-      }
-    }
-  }
-
-
   public Api v2lookup(String path, String method, Map<String, String> parts) {
     if (apiBag == null) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "this should not happen, looking up for v2 API at the wrong place");
diff --git a/solr/core/src/java/org/apache/solr/core/SolrConfig.java b/solr/core/src/java/org/apache/solr/core/SolrConfig.java
index 8861799..6cc7c6f 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrConfig.java
@@ -347,7 +347,6 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
           // and even then -- only if there is a single SpellCheckComponent
           // because of queryConverter.setIndexAnalyzer
       .add(new SolrPluginInfo(QueryConverter.class, "queryConverter", REQUIRE_NAME, REQUIRE_CLASS))
-      .add(new SolrPluginInfo(PluginBag.RuntimeLib.class, "runtimeLib", REQUIRE_NAME, MULTI_OK))
           // this is hackish, since it picks up all SolrEventListeners,
           // regardless of when/how/why they are used (or even if they are
           // declared outside of the appropriate context) but there's no nice
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 4c9fae6..4ae1ae5 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -223,7 +223,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   private final RecoveryStrategy.Builder recoveryStrategyBuilder;
   private IndexReaderFactory indexReaderFactory;
   private final Codec codec;
-  private final MemClassLoader memClassLoader;
   //singleton listener for all packages used in schema
   private final PackageListeningClassLoader schemaPluginsLoader;
 
@@ -1003,10 +1002,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       this.solrDelPolicy = initDeletionPolicy(delPolicy);
 
       this.codec = initCodec(solrConfig, this.schema);
-
-      memClassLoader = new MemClassLoader(
-          PluginBag.RuntimeLib.getLibObjects(this, solrConfig.getPluginInfos(PluginBag.RuntimeLib.class.getName())),
-          getResourceLoader());
       initIndex(prev != null, reload);
 
       initWriters();
@@ -1036,9 +1031,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       // Initialize the RestManager
       restManager = initRestManager();
 
-      // at this point we can load jars loaded from remote urls.
-      memClassLoader.loadRemoteJars();
-
       // Finally tell anyone who wants to know
       resourceLoader.inform(resourceLoader);
       resourceLoader.inform(this); // last call before the latch is released.
@@ -1611,14 +1603,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     valueSourceParsers.close();
     transformerFactories.close();
 
-    if (memClassLoader != null) {
-      try {
-        memClassLoader.close();
-      } catch (Exception e) {
-      }
-    }
-
-
     try {
       if (null != updateHandler) {
         updateHandler.close();
@@ -2789,9 +2773,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     };
   }
 
-  public MemClassLoader getMemClassLoader() {
-    return memClassLoader;
-  }
 
   public interface RawWriter {
     default String getContentType() {
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index b94064a..7e8d2f1 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -572,21 +572,6 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
       op.getMap(PluginInfo.INVARIANTS, null);
       op.getMap(PluginInfo.APPENDS, null);
       if (op.hasError()) return overlay;
-      if (info.clazz == PluginBag.RuntimeLib.class) {
-        if (!PluginBag.RuntimeLib.isEnabled()) {
-          op.addError("Solr not started with -Denable.runtime.lib=true");
-          return overlay;
-        }
-        try {
-          try (PluginBag.RuntimeLib rtl = new PluginBag.RuntimeLib(req.getCore())) {
-            rtl.init(new PluginInfo(info.tag, op.getDataMap()));
-          }
-        } catch (Exception e) {
-          op.addError(e.getMessage());
-          log.error("can't load this plugin ", e);
-          return overlay;
-        }
-      }
       if (!verifyClass(op, clz, info.clazz)) return overlay;
       if (pluginExists(info, overlay, name)) {
         if (isCeate) {
diff --git a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
index d604616..0877c54 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -138,7 +138,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
         streamFactory.withFunctionName(pluginInfo.name,
             () -> holder.getClazz());
       } else {
-        Class<? extends Expressible> clazz = core.getMemClassLoader().findClass(pluginInfo.className, Expressible.class);
+        Class<? extends Expressible> clazz = core.getResourceLoader().findClass(pluginInfo.className, Expressible.class);
         streamFactory.withFunctionName(pluginInfo.name, clazz);
       }
     }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
index 86742fa..a3c8a55 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
@@ -77,7 +77,7 @@ import org.apache.solr.common.util.Base64;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.ConfigSetProperties;
-import org.apache.solr.core.TestDynamicLoading;
+import org.apache.solr.core.TestSolrConfigHandler;
 import org.apache.solr.security.BasicAuthIntegrationTest;
 import org.apache.solr.servlet.SolrDispatchFilter;
 import org.apache.solr.util.ExternalPaths;
@@ -485,7 +485,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
   private long uploadConfigSet(String configSetName, String suffix, String username, String password,
       SolrZkClient zkClient) throws IOException {
     // Read zipped sample config
-    ByteBuffer sampleZippedConfig = TestDynamicLoading
+    ByteBuffer sampleZippedConfig = TestSolrConfigHandler
         .getFileContent(
             createTempZipFile("solr/configsets/upload/"+configSetName), false);
 
@@ -509,7 +509,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
     File zipFile = new File(solrCluster.getBaseDir().toFile().getAbsolutePath() +
         File.separator + TestUtil.randomSimpleString(random(), 6, 8) + ".zip");
 
-    File directory = TestDynamicLoading.getFile(directoryPath);
+    File directory = SolrTestCaseJ4.getFile(directoryPath);
     if (log.isInfoEnabled()) {
       log.info("Directory: {}", directory.getAbsolutePath());
     }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java b/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java
deleted file mode 100644
index 321e208..0000000
--- a/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * 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.solr.cloud;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.common.LinkedHashMapWriter;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.util.Utils;
-import org.apache.solr.core.MemClassLoader;
-import org.apache.solr.core.TestDynamicLoading;
-import org.apache.solr.core.TestSolrConfigHandler;
-import org.apache.solr.handler.TestBlobHandler;
-import org.apache.solr.util.CryptoKeys;
-import org.apache.solr.util.RestTestHarness;
-import org.apache.zookeeper.CreateMode;
-import org.junit.Test;
-
-import static java.util.Arrays.asList;
-import static org.apache.solr.handler.TestSolrConfigHandlerCloud.compareValues;
-
-public class TestCryptoKeys extends AbstractFullDistribZkTestBase {
-
-  public TestCryptoKeys() {
-    super();
-    sliceCount = 1;
-  }
-
-  @Test
-  public void test() throws Exception {
-    System.setProperty("enable.runtime.lib", "true");
-    setupRestTestHarnesses();
-    String pk1sig = "G8LEW7uJ1is81Aqqfl3Sld3qDtOxPuVFeTLJHFJWecgDvUkmJNFXmf7nkHOVlXnDWahp1vqZf0W02VHXg37lBw==";
-    String pk2sig = "pCyBQycB/0YvLVZfKLDIIqG1tFwM/awqzkp2QNpO7R3ThTqmmrj11wEJFDRLkY79efuFuQPHt40EE7jrOKoj9jLNELsfEqvU3jw9sZKiDONY+rV9Bj9QPeW8Pgt+F9Y1";
-    String wrongKeySig = "xTk2hTipfpb+J5s4x3YZGOXkmHWtnJz05Vvd8RTm/Q1fbQVszR7vMk6dQ1URxX08fcg4HvxOo8g9bG2TSMOGjg==";
-    String result = null;
-    CryptoKeys cryptoKeys = null;
-    SolrZkClient zk = getCommonCloudSolrClient().getZkStateReader().getZkClient();
-    cryptoKeys = new CryptoKeys(CloudUtil.getTrustedKeys(zk, "exe"));
-    ByteBuffer samplefile = ByteBuffer.wrap(readFile("cryptokeys/samplefile.bin"));
-    //there are no keys yet created in ZK
-
-    result = cryptoKeys.verify( pk1sig,samplefile);
-    assertNull(result);
-
-    zk.makePath("/keys/exe", true);
-    zk.create("/keys/exe/pubk1.der", readFile("cryptokeys/pubk1.der"), CreateMode.PERSISTENT, true);
-    zk.create("/keys/exe/pubk2.der", readFile("cryptokeys/pubk2.der"), CreateMode.PERSISTENT, true);
-    Map<String, byte[]> trustedKeys = CloudUtil.getTrustedKeys(zk, "exe");
-
-    cryptoKeys = new CryptoKeys(trustedKeys);
-    result = cryptoKeys.verify(pk2sig, samplefile);
-    assertEquals("pubk2.der", result);
-
-
-    result = cryptoKeys.verify(pk1sig, samplefile);
-    assertEquals("pubk1.der", result);
-
-    try {
-      result = cryptoKeys.verify(wrongKeySig,samplefile);
-      assertNull(result);
-    } catch (Exception e) {
-      //pass
-    }
-    try {
-      result = cryptoKeys.verify( "SGVsbG8gV29ybGQhCg==", samplefile);
-      assertNull(result);
-    } catch (Exception e) {
-      //pass
-    }
-
-
-    HttpSolrClient randomClient = (HttpSolrClient) clients.get(random().nextInt(clients.size()));
-    String baseURL = randomClient.getBaseURL();
-    baseURL = baseURL.substring(0, baseURL.lastIndexOf('/'));
-
-    TestBlobHandler.createSystemCollection(getHttpSolrClient(baseURL, randomClient.getHttpClient()));
-    waitForRecoveriesToFinish(".system", true);
-
-    ByteBuffer jar = TestDynamicLoading.getFileContent("runtimecode/runtimelibs.jar.bin");
-    String blobName = "signedjar";
-    TestBlobHandler.postAndCheck(cloudClient, baseURL, blobName, jar, 1);
-
-    String payload = "{\n" +
-        "'create-requesthandler' : { 'name' : '/runtime', 'class': 'org.apache.solr.core.RuntimeLibReqHandler' , 'runtimeLib':true }" +
-        "}";
-    RestTestHarness client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "requestHandler", "/runtime", "class"),
-        "org.apache.solr.core.RuntimeLibReqHandler", 10);
-
-
-    payload = "{\n" +
-        "'add-runtimelib' : { 'name' : 'signedjar' ,'version':1}\n" +
-        "}";
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "runtimeLib", blobName, "version"),
-        1l, 10);
-
-    @SuppressWarnings({"rawtypes"})
-    LinkedHashMapWriter map = TestSolrConfigHandler.getRespMap("/runtime", client);
-    String s = map._getStr( "error/msg",null);
-    assertNotNull(map.toString(), s);
-    assertTrue(map.toString(), s.contains("should be signed with one of the keys in ZK /keys/exe"));
-
-    String wrongSig = "QKqHtd37QN02iMW9UEgvAO9g9qOOuG5vEBNkbUsN7noc2hhXKic/ABFIOYJA9PKw61mNX2EmNFXOcO3WClYdSw==";
-
-    payload = "{\n" +
-        "'update-runtimelib' : { 'name' : 'signedjar' ,'version':1, 'sig': 'QKqHtd37QN02iMW9UEgvAO9g9qOOuG5vEBNkbUsN7noc2hhXKic/ABFIOYJA9PKw61mNX2EmNFXOcO3WClYdSw=='}\n" +
-        "}";
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "runtimeLib", blobName, "sig"),
-        wrongSig, 10);
-
-    map = TestSolrConfigHandler.getRespMap("/runtime", client);
-    s = (String) Utils.getObjectByPath(map, false, Arrays.asList("error", "msg"));
-    assertNotNull(map.toString(), s);//No key matched signature for jar
-    assertTrue(map.toString(), s.contains("No key matched signature for jar"));
-
-    String rightSig = "YkTQgOtvcM/H/5EQdABGl3wjjrPhonAGlouIx59vppBy2cZEofX3qX1yZu5sPNRmJisNXEuhHN2149dxeUmk2Q==";
-
-    payload = "{\n" +
-        "'update-runtimelib' : { 'name' : 'signedjar' ,'version':1, 'sig': 'YkTQgOtvcM/H/5EQdABGl3wjjrPhonAGlouIx59vppBy2cZEofX3qX1yZu5sPNRmJisNXEuhHN2149dxeUmk2Q=='}\n" +
-        "}";
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "runtimeLib", blobName, "sig"),
-        rightSig, 10);
-
-    map = TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/runtime",
-        null,
-        Arrays.asList("class"),
-        "org.apache.solr.core.RuntimeLibReqHandler", 10);
-    compareValues(map, MemClassLoader.class.getName(), asList("loader"));
-
-    rightSig = "VJPMTxDf8Km3IBj2B5HWkIOqeM/o+HHNobOYCNA3WjrEVfOMZbMMqS1Lo7uLUUp//RZwOGkOhrUhuPNY1z2CGEIKX2/m8VGH64L14d52oSvFiwhoTDDuuyjW1TFGu35D";
-    payload = "{\n" +
-        "'update-runtimelib' : { 'name' : 'signedjar' ,'version':1, 'sig': 'VJPMTxDf8Km3IBj2B5HWkIOqeM/o+HHNobOYCNA3WjrEVfOMZbMMqS1Lo7uLUUp//RZwOGkOhrUhuPNY1z2CGEIKX2/m8VGH64L14d52oSvFiwhoTDDuuyjW1TFGu35D'}\n" +
-        "}";
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "runtimeLib", blobName, "sig"),
-        rightSig, 10);
-
-    map = TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/runtime",
-        null,
-        Arrays.asList("class"),
-        "org.apache.solr.core.RuntimeLibReqHandler", 10);
-    compareValues(map, MemClassLoader.class.getName(), asList("loader"));
-  }
-
-
-  private byte[] readFile(String fname) throws IOException {
-    byte[] buf = null;
-    try (FileInputStream fis = new FileInputStream(getFile(fname))) {
-      buf = new byte[fis.available()];
-      fis.read(buf);
-    }
-    return buf;
-  }
-
-
-}
diff --git a/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java b/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java
index 16dad97..18922f0 100644
--- a/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java
+++ b/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java
@@ -131,7 +131,7 @@ public class BlobRepositoryMockingTest {
   @Test
   public void testGetBlobIncrRefByUrl() throws Exception{
     when(mockContainer.isZooKeeperAware()).thenReturn(true);
-    filecontent = TestDynamicLoading.getFileContent("runtimecode/runtimelibs_v2.jar.bin");
+    filecontent = TestSolrConfigHandler.getFileContent("runtimecode/runtimelibs_v2.jar.bin");
     url = "http://localhost:8080/myjar/location.jar";
     @SuppressWarnings({"rawtypes"})
     BlobRepository.BlobContentRef ref = repository.getBlobIncRef( "filefoo",null,url,
diff --git a/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java b/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
deleted file mode 100644
index d9a3bf4..0000000
--- a/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * 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.solr.core;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
-import org.apache.solr.handler.TestBlobHandler;
-import org.apache.solr.util.RestTestHarness;
-import org.apache.solr.util.SimplePostTool;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import static java.util.Arrays.asList;
-import static org.apache.solr.handler.TestSolrConfigHandlerCloud.compareValues;
-
-public class TestDynamicLoading extends AbstractFullDistribZkTestBase {
-
-  @BeforeClass
-  public static void enableRuntimeLib() throws Exception {
-    System.setProperty("enable.runtime.lib", "true");
-  }
-
-  @Test
-  // 12-Jun-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028")
-  //17-Aug-2018 commented @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 20-Jul-2018
-  public void testDynamicLoading() throws Exception {
-    System.setProperty("enable.runtime.lib", "true");
-    setupRestTestHarnesses();
-
-    String blobName = "colltest";
-    boolean success = false;
-
-
-    HttpSolrClient randomClient = (HttpSolrClient) clients.get(random().nextInt(clients.size()));
-    String baseURL = randomClient.getBaseURL();
-    baseURL = baseURL.substring(0, baseURL.lastIndexOf('/'));
-    String payload = "{\n" +
-        "'add-runtimelib' : { 'name' : 'colltest' ,'version':1}\n" +
-        "}";
-    RestTestHarness client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "runtimeLib", blobName, "version"),
-        1l, 10);
-
-
-    payload = "{\n" +
-        "'create-requesthandler' : { 'name' : '/test1', 'class': 'org.apache.solr.core.BlobStoreTestRequestHandler' ,registerPath: '/solr,/v2',  'runtimeLib' : true }\n" +
-        "}";
-
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client,"/config",payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "requestHandler", "/test1", "class"),
-        "org.apache.solr.core.BlobStoreTestRequestHandler",10);
-
-    @SuppressWarnings({"rawtypes"})
-    Map map = TestSolrConfigHandler.getRespMap("/test1", client);
-
-    assertNotNull(map.toString(), map = (Map) map.get("error"));
-    assertTrue(map.toString(), map.get("msg").toString().contains(".system collection not available"));
-
-
-    TestBlobHandler.createSystemCollection(getHttpSolrClient(baseURL, randomClient.getHttpClient()));
-    waitForRecoveriesToFinish(".system", true);
-
-    map = TestSolrConfigHandler.getRespMap("/test1", client);
-
-
-    assertNotNull(map = (Map) map.get("error"));
-    assertTrue("full output " + map, map.get("msg").toString().contains("no such blob or version available: colltest/1" ));
-    payload = " {\n" +
-        "  'set' : {'watched': {" +
-        "                    'x':'X val',\n" +
-        "                    'y': 'Y val'}\n" +
-        "             }\n" +
-        "  }";
-
-    TestSolrConfigHandler.runConfigCommand(client,"/config/params",payload);
-    TestSolrConfigHandler.testForResponseElement(
-        client,
-        null,
-        "/config/params",
-        cloudClient,
-        Arrays.asList("response", "params", "watched", "x"),
-        "X val",
-        10);
-
-
-
-
-    for(int i=0;i<100;i++) {
-      map = TestSolrConfigHandler.getRespMap("/test1", client);
-      if("X val".equals(map.get("x"))){
-         success = true;
-         break;
-      }
-      Thread.sleep(100);
-    }
-    ByteBuffer jar = null;
-
-//     jar = persistZip("/tmp/runtimelibs.jar.bin", TestDynamicLoading.class, RuntimeLibReqHandler.class, RuntimeLibResponseWriter.class, RuntimeLibSearchComponent.class);
-//    if(true) return;
-
-    jar = getFileContent("runtimecode/runtimelibs.jar.bin");
-    TestBlobHandler.postAndCheck(cloudClient, baseURL, blobName, jar, 1);
-
-    payload = "{\n" +
-        "'create-requesthandler' : { 'name' : '/runtime', 'class': 'org.apache.solr.core.RuntimeLibReqHandler' , 'runtimeLib':true }," +
-        "'create-searchcomponent' : { 'name' : 'get', 'class': 'org.apache.solr.core.RuntimeLibSearchComponent' , 'runtimeLib':true }," +
-        "'create-queryResponseWriter' : { 'name' : 'json1', 'class': 'org.apache.solr.core.RuntimeLibResponseWriter' , 'runtimeLib':true }" +
-        "}";
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-
-    @SuppressWarnings({"rawtypes"})
-    Map result = TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "requestHandler", "/runtime", "class"),
-        "org.apache.solr.core.RuntimeLibReqHandler", 10);
-    compareValues(result, "org.apache.solr.core.RuntimeLibResponseWriter", asList("overlay", "queryResponseWriter", "json1", "class"));
-    compareValues(result, "org.apache.solr.core.RuntimeLibSearchComponent", asList("overlay", "searchComponent", "get", "class"));
-
-    result = TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/runtime",
-        null,
-        Arrays.asList("class"),
-        "org.apache.solr.core.RuntimeLibReqHandler", 10);
-    compareValues(result, MemClassLoader.class.getName(), asList( "loader"));
-
-    result = TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/runtime?wt=json1",
-        null,
-        Arrays.asList("wt"),
-        "org.apache.solr.core.RuntimeLibResponseWriter", 10);
-    compareValues(result, MemClassLoader.class.getName(), asList( "loader"));
-
-    result = TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/get?abc=xyz",
-        null,
-        Arrays.asList("get"),
-        "org.apache.solr.core.RuntimeLibSearchComponent", 10);
-    compareValues(result, MemClassLoader.class.getName(), asList( "loader"));
-
-    jar = getFileContent("runtimecode/runtimelibs_v2.jar.bin");
-    TestBlobHandler.postAndCheck(cloudClient, baseURL, blobName, jar, 2);
-    payload = "{\n" +
-        "'update-runtimelib' : { 'name' : 'colltest' ,'version':2}\n" +
-        "}";
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "runtimeLib", blobName, "version"),
-        2l, 10);
-
-    result = TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/get?abc=xyz",
-        null,
-        Arrays.asList("Version"),
-        "2", 10);
-
-
-    payload = " {\n" +
-        "  'set' : {'watched': {" +
-        "                    'x':'X val',\n" +
-        "                    'y': 'Y val'}\n" +
-        "             }\n" +
-        "  }";
-
-    TestSolrConfigHandler.runConfigCommand(client,"/config/params",payload);
-    TestSolrConfigHandler.testForResponseElement(
-        client,
-        null,
-        "/config/params",
-        cloudClient,
-        Arrays.asList("response", "params", "watched", "x"),
-        "X val",
-        10);
-   result = TestSolrConfigHandler.testForResponseElement(
-        client,
-        null,
-        "/test1",
-        cloudClient,
-        Arrays.asList("x"),
-        "X val",
-        10);
-
-    payload = " {\n" +
-        "  'set' : {'watched': {" +
-        "                    'x':'X val changed',\n" +
-        "                    'y': 'Y val'}\n" +
-        "             }\n" +
-        "  }";
-
-    TestSolrConfigHandler.runConfigCommand(client,"/config/params",payload);
-    result = TestSolrConfigHandler.testForResponseElement(
-        client,
-        null,
-        "/test1",
-        cloudClient,
-        Arrays.asList("x"),
-        "X val changed",
-        10);
-  }
-
-  public static ByteBuffer getFileContent(String f) throws IOException {
-    return getFileContent(f, true);
-  }
-  /**
-   * @param loadFromClassPath if true, it will look in the classpath to find the file,
-   *        otherwise load from absolute filesystem path.
-   */
-  public static ByteBuffer getFileContent(String f, boolean loadFromClassPath) throws IOException {
-    ByteBuffer jar;
-    File file = loadFromClassPath ? getFile(f): new File(f);
-    try (FileInputStream fis = new FileInputStream(file)) {
-      byte[] buf = new byte[fis.available()];
-      fis.read(buf);
-      jar = ByteBuffer.wrap(buf);
-    }
-    return jar;
-  }
-
-  public static  ByteBuffer persistZip(String loc,
-                                       @SuppressWarnings({"rawtypes"})Class... classes) throws IOException {
-    ByteBuffer jar = generateZip(classes);
-    try (FileOutputStream fos =  new FileOutputStream(loc)){
-      fos.write(jar.array(), 0, jar.limit());
-      fos.flush();
-    }
-    return jar;
-  }
-
-
-  public static ByteBuffer generateZip(@SuppressWarnings({"rawtypes"})Class... classes) throws IOException {
-    SimplePostTool.BAOS bos = new SimplePostTool.BAOS();
-    try (ZipOutputStream zipOut = new ZipOutputStream(bos)) {
-      zipOut.setLevel(ZipOutputStream.DEFLATED);
-      for (@SuppressWarnings({"rawtypes"})Class c : classes) {
-        String path = c.getName().replace('.', '/').concat(".class");
-        ZipEntry entry = new ZipEntry(path);
-        ByteBuffer b = SimplePostTool.inputStreamToByteArray(c.getClassLoader().getResourceAsStream(path));
-        zipOut.putNextEntry(entry);
-        zipOut.write(b.array(), 0, b.limit());
-        zipOut.closeEntry();
-      }
-    }
-    return bos.getByteBuffer();
-  }
-
-}
diff --git a/solr/core/src/test/org/apache/solr/core/TestDynamicLoadingUrl.java b/solr/core/src/test/org/apache/solr/core/TestDynamicLoadingUrl.java
deleted file mode 100644
index b172d52..0000000
--- a/solr/core/src/test/org/apache/solr/core/TestDynamicLoadingUrl.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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.solr.core;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Map;
-
-import com.google.common.collect.ImmutableMap;
-import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
-import org.apache.solr.common.util.Pair;
-import org.apache.solr.util.RestTestHarness;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.junit.BeforeClass;
-
-import static java.util.Arrays.asList;
-import static org.apache.solr.core.TestDynamicLoading.getFileContent;
-import static org.apache.solr.handler.TestSolrConfigHandlerCloud.compareValues;
-
-@SolrTestCaseJ4.SuppressSSL
-public class TestDynamicLoadingUrl extends AbstractFullDistribZkTestBase {
-
-  @BeforeClass
-  public static void enableRuntimeLib() throws Exception {
-    System.setProperty("enable.runtime.lib", "true");
-  }
-
-  public static Pair<Server, Integer> runHttpServer(Map<String, Object> jars) throws Exception {
-    final Server server = new Server();
-    final ServerConnector connector = new ServerConnector(server);
-    server.setConnectors(new Connector[] { connector });
-    server.setHandler(new AbstractHandler() {
-      @Override
-      public void handle(String s, Request request, HttpServletRequest req, HttpServletResponse rsp)
-        throws IOException {
-        ByteBuffer b = (ByteBuffer) jars.get(s);
-        if (b != null) {
-          rsp.getOutputStream().write(b.array(), 0, b.limit());
-          rsp.setContentType("application/octet-stream");
-          rsp.setStatus(HttpServletResponse.SC_OK);
-          request.setHandled(true);
-        }
-      }
-    });
-    server.start();
-    return new Pair<>(server, connector.getLocalPort());
-  }
-
-  public void testDynamicLoadingUrl() throws Exception {
-    setupRestTestHarnesses();
-    Pair<Server, Integer> pair = runHttpServer(ImmutableMap.of("/jar1.jar", getFileContent("runtimecode/runtimelibs.jar.bin")));
-    Integer port = pair.second();
-
-    try {
-      String payload = "{\n" +
-          "'add-runtimelib' : { 'name' : 'urljar', url : 'http://localhost:" + port + "/jar1.jar'" +
-          "  'sha512':'e01b51de67ae1680a84a813983b1de3b592fc32f1a22b662fc9057da5953abd1b72476388ba342cad21671cd0b805503c78ab9075ff2f3951fdf75fa16981420'}" +
-          "}";
-      RestTestHarness client = randomRestTestHarness();
-      TestSolrConfigHandler.runConfigCommandExpectFailure(client, "/config", payload, "Invalid jar");
-
-
-      payload = "{\n" +
-          "'add-runtimelib' : { 'name' : 'urljar', url : 'http://localhost:" + port + "/jar1.jar'" +
-          "  'sha512':'d01b51de67ae1680a84a813983b1de3b592fc32f1a22b662fc9057da5953abd1b72476388ba342cad21671cd0b805503c78ab9075ff2f3951fdf75fa16981420'}" +
-          "}";
-      client = randomRestTestHarness();
-      TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-      TestSolrConfigHandler.testForResponseElement(client,
-          null,
-          "/config/overlay",
-          null,
-          Arrays.asList("overlay", "runtimeLib", "urljar", "sha512"),
-          "d01b51de67ae1680a84a813983b1de3b592fc32f1a22b662fc9057da5953abd1b72476388ba342cad21671cd0b805503c78ab9075ff2f3951fdf75fa16981420", 120);
-
-      payload = "{\n" +
-          "'create-requesthandler' : { 'name' : '/runtime', 'class': 'org.apache.solr.core.RuntimeLibReqHandler', 'runtimeLib' : true}" +
-          "}";
-      client = randomRestTestHarness();
-      TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-
-      TestSolrConfigHandler.testForResponseElement(client,
-          null,
-          "/config/overlay",
-          null,
-          Arrays.asList("overlay", "requestHandler", "/runtime", "class"),
-          "org.apache.solr.core.RuntimeLibReqHandler", 120);
-
-      @SuppressWarnings({"rawtypes"})
-      Map result = TestSolrConfigHandler.testForResponseElement(client,
-          null,
-          "/runtime",
-          null,
-          Arrays.asList("class"),
-          "org.apache.solr.core.RuntimeLibReqHandler", 120);
-      compareValues(result, MemClassLoader.class.getName(), asList("loader"));
-    } finally {
-      pair.first().stop();
-
-    }
-
-
-  }
-}
-
diff --git a/solr/core/src/test/org/apache/solr/core/TestDynamicURP.java b/solr/core/src/test/org/apache/solr/core/TestDynamicURP.java
deleted file mode 100644
index ac37e28..0000000
--- a/solr/core/src/test/org/apache/solr/core/TestDynamicURP.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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.solr.core;
-
-import static java.util.Collections.singletonMap;
-import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
-import static org.apache.solr.core.TestDynamicLoading.getFileContent;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-
-import org.apache.solr.client.solrj.SolrQuery;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.client.solrj.request.V2Request;
-import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.SolrCloudTestCase;
-import org.apache.solr.common.MapWriter;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.handler.TestBlobHandler;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class TestDynamicURP extends SolrCloudTestCase {
-
-
-  private static final String COLLECTION = "testUrpColl";
-
-  @BeforeClass
-  public static void setupCluster() throws Exception {
-    System.setProperty("enable.runtime.lib", "true");
-    configureCluster(3)
-        .addConfig("conf", configset("cloud-minimal"))
-        .configure();
-    SolrZkClient zkClient = cluster.getSolrClient().getZkStateReader().getZkClient();
-    String path = ZkStateReader.CONFIGS_ZKNODE + "/conf/solrconfig.xml";
-    byte[] data = zkClient.getData(path, null, null, true);
-
-    String solrconfigStr = new String(data, StandardCharsets.UTF_8);
-    zkClient.setData(path, solrconfigStr.replace("</config>",
-        "<updateRequestProcessorChain name=\"test_urp\" processor=\"testURP\" default=\"true\">\n" +
-        "    <processor class=\"solr.RunUpdateProcessorFactory\"/>\n" +
-        "  </updateRequestProcessorChain>\n" +
-        "\n" +
-        "  <updateProcessor class=\"runtimecode.TestURP\" name=\"testURP\" runtimeLib=\"true\"></updateProcessor>\n" +
-        "</config>").getBytes(StandardCharsets.UTF_8), true );
-
-
-    CollectionAdminRequest.createCollection(COLLECTION, "conf", 3, 1).process(cluster.getSolrClient());
-    waitForState("", COLLECTION, clusterShape(3, 3));
-  }
-
-
-
-  @Test
-  public void testUrp() throws Exception {
-
-    ByteBuffer jar = getFileContent("runtimecode/runtimeurp.jar.bin");
-
-    String blobName = "urptest";
-    TestBlobHandler.postAndCheck(cluster.getSolrClient(), cluster.getRandomJetty(random()).getBaseUrl().toString(),
-        blobName, jar, 1);
-
-    new V2Request.Builder("/c/" + COLLECTION + "/config")
-        .withPayload(singletonMap("add-runtimelib", (MapWriter) ew1 -> ew1
-            .put("name", blobName)
-            .put("version", "1")))
-        .withMethod(POST)
-        .build()
-        .process(cluster.getSolrClient());
-    TestSolrConfigHandler.testForResponseElement(null,
-        cluster.getRandomJetty(random()).getBaseUrl().toString(),
-        "/"+COLLECTION+"/config/overlay",
-        cluster.getSolrClient(),
-        Arrays.asList("overlay", "runtimeLib", blobName, "version")
-        ,"1",10);
-
-    SolrInputDocument doc = new SolrInputDocument();
-    doc.addField("id", "123");
-    doc.addField("name_s", "Test URP");
-    new UpdateRequest()
-        .add(doc)
-        .commit(cluster.getSolrClient(), COLLECTION);
-    QueryResponse result = cluster.getSolrClient().query(COLLECTION, new SolrQuery("id:123"));
-    assertEquals(1, result.getResults().getNumFound());
-    Object time_s = result.getResults().get(0).getFirstValue("time_s");
-    assertNotNull(time_s);
-
-
-
-  }
-
-}
diff --git a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
index 6aa48a5..ead344c 100644
--- a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
+++ b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
@@ -16,10 +16,9 @@
  */
 package org.apache.solr.core;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
+import java.io.*;
 import java.lang.invoke.MethodHandles;
+import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,6 +26,8 @@ import java.util.Objects;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.io.FileUtils;
@@ -45,6 +46,7 @@ import org.apache.solr.search.SolrCache;
 import org.apache.solr.util.RESTfulServerProvider;
 import org.apache.solr.util.RestTestBase;
 import org.apache.solr.util.RestTestHarness;
+import org.apache.solr.util.SimplePostTool;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.After;
 import org.junit.Before;
@@ -67,8 +69,53 @@ public class TestSolrConfigHandler extends RestTestBase {
   private static final String collection = "collection1";
   private static final String confDir = collection + "/conf";
 
+    public static ByteBuffer getFileContent(String f) throws IOException {
+      return getFileContent(f, true);
+    }
+
+    /**
+     * @param loadFromClassPath if true, it will look in the classpath to find the file,
+     *        otherwise load from absolute filesystem path.
+     */
+    public static ByteBuffer getFileContent(String f, boolean loadFromClassPath) throws IOException {
+      ByteBuffer jar;
+      File file = loadFromClassPath ? getFile(f): new File(f);
+      try (FileInputStream fis = new FileInputStream(file)) {
+        byte[] buf = new byte[fis.available()];
+        fis.read(buf);
+        jar = ByteBuffer.wrap(buf);
+      }
+      return jar;
+    }
+
+    public static  ByteBuffer persistZip(String loc,
+                                           @SuppressWarnings({"rawtypes"})Class... classes) throws IOException {
+      ByteBuffer jar = generateZip(classes);
+      try (FileOutputStream fos =  new FileOutputStream(loc)){
+        fos.write(jar.array(), 0, jar.limit());
+        fos.flush();
+      }
+      return jar;
+    }
+
+    public static ByteBuffer generateZip(@SuppressWarnings({"rawtypes"})Class... classes) throws IOException {
+      SimplePostTool.BAOS bos = new SimplePostTool.BAOS();
+      try (ZipOutputStream zipOut = new ZipOutputStream(bos)) {
+        zipOut.setLevel(ZipOutputStream.DEFLATED);
+        for (@SuppressWarnings({"rawtypes"})Class c : classes) {
+          String path = c.getName().replace('.', '/').concat(".class");
+          ZipEntry entry = new ZipEntry(path);
+          ByteBuffer b = SimplePostTool.inputStreamToByteArray(c.getClassLoader().getResourceAsStream(path));
+          zipOut.putNextEntry(entry);
+          zipOut.write(b.array(), 0, b.limit());
+          zipOut.closeEntry();
+        }
+      }
+      return bos.getByteBuffer();
+    }
+
 
-  @Before
+    @Before
   public void before() throws Exception {
     tmpSolrHome = createTempDir().toFile();
     tmpConfDir = new File(tmpSolrHome, confDir);
diff --git a/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java b/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
index 1d7480a..b7fbbfc 100644
--- a/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
+++ b/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
@@ -52,7 +52,7 @@ import java.util.concurrent.Callable;
 import java.util.function.Predicate;
 
 import static org.apache.solr.common.util.Utils.JAVABINCONSUMER;
-import static org.apache.solr.core.TestDynamicLoading.getFileContent;
+import static org.apache.solr.core.TestSolrConfigHandler.getFileContent;
 import static org.hamcrest.CoreMatchers.containsString;
 
 @LogLevel("org.apache.solr.filestore.PackageStoreAPI=DEBUG;org.apache.solr.filestore.DistribPackageStore=DEBUG")
diff --git a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
index a54a3b0..77b1221 100644
--- a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
+++ b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
@@ -68,7 +68,7 @@ import org.junit.Test;
 import static org.apache.solr.common.cloud.ZkStateReader.SOLR_PKGS_PATH;
 import static org.apache.solr.common.params.CommonParams.JAVABIN;
 import static org.apache.solr.common.params.CommonParams.WT;
-import static org.apache.solr.core.TestDynamicLoading.getFileContent;
+import static org.apache.solr.core.TestSolrConfigHandler.getFileContent;
 import static org.apache.solr.filestore.TestDistribPackageStore.readFile;
 import static org.apache.solr.filestore.TestDistribPackageStore.uploadKey;
 import static org.apache.solr.filestore.TestDistribPackageStore.waitForAllNodesHaveFile;
diff --git a/solr/core/src/test/org/apache/solr/update/processor/RuntimeUrp.java b/solr/core/src/test/org/apache/solr/update/processor/RuntimeUrp.java
deleted file mode 100644
index 6cee3d9..0000000
--- a/solr/core/src/test/org/apache/solr/update/processor/RuntimeUrp.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.solr.update.processor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.update.AddUpdateCommand;
-
-public class RuntimeUrp extends SimpleUpdateProcessorFactory {
-  @Override
-  protected void process(AddUpdateCommand cmd, SolrQueryRequest req, SolrQueryResponse rsp) {
-    UpdateRequestProcessorChain processorChain = req.getCore().getUpdateProcessorChain(req.getParams());
-    List<String>  names = new ArrayList<>();
-    for (UpdateRequestProcessorFactory p : processorChain.getProcessors()) {
-      if (p instanceof UpdateRequestProcessorChain.LazyUpdateProcessorFactoryHolder.LazyUpdateRequestProcessorFactory) {
-        p = ((UpdateRequestProcessorChain.LazyUpdateProcessorFactoryHolder.LazyUpdateRequestProcessorFactory) p).getDelegate();
-      }
-      names.add(p.getClass().getSimpleName());
-    }
-    cmd.solrDoc.addField("processors_s", StrUtils.join(names,'>'));
-  }
-}
diff --git a/solr/core/src/test/org/apache/solr/update/processor/TestNamedUpdateProcessors.java b/solr/core/src/test/org/apache/solr/update/processor/TestNamedUpdateProcessors.java
deleted file mode 100644
index 45bb41c..0000000
--- a/solr/core/src/test/org/apache/solr/update/processor/TestNamedUpdateProcessors.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.solr.update.processor;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.apache.solr.client.solrj.SolrQuery;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.core.TestDynamicLoading;
-import org.apache.solr.core.TestSolrConfigHandler;
-import org.apache.solr.handler.TestBlobHandler;
-import org.apache.solr.util.RestTestHarness;
-import org.apache.solr.util.SimplePostTool;
-import org.junit.Test;
-
-public class TestNamedUpdateProcessors extends AbstractFullDistribZkTestBase {
-
-  @Test
-  //17-Aug-2018 commented @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 20-Jul-2018
-  public void test() throws Exception {
-    System.setProperty("enable.runtime.lib", "true");
-    setupRestTestHarnesses();
-
-    String blobName = "colltest";
-
-    HttpSolrClient randomClient = (HttpSolrClient) clients.get(random().nextInt(clients.size()));
-    String baseURL = randomClient.getBaseURL();
-
-    final String solrClientUrl = baseURL.substring(0, baseURL.lastIndexOf('/'));
-    TestBlobHandler.createSystemCollection(getHttpSolrClient(solrClientUrl, randomClient.getHttpClient()));
-    waitForRecoveriesToFinish(".system", true);
-
-    TestBlobHandler.postAndCheck(cloudClient, baseURL.substring(0, baseURL.lastIndexOf('/')), blobName, TestDynamicLoading.generateZip(RuntimeUrp.class), 1);
-
-    String payload = "{\n" +
-        "'add-runtimelib' : { 'name' : 'colltest' ,'version':1}\n" +
-        "}";
-    RestTestHarness client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    TestSolrConfigHandler.testForResponseElement(client,
-        null,
-        "/config/overlay",
-        null,
-        Arrays.asList("overlay", "runtimeLib", blobName, "version"),
-        1l, 10);
-
-    payload = "{\n" +
-        "'create-updateprocessor' : { 'name' : 'firstFld', 'class': 'solr.FirstFieldValueUpdateProcessorFactory', 'fieldName':'test_s'}, \n" +
-        "'create-updateprocessor' : { 'name' : 'test', 'class': 'org.apache.solr.update.processor.RuntimeUrp', 'runtimeLib':true }, \n" +
-        "'create-updateprocessor' : { 'name' : 'maxFld', 'class': 'solr.MaxFieldValueUpdateProcessorFactory', 'fieldName':'mul_s'} \n" +
-        "}";
-
-    client = randomRestTestHarness();
-    TestSolrConfigHandler.runConfigCommand(client, "/config", payload);
-    forAllRestTestHarnesses(restTestHarness -> {
-      try {
-        TestSolrConfigHandler.testForResponseElement(restTestHarness,
-            null,
-            "/config/overlay",
-            null,
-            Arrays.asList("overlay", "updateProcessor", "firstFld", "fieldName"),
-            "test_s", 10);
-      } catch (Exception ex) {
-        fail("Caught exception: "+ex);
-      }
-    });
-
-    SolrInputDocument doc = new SolrInputDocument();
-    doc.addField("id", "123");
-    doc.addField("test_s", Arrays.asList("one", "two"));
-    doc.addField("mul_s", Arrays.asList("aaa", "bbb"));
-    randomClient.add(doc);
-    randomClient.commit(true, true);
-    QueryResponse result = randomClient.query(new SolrQuery("id:123"));
-    assertEquals(2, ((Collection) result.getResults().get(0).getFieldValues("test_s")).size());
-    assertEquals(2, ((Collection) result.getResults().get(0).getFieldValues("mul_s")).size());
-    doc = new SolrInputDocument();
-    doc.addField("id", "456");
-    doc.addField("test_s", Arrays.asList("three", "four"));
-    doc.addField("mul_s", Arrays.asList("aaa", "bbb"));
-    UpdateRequest ur = new UpdateRequest();
-    ur.add(doc).setParam("processor", "firstFld,maxFld,test");
-    randomClient.request(ur);
-    randomClient.commit(true, true);
-    result = randomClient.query(new SolrQuery("id:456"));
-    SolrDocument d = result.getResults().get(0);
-    assertEquals(1, d.getFieldValues("test_s").size());
-    assertEquals(1, d.getFieldValues("mul_s").size());
-    assertEquals("three", d.getFieldValues("test_s").iterator().next());
-    assertEquals("bbb", d.getFieldValues("mul_s").iterator().next());
-    String processors = (String) d.getFirstValue("processors_s");
-    assertNotNull(processors);
-    assertEquals(StrUtils.splitSmart(processors, '>'),
-        Arrays.asList("FirstFieldValueUpdateProcessorFactory", "MaxFieldValueUpdateProcessorFactory", "RuntimeUrp", "LogUpdateProcessorFactory", "DistributedUpdateProcessorFactory", "RunUpdateProcessorFactory"));
-
-
-  }
-
-  public static ByteBuffer getFileContent(String f) throws IOException {
-    ByteBuffer jar;
-    try (FileInputStream fis = new FileInputStream(getFile(f))) {
-      byte[] buf = new byte[fis.available()];
-      fis.read(buf);
-      jar = ByteBuffer.wrap(buf);
-    }
-    return jar;
-  }
-
-  public static ByteBuffer persistZip(String loc,
-                                      @SuppressWarnings({"rawtypes"})Class... classes) throws IOException {
-    ByteBuffer jar = generateZip(classes);
-    try (FileOutputStream fos = new FileOutputStream(loc)) {
-      fos.write(jar.array(), 0, jar.limit());
-      fos.flush();
-    }
-    return jar;
-  }
-
-
-  public static ByteBuffer generateZip(@SuppressWarnings({"rawtypes"})Class... classes) throws IOException {
-    SimplePostTool.BAOS bos = new SimplePostTool.BAOS();
-    try (ZipOutputStream zipOut = new ZipOutputStream(bos)) {
-      zipOut.setLevel(ZipOutputStream.DEFLATED);
-      for (@SuppressWarnings({"rawtypes"})Class c : classes) {
-        String path = c.getName().replace('.', '/').concat(".class");
-        ZipEntry entry = new ZipEntry(path);
-        ByteBuffer b = SimplePostTool.inputStreamToByteArray(c.getClassLoader().getResourceAsStream(path));
-        zipOut.putNextEntry(entry);
-        zipOut.write(b.array(), 0, b.limit());
-        zipOut.closeEntry();
-      }
-    }
-    return bos.getByteBuffer();
-  }
-
-}