/**
 * 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
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * 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.containermanager.resourceplugin.fpga;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.List;

import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.fpga.IntelFpgaOpenclPlugin.InnerShellExecutor;
import org.junit.jupiter.api.Test;

/**
 * Tests for AoclDiagnosticOutputParser.
 */
@SuppressWarnings("checkstyle:linelength")
public class TestAoclOutputParser {

  @Test
  public void testParsing() {
    String output = "------------------------- acl0 -------------------------\n" +
        "Vendor: Nallatech ltd\n" +
        "Phys Dev Name  Status   Information\n" +
        "aclnalla_pcie0Passed   nalla_pcie (aclnalla_pcie0)\n" +
        "                       PCIe dev_id = 2494, bus:slot.func = 02:00.00, Gen3 x8\n" +
        "                       FPGA temperature = 53.1 degrees C.\n" +
        "                       Total Card Power Usage = 31.7 Watts.\n" +
        "                       Device Power Usage = 0.0 Watts.\n" +
        "DIAGNOSTIC_PASSED" +
        "---------------------------------------------------------\n";
    output = output +
        "------------------------- acl1 -------------------------\n" +
        "Vendor: Nallatech ltd\n" +
        "Phys Dev Name  Status   Information\n" +
        "aclnalla_pcie1Passed   nalla_pcie (aclnalla_pcie1)\n" +
        "                       PCIe dev_id = 2495, bus:slot.func = 03:00.00, Gen3 x8\n" +
        "                       FPGA temperature = 43.1 degrees C.\n" +
        "                       Total Card Power Usage = 11.7 Watts.\n" +
        "                       Device Power Usage = 0.0 Watts.\n" +
        "DIAGNOSTIC_PASSED" +
        "---------------------------------------------------------\n";
    output = output +
        "------------------------- acl2 -------------------------\n" +
        "Vendor: Intel(R) Corporation\n" +
        "\n" +
        "Phys Dev Name  Status   Information\n" +
        "\n" +
        "acla10_ref0   Passed   Arria 10 Reference Platform (acla10_ref0)\n" +
        "                       PCIe dev_id = 2494, bus:slot.func = 09:00.00, Gen2 x8\n" +
        "                       FPGA temperature = 50.5781 degrees C.\n" +
        "\n" +
        "DIAGNOSTIC_PASSED\n" +
        "---------------------------------------------------------\n";
    InnerShellExecutor shellExecutor = mock(InnerShellExecutor.class);
    when(shellExecutor.getMajorAndMinorNumber("aclnalla_pcie0"))
        .thenReturn("247:0");
    when(shellExecutor.getMajorAndMinorNumber("aclnalla_pcie1"))
        .thenReturn("247:1");
    when(shellExecutor.getMajorAndMinorNumber("acla10_ref0"))
        .thenReturn("246:0");

    List<FpgaDevice> devices =
        AoclDiagnosticOutputParser.parseDiagnosticOutput(
            output, shellExecutor, "IntelOpenCL");

    assertEquals(3, devices.size());
    assertEquals("IntelOpenCL", devices.get(0).getType());
    assertEquals(247, devices.get(0).getMajor());
    assertEquals(0, devices.get(0).getMinor());
    assertEquals("acl0", devices.get(0).getAliasDevName());

    assertEquals("IntelOpenCL", devices.get(1).getType());
    assertEquals(247, devices.get(1).getMajor());
    assertEquals(1, devices.get(1).getMinor());
    assertEquals("acl1", devices.get(1).getAliasDevName());

    assertEquals("IntelOpenCL", devices.get(2).getType());
    assertEquals(246, devices.get(2).getMajor());
    assertEquals(0, devices.get(2).getMinor());
    assertEquals("acl2", devices.get(2).getAliasDevName());

    // Case 2. check alias map
    assertEquals("acl0", devices.get(0).getAliasDevName());
    assertEquals("acl1", devices.get(1).getAliasDevName());
    assertEquals("acl2", devices.get(2).getAliasDevName());
  }
}
