/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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.drivers.fujitsu;


public interface FujitsuNetconfSessionListenerTest {

    /**
     * Verify editConfig request arguments.
     *
     * @param newConfiguration    configuration to set
     * @return true if everuthing as expected
     */
    boolean verifyEditConfig(String newConfiguration);

    /**
     * Verify editConfig request arguments.
     *
     * @param targetConfiguration the targetConfiguration to change
     * @param mode                selected mode to change the configuration
     * @param newConfiguration    configuration to set
     * @return true if everuthing as expected
     */
    boolean verifyEditConfig(String targetConfiguration, String mode, String newConfiguration);

    /**
     * Verify get request arguments.
     *
     * @param filterSchema XML subtrees to include in the reply
     * @param withDefaultsMode with-defaults mode
     * @return true if everuthing as expected
     */
    boolean verifyGet(String filterSchema, String withDefaultsMode);

    /**
     * Build get RPC response if necessary.
     *
     * @return String or null if not support
     */
    String buildGetReply();

    /**
     * Verify rpc request arguments.
     *
     * @param request the XML containing the request to the server.
     * @return true if everuthing as expected
     */
    boolean verifyWrappedRpc(String request);

    /**
     * Verify rpc request arguments.
     *
     * @param filterSchema XML subtrees to indicate specific notification
     */
    void verifyStartSubscription(String filterSchema);

}
