text: /** @file
  
    A test plugin header for testing Plugin's Dynamic Shared Objects (DSO)
  
    @section license License
  
    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.
  
    @section details Details
  
    Implements code necessary for Reverse Proxy which mostly consists of
    general purpose hostname substitution in URLs.
  
   */
  
  #pragma once
  
  #include <map>
  #include <string>
  #include <iostream>
  
  #include <stdio.h>
  #include <stdarg.h>
  
  #include "../PluginFactory.h"
  
  extern thread_local PluginThreadContext *pluginThreadContext;
  
  /* A temp sandbox to play with our toys used for all fun with this test-bench */
  fs::path getTemporaryDir();
  
  class PluginDebugObject
  {
  public:
    PluginDebugObject() { clear(); }
  
    void
    clear()
    {
      contextInit          = nullptr;
      contextInitInstance  = nullptr;
      doRemapCalled        = 0;
      initCalled           = 0;
      doneCalled           = 0;
      initInstanceCalled   = 0;
      deleteInstanceCalled = 0;
      reloadConfigCalled   = 0;
      ih                   = nullptr;
      argc                 = 0;
      argv                 = nullptr;
    }
  
    /* Input fields used to set the test behavior of the plugin call-backs */
    bool fail = false; /* tell the plugin call-back to fail for testing purposuses */
    void *input_ih;    /* the value to be returned by the plugin instance init function */
  
    /* Output fields showing what happend during the test */
    const PluginThreadContext *contextInit         = nullptr; /* plugin initialization context */
    const PluginThreadContext *contextInitInstance = nullptr; /* plugin instance initialization context */
    int doRemapCalled                              = 0;       /* mark if remap was called */
    int initCalled                                 = 0;       /* mark if plugin init was called */
    int doneCalled                                 = 0;       /* mark if done was called */
    int initInstanceCalled                         = 0;       /* mark if instance init was called */
    int deleteInstanceCalled                       = 0;       /* mark if delete instance was called */
    int reloadConfigCalled                         = 0;       /* mark if reload config was called */
    void *ih                                       = nullptr; /* instance handler */
    int argc                                       = 0;       /* number of plugin instance parameters received by the plugin */
    char **argv                                    = nullptr; /* plugin instance parameters received by the plugin */
  };
  
  #ifdef __cplusplus
  extern "C" {
  #endif /* __cplusplus */
  
  typedef void *GetPluginDebugObjectFunction(void);
  GetPluginDebugObjectFunction getPluginDebugObjectTest;
  
  #define Debug(category, fmt, ...) PrintToStdErr("(%s) %s:%d:%s() " fmt "\n", category, __FILE__, __LINE__, __func__, ##__VA_ARGS__)
  #define Error(fmt, ...) PrintToStdErr("%s:%d:%s() " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__)
  void PrintToStdErr(const char *fmt, ...);
  
  #ifdef __cplusplus
  }
  #endif /* __cplusplus */
  