/**
 * 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.falcon.cli.commands;

import org.apache.falcon.client.FalconCLIException;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

/**
 * Tests for Connection commands.
 */
public class FalconConnectionCommandsTest extends FalconCLITest {
    @DataProvider(name = "params-commands", parallel = false)
    public Object[][] provideCommands() {
        FalconCLIException e = new FalconCLIException(BaseFalconCommands.FALCON_URL_ABSENT);
        return new Object[][]{
            {"get", null, e},
            {"set a=b", null, null},
            {"get", null, e},
            {"get a", null, e},
            {"set falcon.url=DUMMY", null, null},
            {"get", "{a=b, falcon.url=DUMMY}", null},
            {"get a", "b", null},
        };
    }

//    @Test(dataProvider = "params-commands")
    public void testGetAndSetParams(String command, Object result, Throwable throwable) throws Throwable {
        execute(command, result, throwable);
    }
}
