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

#ifndef APACHE_HTRACE_TEST_MINI_HTRACED_H
#define APACHE_HTRACE_TEST_MINI_HTRACED_H

/**
 * @file mini_htraced.h
 *
 * Implements a mini htraced cluster which can be used in unit tests.
 *
 * This is useful for testing the htraced trace sink of the native client.
 *
 * This is an internal header, not intended for external use.
 */

#include <unistd.h> /* for pid_t and size_t */

struct htrace_conf;

#define NUM_DATA_DIRS 2

struct mini_htraced_params {
    /**
     * The name of the mini htraced process to start.
     * This shows up in the test directory name and some other places.
     * The memory should be managed by the caller.
     */
    const char *name;

    /**
     * The configuration to use, in string form.
     * The memory should be managed by the caller.
     */
    const char *confstr;
};

struct mini_htraced {
    /**
     * The process ID of the mini htraced.
     */
    int pid;

    /**
     * The path to the root directory that all the state associated with this
     * mini_htraced will be placed under.  Malloced.
     */
    char *root_dir;

    /**
     * Paths to the data directories to use for htraced.  Malloced.
     */
    char *data_dir[NUM_DATA_DIRS];

    /**
     * Path to the server's log file.  Malloced.
     */
    char *htraced_log_path;

    /**
     * Path to the server's conf file.  Malloced.
     */
    char *htraced_conf_path;

    /**
     * The client configuration defaults.  Malloced.
     */
    char *client_conf_defaults;

    /**
     * The startup notification port.
     */
    int snport;

    /**
     * The startup notification socket, or -1 if the socket has been closed.
     */
    int snsock;

    /**
     * Nonzero if the htraced pid is valid.
     */
    int htraced_pid_valid;

    /**
     * The process ID of the htraced pid.
     */
    pid_t htraced_pid;

    /**
     * The HTTP address of the htraced, in hostname:port format.
     */
    char *htraced_http_addr;
};

/**
 * Build the mini HTraced cluster.
 *
 * @param params            The parameters to use.
 * @param ht                (out param) The mini htraced object on success.
 * @param err               (out param) The error message if there was an
 *                              error.
 * @param err_len           The length of the error buffer provided by the
 *                              caller.
 */
void mini_htraced_build(const struct mini_htraced_params *params, struct mini_htraced **ht,
                        char *err, size_t err_len);

/**
 * Stop the htraced process.
 *
 * @param ht                The mini htraced object.
 */
void mini_htraced_stop(struct mini_htraced *ht);

/**
 * Free the memory associated with the mini htraced object.
 *
 * @param ht                The mini htraced object.
 */
void mini_htraced_free(struct mini_htraced *ht);

/**
 * Dump the spans contained in this htraced instance to a file.
 *
 * @param ht                The mini htraced object.
 * @param err               (out param) The error message if there was an
 *                              error.
 * @param err_len           The length of the error buffer provided by the
 *                              caller.
 * @param path              The path to dump the spans to, in json form.
 */
void mini_htraced_dump_spans(struct mini_htraced *ht,
                             char *err, size_t err_len,
                             const char *path);

#endif

// vim: ts=4:sw=4:tw=79:et
