TestFederationProtocolRecords.java

/**
 * 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.federation.store.records;

import org.apache.hadoop.util.Time;
import org.apache.hadoop.yarn.api.BasePBImplRecordsTest;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
import org.apache.hadoop.yarn.api.records.Priority;
import org.apache.hadoop.yarn.api.records.URL;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.api.records.ContainerRetryContext;
import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
import org.apache.hadoop.yarn.api.records.LocalResource;
import org.apache.hadoop.yarn.api.records.LogAggregationContext;
import org.apache.hadoop.yarn.api.records.ReservationId;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.AddApplicationHomeSubClusterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.AddApplicationHomeSubClusterResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.DeleteApplicationHomeSubClusterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.DeleteApplicationHomeSubClusterResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetApplicationHomeSubClusterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetApplicationHomeSubClusterResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetApplicationsHomeSubClusterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetApplicationsHomeSubClusterResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClusterInfoRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClusterInfoResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClusterPoliciesConfigurationsRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClusterPoliciesConfigurationsResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClusterPolicyConfigurationRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClusterPolicyConfigurationResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClustersInfoRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetSubClustersInfoResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SetSubClusterPolicyConfigurationRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SetSubClusterPolicyConfigurationResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterDeregisterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterDeregisterResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterHeartbeatRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterHeartbeatResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterIdProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterInfoProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterRegisterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.SubClusterRegisterResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.UpdateApplicationHomeSubClusterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.UpdateApplicationHomeSubClusterResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.RouterStoreTokenProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.RouterRMTokenRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.RouterRMTokenResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.GetReservationHomeSubClusterRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.RouterMasterKeyProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.RouterMasterKeyRequestProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.RouterMasterKeyResponseProto;
import org.apache.hadoop.yarn.federation.proto.YarnServerFederationProtos.ApplicationHomeSubClusterProto;
import org.apache.hadoop.yarn.server.federation.policies.dao.WeightedPolicyInfo;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.AddApplicationHomeSubClusterRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.AddApplicationHomeSubClusterResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.DeleteApplicationHomeSubClusterRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.DeleteApplicationHomeSubClusterResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetApplicationHomeSubClusterRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetApplicationHomeSubClusterResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetApplicationsHomeSubClusterRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetApplicationsHomeSubClusterResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClusterInfoRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClusterInfoResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClusterPoliciesConfigurationsRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClusterPoliciesConfigurationsResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClusterPolicyConfigurationRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClusterPolicyConfigurationResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClustersInfoRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetSubClustersInfoResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SetSubClusterPolicyConfigurationRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SetSubClusterPolicyConfigurationResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterDeregisterRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterDeregisterResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterHeartbeatRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterHeartbeatResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterIdPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterInfoPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterRegisterRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.SubClusterRegisterResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.UpdateApplicationHomeSubClusterRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.UpdateApplicationHomeSubClusterResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.RouterMasterKeyPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.RouterMasterKeyRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.RouterMasterKeyResponsePBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.RouterStoreTokenPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.RouterRMTokenRequestPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.RouterRMTokenResponsePBImpl;
import org.apache.hadoop.yarn.security.client.YARNDelegationTokenIdentifier;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.ApplicationHomeSubClusterPBImpl;
import org.apache.hadoop.yarn.server.federation.store.records.impl.pb.GetReservationHomeSubClusterRequestPBImpl;
import org.apache.hadoop.yarn.server.records.Version;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.nio.ByteBuffer;

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

/**
 * Test class for federation protocol records.
 */
public class TestFederationProtocolRecords extends BasePBImplRecordsTest {

  @BeforeAll
  public static void setup() throws Exception {
    generateByNewInstance(ApplicationId.class);
    generateByNewInstance(Version.class);
    generateByNewInstance(SubClusterId.class);
    generateByNewInstance(SubClusterInfo.class);
    generateByNewInstance(Priority.class);
    generateByNewInstance(URL.class);
    generateByNewInstance(Resource.class);
    generateByNewInstance(ContainerRetryContext.class);
    generateByNewInstance(LocalResource.class);
    generateByNewInstance(ContainerLaunchContext.class);
    generateByNewInstance(LogAggregationContext.class);
    generateByNewInstance(ApplicationSubmissionContext.class);
    generateByNewInstance(ApplicationHomeSubCluster.class);
    generateByNewInstance(SubClusterPolicyConfiguration.class);
    generateByNewInstance(RouterMasterKey.class);
    generateByNewInstance(YARNDelegationTokenIdentifier.class);
    generateByNewInstance(RouterStoreToken.class);
    generateByNewInstance(ReservationId.class);
  }

  @Test
  public void testSubClusterId() throws Exception {
    validatePBImplRecord(SubClusterIdPBImpl.class, SubClusterIdProto.class);
  }

  @Test
  public void testSubClusterInfo() throws Exception {
    validatePBImplRecord(SubClusterInfoPBImpl.class, SubClusterInfoProto.class);
  }

  @Test
  public void testSubClusterRegisterRequest() throws Exception {
    validatePBImplRecord(SubClusterRegisterRequestPBImpl.class,
        SubClusterRegisterRequestProto.class);
  }

  @Test
  public void testSubClusterRegisterResponse() throws Exception {
    validatePBImplRecord(SubClusterRegisterResponsePBImpl.class,
        SubClusterRegisterResponseProto.class);
  }

  @Test
  public void testSubClusterDeregisterRequest() throws Exception {
    validatePBImplRecord(SubClusterDeregisterRequestPBImpl.class,
        SubClusterDeregisterRequestProto.class);
  }

  @Test
  public void testSubClusterDeregisterResponse() throws Exception {
    validatePBImplRecord(SubClusterDeregisterResponsePBImpl.class,
        SubClusterDeregisterResponseProto.class);
  }

  @Test
  public void testSubClusterHeartbeatRequest() throws Exception {
    validatePBImplRecord(SubClusterHeartbeatRequestPBImpl.class,
        SubClusterHeartbeatRequestProto.class);
  }

  @Test
  public void testSubClusterHeartbeatResponse() throws Exception {
    validatePBImplRecord(SubClusterHeartbeatResponsePBImpl.class,
        SubClusterHeartbeatResponseProto.class);
  }

  @Test
  public void testGetSubClusterRequest() throws Exception {
    validatePBImplRecord(GetSubClusterInfoRequestPBImpl.class,
        GetSubClusterInfoRequestProto.class);
  }

  @Test
  public void testGetSubClusterResponse() throws Exception {
    validatePBImplRecord(GetSubClusterInfoResponsePBImpl.class,
        GetSubClusterInfoResponseProto.class);
  }

  @Test
  public void testGetSubClustersInfoRequest() throws Exception {
    validatePBImplRecord(GetSubClustersInfoRequestPBImpl.class,
        GetSubClustersInfoRequestProto.class);
  }

  @Test
  public void testGetSubClustersInfoResponse() throws Exception {
    validatePBImplRecord(GetSubClustersInfoResponsePBImpl.class,
        GetSubClustersInfoResponseProto.class);
  }

  @Test
  public void testAddApplicationHomeSubClusterRequest() throws Exception {
    validatePBImplRecord(AddApplicationHomeSubClusterRequestPBImpl.class,
        AddApplicationHomeSubClusterRequestProto.class);
  }

  @Test
  public void testAddApplicationHomeSubClusterResponse() throws Exception {
    validatePBImplRecord(AddApplicationHomeSubClusterResponsePBImpl.class,
        AddApplicationHomeSubClusterResponseProto.class);
  }

  @Test
  public void testUpdateApplicationHomeSubClusterRequest() throws Exception {
    validatePBImplRecord(UpdateApplicationHomeSubClusterRequestPBImpl.class,
        UpdateApplicationHomeSubClusterRequestProto.class);
  }

  @Test
  public void testUpdateApplicationHomeSubClusterResponse() throws Exception {
    validatePBImplRecord(UpdateApplicationHomeSubClusterResponsePBImpl.class,
        UpdateApplicationHomeSubClusterResponseProto.class);
  }

  @Test
  public void testGetApplicationHomeSubClusterRequest() throws Exception {
    validatePBImplRecord(GetApplicationHomeSubClusterRequestPBImpl.class,
        GetApplicationHomeSubClusterRequestProto.class);
  }

  @Test
  public void testGetApplicationHomeSubClusterResponse() throws Exception {
    validatePBImplRecord(GetApplicationHomeSubClusterResponsePBImpl.class,
        GetApplicationHomeSubClusterResponseProto.class);
  }

  @Test
  public void testGetApplicationsHomeSubClusterRequest() throws Exception {
    validatePBImplRecord(GetApplicationsHomeSubClusterRequestPBImpl.class,
        GetApplicationsHomeSubClusterRequestProto.class);
  }

  @Test
  public void testGetApplicationsHomeSubClusterResponse() throws Exception {
    validatePBImplRecord(GetApplicationsHomeSubClusterResponsePBImpl.class,
        GetApplicationsHomeSubClusterResponseProto.class);
  }

  @Test
  public void testDeleteApplicationHomeSubClusterRequest() throws Exception {
    validatePBImplRecord(DeleteApplicationHomeSubClusterRequestPBImpl.class,
        DeleteApplicationHomeSubClusterRequestProto.class);
  }

  @Test
  public void testDeleteApplicationHomeSubClusterResponse() throws Exception {
    validatePBImplRecord(DeleteApplicationHomeSubClusterResponsePBImpl.class,
        DeleteApplicationHomeSubClusterResponseProto.class);
  }

  @Test
  public void testGetSubClusterPolicyConfigurationRequest() throws Exception {
    validatePBImplRecord(GetSubClusterPolicyConfigurationRequestPBImpl.class,
        GetSubClusterPolicyConfigurationRequestProto.class);
  }

  @Test
  public void testGetSubClusterPolicyConfigurationResponse() throws Exception {
    validatePBImplRecord(GetSubClusterPolicyConfigurationResponsePBImpl.class,
        GetSubClusterPolicyConfigurationResponseProto.class);
  }

  @Test
  public void testSetSubClusterPolicyConfigurationRequest() throws Exception {
    validatePBImplRecord(SetSubClusterPolicyConfigurationRequestPBImpl.class,
        SetSubClusterPolicyConfigurationRequestProto.class);
  }

  @Test
  public void testSetSubClusterPolicyConfigurationResponse() throws Exception {
    validatePBImplRecord(SetSubClusterPolicyConfigurationResponsePBImpl.class,
        SetSubClusterPolicyConfigurationResponseProto.class);
  }

  @Test
  public void testGetSubClusterPoliciesConfigurationsRequest()
      throws Exception {
    validatePBImplRecord(GetSubClusterPoliciesConfigurationsRequestPBImpl.class,
        GetSubClusterPoliciesConfigurationsRequestProto.class);
  }

  @Test
  public void testGetSubClusterPoliciesConfigurationsResponse()
      throws Exception {
    validatePBImplRecord(
        GetSubClusterPoliciesConfigurationsResponsePBImpl.class,
        GetSubClusterPoliciesConfigurationsResponseProto.class);
  }

  @Test
  public void testRouterMasterKey() throws Exception {
    validatePBImplRecord(RouterMasterKeyPBImpl.class, RouterMasterKeyProto.class);
  }

  @Test
  public void testRouterMasterKeyRequest() throws Exception {
    validatePBImplRecord(RouterMasterKeyRequestPBImpl.class, RouterMasterKeyRequestProto.class);
  }

  @Test
  public void testRouterMasterKeyResponse() throws Exception {
    validatePBImplRecord(RouterMasterKeyResponsePBImpl.class, RouterMasterKeyResponseProto.class);
  }

  @Test
  public void testRouterStoreToken() throws Exception {
    validatePBImplRecord(RouterStoreTokenPBImpl.class, RouterStoreTokenProto.class);
  }

  @Test
  public void testRouterRMTokenRequest() throws Exception {
    validatePBImplRecord(RouterRMTokenRequestPBImpl.class, RouterRMTokenRequestProto.class);
  }

  @Test
  public void testRouterRMTokenResponse() throws Exception {
    validatePBImplRecord(RouterRMTokenResponsePBImpl.class, RouterRMTokenResponseProto.class);
  }

  @Test
  public void testApplicationHomeSubCluster() throws Exception {
    validatePBImplRecord(ApplicationHomeSubClusterPBImpl.class,
        ApplicationHomeSubClusterProto.class);
  }

  @Test
  public void testGetReservationHomeSubClusterRequest() throws Exception {
    validatePBImplRecord(GetReservationHomeSubClusterRequestPBImpl.class,
        GetReservationHomeSubClusterRequestProto.class);
  }

  @Test
  public void testValidateApplicationHomeSubClusterEqual() throws Exception {
    long now = Time.now();

    ApplicationId appId1 = ApplicationId.newInstance(now, 1);
    SubClusterId subClusterId1 = SubClusterId.newInstance("SC-1");
    ApplicationHomeSubCluster applicationHomeSubCluster1 =
        ApplicationHomeSubCluster.newInstance(appId1, subClusterId1);

    ApplicationId appId2 = ApplicationId.newInstance(now, 1);
    SubClusterId subClusterId2 = SubClusterId.newInstance("SC-1");
    ApplicationHomeSubCluster applicationHomeSubCluster2 =
        ApplicationHomeSubCluster.newInstance(appId2, subClusterId2);

    assertEquals(applicationHomeSubCluster1, applicationHomeSubCluster2);
  }

  @Test
  public void testValidateReservationHomeSubClusterEqual() throws Exception {
    long now = Time.now();

    ReservationId reservationId1 = ReservationId.newInstance(now, 1);
    SubClusterId subClusterId1 = SubClusterId.newInstance("SC-1");
    ReservationHomeSubCluster reservationHomeSubCluster1 =
        ReservationHomeSubCluster.newInstance(reservationId1, subClusterId1);

    ReservationId reservationId2 = ReservationId.newInstance(now, 1);
    SubClusterId subClusterId2 = SubClusterId.newInstance("SC-1");
    ReservationHomeSubCluster reservationHomeSubCluster2 =
        ReservationHomeSubCluster.newInstance(reservationId2, subClusterId2);

    assertEquals(reservationHomeSubCluster1, reservationHomeSubCluster2);
  }

  @Test
  public void testSubClusterIdEqual() throws Exception {
    SubClusterId subClusterId1 = SubClusterId.newInstance("SC-1");
    SubClusterId subClusterId2 = SubClusterId.newInstance("SC-1");
    assertEquals(subClusterId1, subClusterId2);
  }

  @Test
  public void testSubClusterIdInfoEqual() throws Exception {
    SubClusterIdInfo subClusterIdInfo1 = new SubClusterIdInfo("SC-1");
    SubClusterIdInfo subClusterIdInfo2 = new SubClusterIdInfo("SC-1");
    assertEquals(subClusterIdInfo1, subClusterIdInfo2);
  }

  @Test
  public void testSubClusterPolicyConfigurationEqual() throws Exception {

    String queue1 = "queue1";
    WeightedPolicyInfo policyInfo1 = mock(WeightedPolicyInfo.class);
    ByteBuffer buf1 = policyInfo1.toByteBuffer();
    SubClusterPolicyConfiguration configuration1 = SubClusterPolicyConfiguration
        .newInstance(queue1, policyInfo1.getClass().getCanonicalName(), buf1);

    String queue2 = "queue1";
    WeightedPolicyInfo policyInfo2 = mock(WeightedPolicyInfo.class);
    ByteBuffer buf2 = policyInfo1.toByteBuffer();
    SubClusterPolicyConfiguration configuration2 = SubClusterPolicyConfiguration
        .newInstance(queue2, policyInfo2.getClass().getCanonicalName(), buf2);

    assertEquals(configuration1, configuration2);
  }

  @Test
  public void testSubClusterInfoEqual() throws Exception {

    String scAmRMAddress = "5.6.7.8:5";
    String scClientRMAddress = "5.6.7.8:6";
    String scRmAdminAddress = "5.6.7.8:7";
    String scWebAppAddress = "127.0.0.1:8080";
    String capabilityJson = "-";
    long currentTime = Time.now();

    SubClusterInfo sc1 =
        SubClusterInfo.newInstance(SubClusterId.newInstance("SC-1"),
        scAmRMAddress, scClientRMAddress, scRmAdminAddress, scWebAppAddress,
        SubClusterState.SC_RUNNING, currentTime, capabilityJson);

    SubClusterInfo sc2 =
        SubClusterInfo.newInstance(SubClusterId.newInstance("SC-1"),
        scAmRMAddress, scClientRMAddress, scRmAdminAddress, scWebAppAddress,
        SubClusterState.SC_RUNNING, currentTime, capabilityJson);

    assertEquals(sc1, sc2);
  }

  @Test
  public void testApplicationHomeSubClusterEqual() throws Exception {
    // Case1, We create 2 ApplicationHomeSubCluster,
    // all properties are consistent
    // We expect the result to be equal.
    ApplicationId appId1 = ApplicationId.newInstance(1, 1);
    SubClusterId subClusterId1 = SubClusterId.newInstance("SC");
    ApplicationSubmissionContext context1 =
        ApplicationSubmissionContext.newInstance(appId1, "test", "default",
        Priority.newInstance(0), null, true, true,
        2, Resource.newInstance(10, 2), "test");
    long createTime = Time.now();
    ApplicationHomeSubCluster ahsc1 =
        ApplicationHomeSubCluster.newInstance(appId1, createTime, subClusterId1, context1);

    ApplicationId appId2 = ApplicationId.newInstance(1, 1);
    SubClusterId subClusterId2 = SubClusterId.newInstance("SC");
    ApplicationSubmissionContext context2 =
        ApplicationSubmissionContext.newInstance(appId1, "test", "default",
        Priority.newInstance(0), null, true, true,
        2, Resource.newInstance(10, 2), "test");
    ApplicationHomeSubCluster ahsc2 =
        ApplicationHomeSubCluster.newInstance(appId2, createTime, subClusterId2, context2);
    assertEquals(ahsc1, ahsc2);

    // Case2, We create 2 ApplicationHomeSubCluster, appId is different
    // We expect the results to be unequal
    ApplicationId appId3 = ApplicationId.newInstance(2, 1);
    ApplicationSubmissionContext context3 =
        ApplicationSubmissionContext.newInstance(appId3, "test", "default",
        Priority.newInstance(0), null, true, true,
        2, Resource.newInstance(10, 2), "test");
    ApplicationHomeSubCluster ahsc3 =
        ApplicationHomeSubCluster.newInstance(appId3, createTime, subClusterId2, context3);
    assertNotEquals(ahsc1, ahsc3);

    // Case3, We create 2 ApplicationHomeSubCluster, createTime is different
    // We expect the results to be unequal
    long createTime2 = Time.now() + 1000;
    ApplicationHomeSubCluster ahsc4 =
        ApplicationHomeSubCluster.newInstance(appId2, createTime2, subClusterId1, context2);
    assertNotEquals(ahsc1, ahsc4);

    // Case4, We create 2 ApplicationHomeSubCluster, submissionContext is different
    // We expect the results to be unequal
    ApplicationHomeSubCluster ahsc5 =
        ApplicationHomeSubCluster.newInstance(appId2, createTime2, subClusterId2, context3);
    assertNotEquals(ahsc1, ahsc5);
  }
}