/*
 * 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.yarn.server.nodemanager.api.impl.pb;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.proto.YarnServerNodemanagerRecoveryProtos.DeletionServiceDeleteTaskProto;
import org.apache.hadoop.yarn.server.nodemanager.DeletionService;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.deletion.recovery.DeletionTaskRecoveryInfo;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.deletion.task.DeletionTask;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.deletion.task.DeletionTaskType;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.deletion.task.FileDeletionTask;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;

/**
 * Test conversion to {@link DeletionTask}.
 */
public class TestNMProtoUtils {

  @Test
  public void testConvertProtoToDeletionTask() throws Exception {
    DeletionService deletionService = mock(DeletionService.class);
    DeletionServiceDeleteTaskProto.Builder protoBuilder =
        DeletionServiceDeleteTaskProto.newBuilder();
    int id = 0;
    protoBuilder.setId(id);
    DeletionServiceDeleteTaskProto proto = protoBuilder.build();
    DeletionTask deletionTask =
        NMProtoUtils.convertProtoToDeletionTask(proto, deletionService);
    assertEquals(DeletionTaskType.FILE, deletionTask.getDeletionTaskType());
    assertEquals(id, deletionTask.getTaskId());
  }

  @Test
  public void testConvertProtoToFileDeletionTask() throws Exception {
    DeletionService deletionService = mock(DeletionService.class);
    int id = 0;
    String user = "user";
    Path subdir = new Path("subdir");
    Path basedir = new Path("basedir");
    DeletionServiceDeleteTaskProto.Builder protoBuilder =
        DeletionServiceDeleteTaskProto.newBuilder();
    protoBuilder
        .setId(id)
        .setUser("user")
        .setSubdir(subdir.getName())
        .addBasedirs(basedir.getName());
    DeletionServiceDeleteTaskProto proto = protoBuilder.build();
    DeletionTask deletionTask =
        NMProtoUtils.convertProtoToFileDeletionTask(proto, deletionService, id);
    assertEquals(DeletionTaskType.FILE.name(),
        deletionTask.getDeletionTaskType().name());
    assertEquals(id, deletionTask.getTaskId());
    assertEquals(subdir, ((FileDeletionTask) deletionTask).getSubDir());
    assertEquals(basedir,
        ((FileDeletionTask) deletionTask).getBaseDirs().get(0));
  }

  @Test
  public void testConvertProtoToDeletionTaskRecoveryInfo() throws Exception {
    long delTime = System.currentTimeMillis();
    List<Integer> successorTaskIds = Arrays.asList(1);
    DeletionTask deletionTask = mock(DeletionTask.class);
    DeletionTaskRecoveryInfo info =
        new DeletionTaskRecoveryInfo(deletionTask, successorTaskIds, delTime);
    assertEquals(deletionTask, info.getTask());
    assertEquals(successorTaskIds, info.getSuccessorTaskIds());
    assertEquals(delTime, info.getDeletionTimestamp());
  }

}