001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.util;
019
020/**
021 * Used by tests to inject an edge into the manager. The intent is to minimise the use of the
022 * injectEdge method giving it default permissions, but in testing we may need to use this
023 * functionality elsewhere.
024 */
025public final class EnvironmentEdgeManagerTestHelper {
026  private EnvironmentEdgeManagerTestHelper() {
027  }
028
029  public static void reset() {
030    EnvironmentEdgeManager.reset();
031  }
032
033  public static void injectEdge(EnvironmentEdge edge) {
034    EnvironmentEdgeManager.injectEdge(edge);
035  }
036
037  private static final class PackageEnvironmentEdgeWrapper implements EnvironmentEdge {
038
039    private final EnvironmentEdge delegate;
040
041    private final String packageName;
042
043    PackageEnvironmentEdgeWrapper(EnvironmentEdge delegate, String packageName) {
044      this.delegate = delegate;
045      this.packageName = packageName;
046    }
047
048    @Override
049    public long currentTime() {
050      StackTraceElement[] elements = new Exception().getStackTrace();
051      // the first element is us, the second one is EnvironmentEdgeManager, so let's check the third
052      // one
053      if (elements.length > 2 && elements[2].getClassName().startsWith(packageName)) {
054        return delegate.currentTime();
055      } else {
056        return System.currentTimeMillis();
057      }
058    }
059  }
060
061  /**
062   * Inject a {@link EnvironmentEdge} which only takes effect when calling directly from the classes
063   * in the given package.
064   */
065  public static void injectEdgeForPackage(EnvironmentEdge edge, String packageName) {
066    injectEdge(new PackageEnvironmentEdgeWrapper(edge, packageName));
067  }
068}