/*
 * 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.beam.sdk.fn.splittabledofn;

import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

import java.util.ArrayList;
import java.util.List;
import org.apache.beam.sdk.fn.splittabledofn.RestrictionTrackers.ClaimObserver;
import org.apache.beam.sdk.transforms.splittabledofn.Backlog;
import org.apache.beam.sdk.transforms.splittabledofn.Backlogs;
import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Tests for {@link RestrictionTrackers}. */
@RunWith(JUnit4.class)
public class RestrictionTrackersTest {
  @Test
  public void testObservingClaims() {
    RestrictionTracker<String, String> observedTracker =
        new RestrictionTracker() {

          @Override
          public boolean tryClaim(Object position) {
            return "goodClaim".equals(position);
          }

          @Override
          public Object currentRestriction() {
            throw new UnsupportedOperationException();
          }

          @Override
          public Object checkpoint() {
            throw new UnsupportedOperationException();
          }

          @Override
          public void checkDone() throws IllegalStateException {
            throw new UnsupportedOperationException();
          }
        };

    List<String> positionsObserved = new ArrayList<>();
    ClaimObserver<String> observer =
        new ClaimObserver<String>() {

          @Override
          public void onClaimed(String position) {
            positionsObserved.add(position);
            assertEquals("goodClaim", position);
          }

          @Override
          public void onClaimFailed(String position) {
            positionsObserved.add(position);
          }
        };

    RestrictionTracker<String, String> observingTracker =
        RestrictionTrackers.observe(observedTracker, observer);
    observingTracker.tryClaim("goodClaim");
    observingTracker.tryClaim("badClaim");

    assertThat(positionsObserved, contains("goodClaim", "badClaim"));
  }

  private static class RestrictionTrackerWithBacklog extends RestrictionTracker<Object, Object>
      implements Backlogs.HasBacklog {

    @Override
    public Backlog getBacklog() {
      return null;
    }

    @Override
    public boolean tryClaim(Object position) {
      return false;
    }

    @Override
    public Object currentRestriction() {
      return null;
    }

    @Override
    public Object checkpoint() {
      return null;
    }

    @Override
    public void checkDone() throws IllegalStateException {}
  }

  private static class RestrictionTrackerWithBacklogPartitionedBacklog
      extends RestrictionTracker<Object, Object> implements Backlogs.HasPartitionedBacklog {

    @Override
    public Backlog getBacklog() {
      return null;
    }

    @Override
    public boolean tryClaim(Object position) {
      return false;
    }

    @Override
    public Object currentRestriction() {
      return null;
    }

    @Override
    public Object checkpoint() {
      return null;
    }

    @Override
    public void checkDone() throws IllegalStateException {}

    @Override
    public byte[] getBacklogPartition() {
      return null;
    }
  }

  @Test
  public void testClaimObserversMaintainBacklogInterfaces() {
    RestrictionTracker hasBacklog =
        RestrictionTrackers.observe(new RestrictionTrackerWithBacklog(), null);
    assertThat(hasBacklog, instanceOf(Backlogs.HasBacklog.class));
    RestrictionTracker hasPartitionedBacklog =
        RestrictionTrackers.observe(new RestrictionTrackerWithBacklogPartitionedBacklog(), null);
    assertThat(hasPartitionedBacklog, instanceOf(Backlogs.HasPartitionedBacklog.class));
  }
}
