/*
 * 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.shardingsphere.elasticjob.cloud.scheduler.mesos;

import org.apache.shardingsphere.elasticjob.cloud.scheduler.fixture.CloudJobConfigurationBuilder;
import org.apache.shardingsphere.elasticjob.cloud.executor.ShardingContexts;
import org.apache.commons.lang3.SerializationUtils;
import org.hamcrest.core.Is;
import org.junit.Assert;
import org.junit.Test;

import java.util.Collections;
import java.util.Map;

public final class TaskInfoDataTest {
    
    private final ShardingContexts shardingContexts = new ShardingContexts("fake_task_id", "test_job", 3, "test_param", Collections.<Integer, String>emptyMap());
    
    @Test
    public void assertSerializeSimpleJob() {
        TaskInfoData actual = new TaskInfoData(shardingContexts, CloudJobConfigurationBuilder.createCloudJobConfiguration("test_job"));
        assertSerialize((Map) SerializationUtils.deserialize(actual.serialize()));
    }
    
    @Test
    public void assertSerializeDataflowJob() {
        TaskInfoData actual = new TaskInfoData(shardingContexts, CloudJobConfigurationBuilder.createDataflowCloudJobConfiguration("test_job"));
        assertSerialize((Map) SerializationUtils.deserialize(actual.serialize()));
    }
    
    @Test
    public void assertSerializeScriptJob() {
        TaskInfoData actual = new TaskInfoData(shardingContexts, CloudJobConfigurationBuilder.createScriptCloudJobConfiguration("test_job"));
        assertSerialize((Map) SerializationUtils.deserialize(actual.serialize()));
    }
    
    private void assertSerialize(final Map expected) {
        Assert.assertThat(expected.size(), Is.is(2));
        Assert.assertNotNull(expected.get("shardingContext"));
        Assert.assertNotNull(expected.get("jobConfigContext"));
    }
}
