/*
 * Copyright 2018-present Open Networking Foundation
 *
 * Licensed 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.onosproject.openstacktelemetry.impl;

import com.google.common.collect.Maps;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.TestApplicationId;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreServiceAdapter;
import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
import org.onosproject.store.service.TestStorageService;

import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

/**
 * Distributed TelemetryConfig store test suite.
 */
public class DistributedTelemetryConfigStoreTest {

    private static final String NAME_1 = "grpc";
    private static final String NAME_2 = "kafka";

    private static final ConfigType TYPE_1 = ConfigType.GRPC;
    private static final ConfigType TYPE_2 = ConfigType.KAFKA;

    private static final String MANUFACTURER_1 = "grpc.io";
    private static final String MANUFACTURER_2 = "kafka.apache.org";

    private static final String SW_VERSION_1 = "1.0";
    private static final String SW_VERSION_2 = "1.0";

    private static final Map<String, String> PROP_1 = Maps.newConcurrentMap();
    private static final Map<String, String> PROP_2 = Maps.newConcurrentMap();

    private static final String PROP_1_KEY_1 = "key11";
    private static final String PROP_1_KEY_2 = "key12";
    private static final String PROP_1_VALUE_1 = "value11";
    private static final String PROP_1_VALUE_2 = "value12";
    private static final String PROP_2_KEY_1 = "key21";
    private static final String PROP_2_KEY_2 = "key22";
    private static final String PROP_2_VALUE_1 = "value21";
    private static final String PROP_2_VALUE_2 = "value22";

    private static final boolean ENABLED_1 = true;
    private static final boolean ENABLED_2 = false;

    private TelemetryConfig config1;
    private TelemetryConfig config2;

    private DistributedTelemetryConfigStore configStore;

    /**
     * Sets up the telemetry config store and the storage service test harness.
     */
    @Before
    public void setUp() {
        configStore = new DistributedTelemetryConfigStore();
        configStore.storageService = new TestStorageService();
        configStore.coreService = new TestCoreService();
        configStore.setDelegate(event -> {
        });
        configStore.activate();

        initTelemetryConfigs();
    }

    /**
     * Tears down the telemetry config store.
     */
    @After
    public void tearDown() {
        configStore.deactivate();
    }

    /**
     * Tests adding, removing and getting.
     */
    @Test
    public void basics() {
        configStore.createTelemetryConfig(config1);
        assertTrue("There should be one telemetry config in the set.",
                configStore.telemetryConfigs().contains(config1));
        assertTrue("The same telemetry config should be returned.",
                configStore.telemetryConfigsByType(ConfigType.GRPC).contains(config1));
        assertEquals("The telemetry config should be the same.",
                configStore.telemetryConfig(NAME_1), config1);
        configStore.removeTelemetryConfig(NAME_1);
        assertFalse("There should be no telemetry config in the set.",
                configStore.telemetryConfigs().contains(config1));

        configStore.createTelemetryConfig(config1);
        configStore.createTelemetryConfig(config2);
        assertEquals("There should be two configs in the sets.",
                configStore.telemetryConfigs().size(), 2);
    }

    /**
     * Test core service; For generate test application ID.
     */
    public class TestCoreService extends CoreServiceAdapter {
        @Override
        public ApplicationId registerApplication(String name) {
            return TestApplicationId.create(name);
        }
    }

    private void initTelemetryConfigs() {
        PROP_1.put(PROP_1_KEY_1, PROP_1_VALUE_1);
        PROP_1.put(PROP_1_KEY_2, PROP_1_VALUE_2);
        PROP_2.put(PROP_2_KEY_1, PROP_2_VALUE_1);
        PROP_2.put(PROP_2_KEY_2, PROP_2_VALUE_2);

        config1 = new DefaultTelemetryConfig(NAME_1, TYPE_1, null,
                MANUFACTURER_1, SW_VERSION_1, ENABLED_1, PROP_1);
        config2 = new DefaultTelemetryConfig(NAME_2, TYPE_2, null,
                MANUFACTURER_2, SW_VERSION_2, ENABLED_2, PROP_2);
    }
}
