/**
 * 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.hadoop.ha;

import org.junit.Assert;

/**
 * A fake shared resource, for use in automatic failover testing.
 * This simulates a real shared resource like a shared edit log.
 * When the {@link DummyHAService} instances change state or get
 * fenced, they notify the shared resource, which asserts that
 * we never have two HA services who think they're holding the
 * resource at the same time.
 */
public class DummySharedResource {
  private DummyHAService holder = null;
  private int violations = 0;
  
  public synchronized void take(DummyHAService newHolder) {
    if (holder == null || holder == newHolder) {
      holder = newHolder;
    } else {
      violations++;
      throw new IllegalStateException("already held by: " + holder);
    }
  }
  
  public synchronized void release(DummyHAService oldHolder) {
    if (holder == oldHolder) {
      holder = null;
    }
  }
  
  public synchronized void assertNoViolations() {
    Assert.assertEquals(0, violations);
  }
}
