/*
 * Copyright 2017-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.incubator.net.virtual.impl;

import org.junit.After;
import org.junit.Before;
import org.onlab.junit.TestUtils;
import org.onosproject.incubator.net.virtual.store.impl.DistributedVirtualFlowObjectiveStore;

/**
 * Junit tests for VirtualNetworkFlowObjectiveManager using
 * DistributedVirtualFlowObjectiveStore.  This test class extends
 * VirtualNetworkFlowObjectiveManagerTest - all the tests defined in
 * VirtualNetworkFlowObjectiveManagerTest will run using
 * DistributedVirtualFlowObjectiveStore.
 */
public class VirtualNetworkFlowObjectiveManagerWithDistStoreTest
        extends VirtualNetworkFlowObjectiveManagerTest {

    private static final String STORE_FIELDNAME_STORAGESERVICE = "storageService";

    private DistributedVirtualFlowObjectiveStore distStore;

    @Before
    public void setUp() throws Exception {
        setupDistFlowObjectiveStore();
        super.setUp();
    }

    private void setupDistFlowObjectiveStore() throws TestUtils.TestUtilsException {
        distStore = new DistributedVirtualFlowObjectiveStore();
        TestUtils.setField(distStore, STORE_FIELDNAME_STORAGESERVICE, storageService);

        distStore.activate();
        flowObjectiveStore = distStore; // super.setUp() will cause Distributed store to be used.
    }

    @After
    public void tearDown() {
        distStore.deactivate();
    }
}
