/**
 * 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.entity;

import org.apache.falcon.entity.v0.feed.LocationType;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.net.URISyntaxException;

/**
 * Test class for Catalog Table Storage.
 * Exists will be covered in integration tests as it actually checks if the table exists.
 */
public class CatalogStorageTest {

    @Test
    public void testGetType() throws Exception {
        String table = "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us";
        CatalogStorage storage = new CatalogStorage(CatalogStorage.CATALOG_URL, table);
        Assert.assertEquals(Storage.TYPE.TABLE, storage.getType());
    }

    @Test
    public void testParseFeedUriValid() throws URISyntaxException {
        String table = "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us";
        CatalogStorage storage = new CatalogStorage(CatalogStorage.CATALOG_URL, table);
        Assert.assertEquals("${hcatNode}", storage.getCatalogUrl());
        Assert.assertEquals("clicksdb", storage.getDatabase());
        Assert.assertEquals("clicks", storage.getTable());
        Assert.assertEquals(Storage.TYPE.TABLE, storage.getType());
        Assert.assertEquals(2, storage.getPartitions().size());
        Assert.assertEquals("us", storage.getPartitionValue("region"));
        Assert.assertTrue(storage.hasPartition("region"));
        Assert.assertNull(storage.getPartitionValue("unknown"));
        Assert.assertFalse(storage.hasPartition("unknown"));
    }

    @Test
    public void testCreateFromUriTemplate() throws Exception {
        String uriTemplate = "thrift://localhost:49083/clicksdb/clicks/region=us;ds=${YEAR}-${MONTH}-${DAY}";
        CatalogStorage storage = new CatalogStorage(uriTemplate);
        Assert.assertEquals("thrift://localhost:49083", storage.getCatalogUrl());
        Assert.assertEquals("clicksdb", storage.getDatabase());
        Assert.assertEquals("clicks", storage.getTable());
        Assert.assertEquals(Storage.TYPE.TABLE, storage.getType());
        Assert.assertEquals(2, storage.getPartitions().size());
        Assert.assertEquals("us", storage.getPartitionValue("region"));
        Assert.assertTrue(storage.hasPartition("region"));
        Assert.assertNull(storage.getPartitionValue("unknown"));
        Assert.assertFalse(storage.hasPartition("unknown"));
    }

    @DataProvider(name = "invalidFeedURIs")
    public Object[][] createParseFeedUriInvalid() {
        return new Object[][] {
            {"catalog:default:clicks:ds=${YEAR}-${MONTH}-${DAY}#region=us", ""},
            {"default:clicks:ds=${YEAR}-${MONTH}-${DAY}#region=us", ""},
            {"catalog:default#ds=${YEAR}-${MONTH}-${DAY};region=us", ""},
            {"catalog://default/clicks#ds=${YEAR}-${MONTH}-${DAY}:region=us", ""},
        };
    }

    @Test(dataProvider = "invalidFeedURIs", expectedExceptions = URISyntaxException.class)
    public void testParseFeedUriInvalid(String tableUri, String ignore) throws URISyntaxException {
        new CatalogStorage(CatalogStorage.CATALOG_URL, tableUri);
        Assert.fail("Exception must have been thrown");
    }

    @Test
    public void testIsIdenticalPositive() throws Exception {
        CatalogStorage table1 = new CatalogStorage(CatalogStorage.CATALOG_URL,
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        CatalogStorage table2 = new CatalogStorage(CatalogStorage.CATALOG_URL,
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        Assert.assertTrue(table1.isIdentical(table2));

        final String catalogUrl = "thrift://localhost:49083";
        CatalogStorage table3 = new CatalogStorage(catalogUrl,
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        CatalogStorage table4 = new CatalogStorage(catalogUrl,
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        Assert.assertTrue(table3.isIdentical(table4));
    }

    @Test
    public void testIsIdenticalNegative() throws Exception {
        CatalogStorage table1 = new CatalogStorage(CatalogStorage.CATALOG_URL,
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        CatalogStorage table2 = new CatalogStorage(CatalogStorage.CATALOG_URL,
                "catalog:clicksdb:impressions#ds=${YEAR}-${MONTH}-${DAY};region=us");
        Assert.assertFalse(table1.isIdentical(table2));

        final String catalogUrl = "thrift://localhost:49083";
        CatalogStorage table3 = new CatalogStorage(catalogUrl,
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        CatalogStorage table4 = new CatalogStorage(catalogUrl,
                "catalog:clicksdb:impressions#ds=${YEAR}-${MONTH}-${DAY};region=us");
        Assert.assertFalse(table3.isIdentical(table4));

        CatalogStorage table5 = new CatalogStorage("thrift://localhost:49084",
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        CatalogStorage table6 = new CatalogStorage("thrift://localhost:49083",
                "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us");
        Assert.assertFalse(table5.isIdentical(table6));
    }

    @Test
    public void testGetUriTemplateWithCatalogUrl() throws Exception {
        final String catalogUrl = "thrift://localhost:49083";
        String tableUri = "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us";
        String uriTemplate = "thrift://localhost:49083/clicksdb/clicks/region=us;ds=${YEAR}-${MONTH}-${DAY}";

        CatalogStorage table = new CatalogStorage(catalogUrl, tableUri);

        Assert.assertEquals(uriTemplate, table.getUriTemplate());
        Assert.assertEquals(uriTemplate, table.getUriTemplate(LocationType.DATA));
        Assert.assertEquals(table.getUriTemplate(), table.getUriTemplate(LocationType.DATA));
    }

    @Test
    public void testGetUriTemplateWithOutCatalogUrl() throws Exception {
        String tableUri = "catalog:clicksdb:clicks#ds=${YEAR}-${MONTH}-${DAY};region=us";
        String uriTemplate = "${hcatNode}/clicksdb/clicks/region=us;ds=${YEAR}-${MONTH}-${DAY}";

        CatalogStorage table = new CatalogStorage(CatalogStorage.CATALOG_URL, tableUri);

        Assert.assertEquals(uriTemplate, table.getUriTemplate());
        Assert.assertEquals(uriTemplate, table.getUriTemplate(LocationType.DATA));
        Assert.assertEquals(table.getUriTemplate(), table.getUriTemplate(LocationType.DATA));
    }
}
