diff --git a/README.md b/README.md index 1c25a55..3189d9a 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ webfuse combines libwebsockets and libfuse. It allows ot attach a remote filesys - [Motivation](#Motivation) - [Fellow Repositories](#Fellow-Repositories) +- [Known Implementations](#Known-Implementations) - [Concept](#Concept) - [Similar Projects](#Similar-Projects) - [Further Documentation](#Further-Documentation) @@ -35,7 +36,16 @@ webfuse solves this problem by using the [WebSocket](https://en.wikipedia.org/wi - **[webfuse-example](https://github.com/falk-werner/webfuse-example)**: Example of webfuse - **[webfused](https://github.com/falk-werner/webfused)**: Reference implementation of webfuse daemon -- **[webfuse-provider](https://github.com/falk-werner/webfuse-provider)**: Reference implementation of webfuse provider +- **[webfuse-provider](https://github.com/falk-werner/webfuse-provider)**: webfuse provider library (C/C++) +- **[webfuse-js](https://github.com/falk-werner/webfuse-js)**: webfuse provider library (JavaScript)) + +## Known Implementations + +| Implementation | Language | Adatper/Server | Adapter/Client | Provider/Server | Provider/Client | +| ------------------------------------------------------------------- | ---------- | ------------- | -------------- | --------------- | --------------- | +| [webfuse](https://github.com/falk-werner/webfuse) | C/C++ | ✔ | ✔ | - | - | +| [webfuse-provider](https://github.com/falk-werner/webfuse-provider) | C/C++ | - | - | - | ✔ | +| [webfuse-js](https://github.com/falk-werner/webfuse-js) | JavaScript | - | - | - | ✔ | ## Concept @@ -54,11 +64,10 @@ A reference implementation of such a daemon is provided within the examples. The ### Adapters and Providers In webfuse, an adapter is a component that adapts the libfuse API to a websocket interface. -Currently, libwebfuse implements only a server based adapter - a websocket server, that allows clients to connect a remote file system which -is represented via libfuse on the server side. +Currently, libwebfuse provides both, server based and client based adapters. In webfuse, a provider is a component that provides a filesystem via websocket interface. -Currently, libwebfuse implements only a client based provider - a websocket client that provides a local filesystem to a remote server. +Take a look at [known implementations](#Known-Implementations) to find provider libraries. ## Similar Projects diff --git a/changelog.md b/changelog.md index a15b4a4..1f97478 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,8 @@ * Remove CMake support (change build system to meson) * Make argument credentials const in `wf_authenticate_fn` +* Moved provider library into [separate project](https://github.com/falk-werner/webfuse-provider) +* Renamed library (libwebfuse_adapter -> libwebfuse) ### New Features diff --git a/helgrind.supp b/helgrind.supp new file mode 100644 index 0000000..3a04c41 --- /dev/null +++ b/helgrind.supp @@ -0,0 +1,13 @@ +{ + lws realloc + Helgrind:Race + fun:_realloc + fun:lws_realloc +} + +{ + lws zalloc + Helgrind:Race + fun:_realloc + fun:lws_zalloc +} \ No newline at end of file diff --git a/include/webfuse/adapter/api.h b/include/webfuse/api.h similarity index 92% rename from include/webfuse/adapter/api.h rename to include/webfuse/api.h index 6ab7d30..b031d0a 100644 --- a/include/webfuse/adapter/api.h +++ b/include/webfuse/api.h @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/api.h +/// \file webfuse/api.h /// \brief API define for webfuse adapter. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_API_H -#define WF_ADAPTER_API_H +#ifndef WF_API_H +#define WF_API_H //------------------------------------------------------------------------------ /// \def WF_API diff --git a/include/webfuse/adapter/authenticate.h b/include/webfuse/authenticate.h similarity index 91% rename from include/webfuse/adapter/authenticate.h rename to include/webfuse/authenticate.h index 0146768..7fefe0e 100644 --- a/include/webfuse/adapter/authenticate.h +++ b/include/webfuse/authenticate.h @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/authenticate.h +/// \file webfuse/authenticate.h /// \brief Authenticate function. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_AUTHENTICATE_H -#define WF_ADAPTER_AUTHENTICATE_H +#ifndef WF_AUTHENTICATE_H +#define WF_AUTHENTICATE_H #ifndef __cplusplus #include diff --git a/include/webfuse/adapter/client.h b/include/webfuse/client.h similarity index 97% rename from include/webfuse/adapter/client.h rename to include/webfuse/client.h index 29b4f17..684e8b4 100644 --- a/include/webfuse/adapter/client.h +++ b/include/webfuse/client.h @@ -1,13 +1,13 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/client.h +/// \file webfuse/client.h /// \brief Adapter client. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_CLIENT_H -#define WF_ADAPTER_CLIENT_H +#ifndef WF_CLIENT_H +#define WF_CLIENT_H -#include -#include +#include +#include #ifdef __cplusplus extern "C" diff --git a/include/webfuse/adapter/client_callback.h b/include/webfuse/client_callback.h similarity index 94% rename from include/webfuse/adapter/client_callback.h rename to include/webfuse/client_callback.h index ad8bd86..fb9d423 100644 --- a/include/webfuse/adapter/client_callback.h +++ b/include/webfuse/client_callback.h @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/client_callbak.h +/// \file webfuse/client_callbak.h /// \brief Callback of adapter clients. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_CLIENT_CALLBACK_H -#define WF_ADAPTER_CLIENT_CALLBACK_H +#ifndef WF_CLIENT_CALLBACK_H +#define WF_CLIENT_CALLBACK_H #ifdef __cplusplus extern "C" diff --git a/include/webfuse/adapter/client_tlsconfig.h b/include/webfuse/client_tlsconfig.h similarity index 93% rename from include/webfuse/adapter/client_tlsconfig.h rename to include/webfuse/client_tlsconfig.h index 550b664..d6a57d4 100644 --- a/include/webfuse/adapter/client_tlsconfig.h +++ b/include/webfuse/client_tlsconfig.h @@ -1,12 +1,12 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/client_tslconfig.h +/// \file webfuse/client_tslconfig.h /// \brief Configuration of TLS (Transport Layer Security) for adapter clients. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_CLIENT_TLSCONFIG_H -#define WF_ADAPTER_CLIENT_TLSCONFIG_H +#ifndef WF_CLIENT_TLSCONFIG_H +#define WF_CLIENT_TLSCONFIG_H -#include +#include #ifdef __cplusplus extern "C" diff --git a/include/webfuse/adapter/credentials.h b/include/webfuse/credentials.h similarity index 96% rename from include/webfuse/adapter/credentials.h rename to include/webfuse/credentials.h index ca404f7..10379e9 100644 --- a/include/webfuse/adapter/credentials.h +++ b/include/webfuse/credentials.h @@ -1,12 +1,12 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/credentials.h +/// \file webfuse/credentials.h /// \brief Credentials used for user authentication. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_CREDENTIALS_H -#define WF_ADAPTER_CREDENTIALS_H +#ifndef WF_CREDENTIALS_H +#define WF_CREDENTIALS_H -#include "webfuse/adapter/api.h" +#include "webfuse/api.h" #ifdef __cplusplus extern "C" diff --git a/include/webfuse/adapter/mountpoint.h b/include/webfuse/mountpoint.h similarity index 95% rename from include/webfuse/adapter/mountpoint.h rename to include/webfuse/mountpoint.h index 9b77165..041e50a 100644 --- a/include/webfuse/adapter/mountpoint.h +++ b/include/webfuse/mountpoint.h @@ -1,12 +1,12 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/mountpoint.h +/// \file webfuse/mountpoint.h /// \brief Mointpoint. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_MOUNTPOINT_H -#define WF_ADAPTER_MOUNTPOINT_H +#ifndef WF_MOUNTPOINT_H +#define WF_MOUNTPOINT_H -#include +#include #ifdef __cplusplus extern "C" diff --git a/include/webfuse/adapter/mountpoint_factory.h b/include/webfuse/mountpoint_factory.h similarity index 85% rename from include/webfuse/adapter/mountpoint_factory.h rename to include/webfuse/mountpoint_factory.h index 7a10bb1..94d72c7 100644 --- a/include/webfuse/adapter/mountpoint_factory.h +++ b/include/webfuse/mountpoint_factory.h @@ -1,12 +1,12 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/mountpoint_factory.h +/// \file webfuse/mountpoint_factory.h /// \brief Defines a factory function to create mointpoints. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_MOUNTPOINT_FACTORY_H -#define WF_ADAPTER_MOUNTPOINT_FACTORY_H +#ifndef WF_MOUNTPOINT_FACTORY_H +#define WF_MOUNTPOINT_FACTORY_H -#include +#include #ifdef __cplusplus extern "C" diff --git a/include/webfuse/core/protocol_names.h b/include/webfuse/protocol_names.h similarity index 97% rename from include/webfuse/core/protocol_names.h rename to include/webfuse/protocol_names.h index aa9abfe..1a0055f 100644 --- a/include/webfuse/core/protocol_names.h +++ b/include/webfuse/protocol_names.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file protocol_names.h +/// \file webufse/protocol_names.h /// \brief Names of websocket protocol. //////////////////////////////////////////////////////////////////////////////// #ifndef WF_PROTOCOL_NAMES_H diff --git a/include/webfuse/provider/api.h b/include/webfuse/provider/api.h deleted file mode 100644 index 963e038..0000000 --- a/include/webfuse/provider/api.h +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/api.h -/// \brief API define for webfuse provider. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_PROVIDER_API_H -#define WFP_PROVIDER_API_H - -//------------------------------------------------------------------------------ -/// \def WFP_API -/// \brief Marks public symbols of libwebfuse_provider. -//------------------------------------------------------------------------------ -#ifndef WFP_API -#define WFP_API -#endif - -//------------------------------------------------------------------------------ -/// \def WFP_EXPORT -/// \brief Marks exported symbols as visible. -/// -/// Set WFP_API to WFP_EXPORT when building libwebfuse_provider.so to export -/// public symbols. -//------------------------------------------------------------------------------ -#ifndef WFP_EXPORT -#ifdef __GNUC__ -#define WFP_EXPORT __attribute__ ((visibility ("default"))) -#else -#define WFP_EXPORT -#endif -#endif - -#endif diff --git a/include/webfuse/provider/client.h b/include/webfuse/provider/client.h deleted file mode 100644 index 1848717..0000000 --- a/include/webfuse/provider/client.h +++ /dev/null @@ -1,105 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/client.h -/// \brief Webfuse provider client. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WF_PROVIDER_CLIENT_H -#define WF_PROVIDER_CLIENT_H - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -//------------------------------------------------------------------------------ -/// \struct wfp_client -/// \brief Webfuse provider client. -//------------------------------------------------------------------------------ -struct wfp_client; - -struct wfp_client_config; - -//------------------------------------------------------------------------------ -/// \brief Creates a webfuse provider client. -/// -/// \note Client configuration is not managed by the client. -/// -/// \param config pointer to client configuration. -/// \return newly created client or NULL in case of an error. -//------------------------------------------------------------------------------ -extern WFP_API struct wfp_client * wfp_client_create( - struct wfp_client_config * config); - -//------------------------------------------------------------------------------ -/// \brief Connects the client to a remote webfuse adapter server. -/// -/// \note This call starts to establish a connection. A callback is invoked, -/// when the connection is estanlished. -/// -/// \param client pointer to client -/// \param url URL of remote webfuse adapter server -/// -/// \see wfp_connected_fn -/// \see wfp_client_config_set_onconnected -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_connect( - struct wfp_client * client, - char const * url); - -//------------------------------------------------------------------------------ -/// \brief Disconnects a connected client. -/// -/// \note This call starts to disconnect the connection. A callback is invoked -/// when conntection is disconnected. -/// -/// \param client pointer to client -/// -/// \see wfp_disconnected_fn -/// \see wfp_client_config_set_ondisconnected -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_disconnect( - struct wfp_client * client); - -//------------------------------------------------------------------------------ -/// \brief Disposes a client. -/// -/// \note Client configuration is not managed by client. -/// -/// \param client pointer to client -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_dispose( - struct wfp_client * client); - -//------------------------------------------------------------------------------ -/// \brief Triggers the client. -/// -/// This function must be invoked in a loop while the client is running. It -/// makes the server wait for the next event and processes it. -/// -/// \param client pointer to client -/// -/// \see wfp_client_interrupt -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_service( - struct wfp_client * client); - -//------------------------------------------------------------------------------ -/// \brief interrupt wfp_client_service -/// -/// This function can be called from another thread. -/// -/// \param client pointer to client -/// -/// \see wfp_client_service -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_interrupt( - struct wfp_client * client); - -#ifdef __cplusplus -} -#endif - - -#endif diff --git a/include/webfuse/provider/client_config.h b/include/webfuse/provider/client_config.h deleted file mode 100644 index 26654bc..0000000 --- a/include/webfuse/provider/client_config.h +++ /dev/null @@ -1,240 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/client_config.h -/// \brief Client configuration of webfuse provider. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WF_PROVIDER_CLIENT_CONFIG_H -#define WF_PROVIDER_CLIENT_CONFIG_H - -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -//------------------------------------------------------------------------------ -/// \struct wfp_client_config -/// \brief Provider client configuration object. -/// -/// Holds configuration of webfuse provider client. -//------------------------------------------------------------------------------ -struct wfp_client_config; - -//------------------------------------------------------------------------------ -/// \brief Callback to signal when the client's connection is established. -/// -/// \param user_data user defined context -//------------------------------------------------------------------------------ -typedef void wfp_connected_fn( - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Callback to signal when a client's connection is disconnected. -/// -/// \param user_data user defined context -//------------------------------------------------------------------------------ -typedef void wfp_disconnected_fn( - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Creates a new client configuration. -/// -/// \return newly created client configuration -//------------------------------------------------------------------------------ -extern WFP_API struct wfp_client_config * wfp_client_config_create(void); - -//------------------------------------------------------------------------------ -/// \brief Disposes a client configuration. -/// -/// \note The user defined context is not managed by the client configuration. -/// -/// \param config pointer to client configuration -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_dispose( - struct wfp_client_config * config); - -//------------------------------------------------------------------------------ -/// \brief Sets a user defined context. -/// -/// \note The user is responsible to manage the lifetime of user data. -/// -/// \param config pointer to client configuration -/// \param user_data user defined context -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_userdata( - struct wfp_client_config * config, - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Sets the path to clients private key. -/// -/// \note To enable TLS both, private key and certificate, must be specified. -/// Otherwise, TLS is not used. -/// -/// \param config pointer to client configuration -/// \param key_path path of clients private key (pem file) -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_keypath( - struct wfp_client_config * config, - char const * key_path); - -//------------------------------------------------------------------------------ -/// \brief Sets the path of clients certificate. -/// -/// \note To enable TLS both, private key and certificate, must be specified. -/// Otherwise, TLS is not used. -/// -/// \param config pointer to client configuration -/// \param cert_path path of the clients certificate (pem file) -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_certpath( - struct wfp_client_config * config, - char const * cert_path); - -//------------------------------------------------------------------------------ -/// \brief Sets the path of ca file to verify servers. -/// -/// \note To enable TLS both, private key and certificate, must be specified. -/// Otherwise, TLS is not used. -/// -/// \param config pointer to client configuration -/// \param ca_filepath path of the ca file (pem file) -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_ca_filepath( - struct wfp_client_config * config, - char const * ca_filepath); - -//------------------------------------------------------------------------------ -/// \brief Sets the onconnected handler. -/// -/// The handler is invoked, when the client's conntection is established. -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_onconnected( - struct wfp_client_config * config, - wfp_connected_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Sets ondisconnected handler -/// -/// The handler is invoked, when the client's conntection is lost. -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_ondisconnected( - struct wfp_client_config * config, - wfp_disconnected_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Sets onlookup handler. -/// -/// The handler is invoked, when the identifier of a file is requested. -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -/// -/// \see wfp_lookup_fn -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_onlookup( - struct wfp_client_config * config, - wfp_lookup_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Sets ongetattr handler. -/// -/// The handler is invoked, when attributes of a file are requested. -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -/// -/// \see wfp_getattr_fn -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_ongetattr( - struct wfp_client_config * config, - wfp_getattr_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Sets onreaddir handler. -/// -/// The handler is invoked, when the contents of directory are requested- -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -/// -/// \see wfp_readdir_fn -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_onreaddir( - struct wfp_client_config * config, - wfp_readdir_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Sets onopen handler. -/// -/// The handler is invoked, whe a file should be opened. -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -/// -/// \see wfp_open_fn -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_onopen( - struct wfp_client_config * config, - wfp_open_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Sets onclose handler. -/// -/// The handler is invoked, when a file is closed. -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -/// -/// \see wfp_close_fn -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_onclose( - struct wfp_client_config * config, - wfp_close_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Sets onread handler. -/// -/// The handler is invoked, when a files content is requested. -/// -/// \param config pointer to client configuration -/// \param handler pointer to handler -/// -/// \see wfp_read_fn -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_set_onread( - struct wfp_client_config * config, - wfp_read_fn * handler); - -//------------------------------------------------------------------------------ -/// \brief Enabled authentication. -/// -/// \param config pointer to client configuration -/// \param get_credentials pointer to function providing credentials when -// needed. -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_config_enable_authentication( - struct wfp_client_config * config, - wfp_get_credentials_fn * get_credentials); - -#ifdef __cplusplus -} -#endif - - -#endif diff --git a/include/webfuse/provider/client_protocol.h b/include/webfuse/provider/client_protocol.h deleted file mode 100644 index 8108030..0000000 --- a/include/webfuse/provider/client_protocol.h +++ /dev/null @@ -1,117 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/client_protocol.h -/// \brief Provides low level access to libwebsockets protocol. -/// -/// By default, libwebfuse encapsulates libwebsockets protocol by \ref -/// wfp_client. But sometimes it might come in handy to have access to -/// libwebsockets protocol. This allows to integrate libwebfuse in existing -/// libwebsockets applications. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WF_PROVIDER_CLIENT_PROTOCOL_H -#define WF_PROVIDER_CLIENT_PROTOCOL_H - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -//------------------------------------------------------------------------------ -/// \struct wfp_client_protocol -/// \brief Opaque webfuse client protocol.. -//------------------------------------------------------------------------------ -struct wfp_client_protocol; - -//------------------------------------------------------------------------------ -/// \struct lws_protocols -/// \brief Forward declaration of libwebsockets protocols structure. -//------------------------------------------------------------------------------ -struct lws_protocols; - -//------------------------------------------------------------------------------ -/// \struct lws_context -/// \brief Forward declaration of libwebsockets context structure. -//------------------------------------------------------------------------------ -struct lws_context; - -//------------------------------------------------------------------------------ -/// \struct wfp_client_config -/// \copydoc wfp_client_config -//------------------------------------------------------------------------------ -struct wfp_client_config; - -//------------------------------------------------------------------------------ -/// \brief Creates a new webfuse provider client protocol. -/// -/// \note The user is responsible to manage lifetime of \arg config. -/// -/// \note TLS configuration is ignored, since TLS is managed by libwebsockets. -/// -/// \param config pointer to client config -/// \return newly created protocol -//------------------------------------------------------------------------------ -extern WFP_API struct wfp_client_protocol * wfp_client_protocol_create( - struct wfp_client_config const * config); - -//------------------------------------------------------------------------------ -/// \brief Disposes a protocol. -/// -/// \note The user defined context is not managed by the protocol. -/// -/// \param protocol pointer to protocol. -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_protocol_dispose( - struct wfp_client_protocol * protocol); - -//------------------------------------------------------------------------------ -/// \brief Initialized libwebsockets protocol structure. -/// -/// \param protocol pointer to protocol -/// \param lws_protocol pointer to libwebsockets protocol structure. -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_protocol_init_lws( - struct wfp_client_protocol * protocol, - struct lws_protocols * lws_protocol); - - -//------------------------------------------------------------------------------ -/// \brief Connects the protocol to a remote webfuse adapter server. -/// -/// \note This call starts to establish a connection. A callback is invoked, -/// when the connection is estanlished. -/// -/// \param protocol pointer to protocol -/// \param context lws context -/// \param url URL of remote webfuse adapter server -/// -/// \see wfp_connected_fn -/// \see wfp_client_config_set_onconnected -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_protocol_connect( - struct wfp_client_protocol * protocol, - struct lws_context * context, - char const * url); - -//------------------------------------------------------------------------------ -/// \brief Disconnects the protocol from a remote webfuse adapter server. -/// -/// \note This call starts to disconnect. A callback is invoked, -/// when the connection is estanlished. -/// -/// \param protocol pointer to protocol -/// -/// \see wfp_connected_fn -/// \see wfp_client_config_set_ondisconnected -//------------------------------------------------------------------------------ -extern WFP_API void wfp_client_protocol_disconnect( - struct wfp_client_protocol * protocol); - -#ifdef __cplusplus -} -#endif - - - -#endif diff --git a/include/webfuse/provider/credentials.h b/include/webfuse/provider/credentials.h deleted file mode 100644 index a6b0806..0000000 --- a/include/webfuse/provider/credentials.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WF_PROVIDER_CREDENTIALS_H -#define WF_PROVIDER_CREDENTIALS_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_credentials; - -typedef void wfp_get_credentials_fn( - struct wfp_credentials * credentials, - void * user_data); - -extern WFP_API void wfp_credentials_set_type( - struct wfp_credentials * credentials, - char const * type); - -extern WFP_API void wfp_credentials_add( - struct wfp_credentials * credentials, - char const * key, - char const * value); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/provider/dirbuffer.h b/include/webfuse/provider/dirbuffer.h deleted file mode 100644 index 2737ab4..0000000 --- a/include/webfuse/provider/dirbuffer.h +++ /dev/null @@ -1,60 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/dirbuffer.h -/// \brief Buffer used for directory listing. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WF_PROVIDER_DIRBUFFER_H -#define WF_PROVIDER_DIRBUFFER_H - -#include -#include -#include - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -//------------------------------------------------------------------------------ -/// \struct wfp_dirbuffer -/// \brief Buffer used for directory listing. -/// -/// \see wfp_respond_readdir -//------------------------------------------------------------------------------ -struct wfp_dirbuffer; - -//------------------------------------------------------------------------------ -/// \brief Creates a new dir buffer. -/// -/// \return newly created dir buffer. -//------------------------------------------------------------------------------ -extern WFP_API struct wfp_dirbuffer * wfp_dirbuffer_create(void); - -//------------------------------------------------------------------------------ -/// \brief Disposes a dir buffer. -/// -/// \param buffer pointer to dir buffer -//------------------------------------------------------------------------------ -extern WFP_API void wfp_dirbuffer_dispose( - struct wfp_dirbuffer * buffer); - -//------------------------------------------------------------------------------ -/// \brief Adds an entry to dir buffer. -/// -/// \param buffer pointer to dir buffer -/// \param name name of the entry (file or directory) -/// \param inode inode of the entry -//------------------------------------------------------------------------------ -extern WFP_API void wfp_dirbuffer_add( - struct wfp_dirbuffer * buffer, - char const * name, - ino_t inode); - -#ifdef __cplusplus -} -#endif - - -#endif diff --git a/include/webfuse/provider/operation/close.h b/include/webfuse/provider/operation/close.h deleted file mode 100644 index ae17a28..0000000 --- a/include/webfuse/provider/operation/close.h +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/operation/close.h -/// \brief Provider's close callback. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_OPERATION_CLOSE_H -#define WFP_OPERATION_CLOSE_H - -#ifndef __cplusplus -#include -#else -#include -#endif - -#include -#include -#include - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -//------------------------------------------------------------------------------ -/// \brief Callback invoked when a file is invoked. -/// -/// This function does not respond. -/// -/// \param inode inode of file to close -/// \param handle handle of file to close -/// \param flags file close flags -/// \param user_data user defined context -//------------------------------------------------------------------------------ -typedef void wfp_close_fn( - ino_t inode, - uint32_t handle, - int flags, - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/provider/operation/error.h b/include/webfuse/provider/operation/error.h deleted file mode 100644 index 556a630..0000000 --- a/include/webfuse/provider/operation/error.h +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/operation/error.h -/// \brief Respond with error code. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_OPERATION_ERROR_H -#define WFP_OPERATION_ERROR_H - -#include "webfuse/provider/api.h" -#include "webfuse/core/status.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_request; - -//------------------------------------------------------------------------------ -/// \brief Respond to a request with an error. -/// -/// A client's callback must respond with exactly one responde, either with a -/// valid reponse regarding to the concrete request or with an error response. -/// -/// \param request pointer to request -/// \param status error code -//------------------------------------------------------------------------------ -extern WFP_API void wfp_respond_error( - struct wfp_request * request, - wf_status status); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/provider/operation/getattr.h b/include/webfuse/provider/operation/getattr.h deleted file mode 100644 index 4c9564f..0000000 --- a/include/webfuse/provider/operation/getattr.h +++ /dev/null @@ -1,55 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/operation/getattr.h -/// \brief Get file attributes. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_OPERATION_GETATTR_H -#define WFP_OPERATION_GETATTR_H - -#include -#include -#include - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_request; - -//------------------------------------------------------------------------------ -/// \brief Get file attributes. -/// -/// \note After this function is called, exactly one response must be sent, -/// either via \ref wfp_respond_getattr or via \ref wfp_respond_error. -/// -/// \param request pointer to request -/// \param inode inode of file to get attributes -/// \param user_data user defined context -/// -/// \see wfp_respond_getattr -/// \see wfp_respond_error -//------------------------------------------------------------------------------ -typedef void wfp_getattr_fn( - struct wfp_request * request, - ino_t inode, - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Respond to a get attributes request. -/// -/// \param request pointer to request -/// \param stat file attributes -//------------------------------------------------------------------------------ -extern WFP_API void wfp_respond_getattr( - struct wfp_request * request, - struct stat const * stat); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/provider/operation/lookup.h b/include/webfuse/provider/operation/lookup.h deleted file mode 100644 index e8f9ca6..0000000 --- a/include/webfuse/provider/operation/lookup.h +++ /dev/null @@ -1,57 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/operation/lookup.h -/// \brief Lookup file. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_OPERATION_LOOKUP_H -#define WFP_OPERATION_LOOKUP_H - -#include -#include -#include - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_request; - -//------------------------------------------------------------------------------ -/// \brief Lookup a file or directory. -/// -/// \note After this function is called, exactly one response must be sent, -/// either via \ref wfp_respond_lookup or via \ref wfp_respond_error. -/// -/// \param request pointer to request -/// \param parent inode of parent -/// \param name name of the filesystem object to lookup -/// \param user_data pointer to user defined context -/// -/// \see wfp_respond_lookup -/// \see wfp_respond_error -//------------------------------------------------------------------------------ -typedef void wfp_lookup_fn( - struct wfp_request * request, - ino_t parent, - char const * name, - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Respond to lookup request. -/// -/// \param request pointer to request -/// \param stat attributes of filesystem object -//------------------------------------------------------------------------------ -extern WFP_API void wfp_respond_lookup( - struct wfp_request * request, - struct stat const * stat); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/provider/operation/open.h b/include/webfuse/provider/operation/open.h deleted file mode 100644 index d5d9f9a..0000000 --- a/include/webfuse/provider/operation/open.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/operation/open.h -/// \brief Open a file. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_OPERATION_OPEN_H -#define WFP_OPERATION_OPEN_H - -#ifndef __cplusplus -#include -#else -#include -#endif - -#include -#include -#include - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_request; - -//------------------------------------------------------------------------------ -/// \brief Open a file. -/// -/// \note After this function is called, exactly one response must be sent, -/// either via \ref wfp_respond_open or via \ref wfp_respond_error. -/// -/// \param request pointer to request -/// \param inode inode of the file to open -/// \param flags file open flags -/// \param user_data user defined context -/// -/// \see wfp_respond_open -/// \see wfp_respond_error -//------------------------------------------------------------------------------ -typedef void wfp_open_fn( - struct wfp_request * request, - ino_t inode, - int flags, - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Respond to open file. -/// -/// \param request pointer to request -/// \param handle handle of the opened file -//------------------------------------------------------------------------------ -extern WFP_API void wfp_respond_open( - struct wfp_request * request, - uint32_t handle); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/provider/operation/read.h b/include/webfuse/provider/operation/read.h deleted file mode 100644 index 64d0047..0000000 --- a/include/webfuse/provider/operation/read.h +++ /dev/null @@ -1,76 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/operation/read.h -/// \brief Read contents of a file. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_OPERATION_READ_H -#define WFP_OPERATION_READ_H - -#ifndef __cplusplus -#include -#include -#else -#include -#include -using std::size_t; -#endif - -#include -#include -#include - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_request; - -//------------------------------------------------------------------------------ -/// \brief Requests content of a file. -/// -/// On success, up to \arg length bytes should be returned via \ref -/// wfp_respond_read. -/// -/// \note After this function is called, exactly one response must be sent, -/// either via \ref wfp_respond_read or via \ref wfp_respond_error. -/// -/// \param request pointer to request -/// \param inode inode of the file to read -/// \param handle handle of the file to read (returned by open) -/// \param offset offset within the file where to start reading -/// \param length amount of bytes to read -/// \param user_data used defined context -/// -/// \see wfp_respond_read -/// \see wfp_respond_error -//------------------------------------------------------------------------------ -typedef void wfp_read_fn( - struct wfp_request * request, - ino_t inode, - uint32_t handle, - size_t offset, - size_t length, - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Respond to read. -/// -/// \note The user is responsible to manage lifetime of \arg data. -/// -/// \param request pointer to request -/// \param data data read from file -/// \param length amount of bytes read -//------------------------------------------------------------------------------ -extern WFP_API void wfp_respond_read( - struct wfp_request * request, - char const * data, - size_t length); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/provider/operation/readdir.h b/include/webfuse/provider/operation/readdir.h deleted file mode 100644 index aef2f07..0000000 --- a/include/webfuse/provider/operation/readdir.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file provider/operation/readdir.h -/// \brief List directory contents. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WFP_OPERATION_READDIR_H -#define WFP_OPERATION_READDIR_H - -#include -#include -#include - -#include "webfuse/provider/api.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_dirbuffer; -struct wfp_request; - -//------------------------------------------------------------------------------ -/// \brief Requests the contents of a directory. -/// -/// \note After this function is called, exactly one response must be sent, -/// either via \ref wfp_respond_readdir or via \ref wfp_respond_error. -/// -/// \param request pointer to request -/// \param directory inode of directory to list -/// \param user_data user defined context -/// -/// \see wfp_respond_readdir -/// \see wfp_respond_error -//------------------------------------------------------------------------------ -typedef void wfp_readdir_fn( - struct wfp_request * request, - ino_t directory, - void * user_data); - -//------------------------------------------------------------------------------ -/// \brief Respond to list directory contents. -/// -/// \note The user is responsible to manage dirbuffe, p.e. to dispose -/// it after this function is called. -/// -/// \param request pointer to request -/// \param dirbuffer contains contents of directory -//------------------------------------------------------------------------------ -extern WFP_API void wfp_respond_readdir( - struct wfp_request * request, - struct wfp_dirbuffer * dirbuffer); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/webfuse/adapter/server.h b/include/webfuse/server.h similarity index 95% rename from include/webfuse/adapter/server.h rename to include/webfuse/server.h index dabfedd..c1928a4 100644 --- a/include/webfuse/adapter/server.h +++ b/include/webfuse/server.h @@ -1,12 +1,12 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/server.h +/// \file webfuse/server.h /// \brief Adapter server. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_SERVER_H -#define WF_ADAPTER_SERVER_H +#ifndef WF_SERVER_H +#define WF_SERVER_H -#include "webfuse/adapter/api.h" +#include "webfuse/api.h" #ifdef __cplusplus extern "C" diff --git a/include/webfuse/adapter/server_config.h b/include/webfuse/server_config.h similarity index 96% rename from include/webfuse/adapter/server_config.h rename to include/webfuse/server_config.h index 6e0bfbb..52b8355 100644 --- a/include/webfuse/adapter/server_config.h +++ b/include/webfuse/server_config.h @@ -1,14 +1,14 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/server_config.h +/// \file webfuse/server_config.h /// \brief Server configuration. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_SERVER_CONFIG_H -#define WF_ADAPTER_SERVER_CONFIG_H +#ifndef WF_SERVER_CONFIG_H +#define WF_SERVER_CONFIG_H -#include "webfuse/adapter/api.h" -#include "webfuse/adapter/authenticate.h" -#include "webfuse/adapter/mountpoint_factory.h" +#include "webfuse/api.h" +#include "webfuse/authenticate.h" +#include "webfuse/mountpoint_factory.h" #ifdef __cplusplus extern "C" diff --git a/include/webfuse/adapter/server_protocol.h b/include/webfuse/server_protocol.h similarity index 93% rename from include/webfuse/adapter/server_protocol.h rename to include/webfuse/server_protocol.h index 68b1dbe..4fca4b8 100644 --- a/include/webfuse/adapter/server_protocol.h +++ b/include/webfuse/server_protocol.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file adapter/server_protocol.h +/// \file webfuse/server_protocol.h /// \brief Provides low level access to libwebsockets protocol. /// /// By default, libwebfuse encapsulates libwebsockets protocol by \ref @@ -8,12 +8,12 @@ /// libwebsockets applications. //////////////////////////////////////////////////////////////////////////////// -#ifndef WF_ADAPTER_SERVER_PROTOCOL_H -#define WF_ADAPTER_SERVER_PROTOCOL_H +#ifndef WF_SERVER_PROTOCOL_H +#define WF_SERVER_PROTOCOL_H -#include -#include -#include +#include +#include +#include #ifdef __cplusplus extern "C" diff --git a/include/webfuse/core/status.h b/include/webfuse/status.h similarity index 96% rename from include/webfuse/core/status.h rename to include/webfuse/status.h index 49e53e5..efd57b5 100644 --- a/include/webfuse/core/status.h +++ b/include/webfuse/status.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -/// \file status.h +/// \file webfuse/status.h /// \brief Generic status code. //////////////////////////////////////////////////////////////////////////////// diff --git a/include/webfuse/webfuse.h b/include/webfuse/webfuse.h new file mode 100644 index 0000000..46c8655 --- /dev/null +++ b/include/webfuse/webfuse.h @@ -0,0 +1,25 @@ +//////////////////////////////////////////////////////////////////////////////// +/// \file webfuse/webfuse.h +/// \brief Convenience header to include all functionality of libfuse_adapter. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef WF_WEBFUSE_H +#define WF_WEBFUSE_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +#endif diff --git a/include/webfuse_adapter.h b/include/webfuse_adapter.h deleted file mode 100644 index 093fd06..0000000 --- a/include/webfuse_adapter.h +++ /dev/null @@ -1,25 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file webfuse_adapter.h -/// \brief Convenience header to include all functionality of libfuse_adapter. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WF_ADAPTER_H -#define WF_ADAPTER_H - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -#endif diff --git a/include/webfuse_provider.h b/include/webfuse_provider.h deleted file mode 100644 index 19afad2..0000000 --- a/include/webfuse_provider.h +++ /dev/null @@ -1,27 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -/// \file webfuse_provider.h -/// \brief Convenience header to include all functionality of libfuse_provider. -//////////////////////////////////////////////////////////////////////////////// - -#ifndef WF_PROVIDER_H -#define WF_PROVIDER_H - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/lib/webfuse/adapter/api.c b/lib/webfuse/api.c similarity index 93% rename from lib/webfuse/adapter/api.c rename to lib/webfuse/api.c index 38b38c1..20a04bf 100644 --- a/lib/webfuse/adapter/api.c +++ b/lib/webfuse/api.c @@ -1,15 +1,15 @@ -#include "webfuse_adapter.h" +#include "webfuse/webfuse.h" -#include "webfuse/adapter/impl/server.h" -#include "webfuse/adapter/impl/server_protocol.h" -#include "webfuse/adapter/impl/server_config.h" -#include "webfuse/adapter/impl/credentials.h" -#include "webfuse/adapter/impl/mountpoint.h" +#include "webfuse/impl/server.h" +#include "webfuse/impl/server_protocol.h" +#include "webfuse/impl/server_config.h" +#include "webfuse/impl/credentials.h" +#include "webfuse/impl/mountpoint.h" -#include "webfuse/core/util.h" +#include "webfuse/impl/util/util.h" -#include "webfuse/adapter/impl/client.h" -#include "webfuse/adapter/impl/client_tlsconfig.h" +#include "webfuse/impl/client.h" +#include "webfuse/impl/client_tlsconfig.h" // server diff --git a/lib/webfuse/core/lws_log.c b/lib/webfuse/core/lws_log.c deleted file mode 100644 index 506e530..0000000 --- a/lib/webfuse/core/lws_log.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "webfuse/core/lws_log.h" -#include -#include - -#define WF_LWSLOG_DISABLE 0 - -static bool wf_lwslog_is_diabled = false; - -void wf_lwslog_disable(void) -{ - if (!wf_lwslog_is_diabled) - { - lws_set_log_level(WF_LWSLOG_DISABLE, NULL); - wf_lwslog_is_diabled = true; - } -} - - diff --git a/lib/webfuse/core/lws_log.h b/lib/webfuse/core/lws_log.h deleted file mode 100644 index 6bbbdda..0000000 --- a/lib/webfuse/core/lws_log.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef WF_LWS_LOG_H -#define WF_LWS_LOG_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern void wf_lwslog_disable(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/webfuse/core/message_queue.c b/lib/webfuse/core/message_queue.c deleted file mode 100644 index af641ff..0000000 --- a/lib/webfuse/core/message_queue.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "webfuse/core/message_queue.h" -#include "webfuse/core/message.h" -#include "webfuse/core/container_of.h" - -void wf_message_queue_cleanup( - struct wf_slist * queue) -{ - struct wf_slist_item * item = wf_slist_first(queue); - while (NULL != item) - { - struct wf_slist_item * next = item->next; - struct wf_message * message = wf_container_of(item, struct wf_message, item); - wf_message_dispose(message); - item = next; - } - wf_slist_init(queue); -} diff --git a/lib/webfuse/core/status_intern.h b/lib/webfuse/core/status_intern.h deleted file mode 100644 index fad0e0c..0000000 --- a/lib/webfuse/core/status_intern.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef WF_STATUS_INTERN_H -#define WF_STATUS_INTERN_H - -#include "webfuse/core/status.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern int wf_status_to_rc(wf_status status); - -extern char const * wf_status_tostring(wf_status status); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/lib/webfuse/core/timer/timepoint.c b/lib/webfuse/core/timer/timepoint.c deleted file mode 100644 index 09fc025..0000000 --- a/lib/webfuse/core/timer/timepoint.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "webfuse/core/timer/timepoint.h" - -#include - -#define WF_TIMER_MSEC_PER_SEC ((wf_timer_timepoint) 1000) -#define WF_TIMER_NSEC_PER_MSEC ((wf_timer_timepoint) 1000 * 1000) - -wf_timer_timepoint wf_timer_timepoint_now(void) -{ - struct timespec tp; - clock_gettime(CLOCK_MONOTONIC, &tp); - - wf_timer_timepoint const now = (tp.tv_sec * WF_TIMER_MSEC_PER_SEC) + (tp.tv_nsec / WF_TIMER_NSEC_PER_MSEC); - return now; -} - -wf_timer_timepoint wf_timer_timepoint_in_msec(wf_timer_timediff value) -{ - wf_timer_timepoint const now = wf_timer_timepoint_now(); - wf_timer_timepoint result = now + ((wf_timer_timepoint) value); - - return result; -} - -bool wf_timer_timepoint_is_elapsed(wf_timer_timepoint tp) -{ - wf_timer_timepoint const now = wf_timer_timepoint_now(); - wf_timer_timediff const diff = (wf_timer_timediff) (tp - now); - - return (0 > diff); -} diff --git a/lib/webfuse/adapter/impl/authenticator.c b/lib/webfuse/impl/authenticator.c similarity index 91% rename from lib/webfuse/adapter/impl/authenticator.c rename to lib/webfuse/impl/authenticator.c index 562a1dd..5f336ee 100644 --- a/lib/webfuse/adapter/impl/authenticator.c +++ b/lib/webfuse/impl/authenticator.c @@ -1,9 +1,9 @@ -#include "webfuse/adapter/impl/authenticator.h" +#include "webfuse/impl/authenticator.h" #include #include -#include "webfuse/adapter/impl/credentials.h" +#include "webfuse/impl/credentials.h" struct wf_impl_authenticator * wf_impl_authenticator_create( char const * type, diff --git a/lib/webfuse/adapter/impl/authenticator.h b/lib/webfuse/impl/authenticator.h similarity index 94% rename from lib/webfuse/adapter/impl/authenticator.h rename to lib/webfuse/impl/authenticator.h index 2d92e2f..22dcdfa 100644 --- a/lib/webfuse/adapter/impl/authenticator.h +++ b/lib/webfuse/impl/authenticator.h @@ -5,7 +5,7 @@ #include #endif -#include "webfuse/adapter/authenticate.h" +#include "webfuse/authenticate.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/adapter/impl/authenticators.c b/lib/webfuse/impl/authenticators.c similarity index 94% rename from lib/webfuse/adapter/impl/authenticators.c rename to lib/webfuse/impl/authenticators.c index 57d1e20..aea7ca3 100644 --- a/lib/webfuse/adapter/impl/authenticators.c +++ b/lib/webfuse/impl/authenticators.c @@ -1,9 +1,9 @@ -#include "webfuse/adapter/impl/authenticators.h" +#include "webfuse/impl/authenticators.h" #include #include -#include "webfuse/adapter/impl/authenticator.h" -#include "webfuse/adapter/impl/credentials.h" +#include "webfuse/impl/authenticator.h" +#include "webfuse/impl/credentials.h" static struct wf_impl_authenticator * wf_impl_authenticators_find( struct wf_impl_authenticators * authenticators, diff --git a/lib/webfuse/adapter/impl/authenticators.h b/lib/webfuse/impl/authenticators.h similarity index 96% rename from lib/webfuse/adapter/impl/authenticators.h rename to lib/webfuse/impl/authenticators.h index bf2c72d..bdf58ff 100644 --- a/lib/webfuse/adapter/impl/authenticators.h +++ b/lib/webfuse/impl/authenticators.h @@ -5,7 +5,7 @@ #include #endif -#include "webfuse/adapter/authenticate.h" +#include "webfuse/authenticate.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/adapter/impl/client.c b/lib/webfuse/impl/client.c similarity index 94% rename from lib/webfuse/adapter/impl/client.c rename to lib/webfuse/impl/client.c index 745250f..6929483 100644 --- a/lib/webfuse/adapter/impl/client.c +++ b/lib/webfuse/impl/client.c @@ -1,7 +1,7 @@ -#include "webfuse/adapter/impl/client.h" -#include "webfuse/adapter/impl/client_protocol.h" -#include "webfuse/adapter/impl/client_tlsconfig.h" -#include "webfuse/core/lws_log.h" +#include "webfuse/impl/client.h" +#include "webfuse/impl/client_protocol.h" +#include "webfuse/impl/client_tlsconfig.h" +#include "webfuse/impl/util/lws_log.h" #include @@ -25,7 +25,7 @@ wf_impl_client_create( wf_client_callback_fn * callback, void * user_data) { - wf_lwslog_disable(); + wf_impl_lwslog_disable(); struct wf_client * client = malloc(sizeof(struct wf_client)); wf_impl_client_tlsconfig_init(&client->tls); diff --git a/lib/webfuse/adapter/impl/client.h b/lib/webfuse/impl/client.h similarity index 95% rename from lib/webfuse/adapter/impl/client.h rename to lib/webfuse/impl/client.h index 62d1299..039e2e9 100644 --- a/lib/webfuse/adapter/impl/client.h +++ b/lib/webfuse/impl/client.h @@ -2,7 +2,7 @@ #define WF_ADAPTER_IMPL_CLIENT_H -#include "webfuse/adapter/client_callback.h" +#include "webfuse/client_callback.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/adapter/impl/client_protocol.c b/lib/webfuse/impl/client_protocol.c similarity index 81% rename from lib/webfuse/adapter/impl/client_protocol.c rename to lib/webfuse/impl/client_protocol.c index 356cf35..646bf58 100644 --- a/lib/webfuse/adapter/impl/client_protocol.c +++ b/lib/webfuse/impl/client_protocol.c @@ -1,18 +1,18 @@ -#include "webfuse/adapter/impl/client_protocol.h" -#include "webfuse/adapter/client_callback.h" -#include "webfuse/adapter/impl/credentials.h" -#include "webfuse/adapter/impl/filesystem.h" -#include "webfuse/adapter/impl/mountpoint.h" -#include "webfuse/core/protocol_names.h" -#include "webfuse/core/url.h" -#include "webfuse/core/util.h" -#include "webfuse/core/timer/manager.h" -#include "webfuse/core/jsonrpc/response.h" -#include "webfuse/core/jsonrpc/proxy.h" +#include "webfuse/impl/client_protocol.h" +#include "webfuse/client_callback.h" +#include "webfuse/impl/credentials.h" +#include "webfuse/impl/filesystem.h" +#include "webfuse/impl/mountpoint.h" +#include "webfuse/protocol_names.h" +#include "webfuse/impl/util/url.h" +#include "webfuse/impl/util/util.h" +#include "webfuse/impl/timer/manager.h" +#include "webfuse/impl/jsonrpc/response.h" +#include "webfuse/impl/jsonrpc/proxy.h" -#include "webfuse/core/message.h" -#include "webfuse/core/message_queue.h" -#include "webfuse/core/container_of.h" +#include "webfuse/impl/message.h" +#include "webfuse/impl/message_queue.h" +#include "webfuse/impl/util/container_of.h" #include @@ -35,9 +35,9 @@ wf_impl_client_protocol_process( json_t * message = json_loadb(data, length, 0, NULL); if (NULL != message) { - if (wf_jsonrpc_is_response(message)) + if (wf_impl_jsonrpc_is_response(message)) { - wf_jsonrpc_proxy_onresult(protocol->proxy, message); + wf_impl_jsonrpc_proxy_onresult(protocol->proxy, message); } json_decref(message); @@ -54,10 +54,10 @@ wf_impl_client_protocol_send( if (NULL != protocol->wsi) { - struct wf_message * message = wf_message_create(request); + struct wf_message * message = wf_impl_message_create(request); if (NULL != message) { - wf_slist_append(&protocol->messages, &message->item); + wf_impl_slist_append(&protocol->messages, &message->item); lws_callback_on_writable(protocol->wsi); result = true; } @@ -95,7 +95,7 @@ wf_impl_client_protocol_on_add_filesystem_finished( if (json_is_string(id)) { char const * name = json_string_value(id); - struct wf_mountpoint * mountpoint = wf_mountpoint_create(context->local_path); + struct wf_mountpoint * mountpoint = wf_impl_mountpoint_create(context->local_path); protocol->filesystem = wf_impl_filesystem_create(protocol->wsi,protocol->proxy, name, mountpoint); if (NULL != protocol->filesystem) { @@ -103,7 +103,7 @@ wf_impl_client_protocol_on_add_filesystem_finished( } else { - wf_mountpoint_dispose(mountpoint); + wf_impl_mountpoint_dispose(mountpoint); } } } @@ -126,7 +126,7 @@ static int wf_impl_client_protocol_lws_callback( if (NULL != protocol) { - wf_timer_manager_check(protocol->timer_manager); + wf_impl_timer_manager_check(protocol->timer_manager); switch (reason) { @@ -156,14 +156,14 @@ static int wf_impl_client_protocol_lws_callback( { result = 1; } - else if (!wf_slist_empty(&protocol->messages)) + else if (!wf_impl_slist_empty(&protocol->messages)) { - struct wf_slist_item * item = wf_slist_remove_first(&protocol->messages); + struct wf_slist_item * item = wf_impl_slist_remove_first(&protocol->messages); struct wf_message * message = wf_container_of(item, struct wf_message, item); lws_write(wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT); - wf_message_dispose(message); + wf_impl_message_dispose(message); - if (!wf_slist_empty(&protocol->messages)) + if (!wf_impl_slist_empty(&protocol->messages)) { lws_callback_on_writable(wsi); } @@ -196,9 +196,9 @@ wf_impl_client_protocol_init( protocol->user_data = user_data; protocol->filesystem = NULL; - wf_slist_init(&protocol->messages); - protocol->timer_manager = wf_timer_manager_create(); - protocol->proxy = wf_jsonrpc_proxy_create(protocol->timer_manager, WF_DEFAULT_TIMEOUT, &wf_impl_client_protocol_send, protocol); + wf_impl_slist_init(&protocol->messages); + protocol->timer_manager = wf_impl_timer_manager_create(); + protocol->proxy = wf_impl_jsonrpc_proxy_create(protocol->timer_manager, WF_DEFAULT_TIMEOUT, &wf_impl_client_protocol_send, protocol); protocol->callback(protocol->user_data, WF_CLIENT_INIT, NULL); } @@ -209,9 +209,9 @@ wf_impl_client_protocol_cleanup( { protocol->callback(protocol->user_data, WF_CLIENT_CLEANUP, NULL); - wf_jsonrpc_proxy_dispose(protocol->proxy); - wf_timer_manager_dispose(protocol->timer_manager); - wf_message_queue_cleanup(&protocol->messages); + wf_impl_jsonrpc_proxy_dispose(protocol->proxy); + wf_impl_timer_manager_dispose(protocol->timer_manager); + wf_impl_message_queue_cleanup(&protocol->messages); if (NULL != protocol->filesystem) { @@ -247,7 +247,7 @@ wf_impl_client_protocol_connect( char const * url) { struct wf_url url_data; - bool const success = wf_url_init(&url_data, url); + bool const success = wf_impl_url_init(&url_data, url); if (success) { struct lws_client_connect_info info; @@ -264,7 +264,7 @@ wf_impl_client_protocol_connect( info.pwsi = &protocol->wsi; lws_client_connect_via_info(&info); - wf_url_cleanup(&url_data); + wf_impl_url_cleanup(&url_data); } else { @@ -297,7 +297,7 @@ wf_impl_client_protocol_authenticate( protocol->callback(protocol->user_data, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, &creds); json_incref(creds.data); - wf_jsonrpc_proxy_invoke( + wf_impl_jsonrpc_proxy_invoke( protocol->proxy, &wf_impl_client_protocol_on_authenticate_finished, protocol, @@ -320,7 +320,7 @@ wf_impl_client_protocol_add_filesystem( context->protocol = protocol; context->local_path = strdup(local_path); - wf_jsonrpc_proxy_invoke( + wf_impl_jsonrpc_proxy_invoke( protocol->proxy, &wf_impl_client_protocol_on_add_filesystem_finished, context, diff --git a/lib/webfuse/adapter/impl/client_protocol.h b/lib/webfuse/impl/client_protocol.h similarity index 95% rename from lib/webfuse/adapter/impl/client_protocol.h rename to lib/webfuse/impl/client_protocol.h index 00c7c26..34d86ed 100644 --- a/lib/webfuse/adapter/impl/client_protocol.h +++ b/lib/webfuse/impl/client_protocol.h @@ -1,8 +1,8 @@ #ifndef WF_ADAPTER_IMPL_CLIENT_PROTOCOL_H #define WF_ADAPTER_IMPL_CLIENT_PROTOCOL_H -#include "webfuse/adapter/client_callback.h" -#include "webfuse/core/slist.h" +#include "webfuse/client_callback.h" +#include "webfuse/impl/util/slist.h" #ifndef __cplusplus #include diff --git a/lib/webfuse/adapter/impl/client_tlsconfig.c b/lib/webfuse/impl/client_tlsconfig.c similarity index 95% rename from lib/webfuse/adapter/impl/client_tlsconfig.c rename to lib/webfuse/impl/client_tlsconfig.c index 561b4b2..716bf0b 100644 --- a/lib/webfuse/adapter/impl/client_tlsconfig.c +++ b/lib/webfuse/impl/client_tlsconfig.c @@ -1,4 +1,4 @@ -#include "webfuse/adapter/impl/client_tlsconfig.h" +#include "webfuse/impl/client_tlsconfig.h" #include #include diff --git a/lib/webfuse/adapter/impl/client_tlsconfig.h b/lib/webfuse/impl/client_tlsconfig.h similarity index 100% rename from lib/webfuse/adapter/impl/client_tlsconfig.h rename to lib/webfuse/impl/client_tlsconfig.h diff --git a/lib/webfuse/adapter/impl/credentials.c b/lib/webfuse/impl/credentials.c similarity index 96% rename from lib/webfuse/adapter/impl/credentials.c rename to lib/webfuse/impl/credentials.c index d4c9461..ab72731 100644 --- a/lib/webfuse/adapter/impl/credentials.c +++ b/lib/webfuse/impl/credentials.c @@ -1,4 +1,4 @@ -#include "webfuse/adapter/impl/credentials.h" +#include "webfuse/impl/credentials.h" #include void wf_impl_credentials_init_default( diff --git a/lib/webfuse/adapter/impl/credentials.h b/lib/webfuse/impl/credentials.h similarity index 100% rename from lib/webfuse/adapter/impl/credentials.h rename to lib/webfuse/impl/credentials.h diff --git a/lib/webfuse/adapter/impl/filesystem.c b/lib/webfuse/impl/filesystem.c similarity index 86% rename from lib/webfuse/adapter/impl/filesystem.c rename to lib/webfuse/impl/filesystem.c index 453f67f..ccb3ecd 100644 --- a/lib/webfuse/adapter/impl/filesystem.c +++ b/lib/webfuse/impl/filesystem.c @@ -1,13 +1,13 @@ -#include "webfuse/adapter/impl/filesystem.h" -#include "webfuse/adapter/impl/operation/context.h" -#include "webfuse/adapter/impl/operation/open.h" -#include "webfuse/adapter/impl/operation/close.h" -#include "webfuse/adapter/impl/operation/read.h" -#include "webfuse/adapter/impl/operation/readdir.h" -#include "webfuse/adapter/impl/operation/getattr.h" -#include "webfuse/adapter/impl/operation/lookup.h" -#include "webfuse/adapter/impl/session.h" -#include "webfuse/adapter/impl/mountpoint.h" +#include "webfuse/impl/filesystem.h" +#include "webfuse/impl/operation/context.h" +#include "webfuse/impl/operation/open.h" +#include "webfuse/impl/operation/close.h" +#include "webfuse/impl/operation/read.h" +#include "webfuse/impl/operation/readdir.h" +#include "webfuse/impl/operation/getattr.h" +#include "webfuse/impl/operation/lookup.h" +#include "webfuse/impl/session.h" +#include "webfuse/impl/mountpoint.h" #include diff --git a/lib/webfuse/adapter/impl/filesystem.h b/lib/webfuse/impl/filesystem.h similarity index 87% rename from lib/webfuse/adapter/impl/filesystem.h rename to lib/webfuse/impl/filesystem.h index 95825f2..717a0c9 100644 --- a/lib/webfuse/adapter/impl/filesystem.h +++ b/lib/webfuse/impl/filesystem.h @@ -5,9 +5,9 @@ #include #endif -#include "webfuse/adapter/impl/fuse_wrapper.h" -#include "webfuse/adapter/impl/operation/context.h" -#include "webfuse/core/slist.h" +#include "webfuse/impl/fuse_wrapper.h" +#include "webfuse/impl/operation/context.h" +#include "webfuse/impl/util/slist.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/adapter/impl/fuse_wrapper.h b/lib/webfuse/impl/fuse_wrapper.h similarity index 100% rename from lib/webfuse/adapter/impl/fuse_wrapper.h rename to lib/webfuse/impl/fuse_wrapper.h diff --git a/lib/webfuse/core/jsonrpc/error.c b/lib/webfuse/impl/jsonrpc/error.c similarity index 72% rename from lib/webfuse/core/jsonrpc/error.c rename to lib/webfuse/impl/jsonrpc/error.c index ad74a58..b54c4bc 100644 --- a/lib/webfuse/core/jsonrpc/error.c +++ b/lib/webfuse/impl/jsonrpc/error.c @@ -1,7 +1,7 @@ -#include "webfuse/core/jsonrpc/error.h" +#include "webfuse/impl/jsonrpc/error.h" json_t * -wf_jsonrpc_error( +wf_impl_jsonrpc_error( int code, char const * message) { @@ -13,13 +13,13 @@ wf_jsonrpc_error( } void -wf_jsonrpc_propate_error( +wf_impl_jsonrpc_propate_error( wf_jsonrpc_proxy_finished_fn * finised, void * user_data, int code, char const * message) { - json_t * error = wf_jsonrpc_error(code, message); + json_t * error = wf_impl_jsonrpc_error(code, message); finised(user_data, NULL, error); json_decref(error); diff --git a/lib/webfuse/core/jsonrpc/error.h b/lib/webfuse/impl/jsonrpc/error.h similarity index 62% rename from lib/webfuse/core/jsonrpc/error.h rename to lib/webfuse/impl/jsonrpc/error.h index 2edfd92..6a0cf2c 100644 --- a/lib/webfuse/core/jsonrpc/error.h +++ b/lib/webfuse/impl/jsonrpc/error.h @@ -1,8 +1,8 @@ -#ifndef WF_JSONRPC_ERROR_H -#define WF_JSONRPC_ERROR_H +#ifndef WF_IMPL_JSONRPC_ERROR_H +#define WF_IMPL_JSONRPC_ERROR_H #include -#include "webfuse/core/jsonrpc/proxy_finished_fn.h" +#include "webfuse/impl/jsonrpc/proxy_finished_fn.h" #ifdef __cplusplus extern "C" @@ -10,12 +10,12 @@ extern "C" #endif extern json_t * -wf_jsonrpc_error( +wf_impl_jsonrpc_error( int code, char const * message); extern void -wf_jsonrpc_propate_error( +wf_impl_jsonrpc_propate_error( wf_jsonrpc_proxy_finished_fn * finised, void * user_data, int code, diff --git a/lib/webfuse/core/jsonrpc/method.c b/lib/webfuse/impl/jsonrpc/method.c similarity index 77% rename from lib/webfuse/core/jsonrpc/method.c rename to lib/webfuse/impl/jsonrpc/method.c index a184dca..f666cf3 100644 --- a/lib/webfuse/core/jsonrpc/method.c +++ b/lib/webfuse/impl/jsonrpc/method.c @@ -1,8 +1,8 @@ -#include "webfuse/core/jsonrpc/method.h" +#include "webfuse/impl/jsonrpc/method.h" #include #include -struct wf_jsonrpc_method * wf_jsonrpc_method_create( +struct wf_jsonrpc_method * wf_impl_jsonrpc_method_create( char const * method_name, wf_jsonrpc_method_invoke_fn * invoke, void * user_data) @@ -16,7 +16,7 @@ struct wf_jsonrpc_method * wf_jsonrpc_method_create( return method; } -void wf_jsonrpc_method_dispose( +void wf_impl_jsonrpc_method_dispose( struct wf_jsonrpc_method * method) { free(method->name); diff --git a/lib/webfuse/core/jsonrpc/method.h b/lib/webfuse/impl/jsonrpc/method.h similarity index 69% rename from lib/webfuse/core/jsonrpc/method.h rename to lib/webfuse/impl/jsonrpc/method.h index e196bff..0957c81 100644 --- a/lib/webfuse/core/jsonrpc/method.h +++ b/lib/webfuse/impl/jsonrpc/method.h @@ -1,7 +1,7 @@ -#ifndef WF_JSONRPC_METHOD_H -#define WF_JSONRPC_METHOD_H +#ifndef WF_IMPL_JSONRPC_METHOD_H +#define WF_IMPL_JSONRPC_METHOD_H -#include "webfuse/core/jsonrpc/method_invoke_fn.h" +#include "webfuse/impl/jsonrpc/method_invoke_fn.h" #ifdef __cplusplus extern "C" @@ -17,13 +17,13 @@ struct wf_jsonrpc_method }; extern struct wf_jsonrpc_method * -wf_jsonrpc_method_create( +wf_impl_jsonrpc_method_create( char const * method_name, wf_jsonrpc_method_invoke_fn * invoke, void * user_data); extern void -wf_jsonrpc_method_dispose( +wf_impl_jsonrpc_method_dispose( struct wf_jsonrpc_method * method); #ifdef __cplusplus diff --git a/lib/webfuse/core/jsonrpc/method_invoke_fn.h b/lib/webfuse/impl/jsonrpc/method_invoke_fn.h similarity index 76% rename from lib/webfuse/core/jsonrpc/method_invoke_fn.h rename to lib/webfuse/impl/jsonrpc/method_invoke_fn.h index 046dfb6..10bb88b 100644 --- a/lib/webfuse/core/jsonrpc/method_invoke_fn.h +++ b/lib/webfuse/impl/jsonrpc/method_invoke_fn.h @@ -1,5 +1,5 @@ -#ifndef WF_JSONRPC_METHOD_INVOKE_FN_H -#define WF_JSONRPC_METHOD_INVOKE_FN_H +#ifndef WF_IMPL_JSONRPC_METHOD_INVOKE_FN_H +#define WF_IMPL_JSONRPC_METHOD_INVOKE_FN_H #include diff --git a/lib/webfuse/core/jsonrpc/proxy.c b/lib/webfuse/impl/jsonrpc/proxy.c similarity index 69% rename from lib/webfuse/core/jsonrpc/proxy.c rename to lib/webfuse/impl/jsonrpc/proxy.c index ee5fc0d..2870e2d 100644 --- a/lib/webfuse/core/jsonrpc/proxy.c +++ b/lib/webfuse/impl/jsonrpc/proxy.c @@ -1,34 +1,34 @@ -#include "webfuse/core/jsonrpc/proxy_intern.h" -#include "webfuse/core/jsonrpc/response_intern.h" -#include "webfuse/core/jsonrpc/error.h" -#include "webfuse/core/status.h" +#include "webfuse/impl/jsonrpc/proxy_intern.h" +#include "webfuse/impl/jsonrpc/response_intern.h" +#include "webfuse/impl/jsonrpc/error.h" +#include "webfuse/status.h" -#include "webfuse/core/timer/timer.h" +#include "webfuse/impl/timer/timer.h" #include #include struct wf_jsonrpc_proxy * -wf_jsonrpc_proxy_create( +wf_impl_jsonrpc_proxy_create( struct wf_timer_manager * manager, int timeout, wf_jsonrpc_send_fn * send, void * user_data) { struct wf_jsonrpc_proxy * proxy = malloc(sizeof(struct wf_jsonrpc_proxy)); - wf_jsonrpc_proxy_init(proxy, manager, timeout, send, user_data); + wf_impl_jsonrpc_proxy_init(proxy, manager, timeout, send, user_data); return proxy; } -void wf_jsonrpc_proxy_dispose( +void wf_impl_jsonrpc_proxy_dispose( struct wf_jsonrpc_proxy * proxy) { - wf_jsonrpc_proxy_cleanup(proxy); + wf_impl_jsonrpc_proxy_cleanup(proxy); free(proxy); } -static void wf_jsonrpc_proxy_on_timeout( +static void wf_impl_jsonrpc_proxy_on_timeout( struct wf_timer * timer, void * proxy_ptr) { struct wf_jsonrpc_proxy * proxy = proxy_ptr; @@ -42,13 +42,13 @@ static void wf_jsonrpc_proxy_on_timeout( proxy->request.id = 0; proxy->request.user_data = NULL; proxy->request.finished = NULL; - wf_timer_cancel(timer); + wf_impl_timer_cancel(timer); - wf_jsonrpc_propate_error(finished, user_data, WF_BAD_TIMEOUT, "Timeout"); + wf_impl_jsonrpc_propate_error(finished, user_data, WF_BAD_TIMEOUT, "Timeout"); } } -static json_t * wf_jsonrpc_request_create( +static json_t * wf_impl_jsonrpc_request_create( char const * method, int id, char const * param_info, @@ -98,7 +98,7 @@ static json_t * wf_jsonrpc_request_create( return request; } -void wf_jsonrpc_proxy_init( +void wf_impl_jsonrpc_proxy_init( struct wf_jsonrpc_proxy * proxy, struct wf_timer_manager * timeout_manager, int timeout, @@ -109,11 +109,11 @@ void wf_jsonrpc_proxy_init( proxy->timeout = timeout; proxy->user_data = user_data; proxy->request.is_pending = false; - proxy->request.timer = wf_timer_create(timeout_manager, - &wf_jsonrpc_proxy_on_timeout, proxy); + proxy->request.timer = wf_impl_timer_create(timeout_manager, + &wf_impl_jsonrpc_proxy_on_timeout, proxy); } -void wf_jsonrpc_proxy_cleanup( +void wf_impl_jsonrpc_proxy_cleanup( struct wf_jsonrpc_proxy * proxy) { if (proxy->request.is_pending) @@ -125,15 +125,15 @@ void wf_jsonrpc_proxy_cleanup( proxy->request.finished = NULL; proxy->request.user_data = NULL; proxy->request.id = 0; - wf_timer_cancel(proxy->request.timer); + wf_impl_timer_cancel(proxy->request.timer); - wf_jsonrpc_propate_error(finished, user_data, WF_BAD, "Bad: cancelled pending request during shutdown"); + wf_impl_jsonrpc_propate_error(finished, user_data, WF_BAD, "Bad: cancelled pending request during shutdown"); } - wf_timer_dispose(proxy->request.timer); + wf_impl_timer_dispose(proxy->request.timer); } -void wf_jsonrpc_proxy_vinvoke( +void wf_impl_jsonrpc_proxy_vinvoke( struct wf_jsonrpc_proxy * proxy, wf_jsonrpc_proxy_finished_fn * finished, void * user_data, @@ -147,9 +147,9 @@ void wf_jsonrpc_proxy_vinvoke( proxy->request.finished = finished; proxy->request.user_data = user_data; proxy->request.id = 42; - wf_timer_start(proxy->request.timer, proxy->timeout); + wf_impl_timer_start(proxy->request.timer, proxy->timeout); - json_t * request = wf_jsonrpc_request_create(method_name, proxy->request.id, param_info, args); + json_t * request = wf_impl_jsonrpc_request_create(method_name, proxy->request.id, param_info, args); bool const is_send = ((NULL != request) && (proxy->send(request, proxy->user_data))); if (!is_send) @@ -158,9 +158,9 @@ void wf_jsonrpc_proxy_vinvoke( proxy->request.finished = NULL; proxy->request.user_data = NULL; proxy->request.id = 0; - wf_timer_cancel(proxy->request.timer); + wf_impl_timer_cancel(proxy->request.timer); - wf_jsonrpc_propate_error(finished, user_data, WF_BAD, "Bad: requenst is not sent"); + wf_impl_jsonrpc_propate_error(finished, user_data, WF_BAD, "Bad: requenst is not sent"); } if (NULL != request) @@ -170,17 +170,17 @@ void wf_jsonrpc_proxy_vinvoke( } else { - wf_jsonrpc_propate_error(finished, user_data, WF_BAD_BUSY, "Busy"); + wf_impl_jsonrpc_propate_error(finished, user_data, WF_BAD_BUSY, "Busy"); } } -extern void wf_jsonrpc_proxy_vnotify( +extern void wf_impl_jsonrpc_proxy_vnotify( struct wf_jsonrpc_proxy * proxy, char const * method_name, char const * param_info, va_list args) { - json_t * request = wf_jsonrpc_request_create(method_name, 0, param_info, args); + json_t * request = wf_impl_jsonrpc_request_create(method_name, 0, param_info, args); if (NULL != request) { @@ -190,12 +190,12 @@ extern void wf_jsonrpc_proxy_vnotify( } -void wf_jsonrpc_proxy_onresult( +void wf_impl_jsonrpc_proxy_onresult( struct wf_jsonrpc_proxy * proxy, json_t * message) { struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); if ((proxy->request.is_pending) && (response.id == proxy->request.id)) { @@ -206,11 +206,10 @@ void wf_jsonrpc_proxy_onresult( proxy->request.id = 0; proxy->request.user_data = NULL; proxy->request.finished = NULL; - wf_timer_cancel(proxy->request.timer); + wf_impl_timer_cancel(proxy->request.timer); finished(user_data, response.result, response.error); } - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); } - diff --git a/lib/webfuse/core/jsonrpc/proxy.h b/lib/webfuse/impl/jsonrpc/proxy.h similarity index 80% rename from lib/webfuse/core/jsonrpc/proxy.h rename to lib/webfuse/impl/jsonrpc/proxy.h index 8a69936..dd5a73e 100644 --- a/lib/webfuse/core/jsonrpc/proxy.h +++ b/lib/webfuse/impl/jsonrpc/proxy.h @@ -1,5 +1,5 @@ -#ifndef WF_JSONRPC_PROXY_H -#define WF_JSONRPC_PROXY_H +#ifndef WF_IMPL_JSONRPC_PROXY_H +#define WF_IMPL_JSONRPC_PROXY_H #ifndef __cplusplus #include @@ -12,8 +12,8 @@ using std::size_t; #endif #include -#include "webfuse/core/jsonrpc/send_fn.h" -#include "webfuse/core/jsonrpc/proxy_finished_fn.h" +#include "webfuse/impl/jsonrpc/send_fn.h" +#include "webfuse/impl/jsonrpc/proxy_finished_fn.h" #ifdef __cplusplus extern "C" { @@ -23,13 +23,13 @@ struct wf_jsonrpc_proxy; struct wf_timer_manager; extern struct wf_jsonrpc_proxy * -wf_jsonrpc_proxy_create( +wf_impl_jsonrpc_proxy_create( struct wf_timer_manager * manager, int timeout, wf_jsonrpc_send_fn * send, void * user_data); -extern void wf_jsonrpc_proxy_dispose( +extern void wf_impl_jsonrpc_proxy_dispose( struct wf_jsonrpc_proxy * proxy); //------------------------------------------------------------------------------ @@ -46,7 +46,7 @@ extern void wf_jsonrpc_proxy_dispose( /// \param param_info types of the param (s = string, i = integer, j = json) /// \param ... params //------------------------------------------------------------------------------ -extern void wf_jsonrpc_proxy_invoke( +extern void wf_impl_jsonrpc_proxy_invoke( struct wf_jsonrpc_proxy * proxy, wf_jsonrpc_proxy_finished_fn * finished, void * user_data, @@ -55,14 +55,14 @@ extern void wf_jsonrpc_proxy_invoke( ... ); -extern void wf_jsonrpc_proxy_notify( +extern void wf_impl_jsonrpc_proxy_notify( struct wf_jsonrpc_proxy * proxy, char const * method_name, char const * param_info, ... ); -extern void wf_jsonrpc_proxy_onresult( +extern void wf_impl_jsonrpc_proxy_onresult( struct wf_jsonrpc_proxy * proxy, json_t * message); diff --git a/lib/webfuse/core/jsonrpc/proxy_finished_fn.h b/lib/webfuse/impl/jsonrpc/proxy_finished_fn.h similarity index 70% rename from lib/webfuse/core/jsonrpc/proxy_finished_fn.h rename to lib/webfuse/impl/jsonrpc/proxy_finished_fn.h index cd59c87..0ea5a97 100644 --- a/lib/webfuse/core/jsonrpc/proxy_finished_fn.h +++ b/lib/webfuse/impl/jsonrpc/proxy_finished_fn.h @@ -1,5 +1,5 @@ -#ifndef WF_JSONRPC_PROXY_FINISHED_FN_H -#define WF_JSONRPC_PROXY_FINISHED_FN_H +#ifndef WF_IMPL_JSONRPC_PROXY_FINISHED_FN_H +#define WF_IMPL_JSONRPC_PROXY_FINISHED_FN_H #include diff --git a/lib/webfuse/core/jsonrpc/proxy_intern.h b/lib/webfuse/impl/jsonrpc/proxy_intern.h similarity index 71% rename from lib/webfuse/core/jsonrpc/proxy_intern.h rename to lib/webfuse/impl/jsonrpc/proxy_intern.h index fd284a0..86a773a 100644 --- a/lib/webfuse/core/jsonrpc/proxy_intern.h +++ b/lib/webfuse/impl/jsonrpc/proxy_intern.h @@ -1,9 +1,9 @@ -#ifndef WF_JSONRPC_PROXY_INTERN_H -#define WF_JSONRPC_PROXY_INTERN_H +#ifndef WF_IMPL_JSONRPC_PROXY_INTERN_H +#define WF_IMPL_JSONRPC_PROXY_INTERN_H -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/jsonrpc/proxy_finished_fn.h" -#include "webfuse/core/jsonrpc/send_fn.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/jsonrpc/proxy_finished_fn.h" +#include "webfuse/impl/jsonrpc/send_fn.h" #ifdef __cplusplus extern "C" @@ -30,7 +30,7 @@ struct wf_jsonrpc_proxy }; extern void -wf_jsonrpc_proxy_init( +wf_impl_jsonrpc_proxy_init( struct wf_jsonrpc_proxy * proxy, struct wf_timer_manager * manager, int timeout, @@ -38,10 +38,10 @@ wf_jsonrpc_proxy_init( void * user_data); extern void -wf_jsonrpc_proxy_cleanup( +wf_impl_jsonrpc_proxy_cleanup( struct wf_jsonrpc_proxy * proxy); -extern void wf_jsonrpc_proxy_vinvoke( +extern void wf_impl_jsonrpc_proxy_vinvoke( struct wf_jsonrpc_proxy * proxy, wf_jsonrpc_proxy_finished_fn * finished, void * user_data, @@ -49,7 +49,7 @@ extern void wf_jsonrpc_proxy_vinvoke( char const * param_info, va_list args); -extern void wf_jsonrpc_proxy_vnotify( +extern void wf_impl_jsonrpc_proxy_vnotify( struct wf_jsonrpc_proxy * proxy, char const * method_name, char const * param_info, diff --git a/lib/webfuse/core/jsonrpc/proxy_variadic.c b/lib/webfuse/impl/jsonrpc/proxy_variadic.c similarity index 57% rename from lib/webfuse/core/jsonrpc/proxy_variadic.c rename to lib/webfuse/impl/jsonrpc/proxy_variadic.c index 2447511..3dcca6c 100644 --- a/lib/webfuse/core/jsonrpc/proxy_variadic.c +++ b/lib/webfuse/impl/jsonrpc/proxy_variadic.c @@ -1,6 +1,6 @@ -#include "webfuse/core/jsonrpc/proxy_intern.h" +#include "webfuse/impl/jsonrpc/proxy_intern.h" -void wf_jsonrpc_proxy_invoke( +void wf_impl_jsonrpc_proxy_invoke( struct wf_jsonrpc_proxy * proxy, wf_jsonrpc_proxy_finished_fn * finished, void * user_data, @@ -10,11 +10,11 @@ void wf_jsonrpc_proxy_invoke( { va_list args; va_start(args, param_info); - wf_jsonrpc_proxy_vinvoke(proxy, finished, user_data, method_name, param_info, args); + wf_impl_jsonrpc_proxy_vinvoke(proxy, finished, user_data, method_name, param_info, args); va_end(args); } -extern void wf_jsonrpc_proxy_notify( +extern void wf_impl_jsonrpc_proxy_notify( struct wf_jsonrpc_proxy * proxy, char const * method_name, char const * param_info, @@ -23,6 +23,6 @@ extern void wf_jsonrpc_proxy_notify( { va_list args; va_start(args, param_info); - wf_jsonrpc_proxy_vnotify(proxy, method_name, param_info, args); + wf_impl_jsonrpc_proxy_vnotify(proxy, method_name, param_info, args); va_end(args); } diff --git a/lib/webfuse/core/jsonrpc/request.c b/lib/webfuse/impl/jsonrpc/request.c similarity index 76% rename from lib/webfuse/core/jsonrpc/request.c rename to lib/webfuse/impl/jsonrpc/request.c index 30212bd..93e2e70 100644 --- a/lib/webfuse/core/jsonrpc/request.c +++ b/lib/webfuse/impl/jsonrpc/request.c @@ -1,5 +1,5 @@ -#include "webfuse/core/jsonrpc/request.h" -#include "webfuse/core/jsonrpc/error.h" +#include "webfuse/impl/jsonrpc/request.h" +#include "webfuse/impl/jsonrpc/error.h" #include struct wf_jsonrpc_request @@ -10,7 +10,7 @@ struct wf_jsonrpc_request }; bool -wf_jsonrpc_is_request( +wf_impl_jsonrpc_is_request( json_t * message) { json_t * id = json_object_get(message, "id"); @@ -23,7 +23,7 @@ wf_jsonrpc_is_request( struct wf_jsonrpc_request * -wf_jsonrpc_request_create( +wf_impl_jsonrpc_request_create( int id, wf_jsonrpc_send_fn * send, void * user_data) @@ -37,14 +37,14 @@ wf_jsonrpc_request_create( } void -wf_jsonrpc_request_dispose( +wf_impl_jsonrpc_request_dispose( struct wf_jsonrpc_request * request) { free(request); } void * -wf_jsonrpc_request_get_userdata( +wf_impl_jsonrpc_request_get_userdata( struct wf_jsonrpc_request * request) { return request->user_data; @@ -52,7 +52,7 @@ wf_jsonrpc_request_get_userdata( void -wf_jsonrpc_respond( +wf_impl_jsonrpc_respond( struct wf_jsonrpc_request * request, json_t * result) { @@ -62,20 +62,19 @@ wf_jsonrpc_respond( request->send(response, request->user_data); json_decref(response); - wf_jsonrpc_request_dispose(request); + wf_impl_jsonrpc_request_dispose(request); } -void wf_jsonrpc_respond_error( +void wf_impl_jsonrpc_respond_error( struct wf_jsonrpc_request * request, int code, char const * message) { json_t * response = json_object(); - json_object_set_new(response, "error", wf_jsonrpc_error(code, message)); + json_object_set_new(response, "error", wf_impl_jsonrpc_error(code, message)); json_object_set_new(response, "id", json_integer(request->id)); request->send(response, request->user_data); json_decref(response); - wf_jsonrpc_request_dispose(request); + wf_impl_jsonrpc_request_dispose(request); } - diff --git a/lib/webfuse/core/jsonrpc/request.h b/lib/webfuse/impl/jsonrpc/request.h similarity index 64% rename from lib/webfuse/core/jsonrpc/request.h rename to lib/webfuse/impl/jsonrpc/request.h index 234ec62..747c480 100644 --- a/lib/webfuse/core/jsonrpc/request.h +++ b/lib/webfuse/impl/jsonrpc/request.h @@ -1,5 +1,5 @@ -#ifndef WF_JSONRPC_REQUEST_H -#define WF_JSONRPC_REQUEST_H +#ifndef WF_IMPL_JSONRPC_REQUEST_H +#define WF_IMPL_JSONRPC_REQUEST_H #ifndef __cplusplus #include @@ -12,7 +12,7 @@ using std::size_t; #endif #include -#include "webfuse/core/jsonrpc/send_fn.h" +#include "webfuse/impl/jsonrpc/send_fn.h" #ifdef __cplusplus extern "C" @@ -21,26 +21,26 @@ extern "C" struct wf_jsonrpc_request; -extern bool wf_jsonrpc_is_request( +extern bool wf_impl_jsonrpc_is_request( json_t * message); extern struct wf_jsonrpc_request * -wf_jsonrpc_request_create( +wf_impl_jsonrpc_request_create( int id, wf_jsonrpc_send_fn * send, void * user_data); -extern void wf_jsonrpc_request_dispose( +extern void wf_impl_jsonrpc_request_dispose( struct wf_jsonrpc_request * request); -extern void * wf_jsonrpc_request_get_userdata( +extern void * wf_impl_jsonrpc_request_get_userdata( struct wf_jsonrpc_request * request); -extern void wf_jsonrpc_respond( +extern void wf_impl_jsonrpc_respond( struct wf_jsonrpc_request * request, json_t * result); -extern void wf_jsonrpc_respond_error( +extern void wf_impl_jsonrpc_respond_error( struct wf_jsonrpc_request * request, int code, char const * message); diff --git a/lib/webfuse/core/jsonrpc/response.c b/lib/webfuse/impl/jsonrpc/response.c similarity index 73% rename from lib/webfuse/core/jsonrpc/response.c rename to lib/webfuse/impl/jsonrpc/response.c index 69f7033..7661828 100644 --- a/lib/webfuse/core/jsonrpc/response.c +++ b/lib/webfuse/impl/jsonrpc/response.c @@ -1,9 +1,9 @@ -#include "webfuse/core/jsonrpc/response_intern.h" -#include "webfuse/core/jsonrpc/error.h" -#include "webfuse/core/status.h" +#include "webfuse/impl/jsonrpc/response_intern.h" +#include "webfuse/impl/jsonrpc/error.h" +#include "webfuse/status.h" bool -wf_jsonrpc_is_response( +wf_impl_jsonrpc_is_response( json_t * message) { json_t * id = json_object_get(message, "id"); @@ -16,7 +16,7 @@ wf_jsonrpc_is_response( void -wf_jsonrpc_response_init( +wf_impl_jsonrpc_response_init( struct wf_jsonrpc_response * result, json_t * response) { @@ -27,7 +27,7 @@ wf_jsonrpc_response_init( json_t * id_holder = json_object_get(response, "id"); if (!json_is_integer(id_holder)) { - result->error = wf_jsonrpc_error(WF_BAD_FORMAT, "invalid format: missing id"); + result->error = wf_impl_jsonrpc_error(WF_BAD_FORMAT, "invalid format: missing id"); return; } @@ -47,13 +47,13 @@ wf_jsonrpc_response_init( } else { - result->error = wf_jsonrpc_error(WF_BAD_FORMAT, "invalid format: invalid error object"); + result->error = wf_impl_jsonrpc_error(WF_BAD_FORMAT, "invalid format: invalid error object"); } } } void -wf_jsonrpc_response_cleanup( +wf_impl_jsonrpc_response_cleanup( struct wf_jsonrpc_response * response) { if (NULL != response->result) diff --git a/lib/webfuse/core/jsonrpc/response.h b/lib/webfuse/impl/jsonrpc/response.h similarity index 60% rename from lib/webfuse/core/jsonrpc/response.h rename to lib/webfuse/impl/jsonrpc/response.h index 0bf0561..2c50000 100644 --- a/lib/webfuse/core/jsonrpc/response.h +++ b/lib/webfuse/impl/jsonrpc/response.h @@ -1,5 +1,5 @@ -#ifndef WF_JSONRPC_RESPONSE_H -#define WF_JSONRPC_RESPONSE_H +#ifndef WF_IMPL_JSONRPC_RESPONSE_H +#define WF_IMPL_JSONRPC_RESPONSE_H #ifndef __cplusplus #include @@ -12,7 +12,7 @@ extern "C" { #endif -extern bool wf_jsonrpc_is_response( +extern bool wf_impl_jsonrpc_is_response( json_t * message); #ifdef __cplusplus diff --git a/lib/webfuse/core/jsonrpc/response_intern.h b/lib/webfuse/impl/jsonrpc/response_intern.h similarity index 62% rename from lib/webfuse/core/jsonrpc/response_intern.h rename to lib/webfuse/impl/jsonrpc/response_intern.h index 137a615..9c48e2b 100644 --- a/lib/webfuse/core/jsonrpc/response_intern.h +++ b/lib/webfuse/impl/jsonrpc/response_intern.h @@ -1,7 +1,7 @@ -#ifndef WF_JSONRPC_RESPONSE_INTERN_H -#define WF_JSONRPC_RESPONSE_INTERN_H +#ifndef WF_IMPL_JSONRPC_RESPONSE_INTERN_H +#define WF_IMPL_JSONRPC_RESPONSE_INTERN_H -#include "webfuse/core/jsonrpc/response.h" +#include "webfuse/impl/jsonrpc/response.h" #ifndef __cplusplus #include @@ -21,11 +21,11 @@ struct wf_jsonrpc_response int id; }; -extern void wf_jsonrpc_response_init( +extern void wf_impl_jsonrpc_response_init( struct wf_jsonrpc_response * response, json_t * message); -extern void wf_jsonrpc_response_cleanup( +extern void wf_impl_jsonrpc_response_cleanup( struct wf_jsonrpc_response * response); #ifdef __cplusplus diff --git a/lib/webfuse/core/jsonrpc/send_fn.h b/lib/webfuse/impl/jsonrpc/send_fn.h similarity index 76% rename from lib/webfuse/core/jsonrpc/send_fn.h rename to lib/webfuse/impl/jsonrpc/send_fn.h index 2892687..3c448fd 100644 --- a/lib/webfuse/core/jsonrpc/send_fn.h +++ b/lib/webfuse/impl/jsonrpc/send_fn.h @@ -1,5 +1,5 @@ -#ifndef WF_JSONRPC_SEND_FN_H -#define WF_JSONRPC_SEND_FN_H +#ifndef WF_IMPL_JSONRPC_SEND_FN_H +#define WF_IMPL_JSONRPC_SEND_FN_H #ifndef __cplusplus #include diff --git a/lib/webfuse/core/jsonrpc/server.c b/lib/webfuse/impl/jsonrpc/server.c similarity index 63% rename from lib/webfuse/core/jsonrpc/server.c rename to lib/webfuse/impl/jsonrpc/server.c index 03e30ae..e366ddf 100644 --- a/lib/webfuse/core/jsonrpc/server.c +++ b/lib/webfuse/impl/jsonrpc/server.c @@ -1,8 +1,8 @@ -#include "webfuse/core/jsonrpc/server.h" -#include "webfuse/core/jsonrpc/method.h" -#include "webfuse/core/jsonrpc/request.h" -#include "webfuse/core/status.h" -#include "webfuse/core/util.h" +#include "webfuse/impl/jsonrpc/server.h" +#include "webfuse/impl/jsonrpc/method.h" +#include "webfuse/impl/jsonrpc/request.h" +#include "webfuse/status.h" +#include "webfuse/impl/util/util.h" #include #include @@ -13,79 +13,79 @@ struct wf_jsonrpc_server }; static void -wf_jsonrpc_server_init( +wf_impl_jsonrpc_server_init( struct wf_jsonrpc_server * server); static void -wf_jsonrpc_server_cleanup( +wf_impl_jsonrpc_server_cleanup( struct wf_jsonrpc_server * server); struct wf_jsonrpc_server * -wf_jsonrpc_server_create(void) +wf_impl_jsonrpc_server_create(void) { struct wf_jsonrpc_server * server = malloc(sizeof(struct wf_jsonrpc_server)); - wf_jsonrpc_server_init(server); + wf_impl_jsonrpc_server_init(server); return server; } void -wf_jsonrpc_server_dispose( +wf_impl_jsonrpc_server_dispose( struct wf_jsonrpc_server * server) { - wf_jsonrpc_server_cleanup(server); + wf_impl_jsonrpc_server_cleanup(server); free(server); } -static void wf_jsonrpc_server_init( +static void wf_impl_jsonrpc_server_init( struct wf_jsonrpc_server * server) { server->methods = NULL; } -static void wf_jsonrpc_server_cleanup( +static void wf_impl_jsonrpc_server_cleanup( struct wf_jsonrpc_server * server) { struct wf_jsonrpc_method * current = server->methods; while (NULL != current) { struct wf_jsonrpc_method * next = current->next; - wf_jsonrpc_method_dispose(current); + wf_impl_jsonrpc_method_dispose(current); current = next; } server->methods = NULL; } -void wf_jsonrpc_server_add( +void wf_impl_jsonrpc_server_add( struct wf_jsonrpc_server * server, char const * method_name, wf_jsonrpc_method_invoke_fn * invoke, void * user_data) { - struct wf_jsonrpc_method * method = wf_jsonrpc_method_create(method_name, invoke, user_data); + struct wf_jsonrpc_method * method = wf_impl_jsonrpc_method_create(method_name, invoke, user_data); method->next = server->methods; server->methods = method; } -static void wf_jsonrpc_server_invalid_method_invoke( +static void wf_impl_jsonrpc_server_invalid_method_invoke( struct wf_jsonrpc_request * request, char const * WF_UNUSED_PARAM(method_name), json_t * WF_UNUSED_PARAM(params), void * WF_UNUSED_PARAM(user_data)) { - wf_jsonrpc_respond_error(request, WF_BAD_NOTIMPLEMENTED, "not implemented"); + wf_impl_jsonrpc_respond_error(request, WF_BAD_NOTIMPLEMENTED, "not implemented"); } -static struct wf_jsonrpc_method const wf_jsonrpc_server_invalid_method = +static struct wf_jsonrpc_method const wf_impl_jsonrpc_server_invalid_method = { .next = NULL, .name = "", - .invoke = &wf_jsonrpc_server_invalid_method_invoke, + .invoke = &wf_impl_jsonrpc_server_invalid_method_invoke, .user_data = NULL }; static struct wf_jsonrpc_method const * -wf_jsonrpc_server_get_method( +wf_impl_jsonrpc_server_get_method( struct wf_jsonrpc_server * server, char const * method_name) { @@ -100,10 +100,10 @@ wf_jsonrpc_server_get_method( current = current->next; } - return &wf_jsonrpc_server_invalid_method; + return &wf_impl_jsonrpc_server_invalid_method; } -void wf_jsonrpc_server_process( +void wf_impl_jsonrpc_server_process( struct wf_jsonrpc_server * server, json_t * request_data, wf_jsonrpc_send_fn * send, @@ -119,8 +119,8 @@ void wf_jsonrpc_server_process( { char const * method_name = json_string_value(method_holder); int id = json_integer_value(id_holder); - struct wf_jsonrpc_request * request = wf_jsonrpc_request_create(id, send, user_data); - struct wf_jsonrpc_method const * method = wf_jsonrpc_server_get_method(server, method_name); + struct wf_jsonrpc_request * request = wf_impl_jsonrpc_request_create(id, send, user_data); + struct wf_jsonrpc_method const * method = wf_impl_jsonrpc_server_get_method(server, method_name); method->invoke(request, method_name, params, method->user_data); } diff --git a/lib/webfuse/core/jsonrpc/server.h b/lib/webfuse/impl/jsonrpc/server.h similarity index 64% rename from lib/webfuse/core/jsonrpc/server.h rename to lib/webfuse/impl/jsonrpc/server.h index 143f121..6f60914 100644 --- a/lib/webfuse/core/jsonrpc/server.h +++ b/lib/webfuse/impl/jsonrpc/server.h @@ -1,5 +1,5 @@ -#ifndef WF_JSONRPC_SERVER_H -#define WF_JSONRPC_SERVER_H +#ifndef WF_IMPL_JSONRPC_SERVER_H +#define WF_IMPL_JSONRPC_SERVER_H #ifndef __cplusplus #include @@ -9,8 +9,8 @@ #endif #include -#include "webfuse/core/jsonrpc/method_invoke_fn.h" -#include "webfuse/core/jsonrpc/send_fn.h" +#include "webfuse/impl/jsonrpc/method_invoke_fn.h" +#include "webfuse/impl/jsonrpc/send_fn.h" #ifdef __cplusplus extern "C" @@ -20,19 +20,19 @@ extern "C" struct wf_jsonrpc_server; extern struct wf_jsonrpc_server * -wf_jsonrpc_server_create(void); +wf_impl_jsonrpc_server_create(void); extern void -wf_jsonrpc_server_dispose( +wf_impl_jsonrpc_server_dispose( struct wf_jsonrpc_server * server); -extern void wf_jsonrpc_server_add( +extern void wf_impl_jsonrpc_server_add( struct wf_jsonrpc_server * server, char const * method_name, wf_jsonrpc_method_invoke_fn * invoke, void * user_data); -extern void wf_jsonrpc_server_process( +extern void wf_impl_jsonrpc_server_process( struct wf_jsonrpc_server * server, json_t * request, wf_jsonrpc_send_fn * send, diff --git a/lib/webfuse/core/message.c b/lib/webfuse/impl/message.c similarity index 80% rename from lib/webfuse/core/message.c rename to lib/webfuse/impl/message.c index bfb0016..8df799d 100644 --- a/lib/webfuse/core/message.c +++ b/lib/webfuse/impl/message.c @@ -1,9 +1,9 @@ -#include "webfuse/core/message.h" +#include "webfuse/impl/message.h" #include #include -extern struct wf_message * wf_message_create(json_t const * value) +extern struct wf_message * wf_impl_message_create(json_t const * value) { struct wf_message * message = NULL; size_t const length = json_dumpb(value, NULL, 0, JSON_COMPACT); @@ -21,7 +21,7 @@ extern struct wf_message * wf_message_create(json_t const * value) return message; } -void wf_message_dispose( +void wf_impl_message_dispose( struct wf_message * message) { free(message); diff --git a/lib/webfuse/core/message.h b/lib/webfuse/impl/message.h similarity index 66% rename from lib/webfuse/core/message.h rename to lib/webfuse/impl/message.h index 7bd346b..8e75437 100644 --- a/lib/webfuse/core/message.h +++ b/lib/webfuse/impl/message.h @@ -1,5 +1,5 @@ -#ifndef WF_MESSAGE_H -#define WF_MESSAGE_H +#ifndef WF_IMPL_MESSAGE_H +#define WF_IMPL_MESSAGE_H #ifndef __cplusplus #include @@ -9,7 +9,7 @@ using std::size_t; #endif #include -#include "webfuse/core/slist.h" +#include "webfuse/impl/util/slist.h" struct wf_message { @@ -23,10 +23,10 @@ extern "C" { #endif -extern struct wf_message * wf_message_create( +extern struct wf_message * wf_impl_message_create( json_t const * value); -extern void wf_message_dispose( +extern void wf_impl_message_dispose( struct wf_message * message); #ifdef __cplusplus diff --git a/lib/webfuse/impl/message_queue.c b/lib/webfuse/impl/message_queue.c new file mode 100644 index 0000000..43980a0 --- /dev/null +++ b/lib/webfuse/impl/message_queue.c @@ -0,0 +1,17 @@ +#include "webfuse/impl/message_queue.h" +#include "webfuse/impl/message.h" +#include "webfuse/impl/util/container_of.h" + +void wf_impl_message_queue_cleanup( + struct wf_slist * queue) +{ + struct wf_slist_item * item = wf_impl_slist_first(queue); + while (NULL != item) + { + struct wf_slist_item * next = item->next; + struct wf_message * message = wf_container_of(item, struct wf_message, item); + wf_impl_message_dispose(message); + item = next; + } + wf_impl_slist_init(queue); +} diff --git a/lib/webfuse/core/message_queue.h b/lib/webfuse/impl/message_queue.h similarity index 54% rename from lib/webfuse/core/message_queue.h rename to lib/webfuse/impl/message_queue.h index 9d549d1..cc6a406 100644 --- a/lib/webfuse/core/message_queue.h +++ b/lib/webfuse/impl/message_queue.h @@ -1,5 +1,5 @@ -#ifndef WF_MESSAGE_QUEUE_H -#define WF_MESSAGE_QUEUE_H +#ifndef WF_IMPL_MESSAGE_QUEUE_H +#define WF_IMPL_MESSAGE_QUEUE_H #ifdef __cplusplus extern "C" @@ -8,7 +8,7 @@ extern "C" struct wf_slist; -extern void wf_message_queue_cleanup( +extern void wf_impl_message_queue_cleanup( struct wf_slist * queue); diff --git a/lib/webfuse/adapter/impl/mountpoint.c b/lib/webfuse/impl/mountpoint.c similarity index 95% rename from lib/webfuse/adapter/impl/mountpoint.c rename to lib/webfuse/impl/mountpoint.c index a459510..d11a116 100644 --- a/lib/webfuse/adapter/impl/mountpoint.c +++ b/lib/webfuse/impl/mountpoint.c @@ -1,4 +1,4 @@ -#include "webfuse/adapter/impl/mountpoint.h" +#include "webfuse/impl/mountpoint.h" #include #include diff --git a/lib/webfuse/adapter/impl/mountpoint.h b/lib/webfuse/impl/mountpoint.h similarity index 93% rename from lib/webfuse/adapter/impl/mountpoint.h rename to lib/webfuse/impl/mountpoint.h index 77fc0ea..5461284 100644 --- a/lib/webfuse/adapter/impl/mountpoint.h +++ b/lib/webfuse/impl/mountpoint.h @@ -1,7 +1,7 @@ #ifndef WF_IMPL_MOUNTPOINT_H #define WF_IMPL_MOUNTPOINT_H -#include "webfuse/adapter/mountpoint.h" +#include "webfuse/mountpoint.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/adapter/impl/mountpoint_factory.c b/lib/webfuse/impl/mountpoint_factory.c similarity index 95% rename from lib/webfuse/adapter/impl/mountpoint_factory.c rename to lib/webfuse/impl/mountpoint_factory.c index 3062888..0197fe9 100644 --- a/lib/webfuse/adapter/impl/mountpoint_factory.c +++ b/lib/webfuse/impl/mountpoint_factory.c @@ -1,4 +1,4 @@ -#include "webfuse/adapter/impl/mountpoint_factory.h" +#include "webfuse/impl/mountpoint_factory.h" #include void diff --git a/lib/webfuse/adapter/impl/mountpoint_factory.h b/lib/webfuse/impl/mountpoint_factory.h similarity index 96% rename from lib/webfuse/adapter/impl/mountpoint_factory.h rename to lib/webfuse/impl/mountpoint_factory.h index 8675879..01fc184 100644 --- a/lib/webfuse/adapter/impl/mountpoint_factory.h +++ b/lib/webfuse/impl/mountpoint_factory.h @@ -1,7 +1,7 @@ #ifndef WF_ADAPTER_IMPL_MOUNTPOINT_FACTORY_H #define WF_ADAPTER_IMPL_MOUNTPOINT_FACTORY_H -#include "webfuse/adapter/mountpoint_factory.h" +#include "webfuse/mountpoint_factory.h" #include #ifdef __cplusplus diff --git a/lib/webfuse/adapter/impl/operation/close.c b/lib/webfuse/impl/operation/close.c similarity index 61% rename from lib/webfuse/adapter/impl/operation/close.c rename to lib/webfuse/impl/operation/close.c index 62d1ec3..159b775 100644 --- a/lib/webfuse/adapter/impl/operation/close.c +++ b/lib/webfuse/impl/operation/close.c @@ -1,12 +1,11 @@ -#include "webfuse/adapter/impl/operation/close.h" -#include "webfuse/adapter/impl/operation/context.h" +#include "webfuse/impl/operation/close.h" +#include "webfuse/impl/operation/context.h" #include #include #include -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/util.h" +#include "webfuse/impl/jsonrpc/proxy.h" void wf_impl_operation_close( fuse_req_t request, @@ -19,7 +18,7 @@ void wf_impl_operation_close( if (NULL != rpc) { int handle = (int) (file_info->fh & INT_MAX); - wf_jsonrpc_proxy_notify(rpc, "close", "siii", user_data->name, inode, handle, file_info->flags); + wf_impl_jsonrpc_proxy_notify(rpc, "close", "siii", user_data->name, inode, handle, file_info->flags); } fuse_reply_err(request, 0); diff --git a/lib/webfuse/adapter/impl/operation/close.h b/lib/webfuse/impl/operation/close.h similarity index 85% rename from lib/webfuse/adapter/impl/operation/close.h rename to lib/webfuse/impl/operation/close.h index d254f67..72bba93 100644 --- a/lib/webfuse/adapter/impl/operation/close.h +++ b/lib/webfuse/impl/operation/close.h @@ -1,7 +1,7 @@ #ifndef WF_ADAPTER_IMPL_OPERATION_CLOSE_H #define WF_ADAPTER_IMPL_OPERATION_CLOSE_H -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/adapter/impl/operation/context.c b/lib/webfuse/impl/operation/context.c similarity index 52% rename from lib/webfuse/adapter/impl/operation/context.c rename to lib/webfuse/impl/operation/context.c index 3e9829d..2dae32e 100644 --- a/lib/webfuse/adapter/impl/operation/context.c +++ b/lib/webfuse/impl/operation/context.c @@ -1,6 +1,6 @@ -#include "webfuse/adapter/impl/operation/context.h" -#include "webfuse/adapter/impl/session_manager.h" -#include "webfuse/adapter/impl/session.h" +#include "webfuse/impl/operation/context.h" +#include "webfuse/impl/session_manager.h" +#include "webfuse/impl/session.h" #include struct wf_jsonrpc_proxy * wf_impl_operation_context_get_proxy( diff --git a/lib/webfuse/adapter/impl/operation/context.h b/lib/webfuse/impl/operation/context.h similarity index 89% rename from lib/webfuse/adapter/impl/operation/context.h rename to lib/webfuse/impl/operation/context.h index 1384f72..fd27db5 100644 --- a/lib/webfuse/adapter/impl/operation/context.h +++ b/lib/webfuse/impl/operation/context.h @@ -1,7 +1,7 @@ #ifndef WF_ADAPTER_IMPL_OPERATION_CONTEXT_H #define WF_ADAPTER_IMPL_OPERATION_CONTEXT_H -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" #ifdef __cplusplus extern "C" { diff --git a/lib/webfuse/adapter/impl/operation/getattr.c b/lib/webfuse/impl/operation/getattr.c similarity index 87% rename from lib/webfuse/adapter/impl/operation/getattr.c rename to lib/webfuse/impl/operation/getattr.c index 8318dc2..a943bc9 100644 --- a/lib/webfuse/adapter/impl/operation/getattr.c +++ b/lib/webfuse/impl/operation/getattr.c @@ -1,5 +1,5 @@ -#include "webfuse/adapter/impl/operation/getattr.h" -#include "webfuse/adapter/impl/operation/context.h" +#include "webfuse/impl/operation/getattr.h" +#include "webfuse/impl/operation/context.h" #include #include @@ -8,9 +8,9 @@ #include #include -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/json_util.h" -#include "webfuse/core/util.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/util/json_util.h" +#include "webfuse/impl/util/util.h" void wf_impl_operation_getattr_finished( void * user_data, @@ -85,7 +85,7 @@ void wf_impl_operation_getattr ( getattr_context->gid = context->gid; getattr_context->timeout = user_data->timeout; - wf_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "si", user_data->name, inode); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "si", user_data->name, inode); } else { diff --git a/lib/webfuse/adapter/impl/operation/getattr.h b/lib/webfuse/impl/operation/getattr.h similarity index 92% rename from lib/webfuse/adapter/impl/operation/getattr.h rename to lib/webfuse/impl/operation/getattr.h index 3908922..b3841a5 100644 --- a/lib/webfuse/adapter/impl/operation/getattr.h +++ b/lib/webfuse/impl/operation/getattr.h @@ -1,7 +1,7 @@ #ifndef WF_ADAPTER_IMPL_OPERATION_GETATTR_H #define WF_ADAPTER_IMPL_OPERATION_GETATTR_H -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" #include #include diff --git a/lib/webfuse/adapter/impl/operation/lookup.c b/lib/webfuse/impl/operation/lookup.c similarity index 87% rename from lib/webfuse/adapter/impl/operation/lookup.c rename to lib/webfuse/impl/operation/lookup.c index 4ebbe3c..99f8fbb 100644 --- a/lib/webfuse/adapter/impl/operation/lookup.c +++ b/lib/webfuse/impl/operation/lookup.c @@ -1,5 +1,5 @@ -#include "webfuse/adapter/impl/operation/lookup.h" -#include "webfuse/adapter/impl/operation/context.h" +#include "webfuse/impl/operation/lookup.h" +#include "webfuse/impl/operation/context.h" #include #include @@ -11,9 +11,9 @@ #include -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/json_util.h" -#include "webfuse/core/util.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/util/json_util.h" +#include "webfuse/impl/util/util.h" void wf_impl_operation_lookup_finished( void * user_data, @@ -95,7 +95,7 @@ void wf_impl_operation_lookup ( lookup_context->gid = context->gid; lookup_context->timeout = user_data->timeout; - wf_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "sis", user_data->name, (int) (parent & INT_MAX), name); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "sis", user_data->name, (int) (parent & INT_MAX), name); } else { diff --git a/lib/webfuse/adapter/impl/operation/lookup.h b/lib/webfuse/impl/operation/lookup.h similarity index 91% rename from lib/webfuse/adapter/impl/operation/lookup.h rename to lib/webfuse/impl/operation/lookup.h index c43e864..ba738b7 100644 --- a/lib/webfuse/adapter/impl/operation/lookup.h +++ b/lib/webfuse/impl/operation/lookup.h @@ -1,7 +1,7 @@ #ifndef WF_ADAPTER_IMPL_OPERATION_LOOKUP_H #define WF_ADAPTER_IMPL_OPERATION_LOOKUP_H -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" #include #include diff --git a/lib/webfuse/adapter/impl/operation/open.c b/lib/webfuse/impl/operation/open.c similarity index 74% rename from lib/webfuse/adapter/impl/operation/open.c rename to lib/webfuse/impl/operation/open.c index 1b25d99..d947678 100644 --- a/lib/webfuse/adapter/impl/operation/open.c +++ b/lib/webfuse/impl/operation/open.c @@ -1,10 +1,10 @@ -#include "webfuse/adapter/impl/operation/open.h" -#include "webfuse/adapter/impl/operation/context.h" +#include "webfuse/impl/operation/open.h" +#include "webfuse/impl/operation/context.h" -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/util.h" -#include "webfuse/core/status.h" -#include "webfuse/core/json_util.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/util/util.h" +#include "webfuse/status.h" +#include "webfuse/impl/util/json_util.h" #include #include @@ -53,7 +53,7 @@ void wf_impl_operation_open( if (NULL != rpc) { - wf_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "sii", user_data->name, inode, file_info->flags); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "sii", user_data->name, inode, file_info->flags); } else { diff --git a/lib/webfuse/adapter/impl/operation/open.h b/lib/webfuse/impl/operation/open.h similarity index 89% rename from lib/webfuse/adapter/impl/operation/open.h rename to lib/webfuse/impl/operation/open.h index eb40490..1ef6104 100644 --- a/lib/webfuse/adapter/impl/operation/open.h +++ b/lib/webfuse/impl/operation/open.h @@ -1,7 +1,7 @@ #ifndef WF_ADAPTER_IMPL_OPERATION_OPEN_H #define WF_ADAPTER_IMPL_OPERATION_OPEN_H -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" #include #ifdef __cplusplus diff --git a/lib/webfuse/adapter/impl/operation/read.c b/lib/webfuse/impl/operation/read.c similarity index 83% rename from lib/webfuse/adapter/impl/operation/read.c rename to lib/webfuse/impl/operation/read.c index 7e2e0f4..c4c3669 100644 --- a/lib/webfuse/adapter/impl/operation/read.c +++ b/lib/webfuse/impl/operation/read.c @@ -1,14 +1,14 @@ -#include "webfuse/adapter/impl/operation/read.h" -#include "webfuse/adapter/impl/operation/context.h" +#include "webfuse/impl/operation/read.h" +#include "webfuse/impl/operation/context.h" #include #include #include #include -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/base64.h" -#include "webfuse/core/json_util.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/util/base64.h" +#include "webfuse/impl/util/json_util.h" #define WF_MAX_READ_LENGTH 4096 @@ -37,7 +37,7 @@ char * wf_impl_fill_buffer( } else if (0 == strcmp("base64", format)) { - size_t result = wf_base64_decode(data, data_size, (uint8_t *) buffer, count); + size_t result = wf_impl_base64_decode(data, data_size, (uint8_t *) buffer, count); if (result != count) { *status = WF_BAD; @@ -118,7 +118,7 @@ void wf_impl_operation_read( { int const length = (size <= WF_MAX_READ_LENGTH) ? (int) size : WF_MAX_READ_LENGTH; int handle = (file_info->fh & INT_MAX); - wf_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "siiii", user_data->name, (int) inode, handle, (int) offset, length); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "siiii", user_data->name, (int) inode, handle, (int) offset, length); } else { diff --git a/lib/webfuse/adapter/impl/operation/read.h b/lib/webfuse/impl/operation/read.h similarity index 87% rename from lib/webfuse/adapter/impl/operation/read.h rename to lib/webfuse/impl/operation/read.h index 89228b0..e675492 100644 --- a/lib/webfuse/adapter/impl/operation/read.h +++ b/lib/webfuse/impl/operation/read.h @@ -1,8 +1,8 @@ #ifndef WF_ADAPTER_IMPL_OPERATION_READ_H #define WF_ADAPTER_IMPL_OPERATION_READ_H -#include "webfuse/adapter/impl/fuse_wrapper.h" -#include "webfuse/core/status.h" +#include "webfuse/impl/fuse_wrapper.h" +#include "webfuse/status.h" #include diff --git a/lib/webfuse/adapter/impl/operation/readdir.c b/lib/webfuse/impl/operation/readdir.c similarity index 91% rename from lib/webfuse/adapter/impl/operation/readdir.c rename to lib/webfuse/impl/operation/readdir.c index 6d54636..78f99ab 100644 --- a/lib/webfuse/adapter/impl/operation/readdir.c +++ b/lib/webfuse/impl/operation/readdir.c @@ -1,5 +1,5 @@ -#include "webfuse/adapter/impl/operation/readdir.h" -#include "webfuse/adapter/impl/operation/context.h" +#include "webfuse/impl/operation/readdir.h" +#include "webfuse/impl/operation/context.h" #include #include @@ -9,9 +9,9 @@ #include #include -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/util.h" -#include "webfuse/core/json_util.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/util/util.h" +#include "webfuse/impl/util/json_util.h" #define WF_DIRBUFFER_INITIAL_SIZE 1024 @@ -151,7 +151,7 @@ void wf_impl_operation_readdir ( readdir_context->size = size; readdir_context->offset = offset; - wf_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_readdir_finished, readdir_context, "readdir", "si", user_data->name, inode); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_readdir_finished, readdir_context, "readdir", "si", user_data->name, inode); } else { diff --git a/lib/webfuse/adapter/impl/operation/readdir.h b/lib/webfuse/impl/operation/readdir.h similarity index 92% rename from lib/webfuse/adapter/impl/operation/readdir.h rename to lib/webfuse/impl/operation/readdir.h index 40eb09e..b5bc097 100644 --- a/lib/webfuse/adapter/impl/operation/readdir.h +++ b/lib/webfuse/impl/operation/readdir.h @@ -1,7 +1,7 @@ #ifndef WF_ADAPTER_IMPL_OPERATION_READDIR_H #define WF_ADAPTER_IMPL_OPERATION_READDIR_H -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" #include #ifdef __cplusplus diff --git a/lib/webfuse/adapter/impl/server.c b/lib/webfuse/impl/server.c similarity index 94% rename from lib/webfuse/adapter/impl/server.c rename to lib/webfuse/impl/server.c index 441b736..3f3fe8c 100644 --- a/lib/webfuse/adapter/impl/server.c +++ b/lib/webfuse/impl/server.c @@ -1,4 +1,4 @@ -#include "webfuse/adapter/server.h" +#include "webfuse/server.h" #include #include @@ -8,9 +8,9 @@ #include #include -#include "webfuse/adapter/impl/server_config.h" -#include "webfuse/adapter/impl/server_protocol.h" -#include "webfuse/core/lws_log.h" +#include "webfuse/impl/server_config.h" +#include "webfuse/impl/server_protocol.h" +#include "webfuse/impl/util/lws_log.h" #define WF_SERVER_PROTOCOL_COUNT 3 @@ -34,7 +34,7 @@ static bool wf_impl_server_tls_enabled( static struct lws_context * wf_impl_server_context_create( struct wf_server * server) { - wf_lwslog_disable(); + wf_impl_lwslog_disable(); memset(server->ws_protocols, 0, sizeof(struct lws_protocols) * WF_SERVER_PROTOCOL_COUNT); server->ws_protocols[0].name = "http"; diff --git a/lib/webfuse/adapter/impl/server.h b/lib/webfuse/impl/server.h similarity index 100% rename from lib/webfuse/adapter/impl/server.h rename to lib/webfuse/impl/server.h diff --git a/lib/webfuse/adapter/impl/server_config.c b/lib/webfuse/impl/server_config.c similarity index 98% rename from lib/webfuse/adapter/impl/server_config.c rename to lib/webfuse/impl/server_config.c index 4233094..82e24cd 100644 --- a/lib/webfuse/adapter/impl/server_config.c +++ b/lib/webfuse/impl/server_config.c @@ -1,4 +1,4 @@ -#include "webfuse/adapter/impl/server_config.h" +#include "webfuse/impl/server_config.h" #include #include diff --git a/lib/webfuse/adapter/impl/server_config.h b/lib/webfuse/impl/server_config.h similarity index 94% rename from lib/webfuse/adapter/impl/server_config.h rename to lib/webfuse/impl/server_config.h index 400b842..1766c73 100644 --- a/lib/webfuse/adapter/impl/server_config.h +++ b/lib/webfuse/impl/server_config.h @@ -1,8 +1,8 @@ #ifndef WF_ADAPTER_IMPL_SERVER_CONFIG_H #define WF_ADAPTER_IMPL_SERVER_CONFIG_H -#include "webfuse/adapter/impl/authenticators.h" -#include "webfuse/adapter/impl/mountpoint_factory.h" +#include "webfuse/impl/authenticators.h" +#include "webfuse/impl/mountpoint_factory.h" #ifdef __cplusplus extern "C" { diff --git a/lib/webfuse/adapter/impl/server_protocol.c b/lib/webfuse/impl/server_protocol.c similarity index 81% rename from lib/webfuse/adapter/impl/server_protocol.c rename to lib/webfuse/impl/server_protocol.c index 1996c67..3aa8cde 100644 --- a/lib/webfuse/adapter/impl/server_protocol.c +++ b/lib/webfuse/impl/server_protocol.c @@ -1,19 +1,19 @@ -#include "webfuse/adapter/impl/server_protocol.h" +#include "webfuse/impl/server_protocol.h" #include #include #include -#include "webfuse/core/message.h" -#include "webfuse/core/util.h" -#include "webfuse/core/protocol_names.h" +#include "webfuse/impl/message.h" +#include "webfuse/impl/util/util.h" +#include "webfuse/protocol_names.h" -#include "webfuse/adapter/impl/credentials.h" -#include "webfuse/core/status_intern.h" +#include "webfuse/impl/credentials.h" +#include "webfuse/impl/status.h" -#include "webfuse/core/jsonrpc/request.h" -#include "webfuse/core/timer/manager.h" -#include "webfuse/core/timer/timer.h" +#include "webfuse/impl/jsonrpc/request.h" +#include "webfuse/impl/timer/manager.h" +#include "webfuse/impl/timer/timer.h" static int wf_impl_server_protocol_callback( struct lws * wsi, @@ -27,7 +27,7 @@ static int wf_impl_server_protocol_callback( if (ws_protocol->callback != &wf_impl_server_protocol_callback) { return 0; } struct wf_server_protocol * protocol = ws_protocol->user; - wf_timer_manager_check(protocol->timer_manager); + wf_impl_timer_manager_check(protocol->timer_manager); struct wf_impl_session * session = wf_impl_session_manager_get(&protocol->session_manager, wsi); switch (reason) @@ -127,7 +127,7 @@ static void wf_impl_server_protocol_authenticate( struct wf_credentials creds; wf_impl_credentials_init(&creds, type, creds_holder); - struct wf_impl_session * session = wf_jsonrpc_request_get_userdata(request); + struct wf_impl_session * session = wf_impl_jsonrpc_request_get_userdata(request); result = wf_impl_session_authenticate(session, &creds); wf_impl_credentials_cleanup(&creds); @@ -137,11 +137,11 @@ static void wf_impl_server_protocol_authenticate( if (result) { json_t * result = json_object(); - wf_jsonrpc_respond(request, result); + wf_impl_jsonrpc_respond(request, result); } else { - wf_jsonrpc_respond_error(request, WF_BAD_ACCESS_DENIED, wf_status_tostring(WF_BAD_ACCESS_DENIED)); + wf_impl_jsonrpc_respond_error(request, WF_BAD_ACCESS_DENIED, wf_impl_status_tostring(WF_BAD_ACCESS_DENIED)); } } @@ -166,7 +166,7 @@ static void wf_impl_server_protocol_add_filesystem( json_t * params, void * WF_UNUSED_PARAM(user_data)) { - struct wf_impl_session * session = wf_jsonrpc_request_get_userdata(request); + struct wf_impl_session * session = wf_impl_jsonrpc_request_get_userdata(request); wf_status status = (session->is_authenticated) ? WF_GOOD : WF_BAD_ACCESS_DENIED; char const * name = NULL; @@ -200,11 +200,11 @@ static void wf_impl_server_protocol_add_filesystem( { json_t * result = json_object(); json_object_set_new(result, "id", json_string(name)); - wf_jsonrpc_respond(request, result); + wf_impl_jsonrpc_respond(request, result); } else { - wf_jsonrpc_respond_error(request, status, wf_status_tostring(status)); + wf_impl_jsonrpc_respond_error(request, status, wf_impl_status_tostring(status)); } @@ -218,13 +218,13 @@ void wf_impl_server_protocol_init( wf_impl_mountpoint_factory_clone(mountpoint_factory, &protocol->mountpoint_factory); - protocol->timer_manager = wf_timer_manager_create(); + protocol->timer_manager = wf_impl_timer_manager_create(); wf_impl_session_manager_init(&protocol->session_manager); wf_impl_authenticators_init(&protocol->authenticators); - protocol->server = wf_jsonrpc_server_create(); - wf_jsonrpc_server_add(protocol->server, "authenticate", &wf_impl_server_protocol_authenticate, protocol); - wf_jsonrpc_server_add(protocol->server, "add_filesystem", &wf_impl_server_protocol_add_filesystem, protocol); + protocol->server = wf_impl_jsonrpc_server_create(); + wf_impl_jsonrpc_server_add(protocol->server, "authenticate", &wf_impl_server_protocol_authenticate, protocol); + wf_impl_jsonrpc_server_add(protocol->server, "add_filesystem", &wf_impl_server_protocol_add_filesystem, protocol); } void wf_impl_server_protocol_cleanup( @@ -232,8 +232,8 @@ void wf_impl_server_protocol_cleanup( { protocol->is_operational = false; - wf_jsonrpc_server_dispose(protocol->server); - wf_timer_manager_dispose(protocol->timer_manager); + wf_impl_jsonrpc_server_dispose(protocol->server); + wf_impl_timer_manager_dispose(protocol->timer_manager); wf_impl_authenticators_cleanup(&protocol->authenticators); wf_impl_session_manager_cleanup(&protocol->session_manager); wf_impl_mountpoint_factory_cleanup(&protocol->mountpoint_factory); diff --git a/lib/webfuse/adapter/impl/server_protocol.h b/lib/webfuse/impl/server_protocol.h similarity index 85% rename from lib/webfuse/adapter/impl/server_protocol.h rename to lib/webfuse/impl/server_protocol.h index 269e3be..71c6e67 100644 --- a/lib/webfuse/adapter/impl/server_protocol.h +++ b/lib/webfuse/impl/server_protocol.h @@ -1,11 +1,11 @@ #ifndef WF_ADAPTER_IMPL_SERVER_PROTOCOL_H #define WF_ADAPTER_IMPL_SERVER_PROTOCOL_H -#include "webfuse/adapter/impl/authenticators.h" -#include "webfuse/adapter/impl/mountpoint_factory.h" -#include "webfuse/adapter/impl/session_manager.h" -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/jsonrpc/server.h" +#include "webfuse/impl/authenticators.h" +#include "webfuse/impl/mountpoint_factory.h" +#include "webfuse/impl/session_manager.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/jsonrpc/server.h" #ifndef __cplusplus #include diff --git a/lib/webfuse/adapter/impl/session.c b/lib/webfuse/impl/session.c similarity index 69% rename from lib/webfuse/adapter/impl/session.c rename to lib/webfuse/impl/session.c index aa950a7..48b2d78 100644 --- a/lib/webfuse/adapter/impl/session.c +++ b/lib/webfuse/impl/session.c @@ -1,16 +1,16 @@ -#include "webfuse/adapter/impl/session.h" -#include "webfuse/adapter/impl/authenticators.h" -#include "webfuse/core/message_queue.h" -#include "webfuse/core/message.h" -#include "webfuse/adapter/impl/mountpoint_factory.h" -#include "webfuse/adapter/impl/mountpoint.h" +#include "webfuse/impl/session.h" +#include "webfuse/impl/authenticators.h" +#include "webfuse/impl/message_queue.h" +#include "webfuse/impl/message.h" +#include "webfuse/impl/mountpoint_factory.h" +#include "webfuse/impl/mountpoint.h" -#include "webfuse/core/container_of.h" -#include "webfuse/core/util.h" +#include "webfuse/impl/util/container_of.h" +#include "webfuse/impl/util/util.h" -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/jsonrpc/request.h" -#include "webfuse/core/jsonrpc/response.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/jsonrpc/request.h" +#include "webfuse/impl/jsonrpc/response.h" #include #include @@ -23,20 +23,20 @@ static bool wf_impl_session_send( void * user_data) { struct wf_impl_session * session = user_data; - struct wf_message * message = wf_message_create(request); + struct wf_message * message = wf_impl_message_create(request); - bool result = (session->is_authenticated || wf_jsonrpc_is_response(request)) && (NULL != session->wsi); + bool result = (session->is_authenticated || wf_impl_jsonrpc_is_response(request)) && (NULL != session->wsi); if (result) { - wf_slist_append(&session->messages, &message->item); + wf_impl_slist_append(&session->messages, &message->item); lws_callback_on_writable(session->wsi); result = true; } else { - wf_message_dispose(message); + wf_impl_message_dispose(message); } return result; @@ -51,15 +51,15 @@ struct wf_impl_session * wf_impl_session_create( { struct wf_impl_session * session = malloc(sizeof(struct wf_impl_session)); - wf_slist_init(&session->filesystems); + wf_impl_slist_init(&session->filesystems); session->wsi = wsi; session->is_authenticated = false; session->authenticators = authenticators; session->server = server; session->mountpoint_factory = mountpoint_factory; - session->rpc = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &wf_impl_session_send, session); - wf_slist_init(&session->messages); + session->rpc = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &wf_impl_session_send, session); + wf_impl_slist_init(&session->messages); return session; } @@ -67,7 +67,7 @@ struct wf_impl_session * wf_impl_session_create( static void wf_impl_session_dispose_filesystems( struct wf_slist * filesystems) { - struct wf_slist_item * item = wf_slist_first(filesystems); + struct wf_slist_item * item = wf_impl_slist_first(filesystems); while (NULL != item) { struct wf_slist_item * next = item->next; @@ -81,8 +81,8 @@ static void wf_impl_session_dispose_filesystems( void wf_impl_session_dispose( struct wf_impl_session * session) { - wf_jsonrpc_proxy_dispose(session->rpc); - wf_message_queue_cleanup(&session->messages); + wf_impl_jsonrpc_proxy_dispose(session->rpc); + wf_impl_message_queue_cleanup(&session->messages); wf_impl_session_dispose_filesystems(&session->filesystems); free(session); @@ -112,7 +112,7 @@ bool wf_impl_session_add_filesystem( result = (NULL != filesystem); if (result) { - wf_slist_append(&session->filesystems, &filesystem->item); + wf_impl_slist_append(&session->filesystems, &filesystem->item); } } @@ -132,14 +132,14 @@ bool wf_impl_session_add_filesystem( void wf_impl_session_onwritable( struct wf_impl_session * session) { - if (!wf_slist_empty(&session->messages)) + if (!wf_impl_slist_empty(&session->messages)) { - struct wf_slist_item * item = wf_slist_remove_first(&session->messages); + struct wf_slist_item * item = wf_impl_slist_remove_first(&session->messages); struct wf_message * message = wf_container_of(item, struct wf_message, item); lws_write(session->wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT); - wf_message_dispose(message); + wf_impl_message_dispose(message); - if (!wf_slist_empty(&session->messages)) + if (!wf_impl_slist_empty(&session->messages)) { lws_callback_on_writable(session->wsi); } @@ -155,13 +155,13 @@ void wf_impl_session_receive( json_t * message = json_loadb(data, length, 0, NULL); if (NULL != message) { - if (wf_jsonrpc_is_response(message)) + if (wf_impl_jsonrpc_is_response(message)) { - wf_jsonrpc_proxy_onresult(session->rpc, message); + wf_impl_jsonrpc_proxy_onresult(session->rpc, message); } - else if (wf_jsonrpc_is_request(message)) + else if (wf_impl_jsonrpc_is_request(message)) { - wf_jsonrpc_server_process(session->server, message, &wf_impl_session_send, session); + wf_impl_jsonrpc_server_process(session->server, message, &wf_impl_session_send, session); } json_decref(message); @@ -175,7 +175,7 @@ static struct wf_impl_filesystem * wf_impl_session_get_filesystem( { struct wf_impl_filesystem * result = NULL; - struct wf_slist_item * item = wf_slist_first(&session->filesystems); + struct wf_slist_item * item = wf_impl_slist_first(&session->filesystems); while (NULL != item) { struct wf_slist_item * next = item->next; diff --git a/lib/webfuse/adapter/impl/session.h b/lib/webfuse/impl/session.h similarity index 89% rename from lib/webfuse/adapter/impl/session.h rename to lib/webfuse/impl/session.h index 1046a2e..7766b6c 100644 --- a/lib/webfuse/adapter/impl/session.h +++ b/lib/webfuse/impl/session.h @@ -9,12 +9,12 @@ using std::size_t; #endif -#include "webfuse/core/message_queue.h" -#include "webfuse/adapter/impl/filesystem.h" -#include "webfuse/core/slist.h" +#include "webfuse/impl/message_queue.h" +#include "webfuse/impl/filesystem.h" +#include "webfuse/impl/util/slist.h" -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/jsonrpc/server.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/impl/jsonrpc/server.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/adapter/impl/session_manager.c b/lib/webfuse/impl/session_manager.c similarity index 81% rename from lib/webfuse/adapter/impl/session_manager.c rename to lib/webfuse/impl/session_manager.c index a872d54..4ab01b4 100644 --- a/lib/webfuse/adapter/impl/session_manager.c +++ b/lib/webfuse/impl/session_manager.c @@ -1,18 +1,18 @@ -#include "webfuse/adapter/impl/session_manager.h" -#include "webfuse/core/util.h" -#include "webfuse/core/container_of.h" +#include "webfuse/impl/session_manager.h" +#include "webfuse/impl/util/util.h" +#include "webfuse/impl/util/container_of.h" #include void wf_impl_session_manager_init( struct wf_impl_session_manager * manager) { - wf_slist_init(&manager->sessions); + wf_impl_slist_init(&manager->sessions); } void wf_impl_session_manager_cleanup( struct wf_impl_session_manager * manager) { - struct wf_slist_item * item = wf_slist_first(&manager->sessions); + struct wf_slist_item * item = wf_impl_slist_first(&manager->sessions); while (NULL != item) { struct wf_slist_item * next = item->next; @@ -33,7 +33,7 @@ struct wf_impl_session * wf_impl_session_manager_add( { struct wf_impl_session * session = wf_impl_session_create( wsi, authenticators, timer_manager, server, mountpoint_factory); - wf_slist_append(&manager->sessions, &session->item); + wf_impl_slist_append(&manager->sessions, &session->item); return session; } @@ -44,7 +44,7 @@ struct wf_impl_session * wf_impl_session_manager_get( { struct wf_impl_session * session = NULL; - struct wf_slist_item * item = wf_slist_first(&manager->sessions); + struct wf_slist_item * item = wf_impl_slist_first(&manager->sessions); while (NULL != item) { struct wf_slist_item * next = item->next; @@ -72,7 +72,7 @@ void wf_impl_session_manager_remove( struct wf_impl_session * session = wf_container_of(item, struct wf_impl_session, item); if (wsi == session->wsi) { - wf_slist_remove_after(&manager->sessions, prev); + wf_impl_slist_remove_after(&manager->sessions, prev); wf_impl_session_dispose(session); break; } diff --git a/lib/webfuse/adapter/impl/session_manager.h b/lib/webfuse/impl/session_manager.h similarity index 90% rename from lib/webfuse/adapter/impl/session_manager.h rename to lib/webfuse/impl/session_manager.h index 691f133..4ee57df 100644 --- a/lib/webfuse/adapter/impl/session_manager.h +++ b/lib/webfuse/impl/session_manager.h @@ -5,9 +5,9 @@ #include #endif -#include "webfuse/adapter/impl/session.h" -#include "webfuse/adapter/impl/fuse_wrapper.h" -#include "webfuse/core/slist.h" +#include "webfuse/impl/session.h" +#include "webfuse/impl/fuse_wrapper.h" +#include "webfuse/impl/util/slist.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/core/status.c b/lib/webfuse/impl/status.c similarity index 85% rename from lib/webfuse/core/status.c rename to lib/webfuse/impl/status.c index d5bc7ba..e0dece4 100644 --- a/lib/webfuse/core/status.c +++ b/lib/webfuse/impl/status.c @@ -1,8 +1,8 @@ -#include "webfuse/core/status_intern.h" +#include "webfuse/impl/status.h" #include - int wf_status_to_rc(wf_status status) + int wf_impl_status_to_rc(wf_status status) { switch(status) { @@ -17,7 +17,7 @@ } } -char const * wf_status_tostring(wf_status status) +char const * wf_impl_status_tostring(wf_status status) { switch(status) { diff --git a/lib/webfuse/impl/status.h b/lib/webfuse/impl/status.h new file mode 100644 index 0000000..8989490 --- /dev/null +++ b/lib/webfuse/impl/status.h @@ -0,0 +1,19 @@ +#ifndef WF_IMPL_STATUS_H +#define WF_IMPL_STATUS_H + +#include "webfuse/status.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern int wf_impl_status_to_rc(wf_status status); + +extern char const * wf_impl_status_tostring(wf_status status); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/lib/webfuse/core/timer/manager.c b/lib/webfuse/impl/timer/manager.c similarity index 72% rename from lib/webfuse/core/timer/manager.c rename to lib/webfuse/impl/timer/manager.c index 99540e9..6b69ee1 100644 --- a/lib/webfuse/core/timer/manager.c +++ b/lib/webfuse/impl/timer/manager.c @@ -1,6 +1,6 @@ -#include "webfuse/core/timer/manager_intern.h" -#include "webfuse/core/timer/timer_intern.h" -#include "webfuse/core/timer/timepoint.h" +#include "webfuse/impl/timer/manager_intern.h" +#include "webfuse/impl/timer/timer_intern.h" +#include "webfuse/impl/timer/timepoint.h" #include #include @@ -11,7 +11,7 @@ struct wf_timer_manager }; struct wf_timer_manager * -wf_timer_manager_create(void) +wf_impl_timer_manager_create(void) { struct wf_timer_manager * manager = malloc(sizeof(struct wf_timer_manager)); manager->timers = NULL; @@ -20,7 +20,7 @@ wf_timer_manager_create(void) } void -wf_timer_manager_dispose( +wf_impl_timer_manager_dispose( struct wf_timer_manager * manager) { struct wf_timer * timer = manager->timers; @@ -28,7 +28,7 @@ wf_timer_manager_dispose( { struct wf_timer * next = timer->next; - wf_timer_trigger(timer); + wf_impl_timer_trigger(timer); timer = next; } @@ -36,7 +36,7 @@ wf_timer_manager_dispose( } -void wf_timer_manager_check( +void wf_impl_timer_manager_check( struct wf_timer_manager * manager) { struct wf_timer * timer = manager->timers; @@ -44,17 +44,17 @@ void wf_timer_manager_check( { struct wf_timer * next = timer->next; - if (wf_timer_is_timeout(timer)) + if (wf_impl_timer_is_timeout(timer)) { - wf_timer_manager_removetimer(manager, timer); - wf_timer_trigger(timer); + wf_impl_timer_manager_removetimer(manager, timer); + wf_impl_timer_trigger(timer); } timer = next; } } -void wf_timer_manager_addtimer( +void wf_impl_timer_manager_addtimer( struct wf_timer_manager * manager, struct wf_timer * timer) { @@ -68,7 +68,7 @@ void wf_timer_manager_addtimer( manager->timers = timer; } -void wf_timer_manager_removetimer( +void wf_impl_timer_manager_removetimer( struct wf_timer_manager * manager, struct wf_timer * timer) { diff --git a/lib/webfuse/core/timer/manager.h b/lib/webfuse/impl/timer/manager.h similarity index 60% rename from lib/webfuse/core/timer/manager.h rename to lib/webfuse/impl/timer/manager.h index 870a2d0..19719cb 100644 --- a/lib/webfuse/core/timer/manager.h +++ b/lib/webfuse/impl/timer/manager.h @@ -1,5 +1,5 @@ -#ifndef WF_TIMER_MANAGER_H -#define WF_TIMER_MANAGER_H +#ifndef WF_IMPL_TIMER_MANAGER_H +#define WF_IMPL_TIMER_MANAGER_H #ifdef __cplusplus extern "C" @@ -9,14 +9,14 @@ extern "C" struct wf_timer_manager; extern struct wf_timer_manager * -wf_timer_manager_create(void); +wf_impl_timer_manager_create(void); extern void -wf_timer_manager_dispose( +wf_impl_timer_manager_dispose( struct wf_timer_manager * manager); extern void -wf_timer_manager_check( +wf_impl_timer_manager_check( struct wf_timer_manager * manager); #ifdef __cplusplus diff --git a/lib/webfuse/core/timer/manager_intern.h b/lib/webfuse/impl/timer/manager_intern.h similarity index 53% rename from lib/webfuse/core/timer/manager_intern.h rename to lib/webfuse/impl/timer/manager_intern.h index 473df2b..20d522e 100644 --- a/lib/webfuse/core/timer/manager_intern.h +++ b/lib/webfuse/impl/timer/manager_intern.h @@ -1,7 +1,7 @@ -#ifndef WF_TIMER_MANAGER_INTERN_H -#define WF_TIMER_MANAGER_INTERN_H +#ifndef WF_IMPL_TIMER_MANAGER_INTERN_H +#define WF_IMPL_TIMER_MANAGER_INTERN_H -#include "webfuse/core/timer/manager.h" +#include "webfuse/impl/timer/manager.h" #ifdef __cplusplus extern "C" @@ -10,11 +10,11 @@ extern "C" struct wf_timer; -extern void wf_timer_manager_addtimer( +extern void wf_impl_timer_manager_addtimer( struct wf_timer_manager * manager, struct wf_timer * timer); -extern void wf_timer_manager_removetimer( +extern void wf_impl_timer_manager_removetimer( struct wf_timer_manager * manager, struct wf_timer * timer); diff --git a/lib/webfuse/core/timer/on_timer_fn.h b/lib/webfuse/impl/timer/on_timer_fn.h similarity index 71% rename from lib/webfuse/core/timer/on_timer_fn.h rename to lib/webfuse/impl/timer/on_timer_fn.h index d250bae..c5c209c 100644 --- a/lib/webfuse/core/timer/on_timer_fn.h +++ b/lib/webfuse/impl/timer/on_timer_fn.h @@ -1,5 +1,5 @@ -#ifndef WF_TIMER_ON_TIMER_FN_H -#define WF_TIMER_ON_TIMER_FN_H +#ifndef WF_IMPL_TIMER_ON_TIMER_FN_H +#define WF_IMPL_TIMER_ON_TIMER_FN_H #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/impl/timer/timepoint.c b/lib/webfuse/impl/timer/timepoint.c new file mode 100644 index 0000000..75fbf15 --- /dev/null +++ b/lib/webfuse/impl/timer/timepoint.c @@ -0,0 +1,31 @@ +#include "webfuse/impl/timer/timepoint.h" + +#include + +#define WF_IMPL_TIMER_MSEC_PER_SEC ((wf_timer_timepoint) 1000) +#define WF_IMPL_TIMER_NSEC_PER_MSEC ((wf_timer_timepoint) 1000 * 1000) + +wf_timer_timepoint wf_impl_timer_timepoint_now(void) +{ + struct timespec tp; + clock_gettime(CLOCK_MONOTONIC, &tp); + + wf_timer_timepoint const now = (tp.tv_sec * WF_IMPL_TIMER_MSEC_PER_SEC) + (tp.tv_nsec / WF_IMPL_TIMER_NSEC_PER_MSEC); + return now; +} + +wf_timer_timepoint wf_impl_timer_timepoint_in_msec(wf_timer_timediff value) +{ + wf_timer_timepoint const now = wf_impl_timer_timepoint_now(); + wf_timer_timepoint result = now + ((wf_timer_timepoint) value); + + return result; +} + +bool wf_impl_timer_timepoint_is_elapsed(wf_timer_timepoint tp) +{ + wf_timer_timepoint const now = wf_impl_timer_timepoint_now(); + wf_timer_timediff const diff = (wf_timer_timediff) (tp - now); + + return (0 > diff); +} diff --git a/lib/webfuse/core/timer/timepoint.h b/lib/webfuse/impl/timer/timepoint.h similarity index 57% rename from lib/webfuse/core/timer/timepoint.h rename to lib/webfuse/impl/timer/timepoint.h index cb78197..1aeb2d4 100644 --- a/lib/webfuse/core/timer/timepoint.h +++ b/lib/webfuse/impl/timer/timepoint.h @@ -1,5 +1,5 @@ -#ifndef WF_TIMER_TIMEPOINT_H -#define WF_TIMER_TIMEPOINT_H +#ifndef WF_IMPL_TIMER_TIMEPOINT_H +#define WF_IMPL_TIMER_TIMEPOINT_H #ifndef __cplusplus #include @@ -16,12 +16,12 @@ extern "C" typedef uint64_t wf_timer_timepoint; typedef int64_t wf_timer_timediff; -extern wf_timer_timepoint wf_timer_timepoint_now(void); +extern wf_timer_timepoint wf_impl_timer_timepoint_now(void); -extern wf_timer_timepoint wf_timer_timepoint_in_msec( +extern wf_timer_timepoint wf_impl_timer_timepoint_in_msec( wf_timer_timediff value); -extern bool wf_timer_timepoint_is_elapsed( +extern bool wf_impl_timer_timepoint_is_elapsed( wf_timer_timepoint timepoint); #ifdef __cplusplus diff --git a/lib/webfuse/core/timer/timer.c b/lib/webfuse/impl/timer/timer.c similarity index 60% rename from lib/webfuse/core/timer/timer.c rename to lib/webfuse/impl/timer/timer.c index 1f4d650..6583ed6 100644 --- a/lib/webfuse/core/timer/timer.c +++ b/lib/webfuse/impl/timer/timer.c @@ -1,13 +1,13 @@ -#include "webfuse/core/timer/timer_intern.h" -#include "webfuse/core/timer/manager_intern.h" -#include "webfuse/core/timer/timepoint.h" +#include "webfuse/impl/timer/timer_intern.h" +#include "webfuse/impl/timer/manager_intern.h" +#include "webfuse/impl/timer/timepoint.h" #include #include #include struct wf_timer * -wf_timer_create( +wf_impl_timer_create( struct wf_timer_manager * manager, wf_timer_on_timer_fn * on_timer, void * user_data) @@ -24,37 +24,37 @@ wf_timer_create( } void -wf_timer_dispose( +wf_impl_timer_dispose( struct wf_timer * timer) { free(timer); } -void wf_timer_start( +void wf_impl_timer_start( struct wf_timer * timer, int timeout_ms) { - timer->timeout = wf_timer_timepoint_in_msec(timeout_ms); + timer->timeout = wf_impl_timer_timepoint_in_msec(timeout_ms); - wf_timer_manager_addtimer(timer->manager, timer); + wf_impl_timer_manager_addtimer(timer->manager, timer); } -void wf_timer_cancel( +void wf_impl_timer_cancel( struct wf_timer * timer) { - wf_timer_manager_removetimer(timer->manager, timer); + wf_impl_timer_manager_removetimer(timer->manager, timer); timer->timeout = 0; } -bool wf_timer_is_timeout( +bool wf_impl_timer_is_timeout( struct wf_timer * timer) { - return wf_timer_timepoint_is_elapsed(timer->timeout); + return wf_impl_timer_timepoint_is_elapsed(timer->timeout); } -void wf_timer_trigger( +void wf_impl_timer_trigger( struct wf_timer * timer) { if (0 != timer->on_timer) diff --git a/lib/webfuse/core/timer/timer.h b/lib/webfuse/impl/timer/timer.h similarity index 67% rename from lib/webfuse/core/timer/timer.h rename to lib/webfuse/impl/timer/timer.h index 48149bd..dd68257 100644 --- a/lib/webfuse/core/timer/timer.h +++ b/lib/webfuse/impl/timer/timer.h @@ -1,7 +1,7 @@ -#ifndef WF_TIMER_TIMER_H -#define WF_TIMER_TIMER_H +#ifndef WF_IMPL_TIMER_TIMER_H +#define WF_IMPL_TIMER_TIMER_H -#include "webfuse/core/timer/on_timer_fn.h" +#include "webfuse/impl/timer/on_timer_fn.h" #ifdef __cplusplus extern "C" @@ -12,22 +12,22 @@ struct wf_timer; struct wf_timer_manager; extern struct wf_timer * -wf_timer_create( +wf_impl_timer_create( struct wf_timer_manager * manager, wf_timer_on_timer_fn * on_timer, void * user_data); extern void -wf_timer_dispose( +wf_impl_timer_dispose( struct wf_timer * timer); extern void -wf_timer_start( +wf_impl_timer_start( struct wf_timer * timer, int timeout_ms); extern void -wf_timer_cancel( +wf_impl_timer_cancel( struct wf_timer * timer); #ifdef __cplusplus diff --git a/lib/webfuse/core/timer/timer_intern.h b/lib/webfuse/impl/timer/timer_intern.h similarity index 60% rename from lib/webfuse/core/timer/timer_intern.h rename to lib/webfuse/impl/timer/timer_intern.h index c910a3b..2b79445 100644 --- a/lib/webfuse/core/timer/timer_intern.h +++ b/lib/webfuse/impl/timer/timer_intern.h @@ -1,9 +1,9 @@ -#ifndef WF_TIMER_TIMER_H -#define WF_TIMER_TIMER_H +#ifndef WF_IMPL_TIMER_TIMER_H +#define WF_IMPL_TIMER_TIMER_H -#include "webfuse/core/timer/timer.h" -#include "webfuse/core/timer/on_timer_fn.h" -#include "webfuse/core/timer/timepoint.h" +#include "webfuse/impl/timer/timer.h" +#include "webfuse/impl/timer/on_timer_fn.h" +#include "webfuse/impl/timer/timepoint.h" #ifndef __cplusplus #include @@ -24,10 +24,10 @@ struct wf_timer struct wf_timer * prev; }; -extern bool wf_timer_is_timeout( +extern bool wf_impl_timer_is_timeout( struct wf_timer * timer); -extern void wf_timer_trigger( +extern void wf_impl_timer_trigger( struct wf_timer * timer); diff --git a/lib/webfuse/core/base64.c b/lib/webfuse/impl/util/base64.c similarity index 90% rename from lib/webfuse/core/base64.c rename to lib/webfuse/impl/util/base64.c index 2b24688..a595fa5 100644 --- a/lib/webfuse/core/base64.c +++ b/lib/webfuse/impl/util/base64.c @@ -1,6 +1,6 @@ -#include "webfuse/core/base64.h" +#include "webfuse/impl/util/base64.h" -static const uint8_t wf_base64_decode_table[256] = { +static const uint8_t wf_impl_base64_decode_table[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 1 @@ -22,12 +22,12 @@ static const uint8_t wf_base64_decode_table[256] = { -size_t wf_base64_encoded_size(size_t length) +size_t wf_impl_base64_encoded_size(size_t length) { return ((length + 2) / 3) * 4; } -size_t wf_base64_encode( +size_t wf_impl_base64_encode( uint8_t const * data, size_t length, char * buffer, @@ -36,7 +36,7 @@ size_t wf_base64_encode( // 0 1 2 3 4 5 6 // 0123456789012345678901234567890123456789012345678901234567890123 static char const table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - size_t const length_needed = wf_base64_encoded_size(length); + size_t const length_needed = wf_impl_base64_encoded_size(length); if (buffer_size < length_needed) { return 0; @@ -78,7 +78,7 @@ size_t wf_base64_encode( return out_pos; } -size_t wf_base64_decoded_size(char const * data, size_t length) +size_t wf_impl_base64_decoded_size(char const * data, size_t length) { size_t result = 0; if ((length > 0) && ((length % 4) == 0)) @@ -98,14 +98,14 @@ size_t wf_base64_decoded_size(char const * data, size_t length) return result; } -size_t wf_base64_decode( +size_t wf_impl_base64_decode( char const * data, size_t length, uint8_t * buffer, size_t buffer_size) { - uint8_t const * table = wf_base64_decode_table; - size_t needed_size = wf_base64_decoded_size(data, length); + uint8_t const * table = wf_impl_base64_decode_table; + size_t needed_size = wf_impl_base64_decoded_size(data, length); if ((0 == needed_size) || (buffer_size < needed_size)) { return 0; @@ -146,9 +146,9 @@ size_t wf_base64_decode( return out_pos; } -extern bool wf_base64_isvalid(char const * data, size_t length) +extern bool wf_impl_base64_isvalid(char const * data, size_t length) { - uint8_t const * table = wf_base64_decode_table; + uint8_t const * table = wf_impl_base64_decode_table; if ((length == 0) || ((length % 4) != 0)) { diff --git a/lib/webfuse/core/base64.h b/lib/webfuse/impl/util/base64.h similarity index 53% rename from lib/webfuse/core/base64.h rename to lib/webfuse/impl/util/base64.h index 6803afb..442cf33 100644 --- a/lib/webfuse/core/base64.h +++ b/lib/webfuse/impl/util/base64.h @@ -1,5 +1,5 @@ -#ifndef WF_BASE64_H -#define WF_BASE64_H +#ifndef WF_IMPL_UTIL_BASE64_H +#define WF_IMPL_UTIL_BASE64_H #ifndef __cplusplus #include @@ -15,23 +15,23 @@ extern "C" { #endif -extern size_t wf_base64_encoded_size(size_t length); +extern size_t wf_impl_base64_encoded_size(size_t length); -extern size_t wf_base64_encode( +extern size_t wf_impl_base64_encode( uint8_t const * data, size_t length, char * buffer, size_t buffer_size); -extern size_t wf_base64_decoded_size(char const * data, size_t length); +extern size_t wf_impl_base64_decoded_size(char const * data, size_t length); -extern size_t wf_base64_decode( +extern size_t wf_impl_base64_decode( char const * data, size_t length, uint8_t * buffer, size_t buffer_size); -extern bool wf_base64_isvalid(char const * data, size_t length); +extern bool wf_impl_base64_isvalid(char const * data, size_t length); #ifdef __cplusplus } diff --git a/lib/webfuse/core/container_of.h b/lib/webfuse/impl/util/container_of.h similarity index 85% rename from lib/webfuse/core/container_of.h rename to lib/webfuse/impl/util/container_of.h index d22bc34..010f228 100644 --- a/lib/webfuse/core/container_of.h +++ b/lib/webfuse/impl/util/container_of.h @@ -1,5 +1,5 @@ -#ifndef WF_CONTAINER_OF_H -#define WF_CONTAINER_OF_H +#ifndef WF_IMPL_UTIL_CONTAINER_OF_H +#define WF_IMPL_UTIL_CONTAINER_OF_H #ifndef __cplusplus #include diff --git a/lib/webfuse/core/json_util.c b/lib/webfuse/impl/util/json_util.c similarity index 83% rename from lib/webfuse/core/json_util.c rename to lib/webfuse/impl/util/json_util.c index 535e07e..b2fdc77 100644 --- a/lib/webfuse/core/json_util.c +++ b/lib/webfuse/impl/util/json_util.c @@ -1,11 +1,11 @@ -#include "webfuse/core/json_util.h" +#include "webfuse/impl/util/json_util.h" int wf_impl_json_get_int(json_t const * object, char const * key, int default_value) { int result = default_value; json_t * holder = json_object_get(object, key); - if ((NULL != holder) && (json_is_integer(holder))) + if (json_is_integer(holder)) { result = json_integer_value(holder); } diff --git a/lib/webfuse/core/json_util.h b/lib/webfuse/impl/util/json_util.h similarity index 74% rename from lib/webfuse/core/json_util.h rename to lib/webfuse/impl/util/json_util.h index db21ed1..64b4eed 100644 --- a/lib/webfuse/core/json_util.h +++ b/lib/webfuse/impl/util/json_util.h @@ -1,8 +1,8 @@ -#ifndef WF_JSON_UTIL_H -#define WF_JSON_UTIL_H +#ifndef WF_IMPL_UTIL_JSON_UTIL_H +#define WF_IMPL_UTIL_JSON_UTIL_H #include -#include "webfuse/core/status.h" +#include "webfuse/status.h" #ifdef __cplusplus extern "C" diff --git a/lib/webfuse/impl/util/lws_log.c b/lib/webfuse/impl/util/lws_log.c new file mode 100644 index 0000000..6db34ad --- /dev/null +++ b/lib/webfuse/impl/util/lws_log.c @@ -0,0 +1,18 @@ +#include "webfuse/impl/util/lws_log.h" +#include +#include + +#define WF_LWSLOG_DISABLE 0 + +static bool wf_impl_lwslog_is_diabled = false; + +void wf_impl_lwslog_disable(void) +{ + if (!wf_impl_lwslog_is_diabled) + { + lws_set_log_level(WF_LWSLOG_DISABLE, NULL); + wf_impl_lwslog_is_diabled = true; + } +} + + diff --git a/lib/webfuse/impl/util/lws_log.h b/lib/webfuse/impl/util/lws_log.h new file mode 100644 index 0000000..d321616 --- /dev/null +++ b/lib/webfuse/impl/util/lws_log.h @@ -0,0 +1,15 @@ +#ifndef WF_IMPL_UTIL_LWS_LOG_H +#define WF_IMPL_UTIL_LWS_LOG_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern void wf_impl_lwslog_disable(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/webfuse/core/slist.c b/lib/webfuse/impl/util/slist.c similarity index 69% rename from lib/webfuse/core/slist.c rename to lib/webfuse/impl/util/slist.c index c6896d7..dba2194 100644 --- a/lib/webfuse/core/slist.c +++ b/lib/webfuse/impl/util/slist.c @@ -1,26 +1,26 @@ -#include "webfuse/core/slist.h" +#include "webfuse/impl/util/slist.h" #include -void wf_slist_init( +void wf_impl_slist_init( struct wf_slist * list) { list->head.next = NULL; list->last = &list->head; } -bool wf_slist_empty( +bool wf_impl_slist_empty( struct wf_slist * list) { return (list->last == &list->head); } -struct wf_slist_item * wf_slist_first( +struct wf_slist_item * wf_impl_slist_first( struct wf_slist * list) { return list->head.next; } -void wf_slist_append( +void wf_impl_slist_append( struct wf_slist * list, struct wf_slist_item * item) { @@ -29,13 +29,13 @@ void wf_slist_append( list->last = item; } -struct wf_slist_item * wf_slist_remove_first( +struct wf_slist_item * wf_impl_slist_remove_first( struct wf_slist * list) { - return wf_slist_remove_after(list, &list->head); + return wf_impl_slist_remove_after(list, &list->head); } -struct wf_slist_item * wf_slist_remove_after( +struct wf_slist_item * wf_impl_slist_remove_after( struct wf_slist * list, struct wf_slist_item * prev) { diff --git a/lib/webfuse/core/slist.h b/lib/webfuse/impl/util/slist.h similarity index 61% rename from lib/webfuse/core/slist.h rename to lib/webfuse/impl/util/slist.h index b5530b5..8d1df46 100644 --- a/lib/webfuse/core/slist.h +++ b/lib/webfuse/impl/util/slist.h @@ -1,5 +1,5 @@ -#ifndef WF_SLIST_H -#define WF_SLIST_H +#ifndef WF_IMPL_UTIL_SLIST_H +#define WF_IMPL_UTIL_SLIST_H #ifndef __cplusplus #include @@ -21,23 +21,23 @@ struct wf_slist struct wf_slist_item * last; }; -extern void wf_slist_init( +extern void wf_impl_slist_init( struct wf_slist * list); -extern bool wf_slist_empty( +extern bool wf_impl_slist_empty( struct wf_slist * list); -extern struct wf_slist_item * wf_slist_first( +extern struct wf_slist_item * wf_impl_slist_first( struct wf_slist * list); -extern void wf_slist_append( +extern void wf_impl_slist_append( struct wf_slist * list, struct wf_slist_item * item); -extern struct wf_slist_item * wf_slist_remove_first( +extern struct wf_slist_item * wf_impl_slist_remove_first( struct wf_slist * list); -extern struct wf_slist_item * wf_slist_remove_after( +extern struct wf_slist_item * wf_impl_slist_remove_after( struct wf_slist * list, struct wf_slist_item * prev); diff --git a/lib/webfuse/core/url.c b/lib/webfuse/impl/util/url.c similarity index 82% rename from lib/webfuse/core/url.c rename to lib/webfuse/impl/util/url.c index 6556362..cf9607f 100644 --- a/lib/webfuse/core/url.c +++ b/lib/webfuse/impl/util/url.c @@ -1,4 +1,4 @@ -#include "webfuse/core/url.h" +#include "webfuse/impl/util/url.h" #include #include @@ -11,7 +11,7 @@ struct wf_url_protocol bool use_tls; }; -static bool wf_url_readprotocol( +static bool wf_impl_url_readprotocol( struct wf_url * url, char const * * data) { @@ -38,7 +38,7 @@ static bool wf_url_readprotocol( return found; } -static bool wf_url_readhost( +static bool wf_impl_url_readhost( struct wf_url * url, char const * * data) { @@ -55,7 +55,7 @@ static bool wf_url_readhost( return result; } -static bool wf_url_readport( +static bool wf_impl_url_readport( struct wf_url * url, char const * * data) { @@ -81,7 +81,7 @@ static bool wf_url_readport( return result; } -static bool wf_url_readpath( +static bool wf_impl_url_readpath( struct wf_url * url, char const * * data) { @@ -93,7 +93,7 @@ static bool wf_url_readpath( } -bool wf_url_init( +bool wf_impl_url_init( struct wf_url * url, char const * value) { @@ -101,21 +101,21 @@ bool wf_url_init( char const * data = value; bool const result = - wf_url_readprotocol(url, &data) && - wf_url_readhost(url, &data) && - wf_url_readport(url, &data) && - wf_url_readpath(url, &data) + wf_impl_url_readprotocol(url, &data) && + wf_impl_url_readhost(url, &data) && + wf_impl_url_readport(url, &data) && + wf_impl_url_readpath(url, &data) ; if (!result) { - wf_url_cleanup(url); + wf_impl_url_cleanup(url); } return result; } -void wf_url_cleanup( +void wf_impl_url_cleanup( struct wf_url * url) { free(url->host); diff --git a/lib/webfuse/core/url.h b/lib/webfuse/impl/util/url.h similarity index 71% rename from lib/webfuse/core/url.h rename to lib/webfuse/impl/util/url.h index 4f75d8d..2de7228 100644 --- a/lib/webfuse/core/url.h +++ b/lib/webfuse/impl/util/url.h @@ -1,5 +1,5 @@ -#ifndef WF_URL_H -#define WF_URL_H +#ifndef WF_IMPL_UTIL_URL_H +#define WF_IMPL_UTIL_URL_H #ifndef __cplusplus #include @@ -17,11 +17,11 @@ struct wf_url bool use_tls; }; -extern bool wf_url_init( +extern bool wf_impl_url_init( struct wf_url * url, char const * value); -extern void wf_url_cleanup( +extern void wf_impl_url_cleanup( struct wf_url * url); diff --git a/lib/webfuse/core/util.h b/lib/webfuse/impl/util/util.h similarity index 69% rename from lib/webfuse/core/util.h rename to lib/webfuse/impl/util/util.h index b0169b8..3a7580d 100644 --- a/lib/webfuse/core/util.h +++ b/lib/webfuse/impl/util/util.h @@ -1,5 +1,5 @@ -#ifndef WF_UTIL_H -#define WF_UTIL_H +#ifndef WF_IMPL_UTIL_UTIL_H +#define WF_IMPL_UTIL_UTIL_H #ifdef __GNUC__ #define WF_UNUSED_PARAM(param) param __attribute__((unused)) diff --git a/lib/webfuse/provider/api.c b/lib/webfuse/provider/api.c deleted file mode 100644 index ad288bd..0000000 --- a/lib/webfuse/provider/api.c +++ /dev/null @@ -1,281 +0,0 @@ -#include "webfuse_provider.h" - -#include "webfuse/provider/impl/request.h" -#include "webfuse/provider/impl/operation/getattr.h" -#include "webfuse/provider/impl/operation/lookup.h" -#include "webfuse/provider/impl/operation/readdir.h" -#include "webfuse/provider/impl/operation/open.h" -#include "webfuse/provider/impl/operation/close.h" -#include "webfuse/provider/impl/operation/read.h" -#include "webfuse/provider/impl/client_protocol.h" -#include "webfuse/provider/impl/client_config.h" -#include "webfuse/provider/impl/client.h" -#include "webfuse/provider/impl/dirbuffer.h" -#include "webfuse/provider/impl/credentials.h" - -#include "webfuse/core/util.h" - -// respond - -void wfp_respond_error( - struct wfp_request * request, - wf_status status) -{ - wfp_impl_respond_error(request, status); -} - -void wfp_respond_getattr( - struct wfp_request * request, - struct stat const * stat) -{ - wfp_impl_respond_getattr(request, stat); -} - -void wfp_respond_lookup( - struct wfp_request * request, - struct stat const * stat) -{ - wfp_impl_respond_lookup(request, stat); -} - -void wfp_respond_open( - struct wfp_request * request, - uint32_t handle) -{ - wfp_impl_respond_open(request, handle); -} - -void wfp_respond_read( - struct wfp_request * request, - char const * data, - size_t length) -{ - wfp_impl_respond_read(request, data, length); -} - -void wfp_respond_readdir( - struct wfp_request * request, - struct wfp_dirbuffer * dirbuffer) -{ - wfp_impl_respond_readdir(request, dirbuffer); -} - -// config - - -struct wfp_client_config * wfp_client_config_create(void) -{ - return wfp_impl_client_config_create(); -} - -void wfp_client_config_dispose( - struct wfp_client_config * config) -{ - wfp_impl_client_config_dispose(config); -} - -void wfp_client_config_set_userdata( - struct wfp_client_config * config, - void * user_data) -{ - wfp_impl_client_config_set_userdata(config, user_data); -} - -void wfp_client_config_set_keypath( - struct wfp_client_config * config, - char const * key_path) -{ - wfp_impl_client_config_set_keypath(config, key_path); -} - -void wfp_client_config_set_certpath( - struct wfp_client_config * config, - char const * cert_path) -{ - wfp_impl_client_config_set_certpath(config, cert_path); -} - -void wfp_client_config_set_ca_filepath( - struct wfp_client_config * config, - char const * ca_filepath) -{ - wfp_impl_client_config_set_ca_filepath(config, ca_filepath); -} - -void wfp_client_config_set_onconnected( - struct wfp_client_config * config, - wfp_connected_fn * handler) -{ - wfp_impl_client_config_set_onconnected(config, handler); -} - -void wfp_client_config_set_ondisconnected( - struct wfp_client_config * config, - wfp_disconnected_fn * handler) -{ - wfp_impl_client_config_set_ondisconnected(config, handler); -} - -void wfp_client_config_set_onlookup( - struct wfp_client_config * config, - wfp_lookup_fn * handler) -{ - wfp_impl_client_config_set_onlookup(config, handler); -} - -void wfp_client_config_set_ongetattr( - struct wfp_client_config * config, - wfp_getattr_fn * handler) -{ - wfp_impl_client_config_set_ongetattr(config, handler); -} - -void wfp_client_config_set_onreaddir( - struct wfp_client_config * config, - wfp_readdir_fn * handler) -{ - wfp_impl_client_config_set_onreaddir(config, handler); -} - -void wfp_client_config_set_onopen( - struct wfp_client_config * config, - wfp_open_fn * handler) -{ - wfp_impl_client_config_set_onopen(config, handler); -} - -void wfp_client_config_set_onclose( - struct wfp_client_config * config, - wfp_close_fn * handler) -{ - wfp_impl_client_config_set_onclose(config, handler); -} - -void wfp_client_config_set_onread( - struct wfp_client_config * config, - wfp_read_fn * handler) -{ - wfp_impl_client_config_set_onread(config, handler); -} - -void wfp_client_config_enable_authentication( - struct wfp_client_config * config, - wfp_get_credentials_fn * get_credentials) -{ - wfp_impl_client_config_enable_authentication(config, get_credentials); -} - -// protocol - - -struct wfp_client_protocol * wfp_client_protocol_create( - struct wfp_client_config const * config) -{ - return wfp_impl_client_protocol_create(config); -} - -void wfp_client_protocol_dispose( - struct wfp_client_protocol * protocol) -{ - wfp_impl_client_protocol_dispose(protocol); -} - -void wfp_client_protocol_init_lws( - struct wfp_client_protocol * protocol, - struct lws_protocols * lws_protocol) -{ - wfp_impl_client_protocol_init_lws(protocol, lws_protocol); -} - -void wfp_client_protocol_connect( - struct wfp_client_protocol * protocol, - struct lws_context * context, - char const * url) -{ - wfp_impl_client_protocol_connect(protocol, context, url); -} - -void wfp_client_protocol_disconnect( - struct wfp_client_protocol * protocol) -{ - wfp_impl_client_protocol_disconnect(protocol); -} - - -// client - -struct wfp_client * wfp_client_create( - struct wfp_client_config * config) -{ - return wfp_impl_client_create(config); -} - -void wfp_client_connect( - struct wfp_client * client, - char const * url) -{ - wfp_impl_client_connect(client, url); -} - -void wfp_client_disconnect( - struct wfp_client * client) -{ - wfp_impl_client_disconnect(client); -} - -void wfp_client_dispose( - struct wfp_client * client) -{ - wfp_impl_client_dispose(client); -} - -void wfp_client_service( - struct wfp_client * client) -{ - wfp_impl_client_service(client); -} - -void wfp_client_interrupt( - struct wfp_client * client) -{ - wfp_impl_client_interrupt(client); -} - - -// dirbuffer - -struct wfp_dirbuffer * wfp_dirbuffer_create(void) -{ - return wfp_impl_dirbuffer_create(); -} - -void wfp_dirbuffer_dispose( - struct wfp_dirbuffer * buffer) -{ - wfp_impl_dirbuffer_dispose(buffer); -} - -void wfp_dirbuffer_add( - struct wfp_dirbuffer * buffer, - char const * name, - ino_t inode) -{ - wfp_impl_dirbuffer_add(buffer, name, inode); -} - -// credentials - -void wfp_credentials_set_type( - struct wfp_credentials * credentials, - char const * type) -{ - wfp_impl_credentials_set_type(credentials, type); -} - -void wfp_credentials_add( - struct wfp_credentials * credentials, - char const * key, - char const * value) -{ - wfp_impl_credentials_add(credentials, key, value); -} diff --git a/lib/webfuse/provider/impl/client.c b/lib/webfuse/provider/impl/client.c deleted file mode 100644 index 2c584e9..0000000 --- a/lib/webfuse/provider/impl/client.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "webfuse/provider/impl/client.h" - -#include -#include -#include - -#include - -#include "webfuse/provider/impl/provider.h" -#include "webfuse/provider/impl/client_protocol.h" -#include "webfuse/provider/impl/client_config.h" -#include "webfuse/core/lws_log.h" - -#define WFP_CLIENT_PROTOCOL_COUNT 2 - -struct wfp_client -{ - struct wfp_client_protocol protocol; - struct lws_context_creation_info info; - struct lws_protocols protocols[WFP_CLIENT_PROTOCOL_COUNT]; - struct lws_context * context; - char * key_path; - char * cert_path; -}; - - -struct wfp_client * wfp_impl_client_create( - struct wfp_client_config * config) -{ - wf_lwslog_disable(); - - struct wfp_client * client = malloc(sizeof(struct wfp_client)); - wfp_impl_client_protocol_init(&client->protocol, &config->provider, config->user_data); - - memset(client->protocols, 0, sizeof(struct lws_protocols) * WFP_CLIENT_PROTOCOL_COUNT); - wfp_impl_client_protocol_init_lws(&client->protocol, &client->protocols[0]); - - memset(&client->info, 0, sizeof(struct lws_context_creation_info)); - client->info.port = CONTEXT_PORT_NO_LISTEN; - client->info.protocols = client->protocols; - client->info.uid = -1; - client->info.gid = -1; - - if ((NULL != config->cert_path) && (NULL != config->key_path)) - { - client->info.options |= LWS_SERVER_OPTION_EXPLICIT_VHOSTS; - } - - client->context = lws_create_context(&client->info); - - if ((NULL != config->cert_path) && (NULL != config->key_path)) - { - struct lws_vhost * vhost = lws_create_vhost(client->context, &client->info); - client->info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; - client->info.client_ssl_cert_filepath = config->cert_path; - client->info.client_ssl_private_key_filepath = config->key_path; - client->info.client_ssl_ca_filepath = config->ca_filepath; - lws_init_vhost_client_ssl(&client->info, vhost); - } - - return client; -} - -void wfp_impl_client_dispose( - struct wfp_client * client) -{ - lws_context_destroy(client->context); - wfp_impl_client_protocol_cleanup(&client->protocol); - free(client); -} - -void wfp_impl_client_connect( - struct wfp_client * client, - char const * url) -{ - wfp_impl_client_protocol_connect(&client->protocol, client->context, url); -} - -void wfp_impl_client_disconnect( - struct wfp_client * client) -{ - wfp_impl_client_protocol_disconnect(&client->protocol); -} - -void wfp_impl_client_service( - struct wfp_client * client) -{ - lws_service(client->context, 0); -} - -void wfp_impl_client_interrupt( - struct wfp_client * client) -{ - lws_cancel_service(client->context); -} diff --git a/lib/webfuse/provider/impl/client.h b/lib/webfuse/provider/impl/client.h deleted file mode 100644 index 0dfc64e..0000000 --- a/lib/webfuse/provider/impl/client.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_CLIENT_H -#define WF_PROVIDER_IMPL_CLIENT_H - -#ifndef __cplusplus -#include -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_client; -struct wfp_client_config; - -extern struct wfp_client * wfp_impl_client_create( - struct wfp_client_config * config); - -extern void wfp_impl_client_set_keypath( - struct wfp_client * client, - char * key_path); - -extern void wfp_impl_client_set_certpath( - struct wfp_client * client, - char * cert_path); - -extern void wfp_impl_client_connect( - struct wfp_client * client, - char const * url); - -extern void wfp_impl_client_disconnect( - struct wfp_client * client); - -extern void wfp_impl_client_dispose( - struct wfp_client * client); - -extern void wfp_impl_client_service( - struct wfp_client * client); - -extern void wfp_impl_client_interrupt( - struct wfp_client * client); - -#ifdef __cplusplus -} -#endif - - -#endif diff --git a/lib/webfuse/provider/impl/client_config.c b/lib/webfuse/provider/impl/client_config.c deleted file mode 100644 index cd7b015..0000000 --- a/lib/webfuse/provider/impl/client_config.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "webfuse/provider/impl/client_config.h" -#include "webfuse/provider/impl/provider.h" -#include -#include - -struct wfp_client_config * wfp_impl_client_config_create(void) -{ - struct wfp_client_config * config = malloc(sizeof(struct wfp_client_config)); - wfp_impl_provider_init(&config->provider); - config->user_data = NULL; - config->key_path = NULL; - config->cert_path = NULL; - config->ca_filepath = NULL; - - return config; -} - -void wfp_impl_client_config_dispose( - struct wfp_client_config * config) -{ - free(config->key_path); - free(config->cert_path); - free(config->ca_filepath); - free(config); -} - -void wfp_impl_client_config_set_userdata( - struct wfp_client_config * config, - void * user_data) -{ - config->user_data = user_data; -} - -void wfp_impl_client_config_set_keypath( - struct wfp_client_config * config, - char const * key_path) -{ - free(config->key_path); - config->key_path = strdup(key_path); -} - -void wfp_impl_client_config_set_certpath( - struct wfp_client_config * config, - char const * cert_path) -{ - free(config->cert_path); - config->cert_path = strdup(cert_path); -} - -void wfp_impl_client_config_set_ca_filepath( - struct wfp_client_config * config, - char const * ca_filepath) -{ - free(config->ca_filepath); - config->ca_filepath = strdup(ca_filepath); -} - -void wfp_impl_client_config_set_onconnected( - struct wfp_client_config * config, - wfp_connected_fn * handler) -{ - config->provider.connected = handler; -} - -void wfp_impl_client_config_set_ondisconnected( - struct wfp_client_config * config, - wfp_disconnected_fn * handler) -{ - config->provider.disconnected = handler; -} - -void wfp_impl_client_config_set_onlookup( - struct wfp_client_config * config, - wfp_lookup_fn * handler) -{ - config->provider.lookup = handler; -} - -void wfp_impl_client_config_set_ongetattr( - struct wfp_client_config * config, - wfp_getattr_fn * handler) -{ - config->provider.getattr = handler; -} - -void wfp_impl_client_config_set_onreaddir( - struct wfp_client_config * config, - wfp_readdir_fn * handler) -{ - config->provider.readdir = handler; -} - -void wfp_impl_client_config_set_onopen( - struct wfp_client_config * config, - wfp_open_fn * handler) -{ - config->provider.open = handler; -} - -void wfp_impl_client_config_set_onclose( - struct wfp_client_config * config, - wfp_close_fn * handler) -{ - config->provider.close = handler; -} - -void wfp_impl_client_config_set_onread( - struct wfp_client_config * config, - wfp_read_fn * handler) -{ - config->provider.read = handler; -} - -void wfp_impl_client_config_enable_authentication( - struct wfp_client_config * config, - wfp_get_credentials_fn * get_credentials) -{ - config->provider.get_credentials = get_credentials; -} diff --git a/lib/webfuse/provider/impl/client_config.h b/lib/webfuse/provider/impl/client_config.h deleted file mode 100644 index 9e588b0..0000000 --- a/lib/webfuse/provider/impl/client_config.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_CLIENT_CONFIG_H -#define WF_PROVIDER_IMPL_CLIENT_CONFIG_H - -#include "webfuse/provider/client_config.h" -#include "webfuse/provider/impl/provider.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_client_config -{ - struct wfp_provider provider; - void * user_data; - char * key_path; - char * cert_path; - char * ca_filepath; -}; - -extern struct wfp_client_config * wfp_impl_client_config_create(void); - -extern void wfp_impl_client_config_dispose( - struct wfp_client_config * config); - -extern void wfp_impl_client_config_set_userdata( - struct wfp_client_config * config, - void * user_data); - -extern void wfp_impl_client_config_set_keypath( - struct wfp_client_config * config, - char const * key_path); - -extern void wfp_impl_client_config_set_certpath( - struct wfp_client_config * config, - char const * cert_path); - -extern void wfp_impl_client_config_set_ca_filepath( - struct wfp_client_config * config, - char const * ca_filepath); - -extern void wfp_impl_client_config_set_onconnected( - struct wfp_client_config * config, - wfp_connected_fn * handler); - -extern void wfp_impl_client_config_set_ondisconnected( - struct wfp_client_config * config, - wfp_disconnected_fn * handler); - -extern void wfp_impl_client_config_set_onlookup( - struct wfp_client_config * config, - wfp_lookup_fn * handler); - -extern void wfp_impl_client_config_set_ongetattr( - struct wfp_client_config * config, - wfp_getattr_fn * handler); - -extern void wfp_impl_client_config_set_onreaddir( - struct wfp_client_config * config, - wfp_readdir_fn * handler); - -extern void wfp_impl_client_config_set_onopen( - struct wfp_client_config * config, - wfp_open_fn * handler); - -extern void wfp_impl_client_config_set_onclose( - struct wfp_client_config * config, - wfp_close_fn * handler); - -extern void wfp_impl_client_config_set_onread( - struct wfp_client_config * config, - wfp_read_fn * handler); - -extern void wfp_impl_client_config_enable_authentication( - struct wfp_client_config * config, - wfp_get_credentials_fn * get_credentials); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/webfuse/provider/impl/client_protocol.c b/lib/webfuse/provider/impl/client_protocol.c deleted file mode 100644 index 7ce8c2e..0000000 --- a/lib/webfuse/provider/impl/client_protocol.c +++ /dev/null @@ -1,340 +0,0 @@ -#include "webfuse/provider/impl/client_protocol.h" - -#include -#include - -#include -#include - -#include "webfuse/provider/impl/client_config.h" -#include "webfuse/provider/impl/provider.h" -#include "webfuse/provider/impl/credentials.h" -#include "webfuse/core/util.h" -#include "webfuse/core/message.h" -#include "webfuse/core/message_queue.h" -#include "webfuse/core/container_of.h" -#include "webfuse/core/url.h" -#include "webfuse/core/protocol_names.h" - -#include "webfuse/core/timer/manager.h" - -#include "webfuse/core/jsonrpc/response.h" -#include "webfuse/core/jsonrpc/request.h" -#include "webfuse/core/jsonrpc/proxy.h" - -#define WF_DEFAULT_TIMEOUT (10 * 1000) - -static void wfp_impl_client_protocol_respond( - json_t * response, - void * user_data) -{ - struct wfp_client_protocol * protocol = (struct wfp_client_protocol *) user_data; - - struct wf_message * message = wf_message_create(response); - if (NULL != message) - { - wf_slist_append(&protocol->messages, &message->item); - lws_callback_on_writable(protocol->wsi); - } -} - -static void wfp_impl_client_protocol_process( - struct wfp_client_protocol * protocol, - char const * data, - size_t length) -{ - json_t * message = json_loadb(data, length, 0, NULL); - if (NULL != message) - { - if (wf_jsonrpc_is_response(message)) - { - wf_jsonrpc_proxy_onresult(protocol->proxy, message); - } - - if (wf_jsonrpc_is_request(message)) - { - struct wfp_impl_invokation_context context = - { - .provider = &protocol->provider, - .user_data = protocol->user_data, - .request = &protocol->request - }; - - wfp_impl_provider_invoke(&context, message); - } - - json_decref(message); - } -} - -static void -wfp_impl_client_protocol_on_add_filesystem_finished( - void * user_data, - json_t const * result, - json_t const * WF_UNUSED_PARAM(error)) -{ - struct wfp_client_protocol * protocol = user_data; - if (NULL == protocol->wsi) { return; } - - if (NULL != result) - { - protocol->is_connected = true; - protocol->provider.connected(protocol->user_data); - } - else - { - protocol->is_shutdown_requested = true; - lws_callback_on_writable(protocol->wsi); - } -} - -static void wfp_impl_client_protocol_add_filesystem( - struct wfp_client_protocol * protocol) -{ - wf_jsonrpc_proxy_invoke( - protocol->proxy, - &wfp_impl_client_protocol_on_add_filesystem_finished, - protocol, - "add_filesystem", - "s", - "cprovider"); -} - -static void -wfp_impl_client_protocol_on_authenticate_finished( - void * user_data, - json_t const * result, - json_t const * WF_UNUSED_PARAM(error)) -{ - struct wfp_client_protocol * protocol = user_data; - if (NULL == protocol->wsi) { return; } - - if (NULL != result) - { - wfp_impl_client_protocol_add_filesystem(protocol); - } - else - { - protocol->is_shutdown_requested = true; - lws_callback_on_writable(protocol->wsi); - } -} - -static void wfp_impl_client_protocol_authenticate( - struct wfp_client_protocol * protocol) -{ - struct wfp_credentials credentials; - wfp_impl_credentials_init(&credentials); - - protocol->provider.get_credentials(&credentials, protocol->user_data); - - char const * cred_type = wfp_impl_credentials_get_type(&credentials); - json_t * creds = wfp_impl_credentials_get(&credentials); - json_incref(creds); - - wf_jsonrpc_proxy_invoke( - protocol->proxy, - &wfp_impl_client_protocol_on_authenticate_finished, - protocol, - "authenticate", - "sj", - cred_type, creds); - - wfp_impl_credentials_cleanup(&credentials); -} - -static void wfp_impl_client_protocol_handshake( - struct wfp_client_protocol * protocol) -{ - if (wfp_impl_provider_is_authentication_enabled(&protocol->provider)) - { - wfp_impl_client_protocol_authenticate(protocol); - } - else - { - wfp_impl_client_protocol_add_filesystem(protocol); - } -} - -static int wfp_impl_client_protocol_callback( - struct lws * wsi, - enum lws_callback_reasons reason, - void * WF_UNUSED_PARAM(user), - void * in, - size_t len) -{ - int result = 0; - struct lws_protocols const * ws_protocol = lws_get_protocol(wsi); - struct wfp_client_protocol * protocol = (NULL != ws_protocol) ? ws_protocol->user: NULL; - - if (NULL != protocol) - { - wf_timer_manager_check(protocol->timer_manager); - - switch (reason) - { - case LWS_CALLBACK_CLIENT_ESTABLISHED: - wfp_impl_client_protocol_handshake(protocol); - break; - case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: - protocol->is_connected = false; - protocol->provider.disconnected(protocol->user_data); - break; - case LWS_CALLBACK_CLIENT_CLOSED: - protocol->is_connected = false; - protocol->provider.disconnected(protocol->user_data); - protocol->wsi = NULL; - break; - case LWS_CALLBACK_CLIENT_RECEIVE: - wfp_impl_client_protocol_process(protocol, in, len); - break; - case LWS_CALLBACK_SERVER_WRITEABLE: - // fall-through - case LWS_CALLBACK_CLIENT_WRITEABLE: - if (wsi == protocol->wsi) - { - if (protocol->is_shutdown_requested) - { - result = 1; - } - else if (!wf_slist_empty(&protocol->messages)) - { - struct wf_slist_item * item = wf_slist_remove_first(&protocol->messages); - struct wf_message * message = wf_container_of(item, struct wf_message, item); - lws_write(wsi, (unsigned char*) message->data, message->length, LWS_WRITE_TEXT); - wf_message_dispose(message); - - if (!wf_slist_empty(&protocol->messages)) - { - lws_callback_on_writable(wsi); - } - } - } - break; - default: - break; - } - } - - return result; -} - -static bool wfp_impl_client_protocol_send( - json_t * request, - void * user_data) -{ - bool result = false; - struct wfp_client_protocol * protocol = user_data; - - struct wf_message * message = wf_message_create(request); - if (NULL != message) - { - wf_slist_append(&protocol->messages, &message->item); - lws_callback_on_writable(protocol->wsi); - result = true; - } - - return result; -} - -void wfp_impl_client_protocol_init( - struct wfp_client_protocol * protocol, - struct wfp_provider const * provider, - void * user_data) -{ - protocol->is_connected = false; - protocol->is_shutdown_requested = false; - wf_slist_init(&protocol->messages); - - protocol->wsi = NULL; - - protocol->request.respond = &wfp_impl_client_protocol_respond; - protocol->request.user_data = protocol; - - protocol->timer_manager = wf_timer_manager_create(); - protocol->proxy = wf_jsonrpc_proxy_create(protocol->timer_manager, WF_DEFAULT_TIMEOUT, &wfp_impl_client_protocol_send, protocol); - - protocol->user_data = user_data; - wfp_impl_provider_init_from_prototype(&protocol->provider, provider); -} - -void wfp_impl_client_protocol_cleanup( - struct wfp_client_protocol * protocol) -{ - wf_jsonrpc_proxy_dispose(protocol->proxy); - wf_timer_manager_dispose(protocol->timer_manager); - wf_message_queue_cleanup(&protocol->messages); -} - -struct wfp_client_protocol * wfp_impl_client_protocol_create( - struct wfp_client_config const * config) -{ - struct wfp_client_protocol * protocol = malloc(sizeof(struct wfp_client_protocol)); - wfp_impl_client_protocol_init(protocol, &config->provider, config->user_data); - - return protocol; -} - -void wfp_impl_client_protocol_dispose( - struct wfp_client_protocol * protocol) -{ - wfp_impl_client_protocol_cleanup(protocol); - free(protocol); -} - -void wfp_impl_client_protocol_init_lws( - struct wfp_client_protocol * protocol, - struct lws_protocols * lws_protocol) -{ - lws_protocol->name = WF_PROTOCOL_NAME_PROVIDER_CLIENT; - lws_protocol->callback = &wfp_impl_client_protocol_callback; - lws_protocol->per_session_data_size = 0; - lws_protocol->user = protocol; -} - -void wfp_impl_client_protocol_connect( - struct wfp_client_protocol * protocol, - struct lws_context * context, - char const * url) -{ - struct wf_url url_data; - bool const success = wf_url_init(&url_data, url); - if (success) - { - struct lws_client_connect_info info; - memset(&info, 0, sizeof(struct lws_client_connect_info)); - info.context = context; - info.port = url_data.port; - info.address = url_data.host; - info.path = url_data.path; - info.host = info.address; - info.origin = info.address; - info.ssl_connection = (url_data.use_tls) ? LCCSCF_USE_SSL : 0; - info.protocol = WF_PROTOCOL_NAME_ADAPTER_SERVER; - info.local_protocol_name = WF_PROTOCOL_NAME_PROVIDER_CLIENT; - info.pwsi = &protocol->wsi; - - lws_client_connect_via_info(&info); - - wf_url_cleanup(&url_data); - } - else - { - protocol->provider.disconnected(protocol->user_data); - } - -} - -void wfp_impl_client_protocol_disconnect( - struct wfp_client_protocol * protocol) -{ - if (protocol->is_connected) - { - protocol->is_shutdown_requested = true; - lws_callback_on_writable(protocol->wsi); - } - else - { - protocol->provider.disconnected(protocol->user_data); - } -} diff --git a/lib/webfuse/provider/impl/client_protocol.h b/lib/webfuse/provider/impl/client_protocol.h deleted file mode 100644 index d6dd8ab..0000000 --- a/lib/webfuse/provider/impl/client_protocol.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_CLIENT_PROTOCOL_H -#define WF_PROVIDER_IMPL_CLIENT_PROTOCOL_H - -#include "webfuse/provider/impl/provider.h" -#include "webfuse/provider/impl/request.h" - -#include "webfuse/core/slist.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_client_config; -struct lws_protocols; -struct lws_context; -struct wf_jsonrpc_proxy; -struct wf_timer_manager; - -struct wfp_client_protocol -{ - bool is_connected; - bool is_shutdown_requested; - struct wfp_request request; - struct wfp_provider provider; - void * user_data; - struct lws * wsi; - struct wf_timer_manager * timer_manager; - struct wf_jsonrpc_proxy * proxy; - struct wf_slist messages; -}; - -extern void wfp_impl_client_protocol_init( - struct wfp_client_protocol * protocol, - struct wfp_provider const * provider, - void * user_data); - -extern void wfp_impl_client_protocol_cleanup( - struct wfp_client_protocol * protocol); - -extern struct wfp_client_protocol * wfp_impl_client_protocol_create( - struct wfp_client_config const * config); - -extern void wfp_impl_client_protocol_dispose( - struct wfp_client_protocol * protocol); - -extern void wfp_impl_client_protocol_init_lws( - struct wfp_client_protocol * protocol, - struct lws_protocols * lws_protocol); - -extern void wfp_impl_client_protocol_connect( - struct wfp_client_protocol * protocol, - struct lws_context * context, - char const * url); - -extern void wfp_impl_client_protocol_disconnect( - struct wfp_client_protocol * protocol); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/webfuse/provider/impl/credentials.c b/lib/webfuse/provider/impl/credentials.c deleted file mode 100644 index f2d254f..0000000 --- a/lib/webfuse/provider/impl/credentials.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "webfuse/provider/impl/credentials.h" - -#include -#include - -void wfp_impl_credentials_init( - struct wfp_credentials * credentials) -{ - credentials->type = NULL; - credentials->contents = json_object(); -} - -void wfp_impl_credentials_cleanup( - struct wfp_credentials * credentials) -{ - free(credentials->type); - json_decref(credentials->contents); -} - -void wfp_impl_credentials_set_type( - struct wfp_credentials * credentials, - char const * type) -{ - free(credentials->type); - credentials->type = strdup(type); -} - -void wfp_impl_credentials_add( - struct wfp_credentials * credentials, - char const * key, - char const * value) -{ - json_object_set_new(credentials->contents, key, json_string(value)); -} - -char const * wfp_impl_credentials_get_type( - struct wfp_credentials * credentials) -{ - return credentials->type; -} - -json_t * wfp_impl_credentials_get( - struct wfp_credentials * credentials) -{ - return credentials->contents; -} diff --git a/lib/webfuse/provider/impl/credentials.h b/lib/webfuse/provider/impl/credentials.h deleted file mode 100644 index 304b067..0000000 --- a/lib/webfuse/provider/impl/credentials.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_CREDENTIALS_H -#define WF_PROVIDER_IMPL_CREDENTIALS_H - -#include "webfuse/provider/credentials.h" -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_credentials -{ - char * type; - json_t * contents; -}; - -extern void wfp_impl_credentials_init( - struct wfp_credentials * credentials); - -extern void wfp_impl_credentials_cleanup( - struct wfp_credentials * credentials); - -extern void wfp_impl_credentials_set_type( - struct wfp_credentials * credentials, - char const * type); - -extern void wfp_impl_credentials_add( - struct wfp_credentials * credentials, - char const * key, - char const * value); - -extern char const * wfp_impl_credentials_get_type( - struct wfp_credentials * credentials); - -extern json_t * wfp_impl_credentials_get( - struct wfp_credentials * credentials); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/webfuse/provider/impl/dirbuffer.c b/lib/webfuse/provider/impl/dirbuffer.c deleted file mode 100644 index 9bc5f22..0000000 --- a/lib/webfuse/provider/impl/dirbuffer.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "webfuse/provider/impl/dirbuffer.h" -#include - -struct wfp_dirbuffer * wfp_impl_dirbuffer_create(void) -{ - struct wfp_dirbuffer * buffer = malloc(sizeof(struct wfp_dirbuffer)); - buffer->entries = json_array(); - - return buffer; -} - -void wfp_impl_dirbuffer_dispose( - struct wfp_dirbuffer * buffer) -{ - if (NULL != buffer->entries) - { - json_decref(buffer->entries); - } - - free(buffer); -} - -void wfp_impl_dirbuffer_add( - struct wfp_dirbuffer * buffer, - char const * name, - ino_t inode) -{ - json_t * entry = json_object(); - json_object_set_new(entry, "name", json_string(name)); - json_object_set_new(entry, "inode", json_integer(inode)); - - json_array_append_new(buffer->entries, entry); -} - -json_t * wfp_impl_dirbuffer_take( - struct wfp_dirbuffer * buffer) -{ - json_t * entries = buffer->entries; - - buffer->entries = NULL; - return entries; -} diff --git a/lib/webfuse/provider/impl/dirbuffer.h b/lib/webfuse/provider/impl/dirbuffer.h deleted file mode 100644 index 8118ed1..0000000 --- a/lib/webfuse/provider/impl/dirbuffer.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_DIRBUFFER_H -#define WF_PROVIDER_IMPL_DIRBUFFER_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_dirbuffer -{ - json_t * entries; -}; - -extern struct wfp_dirbuffer * wfp_impl_dirbuffer_create(void); - -extern void wfp_impl_dirbuffer_dispose( - struct wfp_dirbuffer * buffer); - -extern void wfp_impl_dirbuffer_add( - struct wfp_dirbuffer * buffer, - char const * name, - ino_t inode); - -extern json_t * wfp_impl_dirbuffer_take( - struct wfp_dirbuffer * buffer); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/webfuse/provider/impl/operation/close.c b/lib/webfuse/provider/impl/operation/close.c deleted file mode 100644 index 3346fbc..0000000 --- a/lib/webfuse/provider/impl/operation/close.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "webfuse/provider/impl/operation/close.h" -#include -#include "webfuse/core/util.h" - -void wfp_impl_close( - struct wfp_impl_invokation_context * context, - json_t * params, - int WF_UNUSED_PARAM(id)) -{ - size_t const param_count = json_array_size(params); - if (4 == param_count) - { - json_t * inode_holder = json_array_get(params, 1); - json_t * handle_holder = json_array_get(params, 2); - json_t * flags_holder = json_array_get(params, 3); - - if (json_is_integer(inode_holder) && - json_is_integer(handle_holder) && - json_is_integer(flags_holder)) - { - ino_t inode = (ino_t) json_integer_value(inode_holder); - uint32_t handle = (uint32_t) (json_integer_value(handle_holder) & UINT32_MAX); - int flags = json_integer_value(flags_holder); - - context->provider->close(inode, handle, flags, context->user_data); - } - } - -} - -void wfp_impl_close_default( - ino_t WF_UNUSED_PARAM(inode), - uint32_t WF_UNUSED_PARAM(handle), - int WF_UNUSED_PARAM(flags), - void * WF_UNUSED_PARAM(user_data)) -{ - // empty -} \ No newline at end of file diff --git a/lib/webfuse/provider/impl/operation/close.h b/lib/webfuse/provider/impl/operation/close.h deleted file mode 100644 index da1548b..0000000 --- a/lib/webfuse/provider/impl/operation/close.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_OPERATION_CLOSE_H -#define WF_PROVIDER_IMPL_OPERATION_CLOSE_H - -#include "webfuse/provider/impl/provider.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern void wfp_impl_close( - struct wfp_impl_invokation_context * context, - json_t * params, - int id); - -extern void wfp_impl_close_default( - ino_t inode, - uint32_t handle, - int flags, - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/lib/webfuse/provider/impl/operation/error.h b/lib/webfuse/provider/impl/operation/error.h deleted file mode 100644 index 5594ac1..0000000 --- a/lib/webfuse/provider/impl/operation/error.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef WFP_OPERATION_IMPL_ERROR_H -#define WFP_OPERATION_IMPL_ERROR_H - -#include "webfuse/provider/api.h" -#include "webfuse/core/status.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_request; - -extern WFP_API void wfp_impl_respond_error( - struct wfp_request * request, - wf_status status); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/webfuse/provider/impl/operation/getattr.c b/lib/webfuse/provider/impl/operation/getattr.c deleted file mode 100644 index 467e99b..0000000 --- a/lib/webfuse/provider/impl/operation/getattr.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "webfuse/provider/impl/operation/getattr.h" - -#include - -#include "webfuse/provider/impl/operation/error.h" -#include "webfuse/provider/impl/request.h" -#include "webfuse/core/util.h" - - -void wfp_impl_getattr( - struct wfp_impl_invokation_context * context, - json_t * params, - int id) -{ - size_t const count = json_array_size(params); - if (2 == count) - { - json_t * inode_holder = json_array_get(params, 1); - - if (json_is_integer(inode_holder)) - { - ino_t inode = (ino_t) json_integer_value(inode_holder); - struct wfp_request * request = wfp_impl_request_create(context->request, id); - - context->provider->getattr(request, inode, context->user_data); - } - } -} - -void wfp_impl_getattr_default( - struct wfp_request * request, - ino_t WF_UNUSED_PARAM(inode), - void * WF_UNUSED_PARAM(user_data)) -{ - wfp_impl_respond_error(request, WF_BAD_NOENTRY); -} - -void wfp_impl_respond_getattr( - struct wfp_request * request, - struct stat const * stat) -{ - bool const is_file = (0 != (stat->st_mode & S_IFREG)); - bool const is_dir = (0 != (stat->st_mode & S_IFDIR)); - - json_t * result = json_object(); - json_object_set_new(result, "inode", json_integer(stat->st_ino)); - json_object_set_new(result, "mode", json_integer(stat->st_mode & 0777)); - json_object_set_new(result, "atime", json_integer(stat->st_atime)); - json_object_set_new(result, "mtime", json_integer(stat->st_mtime)); - json_object_set_new(result, "ctime", json_integer(stat->st_ctime)); - - if (is_file) - { - json_object_set_new(result, "type", json_string("file")); - json_object_set_new(result, "size", json_integer(stat->st_size)); - } - - if (is_dir) - { - json_object_set_new(result, "type", json_string("dir")); - } - - wfp_impl_respond(request, result); -} diff --git a/lib/webfuse/provider/impl/operation/getattr.h b/lib/webfuse/provider/impl/operation/getattr.h deleted file mode 100644 index 40f3b1c..0000000 --- a/lib/webfuse/provider/impl/operation/getattr.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_OPERATION_GETATTR_H -#define WF_PROVIDER_IMPL_OPERATION_GETATTR_H - -#include "webfuse/provider/impl/provider.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern void wfp_impl_respond_getattr( - struct wfp_request * request, - struct stat const * stat); - -extern void wfp_impl_getattr( - struct wfp_impl_invokation_context * context, - json_t * params, - int id); - -extern void wfp_impl_getattr_default( - struct wfp_request * request, - ino_t inode, - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/lib/webfuse/provider/impl/operation/lookup.c b/lib/webfuse/provider/impl/operation/lookup.c deleted file mode 100644 index d2e89aa..0000000 --- a/lib/webfuse/provider/impl/operation/lookup.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "webfuse/provider/impl/operation/lookup.h" - -#include - -#include "webfuse/provider/impl/operation/error.h" -#include "webfuse/provider/impl/request.h" -#include "webfuse/core/util.h" - -void wfp_impl_lookup( - struct wfp_impl_invokation_context * context, - json_t * params, - int id) -{ - size_t const count = json_array_size(params); - if (3 == count) - { - json_t * inode_holder = json_array_get(params, 1); - json_t * name_holder = json_array_get(params, 2); - - if (json_is_integer(inode_holder) && - json_is_string(name_holder)) - { - ino_t inode = json_integer_value(inode_holder); - char const * name = json_string_value(name_holder); - - struct wfp_request * request = wfp_impl_request_create(context->request, id); - context->provider->lookup(request, inode, name, context->user_data); - } - } -} - -void wfp_impl_respond_lookup( - struct wfp_request * request, - struct stat const * stat) -{ - bool const is_file = (0 != (stat->st_mode & S_IFREG)); - bool const is_dir = (0 != (stat->st_mode & S_IFDIR)); - - json_t * result = json_object(); - json_object_set_new(result, "inode", json_integer(stat->st_ino)); - json_object_set_new(result, "mode", json_integer(stat->st_mode & 0777)); - json_object_set_new(result, "atime", json_integer(stat->st_atime)); - json_object_set_new(result, "mtime", json_integer(stat->st_mtime)); - json_object_set_new(result, "ctime", json_integer(stat->st_ctime)); - - if (is_file) - { - json_object_set_new(result, "type", json_string("file")); - json_object_set_new(result, "size", json_integer(stat->st_size)); - } - - if (is_dir) - { - json_object_set_new(result, "type", json_string("dir")); - } - - wfp_impl_respond(request, result); -} - -void wfp_impl_lookup_default( - struct wfp_request * request, - ino_t WF_UNUSED_PARAM(parent), - char const * WF_UNUSED_PARAM(name), - void * WF_UNUSED_PARAM(user_data)) -{ - wfp_impl_respond_error(request, WF_BAD_NOENTRY); -} - diff --git a/lib/webfuse/provider/impl/operation/lookup.h b/lib/webfuse/provider/impl/operation/lookup.h deleted file mode 100644 index e0fca6f..0000000 --- a/lib/webfuse/provider/impl/operation/lookup.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_OPERATION_LOOKUP_H -#define WF_PROVIDER_IMPL_OPERATION_LOOKUP_H - -#include "webfuse/provider/impl/provider.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern void wfp_impl_respond_lookup( - struct wfp_request * request, - struct stat const * stat); - -extern void wfp_impl_lookup( - struct wfp_impl_invokation_context * context, - json_t * params, - int id); - -extern void wfp_impl_lookup_default( - struct wfp_request * request, - ino_t parent, - char const * name, - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/lib/webfuse/provider/impl/operation/open.c b/lib/webfuse/provider/impl/operation/open.c deleted file mode 100644 index a0ed9b1..0000000 --- a/lib/webfuse/provider/impl/operation/open.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "webfuse/provider/impl/operation/open.h" -#include "webfuse/provider/impl/operation/error.h" -#include "webfuse/provider/impl/request.h" -#include "webfuse/core/util.h" - -void wfp_impl_open( - struct wfp_impl_invokation_context * context, - json_t * params, - int id) -{ - size_t const count = json_array_size(params); - if (3 == count) - { - json_t * inode_holder = json_array_get(params, 1); - json_t * flags_holder = json_array_get(params, 2); - - if (json_is_integer(inode_holder) && - json_is_integer(flags_holder)) - { - ino_t inode = (ino_t) json_integer_value(inode_holder); - int flags = (ino_t) json_integer_value(flags_holder); - - struct wfp_request * request = wfp_impl_request_create(context->request, id); - - context->provider->open(request, inode, flags, context->user_data); - } - } -} - -void wfp_impl_open_default( - struct wfp_request * request, - ino_t WF_UNUSED_PARAM(inode), - int WF_UNUSED_PARAM(flags), - void * WF_UNUSED_PARAM(user_data)) -{ - wfp_impl_respond_error(request, WF_BAD_NOENTRY); -} - -void wfp_impl_respond_open( - struct wfp_request * request, - uint32_t handle) -{ - json_t * result = json_object(); - json_object_set_new(result, "handle", json_integer((int) handle)); - - wfp_impl_respond(request, result); -} diff --git a/lib/webfuse/provider/impl/operation/open.h b/lib/webfuse/provider/impl/operation/open.h deleted file mode 100644 index 22d74c8..0000000 --- a/lib/webfuse/provider/impl/operation/open.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_OPERATION_OPEN_H -#define WF_PROVIDER_IMPL_OPERATION_OPEN_H - -#include "webfuse/provider/impl/provider.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern void wfp_impl_respond_open( - struct wfp_request * request, - uint32_t handle); - -extern void wfp_impl_open( - struct wfp_impl_invokation_context * context, - json_t * params, - int id); - -extern void wfp_impl_open_default( - struct wfp_request * request, - ino_t inode, - int flags, - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/lib/webfuse/provider/impl/operation/read.c b/lib/webfuse/provider/impl/operation/read.c deleted file mode 100644 index 5c2b639..0000000 --- a/lib/webfuse/provider/impl/operation/read.c +++ /dev/null @@ -1,78 +0,0 @@ -#include "webfuse/provider/impl/operation/read.h" - -#include - -#include "webfuse/provider/impl/operation/error.h" -#include "webfuse/provider/impl/request.h" -#include "webfuse/core/util.h" -#include "webfuse/core/base64.h" - -void wfp_impl_read( - struct wfp_impl_invokation_context * context, - json_t * params, - int id) -{ - size_t const count = json_array_size(params); - if (5 == count) - { - json_t * inode_holder = json_array_get(params, 1); - json_t * handle_holder = json_array_get(params, 2); - json_t * offset_holder = json_array_get(params, 3); - json_t * length_holder = json_array_get(params, 4); - - if (json_is_integer(inode_holder) && - json_is_integer(handle_holder) && - json_is_integer(offset_holder) && - json_is_integer(length_holder)) - { - ino_t inode = (ino_t) json_integer_value(inode_holder); - int handle = json_integer_value(handle_holder); - size_t offset = json_integer_value(offset_holder); - size_t length = json_integer_value(length_holder); - struct wfp_request * request = wfp_impl_request_create(context->request, id); - - context->provider->read(request, inode, handle, offset, length, context->user_data); - } - } -} - -void wfp_impl_read_default( - struct wfp_request * request, - ino_t WF_UNUSED_PARAM(inode), - uint32_t WF_UNUSED_PARAM(handle), - size_t WF_UNUSED_PARAM(offset), - size_t WF_UNUSED_PARAM(length), - void * WF_UNUSED_PARAM(user_data)) -{ - wfp_impl_respond_error(request, WF_BAD_NOENTRY); -} - -void wfp_impl_respond_read( - struct wfp_request * request, - char const * data, - size_t length) -{ - if (0 < length) - { - size_t const size = wf_base64_encoded_size(length) + 1; - char * buffer = malloc(size); - wf_base64_encode((uint8_t const *) data, length, buffer, size); - - json_t * result = json_object(); - json_object_set_new(result, "data", json_string(buffer)); - json_object_set_new(result, "format", json_string("base64")); - json_object_set_new(result, "count", json_integer((int) length)); - - wfp_impl_respond(request, result); - free(buffer); - } - else - { - json_t * result = json_object(); - json_object_set_new(result, "data", json_string("")); - json_object_set_new(result, "format", json_string("identity")); - json_object_set_new(result, "count", json_integer(0)); - - wfp_impl_respond(request, result); - } -} \ No newline at end of file diff --git a/lib/webfuse/provider/impl/operation/read.h b/lib/webfuse/provider/impl/operation/read.h deleted file mode 100644 index 5376ee6..0000000 --- a/lib/webfuse/provider/impl/operation/read.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_OPERATION_READ_H -#define WF_PROVIDER_IMPL_OPERATION_READ_H - -#include "webfuse/provider/impl/provider.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern void wfp_impl_respond_read( - struct wfp_request * request, - char const * data, - size_t length); - -extern void wfp_impl_read( - struct wfp_impl_invokation_context * context, - json_t * params, - int id); - -extern void wfp_impl_read_default( - struct wfp_request * request, - ino_t inode, - uint32_t handle, - size_t offset, - size_t length, - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/lib/webfuse/provider/impl/operation/readdir.c b/lib/webfuse/provider/impl/operation/readdir.c deleted file mode 100644 index 63d59c1..0000000 --- a/lib/webfuse/provider/impl/operation/readdir.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "webfuse/provider/impl/operation/readdir.h" -#include "webfuse/provider/impl/operation/error.h" -#include "webfuse/provider/impl/dirbuffer.h" -#include "webfuse/provider/impl/request.h" -#include "webfuse/core/util.h" - -void wfp_impl_readdir( - struct wfp_impl_invokation_context * context, - json_t * params, - int id) -{ - size_t const count = json_array_size(params); - if (2 == count) - { - json_t * inode_holder = json_array_get(params, 1); - - if (json_is_integer(inode_holder)) - { - ino_t inode = (ino_t) json_integer_value(inode_holder); - struct wfp_request * request = wfp_impl_request_create(context->request, id); - - context->provider->readdir(request, inode, context->user_data); - } - } -} - -void wfp_impl_readdir_default( - struct wfp_request * request, - ino_t WF_UNUSED_PARAM(directory), - void * WF_UNUSED_PARAM(user_data)) -{ - wfp_impl_respond_error(request, WF_BAD_NOENTRY); -} - -void wfp_impl_respond_readdir( - struct wfp_request * request, - struct wfp_dirbuffer * dirbuffer) -{ - json_t * result = wfp_impl_dirbuffer_take(dirbuffer); - wfp_impl_respond(request, result); -} - diff --git a/lib/webfuse/provider/impl/operation/readdir.h b/lib/webfuse/provider/impl/operation/readdir.h deleted file mode 100644 index 80e31af..0000000 --- a/lib/webfuse/provider/impl/operation/readdir.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_OPERATION_READDIR_H -#define WF_PROVIDER_IMPL_OPERATION_READDIR_H - -#include "webfuse/provider/impl/provider.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -extern void wfp_impl_respond_readdir( - struct wfp_request * request, - struct wfp_dirbuffer * dirbuffer); - -extern void wfp_impl_readdir( - struct wfp_impl_invokation_context * context, - json_t * params, - int id); - -extern void wfp_impl_readdir_default( - struct wfp_request * request, - ino_t directory, - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/lib/webfuse/provider/impl/provider.c b/lib/webfuse/provider/impl/provider.c deleted file mode 100644 index 397a563..0000000 --- a/lib/webfuse/provider/impl/provider.c +++ /dev/null @@ -1,125 +0,0 @@ -#include "webfuse/provider/impl/provider.h" - -#include -#include - -#include "webfuse/provider/impl/request.h" -#include "webfuse/provider/impl/operation/lookup.h" -#include "webfuse/provider/impl/operation/getattr.h" -#include "webfuse/provider/impl/operation/readdir.h" -#include "webfuse/provider/impl/operation/open.h" -#include "webfuse/provider/impl/operation/close.h" -#include "webfuse/provider/impl/operation/read.h" - -typedef void wfp_impl_invoke_fn( - struct wfp_impl_invokation_context * context, - json_t * params, - int id); - - -struct wfp_impl_method -{ - char const * name; - wfp_impl_invoke_fn * invoke; - bool is_notification; -}; - -static void wfp_impl_provider_invoke_method( - struct wfp_impl_invokation_context * context, - char const * method_name, - json_t * params, - int id) -{ - static struct wfp_impl_method const methods[] = - { - {"lookup", &wfp_impl_lookup, false}, - {"getattr", &wfp_impl_getattr, false}, - {"readdir", &wfp_impl_readdir, false}, - {"open", &wfp_impl_open, false}, - {"close", &wfp_impl_close, true}, - {"read", &wfp_impl_read, false} - }; - static size_t const count = sizeof(methods) / sizeof(methods[0]); - - for (size_t i = 0; i < count; i++) - { - struct wfp_impl_method const * method = &methods[i]; - if (0 == strcmp(method_name, method->name)) - { - if ((0 < id) || (method->is_notification)) - { - method->invoke(context, params, id); - } - break; - } - } -} - -void wfp_impl_provider_init( - struct wfp_provider * provider) -{ - provider->lookup = &wfp_impl_lookup_default; - provider->getattr = &wfp_impl_getattr_default; - provider->readdir = &wfp_impl_readdir_default; - provider->open = &wfp_impl_open_default; - provider->close = &wfp_impl_close_default; - provider->read = &wfp_impl_read_default; - provider->connected = &wfp_impl_connected_default; - provider->disconnected = &wfp_impl_disconnected_default; - provider->get_credentials = NULL; -} - -void wfp_impl_provider_init_from_prototype( - struct wfp_provider * provider, - struct wfp_provider const * prototype) -{ - provider->lookup = prototype->lookup; - provider->getattr = prototype->getattr; - provider->readdir = prototype->readdir; - provider->open = prototype->open; - provider->close = prototype->close; - provider->read = prototype->read; - provider->connected = prototype->connected; - provider->disconnected = prototype->disconnected; - provider->get_credentials = prototype->get_credentials; -} - -void wfp_impl_provider_invoke( - struct wfp_impl_invokation_context * context, - json_t * request) -{ - json_t * method_holder = json_object_get(request, "method"); - json_t * params = json_object_get(request, "params"); - json_t * id_holder = json_object_get(request, "id"); - - if ((json_is_string(method_holder)) && (json_is_array(params))) - { - char const * method = json_string_value(method_holder); - int id = json_is_integer(id_holder) ? json_integer_value(id_holder) : 0; - - wfp_impl_provider_invoke_method(context, method, params, id); - } -} - -void wfp_impl_connected_default( - void * user_data) -{ - (void) user_data; - - // empty -} - -void wfp_impl_disconnected_default( - void * user_data) -{ - (void) user_data; - - // empty -} - - bool wfp_impl_provider_is_authentication_enabled( - struct wfp_provider * provider) -{ - return (NULL != provider->get_credentials); -} - diff --git a/lib/webfuse/provider/impl/provider.h b/lib/webfuse/provider/impl/provider.h deleted file mode 100644 index aff4420..0000000 --- a/lib/webfuse/provider/impl/provider.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_PROVIDER_H -#define WF_PROVIDER_IMPL_PROVIDER_H - -#ifndef __cplusplus -#include -#endif - -#include -#include "webfuse/provider/client_config.h" - - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_provider -{ - wfp_connected_fn * connected; - wfp_disconnected_fn * disconnected; - wfp_lookup_fn * lookup; - wfp_getattr_fn * getattr; - wfp_readdir_fn * readdir; - wfp_open_fn * open; - wfp_close_fn * close; - wfp_read_fn * read; - wfp_get_credentials_fn * get_credentials; -}; - -struct wfp_impl_invokation_context -{ - struct wfp_provider const * provider; - void * user_data; - struct wfp_request * request; -}; - -extern void wfp_impl_provider_init( - struct wfp_provider * provider); - -extern void wfp_impl_provider_init_from_prototype( - struct wfp_provider * provider, - struct wfp_provider const * prototype); - - -extern void wfp_impl_provider_invoke( - struct wfp_impl_invokation_context * context, - json_t * request); - -extern bool wfp_impl_provider_is_authentication_enabled( - struct wfp_provider * provider); - -extern void wfp_impl_connected_default( - void * user_data); - -extern void wfp_impl_disconnected_default( - void * user_data); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/lib/webfuse/provider/impl/request.c b/lib/webfuse/provider/impl/request.c deleted file mode 100644 index 7f8b05f..0000000 --- a/lib/webfuse/provider/impl/request.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "webfuse/provider/impl/request.h" - -#include -#include "webfuse/provider/impl/operation/error.h" - -struct wfp_request * wfp_impl_request_create( - struct wfp_request * prototype, - int id) -{ - struct wfp_request * request = malloc(sizeof(struct wfp_request)); - request->respond = prototype->respond; - request->user_data = prototype->user_data; - request->id = id; - - return request; -} - -void wfp_impl_request_dispose( - struct wfp_request * request) -{ - free(request); -} - -extern void wfp_impl_respond( - struct wfp_request * request, - json_t * result) -{ - json_t * response = json_object(); - json_object_set_new(response, "result", result); - json_object_set_new(response, "id", json_integer(request->id)); - - request->respond(response, request->user_data); - - json_decref(response); - wfp_impl_request_dispose(request); -} - -void wfp_impl_respond_error( - struct wfp_request * request, - wf_status status) -{ - json_t * response = json_object(); - json_t * error = json_object(); - json_object_set_new(error, "code", json_integer(status)); - json_object_set_new(response, "error", error); - json_object_set_new(response, "id", json_integer(request->id)); - - request->respond(response, request->user_data); - - json_decref(response); - wfp_impl_request_dispose(request); -} \ No newline at end of file diff --git a/lib/webfuse/provider/impl/request.h b/lib/webfuse/provider/impl/request.h deleted file mode 100644 index 8377a80..0000000 --- a/lib/webfuse/provider/impl/request.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef WF_PROVIDER_IMPL_REQUEST_H -#define WF_PROVIDER_IMPL_REQUEST_H - -#include -#include "webfuse/provider/impl/provider.h" -#include "webfuse/core/status.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -typedef void wfp_impl_request_respond_fn( - json_t * response, - void * user_data); - -struct wfp_request -{ - wfp_impl_request_respond_fn * respond; - void * user_data; - int id; -}; - -extern void wfp_impl_respond_error( - struct wfp_request * request, - wf_status status); - -extern struct wfp_request * wfp_impl_request_create( - struct wfp_request * prototype, - int id); - -extern void wfp_impl_request_dispose( - struct wfp_request * request); - -extern void wfp_impl_respond( - struct wfp_request * request, - json_t * result); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/meson.build b/meson.build index 4842fea..b86268c 100644 --- a/meson.build +++ b/meson.build @@ -1,10 +1,8 @@ project('webfuse', 'c', 'cpp', version: '0.4.0', license: 'LGPL-3.0+') -without_adapter = get_option('without_adapter') -without_provider = get_option('without_provider') -without_tests = get_option('without_tests') or without_adapter or without_provider +without_tests = get_option('without_tests') -libwebsockets_dep = dependency('libwebsockets', version: '>=4.0.13', required: false) +libwebsockets_dep = dependency('libwebsockets', version: '>=4.0.0', required: false) if not libwebsockets_dep.found() cmake = import('cmake') libwebsockets = cmake.subproject('libwebsockets') @@ -12,163 +10,86 @@ if not libwebsockets_dep.found() endif jansson_dep = dependency('jansson', version: '>=2.11', fallback: ['jansson', 'jansson_dep']) +libfuse_dep = dependency('fuse3', version: '>=3.8.0', fallback: ['fuse3', 'libfuse_dep']) pkg_config = import('pkgconfig') -# Webfuse core - inc_dir = include_directories('include') private_inc_dir = include_directories('include', 'lib') -webfuse_core = static_library('webfuse_core', - 'lib/webfuse/core/slist.c', - 'lib/webfuse/core/message.c', - 'lib/webfuse/core/message_queue.c', - 'lib/webfuse/core/status.c', - 'lib/webfuse/core/base64.c', - 'lib/webfuse/core/lws_log.c', - 'lib/webfuse/core/json_util.c', - 'lib/webfuse/core/url.c', - 'lib/webfuse/core/timer/manager.c', - 'lib/webfuse/core/timer/timepoint.c', - 'lib/webfuse/core/timer/timer.c', - 'lib/webfuse/core/jsonrpc/proxy.c', - 'lib/webfuse/core/jsonrpc/proxy_variadic.c', - 'lib/webfuse/core/jsonrpc/server.c', - 'lib/webfuse/core/jsonrpc/method.c', - 'lib/webfuse/core/jsonrpc/request.c', - 'lib/webfuse/core/jsonrpc/response.c', - 'lib/webfuse/core/jsonrpc/error.c', - c_args: ['-fvisibility=hidden'], - include_directories: private_inc_dir, - dependencies: [jansson_dep, libwebsockets_dep]) - -webfuse_core_dep = declare_dependency( - include_directories: inc_dir, - link_with: webfuse_core, - dependencies: [jansson_dep, libwebsockets_dep]) - -install_subdir('include/webfuse/core', install_dir: 'include/webfuse') - -# Webfuse provider - -if not without_provider - -webfuse_provider_static = static_library('webfuse_provider', - 'lib/webfuse/provider/api.c', - 'lib/webfuse/provider/impl/client.c', - 'lib/webfuse/provider/impl/client_config.c', - 'lib/webfuse/provider/impl/client_protocol.c', - 'lib/webfuse/provider/impl/provider.c', - 'lib/webfuse/provider/impl/request.c', - 'lib/webfuse/provider/impl/dirbuffer.c', - 'lib/webfuse/provider/impl/credentials.c', - 'lib/webfuse/provider/impl/operation/lookup.c', - 'lib/webfuse/provider/impl/operation/getattr.c', - 'lib/webfuse/provider/impl/operation/readdir.c', - 'lib/webfuse/provider/impl/operation/open.c', - 'lib/webfuse/provider/impl/operation/close.c', - 'lib/webfuse/provider/impl/operation/read.c', +webfuse_static = static_library('webfuse', + 'lib/webfuse/api.c', + 'lib/webfuse/impl/util/slist.c', + 'lib/webfuse/impl/util/base64.c', + 'lib/webfuse/impl/util/lws_log.c', + 'lib/webfuse/impl/util/json_util.c', + 'lib/webfuse/impl/util/url.c', + 'lib/webfuse/impl/timer/manager.c', + 'lib/webfuse/impl/timer/timepoint.c', + 'lib/webfuse/impl/timer/timer.c', + 'lib/webfuse/impl/jsonrpc/proxy.c', + 'lib/webfuse/impl/jsonrpc/proxy_variadic.c', + 'lib/webfuse/impl/jsonrpc/server.c', + 'lib/webfuse/impl/jsonrpc/method.c', + 'lib/webfuse/impl/jsonrpc/request.c', + 'lib/webfuse/impl/jsonrpc/response.c', + 'lib/webfuse/impl/jsonrpc/error.c', + 'lib/webfuse/impl/message.c', + 'lib/webfuse/impl/message_queue.c', + 'lib/webfuse/impl/status.c', + 'lib/webfuse/impl/filesystem.c', + 'lib/webfuse/impl/server.c', + 'lib/webfuse/impl/server_config.c', + 'lib/webfuse/impl/server_protocol.c', + 'lib/webfuse/impl/session.c', + 'lib/webfuse/impl/session_manager.c', + 'lib/webfuse/impl/authenticator.c', + 'lib/webfuse/impl/authenticators.c', + 'lib/webfuse/impl/credentials.c', + 'lib/webfuse/impl/mountpoint.c', + 'lib/webfuse/impl/mountpoint_factory.c', + 'lib/webfuse/impl/operation/context.c', + 'lib/webfuse/impl/operation/lookup.c', + 'lib/webfuse/impl/operation/getattr.c', + 'lib/webfuse/impl/operation/readdir.c', + 'lib/webfuse/impl/operation/open.c', + 'lib/webfuse/impl/operation/close.c', + 'lib/webfuse/impl/operation/read.c', + 'lib/webfuse/impl/client.c', + 'lib/webfuse/impl/client_protocol.c', + 'lib/webfuse/impl/client_tlsconfig.c', c_args: ['-fvisibility=hidden'], include_directories: private_inc_dir, - dependencies: [webfuse_core_dep]) + dependencies: [libfuse_dep, libwebsockets_dep, jansson_dep]) -webfuse_provider_static_dep = declare_dependency( - include_directories: inc_dir, - link_with: webfuse_provider_static, - dependencies: [webfuse_core_dep]) - -webfuse_provider = shared_library('webfuse_provider', - 'lib/webfuse/provider/api.c', - version: meson.project_version(), - c_args: ['-fvisibility=hidden', '-DWFP_API=WFP_EXPORT'], - include_directories: private_inc_dir, - dependencies: [webfuse_provider_static_dep], - install: true) - -webfuse_provider_dep = declare_dependency( +webfuse_static_dep = declare_dependency( include_directories: inc_dir, - link_with: [webfuse_provider], - dependencies: [libwebsockets_dep, jansson_dep]) + link_with: [webfuse_static], + dependencies: [libfuse_dep, libwebsockets_dep, jansson_dep]) -install_headers('include/webfuse_provider.h', subdir: 'webfuse') -install_subdir('include/webfuse/provider', install_dir: 'include/webfuse') - -pkg_config.generate( - libraries: [webfuse_provider], - requires: ['libwebsockets', 'jansson'], - subdirs: '.', - version: meson.project_version(), - name: 'libwebfuse_provider', - filebase: 'webfuse_provider', - description: 'Provider library for websockets filesystem') - -endif - -# Webfuse adapter - -if not without_adapter - -libfuse_dep = dependency('fuse3', version: '>=3.8.0', fallback: ['fuse3', 'libfuse_dep']) - -webfuse_adapter_static = static_library('webfuse_adapter', - 'lib/webfuse/adapter/api.c', - 'lib/webfuse/adapter/impl/filesystem.c', - 'lib/webfuse/adapter/impl/server.c', - 'lib/webfuse/adapter/impl/server_config.c', - 'lib/webfuse/adapter/impl/server_protocol.c', - 'lib/webfuse/adapter/impl/session.c', - 'lib/webfuse/adapter/impl/session_manager.c', - 'lib/webfuse/adapter/impl/authenticator.c', - 'lib/webfuse/adapter/impl/authenticators.c', - 'lib/webfuse/adapter/impl/credentials.c', - 'lib/webfuse/adapter/impl/mountpoint.c', - 'lib/webfuse/adapter/impl/mountpoint_factory.c', - 'lib/webfuse/adapter/impl/operation/context.c', - 'lib/webfuse/adapter/impl/operation/lookup.c', - 'lib/webfuse/adapter/impl/operation/getattr.c', - 'lib/webfuse/adapter/impl/operation/readdir.c', - 'lib/webfuse/adapter/impl/operation/open.c', - 'lib/webfuse/adapter/impl/operation/close.c', - 'lib/webfuse/adapter/impl/operation/read.c', - 'lib/webfuse/adapter/impl/client.c', - 'lib/webfuse/adapter/impl/client_protocol.c', - 'lib/webfuse/adapter/impl/client_tlsconfig.c', - c_args: ['-fvisibility=hidden'], - include_directories: private_inc_dir, - dependencies: [webfuse_core_dep, libfuse_dep]) - -webfuse_adapter_static_dep = declare_dependency( - include_directories: inc_dir, - link_with: [webfuse_adapter_static], - dependencies: [webfuse_core_dep, libfuse_dep]) - -webfuse_adapter = shared_library('webfuse_adapter', - 'lib/webfuse/adapter/api.c', +webfuse = shared_library('webfuse', + 'lib/webfuse/api.c', version: meson.project_version(), c_args: ['-fvisibility=hidden', '-DWF_API=WF_EXPORT'], include_directories: private_inc_dir, - dependencies: [webfuse_adapter_static_dep, libfuse_dep], + dependencies: [webfuse_static_dep, libfuse_dep, libwebsockets_dep, jansson_dep], install: true) -webfuse_adapter_dep = declare_dependency( +webfuse_dep = declare_dependency( include_directories: inc_dir, - link_with: [webfuse_adapter], + link_with: [webfuse], dependencies: [libfuse_dep, libwebsockets_dep, jansson_dep]) -install_headers('include/webfuse_adapter.h', subdir: 'webfuse') -install_subdir('include/webfuse/adapter', install_dir: 'include/webfuse') +install_subdir('include/webfuse', install_dir: 'include') pkg_config.generate( - libraries: [webfuse_adapter], + libraries: [webfuse], requires: ['fuse3', 'libwebsockets', 'jansson'], subdirs: '.', version: meson.project_version(), - name: 'libwebfuse_adapter', - filebase: 'webfuse_adapter', - description: 'Websockets filesystem server library') - -endif + name: 'libwebfuse', + filebase: 'webfuse', + description: 'Websockets filesystem adapter library') # Unit Tests @@ -178,7 +99,7 @@ gtest_dep = dependency('gtest', version: '>=1.10.0', fallback: ['gtest', 'gtest_ gmock_main_dep = dependency('gmock_main', version: '>=1.10.0', fallback: ['gtest', 'gmock_main_dep']) fscheck = executable('fs_check', - 'test/webfuse/tests/integration/fs_check.c') + 'test/webfuse/fs_check/main.c') openssl = find_program('openssl') test_server_certs = custom_target('test_server_certs', @@ -192,83 +113,68 @@ test_certs_dep = declare_dependency( sources: [test_server_certs, test_client_certs]) alltests = executable('alltests', - 'test/webfuse/tests/core/jsonrpc/mock_timer_callback.cc', - 'test/webfuse/tests/core/jsonrpc/mock_timer.cc', - 'test/webfuse/tests/core/jsonrpc/test_is_request.cc', - 'test/webfuse/tests/core/jsonrpc/test_request.cc', - 'test/webfuse/tests/core/jsonrpc/test_is_response.cc', - 'test/webfuse/tests/core/jsonrpc/test_response.cc', - 'test/webfuse/tests/core/jsonrpc/test_server.cc', - 'test/webfuse/tests/core/jsonrpc/test_proxy.cc', - 'test/webfuse/tests/core/jsonrpc/test_response_parser.cc', - 'test/webfuse/tests/core/timer/test_timepoint.cc', - 'test/webfuse/tests/core/timer/test_timer.cc', - 'test/webfuse/utils/tempdir.cc', - 'test/webfuse/utils/file_utils.cc', - 'test/webfuse/utils/timeout_watcher.cc', - 'test/webfuse/utils/path.c', - 'test/webfuse/utils/static_filesystem.c', - 'test/webfuse/utils/ws_server.cc', - 'test/webfuse/utils/ws_server2.cc', - 'test/webfuse/utils/adapter_client.cc', - 'test/webfuse/utils/jansson_test_environment.cc', - 'test/webfuse/mocks/fake_invokation_context.cc', + 'test/webfuse/jsonrpc/mock_timer_callback.cc', + 'test/webfuse/jsonrpc/mock_timer.cc', + 'test/webfuse/jsonrpc/test_is_request.cc', + 'test/webfuse/jsonrpc/test_request.cc', + 'test/webfuse/jsonrpc/test_is_response.cc', + 'test/webfuse/jsonrpc/test_response.cc', + 'test/webfuse/jsonrpc/test_server.cc', + 'test/webfuse/jsonrpc/test_proxy.cc', + 'test/webfuse/jsonrpc/test_response_parser.cc', + 'test/webfuse/timer/test_timepoint.cc', + 'test/webfuse/timer/test_timer.cc', + 'test/webfuse/test_util/mountpoint_factory.cc', + 'test/webfuse/test_util/tempdir.cc', + 'test/webfuse/test_util/server.cc', + 'test/webfuse/test_util/server_protocol.cc', + 'test/webfuse/test_util/ws_server.cc', + 'test/webfuse/test_util/ws_client.cc', + 'test/webfuse/test_util/adapter_client.cc', + 'test/webfuse/test_util/file.cc', + 'test/webfuse/test_util/jansson_test_environment.cc', + 'test/webfuse/test_util/lws_test_environment.cc', 'test/webfuse/mocks/mock_authenticator.cc', - 'test/webfuse/mocks/mock_request.cc', - 'test/webfuse/mocks/mock_provider_client.cc', - 'test/webfuse/mocks/mock_provider.cc', 'test/webfuse/mocks/mock_fuse.cc', 'test/webfuse/mocks/mock_operation_context.cc', 'test/webfuse/mocks/mock_jsonrpc_proxy.cc', 'test/webfuse/mocks/mock_adapter_client_callback.cc', - 'test/webfuse//tests/core/test_util.cc', - 'test/webfuse/tests/core/test_container_of.cc', - 'test/webfuse/tests/core/test_slist.cc', - 'test/webfuse/tests/core/test_base64.cc', - 'test/webfuse/tests/core/test_status.cc', - 'test/webfuse/tests/core/test_message.cc', - 'test/webfuse/tests/core/test_message_queue.cc', - 'test/webfuse/tests/core/test_url.cc', - 'test/webfuse/tests/adapter/test_server.cc', - 'test/webfuse/tests/adapter/test_server_config.cc', - 'test/webfuse/tests/adapter/test_credentials.cc', - 'test/webfuse/tests/adapter/test_authenticator.cc', - 'test/webfuse/tests/adapter/test_authenticators.cc', - 'test/webfuse/tests/adapter/test_mountpoint.cc', - 'test/webfuse/tests/adapter/test_fuse_req.cc', - 'test/webfuse/tests/adapter/operation/test_context.cc', - 'test/webfuse/tests/adapter/operation/test_open.cc', - 'test/webfuse/tests/adapter/operation/test_close.cc', - 'test/webfuse/tests/adapter/operation/test_read.cc', - 'test/webfuse/tests/adapter/operation/test_readdir.cc', - 'test/webfuse/tests/adapter/operation/test_getattr.cc', - 'test/webfuse/tests/adapter/operation/test_lookup.cc', - 'test/webfuse/tests/provider/test_client_protocol.cc', - 'test/webfuse/tests/provider/test_dirbuffer.cc', - 'test/webfuse/tests/provider/operation/test_close.cc', - 'test/webfuse/tests/provider/operation/test_getattr.cc', - 'test/webfuse/tests/provider/operation/test_lookup.cc', - 'test/webfuse/tests/provider/operation/test_open.cc', - 'test/webfuse/tests/provider/operation/test_read.cc', - 'test/webfuse/tests/provider/operation/test_readdir.cc', - 'test/webfuse/tests/integration/test_lowlevel.cc', - 'test/webfuse/tests/integration/test_integration.cc', - 'test/webfuse/tests/integration/file.cc', - 'test/webfuse/tests/integration/server.cc', - 'test/webfuse/tests/integration/provider.cc', - 'test/webfuse/tests/adapter/test_client.cc', - 'test/webfuse/tests/adapter/test_client_tlsconfig.cc', + 'test/webfuse/util/test_util.cc', + 'test/webfuse/util/test_container_of.cc', + 'test/webfuse/util/test_slist.cc', + 'test/webfuse/util/test_base64.cc', + 'test/webfuse/util/test_url.cc', + 'test/webfuse/test_status.cc', + 'test/webfuse/test_message.cc', + 'test/webfuse/test_message_queue.cc', + 'test/webfuse/test_server.cc', + 'test/webfuse/test_server_protocol.cc', + 'test/webfuse/test_server_config.cc', + 'test/webfuse/test_credentials.cc', + 'test/webfuse/test_authenticator.cc', + 'test/webfuse/test_authenticators.cc', + 'test/webfuse/test_mountpoint.cc', + 'test/webfuse/test_fuse_req.cc', + 'test/webfuse/operation/test_context.cc', + 'test/webfuse/operation/test_open.cc', + 'test/webfuse/operation/test_close.cc', + 'test/webfuse/operation/test_read.cc', + 'test/webfuse/operation/test_readdir.cc', + 'test/webfuse/operation/test_getattr.cc', + 'test/webfuse/operation/test_lookup.cc', + 'test/webfuse/test_client.cc', + 'test/webfuse/test_client_tlsconfig.cc', link_args: [ - '-Wl,--wrap=wf_timer_manager_create', - '-Wl,--wrap=wf_timer_manager_dispose', - '-Wl,--wrap=wf_timer_manager_check', - '-Wl,--wrap=wf_timer_create', - '-Wl,--wrap=wf_timer_dispose', - '-Wl,--wrap=wf_timer_start', - '-Wl,--wrap=wf_timer_cancel', + '-Wl,--wrap=wf_impl_timer_manager_create', + '-Wl,--wrap=wf_impl_timer_manager_dispose', + '-Wl,--wrap=wf_impl_timer_manager_check', + '-Wl,--wrap=wf_impl_timer_create', + '-Wl,--wrap=wf_impl_timer_dispose', + '-Wl,--wrap=wf_impl_timer_start', + '-Wl,--wrap=wf_impl_timer_cancel', '-Wl,--wrap=wf_impl_operation_context_get_proxy', - '-Wl,--wrap=wf_jsonrpc_proxy_vinvoke', - '-Wl,--wrap=wf_jsonrpc_proxy_vnotify', + '-Wl,--wrap=wf_impl_jsonrpc_proxy_vinvoke', + '-Wl,--wrap=wf_impl_jsonrpc_proxy_vnotify', '-Wl,--wrap=fuse_req_userdata', '-Wl,--wrap=fuse_reply_open', '-Wl,--wrap=fuse_reply_err', @@ -279,9 +185,7 @@ alltests = executable('alltests', ], include_directories: [private_inc_dir, 'test'], dependencies: [ - webfuse_adapter_static_dep, - webfuse_provider_static_dep, - webfuse_core_dep, + webfuse_static_dep, libwebsockets_dep, libfuse_dep, jansson_dep, diff --git a/meson_options.txt b/meson_options.txt index 81622ad..89f39a5 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,3 +1 @@ option('without_tests', type: 'boolean', value: false, description: 'disable unit tests') -option('without_adapter', type: 'boolean', value: false, description: 'disable adapter library') -option('without_provider', type: 'boolean', value: false, description: 'disable provider library') \ No newline at end of file diff --git a/test/json_matcher.hpp b/test/json_matcher.hpp deleted file mode 100644 index 7822344..0000000 --- a/test/json_matcher.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef WF_JSON_MATCHER_HPP -#define FW_JSON_MATCHER_HPP - -#include -#include - -namespace webfuse_test -{ - -MATCHER_P(JsonMatcher, expected_str, "") -{ - std::cout << "--- JsonMatcher ---" << std::endl; - bool matches = false; - json_t * expected = json_loads(expected_str, 0, nullptr); - if (nullptr != expected) - { - matches = (1 == json_equal(expected, arg)); - if (!matches) - { - char * actual = json_dumps(arg, 0); - std::cout << actual << std::endl; - *result_listener << "where arg is " << actual; - free(actual); - } - - json_decref(expected); - } - - return true; //matches; -} - -} - -#endif diff --git a/test/webfuse/tests/integration/fs_check.c b/test/webfuse/fs_check/main.c similarity index 100% rename from test/webfuse/tests/integration/fs_check.c rename to test/webfuse/fs_check/main.c diff --git a/test/webfuse/jsonrpc/mock_timer.cc b/test/webfuse/jsonrpc/mock_timer.cc new file mode 100644 index 0000000..26ec69f --- /dev/null +++ b/test/webfuse/jsonrpc/mock_timer.cc @@ -0,0 +1,31 @@ +#include "webfuse/jsonrpc/mock_timer.hpp" +#include "webfuse/test_util/wrap.hpp" + +extern "C" +{ +static wf_jsonrpc_test::ITimer * wf_jsonrpc_MockTimer = nullptr; + +WF_WRAP_FUNC0(wf_jsonrpc_MockTimer, wf_timer_manager *, wf_impl_timer_manager_create); +WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_impl_timer_manager_dispose, wf_timer_manager *); +WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_impl_timer_manager_check, wf_timer_manager *); + +WF_WRAP_FUNC3(wf_jsonrpc_MockTimer, wf_timer *, wf_impl_timer_create, wf_timer_manager *, wf_timer_on_timer_fn *, void *); +WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_impl_timer_dispose, wf_timer *); +WF_WRAP_FUNC2(wf_jsonrpc_MockTimer, void, wf_impl_timer_start, wf_timer *, int); +WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_impl_timer_cancel, wf_timer *); + +} + +namespace wf_jsonrpc_test +{ +MockTimer::MockTimer() +{ + wf_jsonrpc_MockTimer = this; +} + +MockTimer::~MockTimer() +{ + wf_jsonrpc_MockTimer = nullptr; +} + +} \ No newline at end of file diff --git a/test/webfuse/jsonrpc/mock_timer.hpp b/test/webfuse/jsonrpc/mock_timer.hpp new file mode 100644 index 0000000..832d602 --- /dev/null +++ b/test/webfuse/jsonrpc/mock_timer.hpp @@ -0,0 +1,48 @@ +#ifndef WF_JSONRPC_MOCK_TIMERMANAGER_HPP +#define WF_JSONRPC_MOCK_TIMERMANAGER_HPP + +#include "webfuse/impl/timer/timer.h" +#include "webfuse/impl/timer/manager.h" +#include + +namespace wf_jsonrpc_test +{ + +class ITimer +{ +public: + virtual ~ITimer() = default; + virtual wf_timer_manager * wf_impl_timer_manager_create() = 0; + virtual void wf_impl_timer_manager_dispose(wf_timer_manager * manager) = 0; + virtual void wf_impl_timer_manager_check(wf_timer_manager * manager) = 0; + virtual wf_timer * wf_impl_timer_create( + wf_timer_manager * manager, + wf_timer_on_timer_fn * on_timer, + void * user_data) = 0; + virtual void wf_impl_timer_dispose(wf_timer * timer) = 0; + virtual void wf_impl_timer_start(wf_timer * timer, int timeout_ms) = 0; + virtual void wf_impl_timer_cancel(wf_timer * timer) = 0; +}; + +class MockTimer: public ITimer +{ +public: + MockTimer(); + ~MockTimer() override; + MOCK_METHOD0(wf_impl_timer_manager_create, wf_timer_manager * ()); + MOCK_METHOD1(wf_impl_timer_manager_dispose, void(wf_timer_manager * manager)); + MOCK_METHOD1(wf_impl_timer_manager_check, void (wf_timer_manager * manager)); + MOCK_METHOD3(wf_impl_timer_create, wf_timer *( + wf_timer_manager * manager, + wf_timer_on_timer_fn * on_timer, + void * user_data)); + MOCK_METHOD1(wf_impl_timer_dispose, void (wf_timer * timer)); + MOCK_METHOD2(wf_impl_timer_start, void (wf_timer * timer, int timeout_ms)); + MOCK_METHOD1(wf_impl_timer_cancel, void (wf_timer * timer)); + +}; + + +} + +#endif diff --git a/test/webfuse/tests/core/jsonrpc/mock_timer_callback.cc b/test/webfuse/jsonrpc/mock_timer_callback.cc similarity index 90% rename from test/webfuse/tests/core/jsonrpc/mock_timer_callback.cc rename to test/webfuse/jsonrpc/mock_timer_callback.cc index 7e62c31..d1cdc00 100644 --- a/test/webfuse/tests/core/jsonrpc/mock_timer_callback.cc +++ b/test/webfuse/jsonrpc/mock_timer_callback.cc @@ -1,4 +1,4 @@ -#include "webfuse/tests/core/jsonrpc/mock_timer_callback.hpp" +#include "webfuse/jsonrpc/mock_timer_callback.hpp" extern "C" { diff --git a/test/webfuse/tests/core/jsonrpc/mock_timer_callback.hpp b/test/webfuse/jsonrpc/mock_timer_callback.hpp similarity index 89% rename from test/webfuse/tests/core/jsonrpc/mock_timer_callback.hpp rename to test/webfuse/jsonrpc/mock_timer_callback.hpp index e55b7e1..51bfb3d 100644 --- a/test/webfuse/tests/core/jsonrpc/mock_timer_callback.hpp +++ b/test/webfuse/jsonrpc/mock_timer_callback.hpp @@ -1,7 +1,7 @@ #ifndef WF_JSONRPC_MOCK_TIMERCALLBACK_HPP #define WF_JSONRPC_MOCK_TIMERCALLBACK_HPP -#include "webfuse/core/timer/on_timer_fn.h" +#include "webfuse/impl/timer/on_timer_fn.h" #include namespace wf_jsonrpc_test diff --git a/test/webfuse/tests/core/jsonrpc/test_is_request.cc b/test/webfuse/jsonrpc/test_is_request.cc similarity index 82% rename from test/webfuse/tests/core/jsonrpc/test_is_request.cc rename to test/webfuse/jsonrpc/test_is_request.cc index 4599611..eca0b00 100644 --- a/test/webfuse/tests/core/jsonrpc/test_is_request.cc +++ b/test/webfuse/jsonrpc/test_is_request.cc @@ -1,5 +1,5 @@ #include -#include "webfuse/core/jsonrpc/request.h" +#include "webfuse/impl/jsonrpc/request.h" TEST(wf_jsonrpc_is_request, request_with_object_params) { @@ -8,7 +8,7 @@ TEST(wf_jsonrpc_is_request, request_with_object_params) json_object_set_new(request, "params", json_object()); json_object_set_new(request, "id", json_integer(42)); - ASSERT_TRUE(wf_jsonrpc_is_request(request)); + ASSERT_TRUE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -20,14 +20,14 @@ TEST(wf_jsonrpc_is_request, request_with_array_params) json_object_set_new(request, "params", json_array()); json_object_set_new(request, "id", json_integer(42)); - ASSERT_TRUE(wf_jsonrpc_is_request(request)); + ASSERT_TRUE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } TEST(wf_jsonrpc_is_request, null_request) { - ASSERT_FALSE(wf_jsonrpc_is_request(nullptr)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(nullptr)); } TEST(wf_jsonrpc_is_request, invalid_request) @@ -37,7 +37,7 @@ TEST(wf_jsonrpc_is_request, invalid_request) json_array_append_new(request, json_object()); json_array_append_new(request, json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -48,7 +48,7 @@ TEST(wf_jsonrpc_is_request, invalid_request_without_id) json_object_set_new(request, "method", json_string("method")); json_object_set_new(request, "params", json_object()); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -60,7 +60,7 @@ TEST(wf_jsonrpc_is_request, invalid_request_due_to_invalid_id) json_object_set_new(request, "params", json_object()); json_object_set_new(request, "id", json_string("42")); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -71,7 +71,7 @@ TEST(wf_jsonrpc_is_request, invalid_request_without_method) json_object_set_new(request, "params", json_object()); json_object_set_new(request, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -83,7 +83,7 @@ TEST(wf_jsonrpc_is_request, invalid_request_due_to_invalid_method) json_object_set_new(request, "params", json_object()); json_object_set_new(request, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -94,7 +94,7 @@ TEST(wf_jsonrpc_is_request, invalid_request_without_params) json_object_set_new(request, "method", json_string("method")); json_object_set_new(request, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -106,7 +106,7 @@ TEST(wf_jsonrpc_is_request, invalid_request_due_to_invalid_params) json_object_set_new(request, "params", json_string("params")); json_object_set_new(request, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } diff --git a/test/webfuse/tests/core/jsonrpc/test_is_response.cc b/test/webfuse/jsonrpc/test_is_response.cc similarity index 77% rename from test/webfuse/tests/core/jsonrpc/test_is_response.cc rename to test/webfuse/jsonrpc/test_is_response.cc index 908ddf0..550ce53 100644 --- a/test/webfuse/tests/core/jsonrpc/test_is_response.cc +++ b/test/webfuse/jsonrpc/test_is_response.cc @@ -1,5 +1,5 @@ #include -#include "webfuse/core/jsonrpc/response.h" +#include "webfuse/impl/jsonrpc/response.h" TEST(wf_jsonrpc_is_response, valid_result) { @@ -7,7 +7,7 @@ TEST(wf_jsonrpc_is_response, valid_result) json_object_set_new(message, "result", json_object()); json_object_set_new(message, "id", json_integer(42)); - ASSERT_TRUE(wf_jsonrpc_is_response(message)); + ASSERT_TRUE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } @@ -18,7 +18,7 @@ TEST(wf_jsonrpc_is_response, valid_result_string) json_object_set_new(message, "result", json_string("also valid")); json_object_set_new(message, "id", json_integer(42)); - ASSERT_TRUE(wf_jsonrpc_is_response(message)); + ASSERT_TRUE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } @@ -29,14 +29,14 @@ TEST(wf_jsonrpc_is_response, valid_error) json_object_set_new(message, "error", json_object()); json_object_set_new(message, "id", json_integer(42)); - ASSERT_TRUE(wf_jsonrpc_is_response(message)); + ASSERT_TRUE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } TEST(wf_jsonrpc_is_response, invalid_null) { - ASSERT_FALSE(wf_jsonrpc_is_response(nullptr)); + ASSERT_FALSE(wf_impl_jsonrpc_is_response(nullptr)); } TEST(wf_jsonrpc_is_response, invalid_message) @@ -45,7 +45,7 @@ TEST(wf_jsonrpc_is_response, invalid_message) json_array_append_new(message, json_object()); json_array_append_new(message, json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_response(message)); + ASSERT_FALSE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } @@ -55,7 +55,7 @@ TEST(wf_jsonrpc_is_response, invalid_missing_id) json_t * message = json_object(); json_object_set_new(message, "result", json_object()); - ASSERT_FALSE(wf_jsonrpc_is_response(message)); + ASSERT_FALSE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } @@ -66,7 +66,7 @@ TEST(wf_jsonrpc_is_response, invalid_id_wrong_type) json_object_set_new(message, "result", json_object()); json_object_set_new(message, "id", json_string("42")); - ASSERT_FALSE(wf_jsonrpc_is_response(message)); + ASSERT_FALSE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } @@ -77,7 +77,7 @@ TEST(wf_jsonrpc_is_response, invalid_missing_result_and_error) json_t * message = json_object(); json_object_set_new(message, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_response(message)); + ASSERT_FALSE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } @@ -88,7 +88,7 @@ TEST(wf_jsonrpc_is_response, invalid_error_wrong_type) json_object_set_new(message, "error", json_array()); json_object_set_new(message, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_response(message)); + ASSERT_FALSE(wf_impl_jsonrpc_is_response(message)); json_decref(message); } diff --git a/test/webfuse/tests/core/jsonrpc/test_proxy.cc b/test/webfuse/jsonrpc/test_proxy.cc similarity index 64% rename from test/webfuse/tests/core/jsonrpc/test_proxy.cc rename to test/webfuse/jsonrpc/test_proxy.cc index e594e89..c23ef2e 100644 --- a/test/webfuse/tests/core/jsonrpc/test_proxy.cc +++ b/test/webfuse/jsonrpc/test_proxy.cc @@ -1,9 +1,9 @@ #include -#include "webfuse/core/jsonrpc/proxy.h" -#include "webfuse/core/status.h" -#include "webfuse/core/timer/manager.h" +#include "webfuse/impl/jsonrpc/proxy.h" +#include "webfuse/status.h" +#include "webfuse/impl/timer/manager.h" -#include "webfuse/tests/core/jsonrpc/mock_timer.hpp" +#include "webfuse/jsonrpc/mock_timer.hpp" #include #include @@ -101,29 +101,29 @@ namespace TEST(wf_jsonrpc_proxy, init) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext context; void * user_data = reinterpret_cast(&context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, user_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, user_data); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); ASSERT_FALSE(context.is_called); } TEST(wf_jsonrpc_proxy, invoke) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); @@ -145,8 +145,8 @@ TEST(wf_jsonrpc_proxy, invoke) ASSERT_FALSE(finished_context.is_called); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); ASSERT_TRUE(finished_context.is_called); ASSERT_FALSE(nullptr == finished_context.error); @@ -154,15 +154,15 @@ TEST(wf_jsonrpc_proxy, invoke) TEST(wf_jsonrpc_proxy, invoke_calls_finish_if_send_fails) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context(false); void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); @@ -170,25 +170,25 @@ TEST(wf_jsonrpc_proxy, invoke_calls_finish_if_send_fails) ASSERT_TRUE(finished_context.is_called); ASSERT_FALSE(nullptr == finished_context.error); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, invoke_fails_if_another_request_is_pending) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); FinishedContext finished_context2; void * finished_data2 = reinterpret_cast(&finished_context2); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data2, "foo", ""); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data2, "foo", ""); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); @@ -198,42 +198,42 @@ TEST(wf_jsonrpc_proxy, invoke_fails_if_another_request_is_pending) ASSERT_TRUE(finished_context2.is_called); ASSERT_EQ(WF_BAD_BUSY, jsonrpc_get_status(finished_context2.error)); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, invoke_fails_if_request_is_invalid) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "?", "error"); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "?", "error"); ASSERT_FALSE(send_context.is_called); ASSERT_TRUE(finished_context.is_called); ASSERT_EQ(WF_BAD, jsonrpc_get_status(finished_context.error)); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, on_result) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); @@ -245,7 +245,7 @@ TEST(wf_jsonrpc_proxy, on_result) json_object_set_new(response, "result", json_string("okay")); json_object_set(response, "id", id); - wf_jsonrpc_proxy_onresult(proxy, response); + wf_impl_jsonrpc_proxy_onresult(proxy, response); json_decref(response); ASSERT_TRUE(finished_context.is_called); @@ -253,21 +253,21 @@ TEST(wf_jsonrpc_proxy, on_result) ASSERT_TRUE(json_is_string(finished_context.result)); ASSERT_STREQ("okay", json_string_value(finished_context.result)); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, on_result_reject_response_with_unknown_id) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); @@ -279,75 +279,75 @@ TEST(wf_jsonrpc_proxy, on_result_reject_response_with_unknown_id) json_object_set_new(response, "result", json_string("okay")); json_object_set_new(response, "id", json_integer(1 + json_integer_value(id))); - wf_jsonrpc_proxy_onresult(proxy, response); + wf_impl_jsonrpc_proxy_onresult(proxy, response); json_decref(response); ASSERT_FALSE(finished_context.is_called); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, timeout) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, 0, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, 0, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); std::this_thread::sleep_for(10ms); - wf_timer_manager_check(timer_manager); + wf_impl_timer_manager_check(timer_manager); ASSERT_TRUE(finished_context.is_called); ASSERT_EQ(WF_BAD_TIMEOUT, jsonrpc_get_status(finished_context.error)); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, cleanup_pending_request) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, 10, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, 10, &jsonrpc_send, send_data); FinishedContext finished_context; void * finished_data = reinterpret_cast(&finished_context); - wf_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_invoke(proxy, &jsonrpc_finished, finished_data, "foo", "si", "bar", 42); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); ASSERT_FALSE(finished_context.is_called); - wf_jsonrpc_proxy_dispose(proxy); + wf_impl_jsonrpc_proxy_dispose(proxy); ASSERT_TRUE(finished_context.is_called); - wf_timer_manager_dispose(timer_manager); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, notify) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); - wf_jsonrpc_proxy_notify(proxy, "foo", "si", "bar", 42); + wf_impl_jsonrpc_proxy_notify(proxy, "foo", "si", "bar", 42); ASSERT_TRUE(send_context.is_called); ASSERT_TRUE(json_is_object(send_context.response)); @@ -367,24 +367,24 @@ TEST(wf_jsonrpc_proxy, notify) json_t * id = json_object_get(send_context.response, "id"); ASSERT_EQ(nullptr, id); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, notify_dont_send_invalid_request) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); - wf_jsonrpc_proxy_notify(proxy, "foo", "?"); + wf_impl_jsonrpc_proxy_notify(proxy, "foo", "?"); ASSERT_FALSE(send_context.is_called); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } TEST(wf_jsonrpc_proxy, swallow_timeout_if_no_request_pending) @@ -393,38 +393,38 @@ TEST(wf_jsonrpc_proxy, swallow_timeout_if_no_request_pending) wf_timer_on_timer_fn * on_timer = nullptr; void * timer_context = nullptr; - EXPECT_CALL(timer_api, wf_timer_create(_, _, _)) + EXPECT_CALL(timer_api, wf_impl_timer_create(_, _, _)) .Times(1) .WillOnce(DoAll(SaveArg<1>(&on_timer), SaveArg<2>(&timer_context), Return(nullptr))); - EXPECT_CALL(timer_api, wf_timer_dispose(_)).Times(1); + EXPECT_CALL(timer_api, wf_impl_timer_dispose(_)).Times(1); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(nullptr, 1, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(nullptr, 1, &jsonrpc_send, send_data); on_timer(nullptr, timer_context); ASSERT_FALSE(send_context.is_called); - wf_jsonrpc_proxy_dispose(proxy); + wf_impl_jsonrpc_proxy_dispose(proxy); } TEST(wf_jsonrpc_proxy, on_result_swallow_if_no_request_pending) { - struct wf_timer_manager * timer_manager = wf_timer_manager_create(); + struct wf_timer_manager * timer_manager = wf_impl_timer_manager_create(); SendContext send_context; void * send_data = reinterpret_cast(&send_context); - struct wf_jsonrpc_proxy * proxy = wf_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); + struct wf_jsonrpc_proxy * proxy = wf_impl_jsonrpc_proxy_create(timer_manager, WF_DEFAULT_TIMEOUT, &jsonrpc_send, send_data); json_t * response = json_object(); json_object_set_new(response, "result", json_string("okay")); json_object_set_new(response, "id", json_integer(42)); - wf_jsonrpc_proxy_onresult(proxy, response); + wf_impl_jsonrpc_proxy_onresult(proxy, response); json_decref(response); - wf_jsonrpc_proxy_dispose(proxy); - wf_timer_manager_dispose(timer_manager); + wf_impl_jsonrpc_proxy_dispose(proxy); + wf_impl_timer_manager_dispose(timer_manager); } diff --git a/test/webfuse/tests/core/jsonrpc/test_request.cc b/test/webfuse/jsonrpc/test_request.cc similarity index 81% rename from test/webfuse/tests/core/jsonrpc/test_request.cc rename to test/webfuse/jsonrpc/test_request.cc index 8d37a9f..6152ecb 100644 --- a/test/webfuse/tests/core/jsonrpc/test_request.cc +++ b/test/webfuse/jsonrpc/test_request.cc @@ -1,6 +1,6 @@ #include -#include "webfuse/core/jsonrpc/request.h" -#include "webfuse/core/status.h" +#include "webfuse/impl/jsonrpc/request.h" +#include "webfuse/status.h" namespace { @@ -29,12 +29,12 @@ TEST(wf_jsonrpc_request, create_dispose) void * user_data = reinterpret_cast(&context); struct wf_jsonrpc_request * request = - wf_jsonrpc_request_create(42, &jsonrpc_send, user_data); + wf_impl_jsonrpc_request_create(42, &jsonrpc_send, user_data); ASSERT_NE(nullptr, request); - ASSERT_EQ(user_data, wf_jsonrpc_request_get_userdata(request)); + ASSERT_EQ(user_data, wf_impl_jsonrpc_request_get_userdata(request)); - wf_jsonrpc_request_dispose(request); + wf_impl_jsonrpc_request_dispose(request); } TEST(wf_jsonrpc_request, respond) @@ -43,9 +43,9 @@ TEST(wf_jsonrpc_request, respond) void * user_data = reinterpret_cast(&context); struct wf_jsonrpc_request * request = - wf_jsonrpc_request_create(42, &jsonrpc_send, user_data); + wf_impl_jsonrpc_request_create(42, &jsonrpc_send, user_data); - wf_jsonrpc_respond(request, json_string("okay")); + wf_impl_jsonrpc_respond(request, json_string("okay")); ASSERT_NE(nullptr, context.response); @@ -72,9 +72,9 @@ TEST(wf_jsonrpc_request, respond_error) void * user_data = reinterpret_cast(&context); struct wf_jsonrpc_request * request = - wf_jsonrpc_request_create(42, &jsonrpc_send, user_data); + wf_impl_jsonrpc_request_create(42, &jsonrpc_send, user_data); - wf_jsonrpc_respond_error(request, WF_BAD, "Bad"); + wf_impl_jsonrpc_respond_error(request, WF_BAD, "Bad"); ASSERT_NE(nullptr, context.response); @@ -109,7 +109,7 @@ TEST(wf_jsonrpc_request, is_request_object_params) json_object_set_new(request, "params", json_object()); json_object_set_new(request, "id", json_integer(42)); - ASSERT_TRUE(wf_jsonrpc_is_request(request)); + ASSERT_TRUE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -120,7 +120,7 @@ TEST(wf_jsonrpc_request, is_request_fail_missing_params) json_object_set_new(request, "method", json_string("some_method")); json_object_set_new(request, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } @@ -132,7 +132,7 @@ TEST(wf_jsonrpc_request, is_request_fail_params_wrong_type) json_object_set_new(request, "params", json_string("invalid_params")); json_object_set_new(request, "id", json_integer(42)); - ASSERT_FALSE(wf_jsonrpc_is_request(request)); + ASSERT_FALSE(wf_impl_jsonrpc_is_request(request)); json_decref(request); } diff --git a/test/webfuse/tests/core/jsonrpc/test_response.cc b/test/webfuse/jsonrpc/test_response.cc similarity index 81% rename from test/webfuse/tests/core/jsonrpc/test_response.cc rename to test/webfuse/jsonrpc/test_response.cc index f6ef9e7..0a92b29 100644 --- a/test/webfuse/tests/core/jsonrpc/test_response.cc +++ b/test/webfuse/jsonrpc/test_response.cc @@ -1,6 +1,6 @@ #include -#include "webfuse/core/jsonrpc/response_intern.h" -#include "webfuse/core/status.h" +#include "webfuse/impl/jsonrpc/response_intern.h" +#include "webfuse/status.h" TEST(wf_json_response, init_result) { @@ -9,14 +9,14 @@ TEST(wf_json_response, init_result) json_object_set_new(message, "id", json_integer(11)); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(nullptr, response.error); ASSERT_TRUE(json_is_integer(response.result)); ASSERT_EQ(47, json_integer_value(response.result)); ASSERT_EQ(11, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } @@ -30,14 +30,14 @@ TEST(wf_json_response, init_error) json_object_set_new(message, "id", json_integer(23)); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(42, json_integer_value(json_object_get(response.error, "code"))); ASSERT_STREQ("Don't Panic!", json_string_value(json_object_get(response.error, "message"))); ASSERT_EQ(nullptr, response.result); ASSERT_EQ(23, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } @@ -47,13 +47,13 @@ TEST(wf_json_response, init_fail_missing_result_and_error) json_object_set_new(message, "id", json_integer(12)); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(WF_BAD_FORMAT, json_integer_value(json_object_get(response.error, "code"))); ASSERT_EQ(nullptr, response.result); ASSERT_EQ(12, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } @@ -63,13 +63,13 @@ TEST(wf_json_response, init_fail_missing_id) json_object_set_new(message, "result", json_integer(47)); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(WF_BAD_FORMAT, json_integer_value(json_object_get(response.error, "code"))); ASSERT_EQ(nullptr, response.result); ASSERT_EQ(-1, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } @@ -80,13 +80,13 @@ TEST(wf_json_response, init_fail_wrong_id_type) json_object_set_new(message, "id", json_string("42")); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(WF_BAD_FORMAT, json_integer_value(json_object_get(response.error, "code"))); ASSERT_EQ(nullptr, response.result); ASSERT_EQ(-1, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } @@ -99,13 +99,13 @@ TEST(wf_json_response, init_fail_error_missing_code) json_object_set_new(message, "id", json_integer(23)); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(WF_BAD_FORMAT, json_integer_value(json_object_get(response.error, "code"))); ASSERT_EQ(nullptr, response.result); ASSERT_EQ(23, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } @@ -119,13 +119,13 @@ TEST(wf_json_response, init_fail_error_wrong_code_type) json_object_set_new(message, "id", json_integer(23)); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(WF_BAD_FORMAT, json_integer_value(json_object_get(response.error, "code"))); ASSERT_EQ(nullptr, response.result); ASSERT_EQ(23, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } @@ -136,12 +136,12 @@ TEST(wf_json_response, init_fail_error_wrong_type) json_object_set_new(message, "id", json_integer(23)); struct wf_jsonrpc_response response; - wf_jsonrpc_response_init(&response, message); + wf_impl_jsonrpc_response_init(&response, message); ASSERT_EQ(WF_BAD_FORMAT, json_integer_value(json_object_get(response.error, "code"))); ASSERT_EQ(nullptr, response.result); ASSERT_EQ(23, response.id); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); json_decref(message); } diff --git a/test/webfuse/tests/core/jsonrpc/test_response_parser.cc b/test/webfuse/jsonrpc/test_response_parser.cc similarity index 79% rename from test/webfuse/tests/core/jsonrpc/test_response_parser.cc rename to test/webfuse/jsonrpc/test_response_parser.cc index f9941c1..7d944d4 100644 --- a/test/webfuse/tests/core/jsonrpc/test_response_parser.cc +++ b/test/webfuse/jsonrpc/test_response_parser.cc @@ -1,7 +1,7 @@ #include #include -#include "webfuse/core/jsonrpc/response_intern.h" +#include "webfuse/impl/jsonrpc/response_intern.h" static void response_parse_str( @@ -11,7 +11,7 @@ static void response_parse_str( json_t * message = json_loadb(buffer.c_str(), buffer.size(), 0, nullptr); if (nullptr != message) { - wf_jsonrpc_response_init(response, message); + wf_impl_jsonrpc_response_init(response, message); json_decref(message); } } @@ -25,21 +25,21 @@ TEST(response_parser, test) ASSERT_NE(nullptr, response.error); ASSERT_EQ(-1, response.id); ASSERT_EQ(nullptr, response.result); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); // empty response_parse_str("{}", &response); ASSERT_NE(nullptr, response.error); ASSERT_EQ(-1, response.id); ASSERT_EQ(nullptr, response.result); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); // no data response_parse_str("{\"id\":42}", &response); ASSERT_NE(nullptr, response.error); ASSERT_EQ(42, response.id); ASSERT_EQ(nullptr, response.result); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); // custom error code response_parse_str("{\"error\":{\"code\": 42}, \"id\": 42}", &response); @@ -47,12 +47,12 @@ TEST(response_parser, test) ASSERT_EQ(42, json_integer_value(json_object_get(response.error, "code"))); ASSERT_EQ(42, response.id); ASSERT_EQ(nullptr, response.result); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); // valid response response_parse_str("{\"result\": true, \"id\": 42}", &response); ASSERT_EQ(nullptr, response.error); ASSERT_EQ(42, response.id); ASSERT_NE(nullptr, response.result); - wf_jsonrpc_response_cleanup(&response); + wf_impl_jsonrpc_response_cleanup(&response); } diff --git a/test/webfuse/tests/core/jsonrpc/test_server.cc b/test/webfuse/jsonrpc/test_server.cc similarity index 73% rename from test/webfuse/tests/core/jsonrpc/test_server.cc rename to test/webfuse/jsonrpc/test_server.cc index 688028f..c9425d5 100644 --- a/test/webfuse/tests/core/jsonrpc/test_server.cc +++ b/test/webfuse/jsonrpc/test_server.cc @@ -1,7 +1,7 @@ #include -#include "webfuse/core/jsonrpc/server.h" -#include "webfuse/core/jsonrpc/request.h" -#include "webfuse/core/status.h" +#include "webfuse/impl/jsonrpc/server.h" +#include "webfuse/impl/jsonrpc/request.h" +#include "webfuse/status.h" namespace { @@ -34,15 +34,15 @@ namespace (void) user_data; json_t * result = json_string("Hello"); - wf_jsonrpc_respond(request, result); + wf_impl_jsonrpc_respond(request, result); } } TEST(wf_jsonrpc_server, process_request) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); - wf_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); + wf_impl_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); @@ -50,7 +50,7 @@ TEST(wf_jsonrpc_server, process_request) json_object_set_new(request, "method", json_string("sayHello")); json_object_set_new(request, "params", json_array()); json_object_set_new(request, "id", json_integer(23)); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_TRUE(context.is_called); ASSERT_NE(nullptr, context.response); @@ -66,13 +66,13 @@ TEST(wf_jsonrpc_server, process_request) json_decref(context.response); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, process_request_with_oject_params) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); - wf_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); + wf_impl_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); @@ -80,7 +80,7 @@ TEST(wf_jsonrpc_server, process_request_with_oject_params) json_object_set_new(request, "method", json_string("sayHello")); json_object_set_new(request, "params", json_object()); json_object_set_new(request, "id", json_integer(23)); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_TRUE(context.is_called); ASSERT_NE(nullptr, context.response); @@ -96,13 +96,13 @@ TEST(wf_jsonrpc_server, process_request_with_oject_params) json_decref(context.response); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, invoke_unknown_method) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); - wf_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); + wf_impl_jsonrpc_server_add(server, "sayHello", &sayHello, nullptr); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); @@ -110,7 +110,7 @@ TEST(wf_jsonrpc_server, invoke_unknown_method) json_object_set_new(request, "method", json_string("greet")); json_object_set_new(request, "params", json_array()); json_object_set_new(request, "id", json_integer(42)); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_TRUE(context.is_called); ASSERT_NE(nullptr, context.response); @@ -132,29 +132,29 @@ TEST(wf_jsonrpc_server, invoke_unknown_method) json_decref(context.response); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, skip_invalid_request_missing_id) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); json_t * request = json_object(); json_object_set_new(request, "method", json_string("sayHello")); json_object_set_new(request, "params", json_array()); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_FALSE(context.is_called); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, skip_invalid_request_wrong_id_type) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); @@ -162,34 +162,34 @@ TEST(wf_jsonrpc_server, skip_invalid_request_wrong_id_type) json_object_set_new(request, "method", json_string("sayHello")); json_object_set_new(request, "params", json_array()); json_object_set_new(request, "id", json_string("42")); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_FALSE(context.is_called); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, skip_invalid_request_missing_params) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); json_t * request = json_object(); json_object_set_new(request, "method", json_string("sayHello")); json_object_set_new(request, "id", json_integer(42)); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_FALSE(context.is_called); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, skip_invalid_request_wrong_params_type) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); @@ -197,34 +197,34 @@ TEST(wf_jsonrpc_server, skip_invalid_request_wrong_params_type) json_object_set_new(request, "method", json_string("sayHello")); json_object_set_new(request, "params", json_string("invalid")); json_object_set_new(request, "id", json_integer(42)); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_FALSE(context.is_called); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, skip_invalid_request_missing_method) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); json_t * request = json_object(); json_object_set_new(request, "params", json_array()); json_object_set_new(request, "id", json_integer(42)); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_FALSE(context.is_called); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } TEST(wf_jsonrpc_server, skip_invalid_request_wront_method_type) { - struct wf_jsonrpc_server * server = wf_jsonrpc_server_create(); + struct wf_jsonrpc_server * server = wf_impl_jsonrpc_server_create(); Context context{nullptr, false}; void * user_data = reinterpret_cast(&context); @@ -232,10 +232,10 @@ TEST(wf_jsonrpc_server, skip_invalid_request_wront_method_type) json_object_set_new(request, "method", json_integer(42)); json_object_set_new(request, "params", json_array()); json_object_set_new(request, "id", json_integer(42)); - wf_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); + wf_impl_jsonrpc_server_process(server, request, &jsonrpc_send, user_data); ASSERT_FALSE(context.is_called); json_decref(request); - wf_jsonrpc_server_dispose(server); + wf_impl_jsonrpc_server_dispose(server); } \ No newline at end of file diff --git a/test/webfuse/mocks/fake_invokation_context.cc b/test/webfuse/mocks/fake_invokation_context.cc deleted file mode 100644 index 4aea3ee..0000000 --- a/test/webfuse/mocks/fake_invokation_context.cc +++ /dev/null @@ -1,17 +0,0 @@ -#include "webfuse/mocks/fake_invokation_context.hpp" - -namespace webfuse_test -{ - -wfp_impl_invokation_context create_context(MockProvider& provider, wfp_request * request) -{ - wfp_impl_invokation_context context = - { - provider.get_provider(), - provider.get_userdata(), - request - }; - return context; -} - -} \ No newline at end of file diff --git a/test/webfuse/mocks/fake_invokation_context.hpp b/test/webfuse/mocks/fake_invokation_context.hpp deleted file mode 100644 index 07eb971..0000000 --- a/test/webfuse/mocks/fake_invokation_context.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef FAKE_INVOCATION_CONTEXT_HPP -#define FAKE_INVOCATION_CONTEXT_HPP - -#include "webfuse/provider/impl/provider.h" -#include "webfuse/mocks/mock_provider.hpp" - -namespace webfuse_test -{ - -wfp_impl_invokation_context create_context( - MockProvider& provider, - wfp_request * request = nullptr); - -} - -#endif \ No newline at end of file diff --git a/test/webfuse/mocks/getattr_matcher.hpp b/test/webfuse/mocks/getattr_matcher.hpp new file mode 100644 index 0000000..71094c7 --- /dev/null +++ b/test/webfuse/mocks/getattr_matcher.hpp @@ -0,0 +1,36 @@ +#ifndef WF_GETATTR_MATCHER_HPP +#define WF_GETATTR_MATCHER_HPP + +#include +#include + +namespace webfuse_test +{ + +MATCHER_P(GetAttr, inode, "") +{ + if (!json_is_array(arg)) + { + *result_listener << "json array expected"; + return false; + } + + json_t * inode_ = json_array_get(arg, 1); + if (!json_is_integer(inode_)) + { + *result_listener << "inode is expectoed to an integer"; + return false; + } + + if (inode != json_integer_value(inode_)) + { + *result_listener << "inode mismatch: expected" << inode + << " but was " << json_integer_value(inode_); + } + + return true; +} + +} + +#endif diff --git a/test/webfuse/mocks/mock_adapter_client_callback.cc b/test/webfuse/mocks/mock_adapter_client_callback.cc index 4407497..e6d2e6a 100644 --- a/test/webfuse/mocks/mock_adapter_client_callback.cc +++ b/test/webfuse/mocks/mock_adapter_client_callback.cc @@ -1,5 +1,5 @@ #include "webfuse/mocks/mock_adapter_client_callback.hpp" -#include "webfuse/adapter/client.h" +#include "webfuse/client.h" extern "C" { diff --git a/test/webfuse/mocks/mock_adapter_client_callback.hpp b/test/webfuse/mocks/mock_adapter_client_callback.hpp index cd66c7e..48b9d34 100644 --- a/test/webfuse/mocks/mock_adapter_client_callback.hpp +++ b/test/webfuse/mocks/mock_adapter_client_callback.hpp @@ -2,7 +2,7 @@ #define WF_MOCK_ADAPTER_CLIENT_CALLBACK_HPP #include -#include "webfuse/adapter/client_callback.h" +#include "webfuse/client_callback.h" namespace webfuse_test { diff --git a/test/webfuse/mocks/mock_authenticator.hpp b/test/webfuse/mocks/mock_authenticator.hpp index ac7f2bf..f440a0b 100644 --- a/test/webfuse/mocks/mock_authenticator.hpp +++ b/test/webfuse/mocks/mock_authenticator.hpp @@ -2,7 +2,7 @@ #define MOCK_AUTHENTICATOR_H #include -#include "webfuse/adapter/impl/authenticator.h" +#include "webfuse/impl/authenticator.h" namespace webfuse_test { diff --git a/test/webfuse/mocks/mock_fuse.cc b/test/webfuse/mocks/mock_fuse.cc index 486c8ed..cbd7164 100644 --- a/test/webfuse/mocks/mock_fuse.cc +++ b/test/webfuse/mocks/mock_fuse.cc @@ -1,5 +1,5 @@ #include "webfuse/mocks/mock_fuse.hpp" -#include "webfuse/utils/wrap.hpp" +#include "webfuse/test_util/wrap.hpp" extern "C" { diff --git a/test/webfuse/mocks/mock_fuse.hpp b/test/webfuse/mocks/mock_fuse.hpp index cc3fb71..22bdc7e 100644 --- a/test/webfuse/mocks/mock_fuse.hpp +++ b/test/webfuse/mocks/mock_fuse.hpp @@ -1,7 +1,7 @@ #ifndef MOCK_FUSE_HPP #define MOCK_FUSE_HPP -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" #include namespace webfuse_test diff --git a/test/webfuse/mocks/mock_invokation_handler.hpp b/test/webfuse/mocks/mock_invokation_handler.hpp index 48d3b8b..9c79159 100644 --- a/test/webfuse/mocks/mock_invokation_handler.hpp +++ b/test/webfuse/mocks/mock_invokation_handler.hpp @@ -1,13 +1,13 @@ #ifndef WF_MOCK_INVOKATION_HANDLER_HPP #define WF_MOCK_INVOKATION_HANDLER_HPP -#include "webfuse/utils/ws_server2.hpp" -#include +#include "webfuse/test_util/invokation_handler.hpp" +#include namespace webfuse_test { -class MockInvokationHander: public IIvokationHandler +class MockInvokationHander: public InvokationHandler { public: MOCK_METHOD2(Invoke, std::string(char const * method, json_t * params)); diff --git a/test/webfuse/mocks/mock_jsonrpc_proxy.cc b/test/webfuse/mocks/mock_jsonrpc_proxy.cc index 3fb243e..a2598b3 100644 --- a/test/webfuse/mocks/mock_jsonrpc_proxy.cc +++ b/test/webfuse/mocks/mock_jsonrpc_proxy.cc @@ -1,18 +1,18 @@ #include "webfuse/mocks/mock_jsonrpc_proxy.hpp" -#include "webfuse/utils/wrap.hpp" +#include "webfuse/test_util/wrap.hpp" extern "C" { static webfuse_test::MockJsonRpcProxy * webfuse_test_MockJsonRpcProxy = nullptr; -WF_WRAP_VFUNC5(webfuse_test_MockJsonRpcProxy, void, wf_jsonrpc_proxy_vinvoke, +WF_WRAP_VFUNC5(webfuse_test_MockJsonRpcProxy, void, wf_impl_jsonrpc_proxy_vinvoke, struct wf_jsonrpc_proxy *, wf_jsonrpc_proxy_finished_fn *, void *, char const *, char const *); -WF_WRAP_VFUNC3(webfuse_test_MockJsonRpcProxy, void, wf_jsonrpc_proxy_vnotify, +WF_WRAP_VFUNC3(webfuse_test_MockJsonRpcProxy, void, wf_impl_jsonrpc_proxy_vnotify, struct wf_jsonrpc_proxy *, char const *, char const *); diff --git a/test/webfuse/mocks/mock_jsonrpc_proxy.hpp b/test/webfuse/mocks/mock_jsonrpc_proxy.hpp index 74d61af..42d97c9 100644 --- a/test/webfuse/mocks/mock_jsonrpc_proxy.hpp +++ b/test/webfuse/mocks/mock_jsonrpc_proxy.hpp @@ -1,7 +1,7 @@ #ifndef MOCK_JSONRPC_PROXY_HPP #define MOCK_JSONRPC_PROXY_HPP -#include "webfuse/core/jsonrpc/proxy_intern.h" +#include "webfuse/impl/jsonrpc/proxy_intern.h" #include namespace webfuse_test @@ -12,13 +12,13 @@ class MockJsonRpcProxy public: MockJsonRpcProxy(); virtual ~MockJsonRpcProxy(); - MOCK_METHOD5(wf_jsonrpc_proxy_vinvoke, void ( + MOCK_METHOD5(wf_impl_jsonrpc_proxy_vinvoke, void ( struct wf_jsonrpc_proxy * proxy, wf_jsonrpc_proxy_finished_fn * finished, void * user_data, char const * method_name, char const * param_info)); - MOCK_METHOD3(wf_jsonrpc_proxy_vnotify, void ( + MOCK_METHOD3(wf_impl_jsonrpc_proxy_vnotify, void ( struct wf_jsonrpc_proxy * proxy, char const * method_name, char const * param_info)); diff --git a/test/webfuse/mocks/mock_operation_context.cc b/test/webfuse/mocks/mock_operation_context.cc index 9537533..c6158c4 100644 --- a/test/webfuse/mocks/mock_operation_context.cc +++ b/test/webfuse/mocks/mock_operation_context.cc @@ -1,5 +1,5 @@ #include "webfuse/mocks/mock_operation_context.hpp" -#include "webfuse/utils/wrap.hpp" +#include "webfuse/test_util/wrap.hpp" extern "C" { diff --git a/test/webfuse/mocks/mock_operation_context.hpp b/test/webfuse/mocks/mock_operation_context.hpp index e692e76..70c802c 100644 --- a/test/webfuse/mocks/mock_operation_context.hpp +++ b/test/webfuse/mocks/mock_operation_context.hpp @@ -1,7 +1,7 @@ #ifndef MOCK_OPERATIONS_CONTEXT_HPP #define MOCK_OPERATIONS_CONTEXT_HPP -#include "webfuse/adapter/impl/operation/context.h" +#include "webfuse/impl/operation/context.h" #include namespace webfuse_test diff --git a/test/webfuse/mocks/mock_provider.cc b/test/webfuse/mocks/mock_provider.cc deleted file mode 100644 index 1aab4cf..0000000 --- a/test/webfuse/mocks/mock_provider.cc +++ /dev/null @@ -1,130 +0,0 @@ -#include "webfuse/mocks/mock_provider.hpp" - -extern "C" -{ -using webfuse_test::MockProvider; - -static void webfuse_test_MockProvider_connected( - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->connected(); -} - -static void webfuse_test_MockProvider_disconnected( - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->disconnected(); -} - -static void webfuse_test_MockProvider_lookup( - wfp_request * request, - ino_t parent, - char const * name, - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->lookup(request, parent, name); -} - -static void webfuse_test_MockProvider_getattr( - wfp_request * request, - ino_t inode, - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->getattr(request, inode); -} - -static void webfuse_test_MockProvider_readdir( - wfp_request * request, - ino_t directory, - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->readdir(request, directory); -} - -static void webfuse_test_MockProvider_open( - wfp_request * request, - ino_t inode, - int flags, - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->open(request, inode, flags); - -} - -static void webfuse_test_MockProvider_close( - ino_t inode, - uint32_t handle, - int flags, - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->close(inode, handle, flags); - -} - -static void webfuse_test_MockProvider_read( - wfp_request * request, - ino_t inode, - uint32_t handle, - size_t offset, - size_t length, - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->read(request, inode, handle, offset, length); -} - -static void webfuse_test_MockProvider_get_credentials( - wfp_credentials * credentials, - void * user_data) -{ - auto * provider = reinterpret_cast(user_data); - provider->get_credentials(credentials); -} - - -static wfp_provider const webfuse_test_MockProvider = -{ - &webfuse_test_MockProvider_connected, - &webfuse_test_MockProvider_disconnected, - &webfuse_test_MockProvider_lookup, - &webfuse_test_MockProvider_getattr, - &webfuse_test_MockProvider_readdir, - &webfuse_test_MockProvider_open, - &webfuse_test_MockProvider_close, - &webfuse_test_MockProvider_read, - &webfuse_test_MockProvider_get_credentials, -}; - -} - -namespace webfuse_test -{ - -MockProvider::MockProvider() -{ - -} - -MockProvider::~MockProvider() -{ - -} - -wfp_provider const * MockProvider::get_provider() -{ - return &webfuse_test_MockProvider; -} - -void * MockProvider::get_userdata() -{ - return reinterpret_cast(this); -} - -} \ No newline at end of file diff --git a/test/webfuse/mocks/mock_provider.hpp b/test/webfuse/mocks/mock_provider.hpp deleted file mode 100644 index 1f03b08..0000000 --- a/test/webfuse/mocks/mock_provider.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef WF_MOCK_PROVIDER_HPP -#define WF_MOCK_PROVIDER_HPP - -#include "webfuse/provider/impl/provider.h" -#include - -namespace webfuse_test -{ - -class MockProvider -{ -public: - MockProvider(); - ~MockProvider(); - wfp_provider const * get_provider(); - void * get_userdata(); - MOCK_METHOD0(connected, void ()); - MOCK_METHOD0(disconnected, void ()); - MOCK_METHOD0(on_timer, void()); - MOCK_METHOD3(lookup, void(wfp_request * request, ino_t parent, char const * name)); - MOCK_METHOD2(getattr, void(wfp_request * request, ino_t inode)); - MOCK_METHOD2(readdir, void(wfp_request * request, ino_t directory)); - MOCK_METHOD3(open, void(wfp_request * request, ino_t inode, int flags)); - MOCK_METHOD3(close, void(ino_t inode, uint32_t handle, int flags)); - MOCK_METHOD5(read, void(wfp_request * request, ino_t inode, uint32_t handle, size_t offset, size_t length)); - MOCK_METHOD1(get_credentials, void(wfp_credentials * credentials)); -}; - -} - -#endif diff --git a/test/webfuse/mocks/mock_provider_client.cc b/test/webfuse/mocks/mock_provider_client.cc deleted file mode 100644 index 779c0ef..0000000 --- a/test/webfuse/mocks/mock_provider_client.cc +++ /dev/null @@ -1,217 +0,0 @@ -#include "webfuse/mocks/mock_provider_client.hpp" -#include "webfuse/provider/operation/error.h" -#include "webfuse/provider/dirbuffer.h" - -extern "C" -{ -using webfuse_test::IProviderClient; -using webfuse_test::ProviderClientException; - -static void webfuse_test_iproviderclient_onconnected( - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - self->OnConnected(); -} - -static void webfuse_test_iproviderclient_ondisconnected( - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - self->OnDisconnected(); -} - -static void webfuse_test_iproviderclient_onlookup( - struct wfp_request * request, - ino_t parent, - char const * name, - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - - try - { - struct stat buffer; - self->Lookup(parent, name, &buffer); - wfp_respond_lookup(request, &buffer); - } - catch (ProviderClientException& ex) - { - wfp_respond_error(request, ex.GetErrorCode()); - } - catch (...) - { - wfp_respond_error(request, WF_BAD); - } -} - -static void webfuse_test_iproviderclient_ongetattr( - struct wfp_request * request, - ino_t inode, - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - - try - { - struct stat buffer; - memset(&buffer, 0, sizeof(struct stat)); - self->GetAttr(inode, &buffer); - wfp_respond_getattr(request,&buffer); - } - catch (ProviderClientException& ex) - { - wfp_respond_error(request, ex.GetErrorCode()); - } - catch (...) - { - wfp_respond_error(request, WF_BAD); - } - -} - -static void webfuse_test_iproviderclient_onreaddir( - struct wfp_request * request, - ino_t directory, - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - wfp_dirbuffer * buffer = wfp_dirbuffer_create(); - - try - { - self->ReadDir(directory, buffer); - wfp_respond_readdir(request, buffer); - } - catch (ProviderClientException& ex) - { - wfp_respond_error(request, ex.GetErrorCode()); - } - catch (...) - { - wfp_respond_error(request, WF_BAD); - } - - wfp_dirbuffer_dispose(buffer); - -} - -static void webfuse_test_iproviderclient_onopen( - struct wfp_request * request, - ino_t inode, - int flags, - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - - try - { - uint32_t handle = 0; - self->Open(inode, flags, &handle); - wfp_respond_open(request, handle); - } - catch (ProviderClientException& ex) - { - wfp_respond_error(request, ex.GetErrorCode()); - } - catch (...) - { - wfp_respond_error(request, WF_BAD); - } - -} - -static void webfuse_test_iproviderclient_onclose( - ino_t inode, - uint32_t handle, - int flags, - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - self->Close(inode, handle, flags); -} - -static void webfuse_test_iproviderclient_onread( - struct wfp_request * request, - ino_t inode, - uint32_t handle, - size_t offset, - size_t length, - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - char * data = new char[length]; - - try - { - size_t bytes_read = 0; - self->Read(inode, handle, offset, length, data, &bytes_read); - wfp_respond_read(request, data, bytes_read); - } - catch (ProviderClientException& ex) - { - wfp_respond_error(request, ex.GetErrorCode()); - } - catch (...) - { - wfp_respond_error(request, WF_BAD); - } - - delete[] data; -} - -static void webfuse_test_iproviderclient_get_credentials( - wfp_credentials * credentials, - void * user_data) -{ - auto * self = reinterpret_cast(user_data); - - try - { - self->GetCredentials(credentials); - } - catch (...) - { - // swallow - } -} - -} - -namespace webfuse_test -{ - -ProviderClientException::ProviderClientException(wf_status error_code) -: runtime_error("ProviderClientException") -, error_code_(error_code) -{ - -} - -wf_status ProviderClientException::GetErrorCode() -{ - return error_code_; -} - - -void IProviderClient::AttachTo(wfp_client_config * config, bool enableAuthentication) -{ - void * self = reinterpret_cast(this); - wfp_client_config_set_userdata(config, self); - wfp_client_config_set_onconnected(config, &webfuse_test_iproviderclient_onconnected); - wfp_client_config_set_ondisconnected(config, &webfuse_test_iproviderclient_ondisconnected); - - wfp_client_config_set_onlookup(config, &webfuse_test_iproviderclient_onlookup); - wfp_client_config_set_ongetattr(config, &webfuse_test_iproviderclient_ongetattr); - wfp_client_config_set_onreaddir(config, &webfuse_test_iproviderclient_onreaddir); - wfp_client_config_set_onopen(config, &webfuse_test_iproviderclient_onopen); - wfp_client_config_set_onclose(config, &webfuse_test_iproviderclient_onclose); - wfp_client_config_set_onread(config, &webfuse_test_iproviderclient_onread); - - if (enableAuthentication) - { - wfp_client_config_enable_authentication(config, &webfuse_test_iproviderclient_get_credentials); - } -} - -} \ No newline at end of file diff --git a/test/webfuse/mocks/mock_provider_client.hpp b/test/webfuse/mocks/mock_provider_client.hpp deleted file mode 100644 index b60e743..0000000 --- a/test/webfuse/mocks/mock_provider_client.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef WF_MOCK_PROVIDER_CLIENT_HPP -#define WF_MOCK_PROVIDER_CLIENT_HPP - -#include -#include "webfuse/provider/client_config.h" -#include "webfuse/core/status.h" -#include - -namespace webfuse_test -{ - class ProviderClientException: public std::runtime_error - { - public: - explicit ProviderClientException(wf_status error_code); - wf_status GetErrorCode(); - private: - wf_status error_code_; - }; - - class IProviderClient - { - public: - virtual ~IProviderClient() = default; - virtual void OnConnected() = 0; - virtual void OnDisconnected() = 0; - virtual void Lookup(ino_t parent, char const * name, struct stat * result) = 0; - virtual void GetAttr(ino_t inode, struct stat * buffer) = 0; - virtual void ReadDir(ino_t directory, wfp_dirbuffer * buffer) = 0; - virtual void Open(ino_t inode, int flags, uint32_t * handle) = 0; - virtual void Close(ino_t inode, uint32_t handle, int flags) = 0; - virtual void Read(ino_t inode, uint32_t handle, size_t offset, size_t length, char * buffer, size_t * bytes_read) = 0; - virtual void GetCredentials(wfp_credentials * credentials) = 0; - - void AttachTo(wfp_client_config * config, bool enableAuthentication = false); - }; - - class MockProviderClient: public IProviderClient - { - public: - ~MockProviderClient() override = default; - MOCK_METHOD0( OnConnected, void()); - MOCK_METHOD0( OnDisconnected, void()); - MOCK_METHOD3( Lookup, void(ino_t parent, char const * name, struct stat * result)); - MOCK_METHOD2( GetAttr, void(ino_t inode, struct stat * buffer)); - MOCK_METHOD2( ReadDir, void(ino_t directory, wfp_dirbuffer * buffer)); - MOCK_METHOD3( Open, void(ino_t inode, int flags, uint32_t * handle)); - MOCK_METHOD3( Close, void(ino_t inode, uint32_t handle, int flags)); - MOCK_METHOD6( Read, void(ino_t inode, uint32_t handle, size_t offset, size_t length, char * buffer, size_t * bytes_read)); - MOCK_METHOD1( GetCredentials, void (wfp_credentials * credentials)); - }; -} - -#endif diff --git a/test/webfuse/mocks/mock_request.cc b/test/webfuse/mocks/mock_request.cc deleted file mode 100644 index 5b31c63..0000000 --- a/test/webfuse/mocks/mock_request.cc +++ /dev/null @@ -1,50 +0,0 @@ -#include "webfuse/mocks/mock_request.hpp" -#include - -extern "C" -{ - -static void webfuse_test_MockRequest_respond( - json_t * response, - void * user_data) -{ - auto * request = reinterpret_cast(user_data); - - json_t * result = json_object_get(response, "result"); - json_t * error = json_object_get(response, "error"); - json_t * id_holder = json_object_get(response, "id"); - - int id = -1; - if (json_is_integer(id_holder)) - { - id = json_integer_value(id_holder); - } - - if (nullptr != result) - { - request->respond(result, id); - } - else - { - request->respond_error(error, id); - } -} - -} - -namespace webfuse_test -{ - -struct wfp_request * MockRequest::create_request(int id) -{ - auto * request = reinterpret_cast(malloc(sizeof(wfp_request))); - request->respond = &webfuse_test_MockRequest_respond; - request->user_data = reinterpret_cast(this); - request->id = id; - - return request; -} - - - -} \ No newline at end of file diff --git a/test/webfuse/mocks/mock_request.hpp b/test/webfuse/mocks/mock_request.hpp deleted file mode 100644 index 0582d6a..0000000 --- a/test/webfuse/mocks/mock_request.hpp +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef WF_MOCK_REQUEST_HPP -#define WF_MOCK_REQUEST_HPP - -#include -#include -#include -#include "webfuse/provider/impl/request.h" - - -namespace webfuse_test -{ - -class MockRequest -{ -public: - struct wfp_request * create_request(int id); - MOCK_METHOD2(respond, void(json_t * result, int id)); - MOCK_METHOD2(respond_error, void(json_t * error, int id)); -}; - -MATCHER_P3(StatMatcher, inode, mode, file_type, "") -{ - json_t * inode_holder = json_object_get(arg, "inode"); - if ((!json_is_integer(inode_holder)) || (inode != json_integer_value(inode_holder))) - { - *result_listener << "missing inode"; - return false; - } - - json_t * mode_holder = json_object_get(arg, "mode"); - if ((!json_is_integer(mode_holder)) || (mode != json_integer_value(mode_holder))) - { - *result_listener << "missing mode"; - return false; - } - - json_t * type_holder = json_object_get(arg, "type"); - if ((!json_is_string(type_holder)) || (0 != strcmp(file_type, json_string_value(type_holder)))) - { - *result_listener << "missing type"; - return false; - } - - return true; -} - -MATCHER_P(OpenMatcher, handle, "") -{ - json_t * handle_holder = json_object_get(arg, "handle"); - if ((!json_is_integer(handle_holder)) || (handle != json_integer_value(handle_holder))) - { - *result_listener << "missing handle"; - return false; - } - - return true; -} - -MATCHER_P3(ReadResultMatcher, data, format, count, "") -{ - json_t * format_holder = json_object_get(arg, "format"); - if ((!json_is_string(format_holder)) || (0 != strcmp(format, json_string_value(format_holder)))) - { - *result_listener << "invalid or missing format: " << json_string_value(format_holder); - return false; - } - - json_t * count_holder = json_object_get(arg, "count"); - if ((!json_is_integer(count_holder)) || (count != json_integer_value(count_holder))) - { - *result_listener << "invalid or missing count: " << json_integer_value(count_holder); - return false; - } - - json_t * data_holder = json_object_get(arg, "data"); - if ((!json_is_string(data_holder)) || (0 != strcmp(data, json_string_value(data_holder)))) - { - *result_listener << "invalid or missing data: " << json_string_value(data_holder); - return false; - } - - return true; -} - -MATCHER_P(ReaddirMatcher, contained_elements , "") -{ - if (!json_is_array(arg)) - { - *result_listener << "result is not array"; - return false; - } - - { - size_t i; - json_t * value; - - json_array_foreach(arg, i, value) - { - json_t * inode = json_object_get(value, "inode"); - json_t * name = json_object_get(value, "name"); - - if(!json_is_integer(inode)) - { - *result_listener << "invalid result: missing inode"; - return false; - } - - if (!json_is_string(name)) - { - *result_listener << "invalid result: missing name"; - return false; - } - } - } - - for(size_t i = 0; NULL != contained_elements[i]; i++) - { - char const * element = contained_elements[i]; - bool found = false; - size_t j; - json_t * value; - - json_array_foreach(arg, j, value) - { - json_t * name = json_object_get(value, "name"); - - found = (0 == strcmp(element, json_string_value(name))); - if (found) - { - break; - } - } - - if (!found) - { - *result_listener << "missing required directory element: " << element; - return false; - } - } - - return true; -} - -} - - -#endif diff --git a/test/webfuse/mocks/open_matcher.hpp b/test/webfuse/mocks/open_matcher.hpp new file mode 100644 index 0000000..462792e --- /dev/null +++ b/test/webfuse/mocks/open_matcher.hpp @@ -0,0 +1,36 @@ +#ifndef WF_OPEN_MATCHER_HPP +#define WF_OPEN_MATCHER_HPP + +#include +#include + +namespace webfuse_test +{ + +MATCHER_P(Open, inode, "") +{ + if (!json_is_array(arg)) + { + *result_listener << "json array expected"; + return false; + } + + json_t * inode_ = json_array_get(arg, 1); + if (!json_is_integer(inode_)) + { + *result_listener << "inode is expectoed to an integer"; + return false; + } + + if (inode != json_integer_value(inode_)) + { + *result_listener << "inode mismatch: expected" << inode + << " but was " << json_integer_value(inode_); + } + + return true; +} + +} + +#endif diff --git a/test/webfuse/mocks/readdir_matcher.hpp b/test/webfuse/mocks/readdir_matcher.hpp new file mode 100644 index 0000000..ad2c2ab --- /dev/null +++ b/test/webfuse/mocks/readdir_matcher.hpp @@ -0,0 +1,36 @@ +#ifndef WF_READDIR_MATCHER_HPP +#define WF_READDIR_MATCHER_HPP + +#include +#include + +namespace webfuse_test +{ + +MATCHER_P(ReadDir, inode, "") +{ + if (!json_is_array(arg)) + { + *result_listener << "json array expected"; + return false; + } + + json_t * inode_ = json_array_get(arg, 1); + if (!json_is_integer(inode_)) + { + *result_listener << "inode is expectoed to an integer"; + return false; + } + + if (inode != json_integer_value(inode_)) + { + *result_listener << "inode mismatch: expected" << inode + << " but was " << json_integer_value(inode_); + } + + return true; +} + +} + +#endif diff --git a/test/webfuse/tests/adapter/operation/test_close.cc b/test/webfuse/operation/test_close.cc similarity index 88% rename from test/webfuse/tests/adapter/operation/test_close.cc rename to test/webfuse/operation/test_close.cc index 00e4763..e91d349 100644 --- a/test/webfuse/tests/adapter/operation/test_close.cc +++ b/test/webfuse/operation/test_close.cc @@ -1,4 +1,4 @@ -#include "webfuse/adapter/impl/operation/close.h" +#include "webfuse/impl/operation/close.h" #include #include "webfuse/mocks/mock_fuse.hpp" @@ -17,7 +17,7 @@ using testing::StrEq; TEST(wf_impl_operation_close, notify_proxy) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vnotify(_,StrEq("close"),StrEq("siii"))).Times(1); + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vnotify(_,StrEq("close"),StrEq("siii"))).Times(1); MockOperationContext context; EXPECT_CALL(context, wf_impl_operation_context_get_proxy(_)).Times(1) @@ -39,7 +39,7 @@ TEST(wf_impl_operation_close, notify_proxy) TEST(wf_impl_operation_close, fail_rpc_null) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vnotify(_,_,_)).Times(0); + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vnotify(_,_,_)).Times(0); MockOperationContext context; EXPECT_CALL(context, wf_impl_operation_context_get_proxy(_)).Times(1) diff --git a/test/webfuse/tests/adapter/operation/test_context.cc b/test/webfuse/operation/test_context.cc similarity index 83% rename from test/webfuse/tests/adapter/operation/test_context.cc rename to test/webfuse/operation/test_context.cc index 75e619e..92355ed 100644 --- a/test/webfuse/tests/adapter/operation/test_context.cc +++ b/test/webfuse/operation/test_context.cc @@ -1,5 +1,5 @@ -#include "webfuse/adapter/impl/operation/context.h" -#include "webfuse/adapter/impl/session.h" +#include "webfuse/impl/operation/context.h" +#include "webfuse/impl/session.h" #include TEST(wf_impl_operation_context, get_proxy) diff --git a/test/webfuse/tests/adapter/operation/test_getattr.cc b/test/webfuse/operation/test_getattr.cc similarity index 97% rename from test/webfuse/tests/adapter/operation/test_getattr.cc rename to test/webfuse/operation/test_getattr.cc index 8249692..f3ea09c 100644 --- a/test/webfuse/tests/adapter/operation/test_getattr.cc +++ b/test/webfuse/operation/test_getattr.cc @@ -1,6 +1,6 @@ -#include "webfuse/adapter/impl/operation/getattr.h" +#include "webfuse/impl/operation/getattr.h" -#include "webfuse/core/status.h" +#include "webfuse/status.h" #include "webfuse/mocks/mock_fuse.hpp" #include "webfuse/mocks/mock_operation_context.hpp" @@ -34,7 +34,7 @@ void free_context( TEST(wf_impl_operation_getattr, invoke_proxy) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vinvoke(_,_,_,StrEq("getattr"),StrEq("si"))).Times(1) + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vinvoke(_,_,_,StrEq("getattr"),StrEq("si"))).Times(1) .WillOnce(Invoke(free_context)); MockOperationContext context; diff --git a/test/webfuse/tests/adapter/operation/test_lookup.cc b/test/webfuse/operation/test_lookup.cc similarity index 97% rename from test/webfuse/tests/adapter/operation/test_lookup.cc rename to test/webfuse/operation/test_lookup.cc index 002fc30..09dc985 100644 --- a/test/webfuse/tests/adapter/operation/test_lookup.cc +++ b/test/webfuse/operation/test_lookup.cc @@ -1,6 +1,6 @@ -#include "webfuse/adapter/impl/operation/lookup.h" +#include "webfuse/impl/operation/lookup.h" -#include "webfuse/core/status.h" +#include "webfuse/status.h" #include "webfuse/mocks/mock_fuse.hpp" #include "webfuse/mocks/mock_operation_context.hpp" @@ -34,7 +34,7 @@ void free_context( TEST(wf_impl_operation_lookup, invoke_proxy) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vinvoke(_,_,_,StrEq("lookup"),StrEq("sis"))).Times(1) + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vinvoke(_,_,_,StrEq("lookup"),StrEq("sis"))).Times(1) .WillOnce(Invoke(free_context)); MockOperationContext context; diff --git a/test/webfuse/tests/adapter/operation/test_open.cc b/test/webfuse/operation/test_open.cc similarity index 94% rename from test/webfuse/tests/adapter/operation/test_open.cc rename to test/webfuse/operation/test_open.cc index e3d89bc..e509653 100644 --- a/test/webfuse/tests/adapter/operation/test_open.cc +++ b/test/webfuse/operation/test_open.cc @@ -1,6 +1,6 @@ -#include "webfuse/adapter/impl/operation/open.h" +#include "webfuse/impl/operation/open.h" -#include "webfuse/core/status.h" +#include "webfuse/status.h" #include "webfuse/mocks/mock_fuse.hpp" #include "webfuse/mocks/mock_operation_context.hpp" @@ -18,7 +18,7 @@ using testing::StrEq; TEST(wf_impl_operation_open, invoke_proxy) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vinvoke(_,_,_,StrEq("open"),StrEq("sii"))).Times(1); + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vinvoke(_,_,_,StrEq("open"),StrEq("sii"))).Times(1); MockOperationContext context; EXPECT_CALL(context, wf_impl_operation_context_get_proxy(_)).Times(1) diff --git a/test/webfuse/tests/adapter/operation/test_read.cc b/test/webfuse/operation/test_read.cc similarity index 96% rename from test/webfuse/tests/adapter/operation/test_read.cc rename to test/webfuse/operation/test_read.cc index 15b9f9c..8ed3101 100644 --- a/test/webfuse/tests/adapter/operation/test_read.cc +++ b/test/webfuse/operation/test_read.cc @@ -1,4 +1,4 @@ -#include "webfuse/adapter/impl/operation/read.h" +#include "webfuse/impl/operation/read.h" #include "webfuse/mocks/mock_fuse.hpp" #include "webfuse/mocks/mock_operation_context.hpp" @@ -16,7 +16,7 @@ using testing::StrEq; TEST(wf_impl_operation_read, invoke_proxy) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vinvoke(_,_,_,StrEq("read"),StrEq("siiii"))).Times(1); + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vinvoke(_,_,_,StrEq("read"),StrEq("siiii"))).Times(1); MockOperationContext context; EXPECT_CALL(context, wf_impl_operation_context_get_proxy(_)).Times(1) @@ -39,7 +39,7 @@ TEST(wf_impl_operation_read, invoke_proxy) TEST(wf_impl_operation_read, invoke_proxy_limit_size) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vinvoke(_,_,_,StrEq("read"),StrEq("siiii"))).Times(1); + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vinvoke(_,_,_,StrEq("read"),StrEq("siiii"))).Times(1); MockOperationContext context; EXPECT_CALL(context, wf_impl_operation_context_get_proxy(_)).Times(1) diff --git a/test/webfuse/tests/adapter/operation/test_readdir.cc b/test/webfuse/operation/test_readdir.cc similarity index 98% rename from test/webfuse/tests/adapter/operation/test_readdir.cc rename to test/webfuse/operation/test_readdir.cc index c020c3d..deef623 100644 --- a/test/webfuse/tests/adapter/operation/test_readdir.cc +++ b/test/webfuse/operation/test_readdir.cc @@ -1,6 +1,6 @@ -#include "webfuse/adapter/impl/operation/readdir.h" +#include "webfuse/impl/operation/readdir.h" -#include "webfuse/core/status.h" +#include "webfuse/status.h" #include "webfuse/mocks/mock_fuse.hpp" #include "webfuse/mocks/mock_operation_context.hpp" @@ -34,7 +34,7 @@ void free_context( TEST(wf_impl_operation_readdir, invoke_proxy) { MockJsonRpcProxy proxy; - EXPECT_CALL(proxy, wf_jsonrpc_proxy_vinvoke(_,_,_,StrEq("readdir"),StrEq("si"))) + EXPECT_CALL(proxy, wf_impl_jsonrpc_proxy_vinvoke(_,_,_,StrEq("readdir"),StrEq("si"))) .Times(1).WillOnce(Invoke(free_context)); MockOperationContext context; diff --git a/test/webfuse/tests/adapter/test_authenticator.cc b/test/webfuse/test_authenticator.cc similarity index 94% rename from test/webfuse/tests/adapter/test_authenticator.cc rename to test/webfuse/test_authenticator.cc index 07e06e5..5edcacc 100644 --- a/test/webfuse/tests/adapter/test_authenticator.cc +++ b/test/webfuse/test_authenticator.cc @@ -3,8 +3,8 @@ #include "webfuse/mocks/mock_authenticator.hpp" -#include "webfuse/adapter/impl/authenticator.h" -#include "webfuse/adapter/impl/credentials.h" +#include "webfuse/impl/authenticator.h" +#include "webfuse/impl/credentials.h" using ::testing::Return; using ::testing::_; diff --git a/test/webfuse/tests/adapter/test_authenticators.cc b/test/webfuse/test_authenticators.cc similarity index 98% rename from test/webfuse/tests/adapter/test_authenticators.cc rename to test/webfuse/test_authenticators.cc index 6cb8064..647bea0 100644 --- a/test/webfuse/tests/adapter/test_authenticators.cc +++ b/test/webfuse/test_authenticators.cc @@ -1,8 +1,8 @@ #include #include -#include "webfuse/adapter/impl/authenticators.h" -#include "webfuse/adapter/impl/credentials.h" +#include "webfuse/impl/authenticators.h" +#include "webfuse/impl/credentials.h" #include "webfuse/mocks/mock_authenticator.hpp" using ::testing::_; diff --git a/test/webfuse/tests/adapter/test_client.cc b/test/webfuse/test_client.cc similarity index 69% rename from test/webfuse/tests/adapter/test_client.cc rename to test/webfuse/test_client.cc index 78cf7b2..a1ae12b 100644 --- a/test/webfuse/tests/adapter/test_client.cc +++ b/test/webfuse/test_client.cc @@ -1,22 +1,23 @@ #include #include -#include "webfuse/utils/adapter_client.hpp" -#include "webfuse/adapter/client_tlsconfig.h" -#include "webfuse/adapter/credentials.h" -#include "webfuse/core/protocol_names.h" -#include "webfuse/utils/ws_server2.hpp" +#include "webfuse/test_util/adapter_client.hpp" +#include "webfuse/client_tlsconfig.h" +#include "webfuse/credentials.h" +#include "webfuse/protocol_names.h" +#include "webfuse/test_util/ws_server.hpp" #include "webfuse/mocks/mock_adapter_client_callback.hpp" #include "webfuse/mocks/mock_invokation_handler.hpp" -#include "webfuse/utils/timeout_watcher.hpp" -#include "webfuse/tests/integration/file.hpp" +#include "webfuse/test_util/file.hpp" #include "webfuse/mocks/lookup_matcher.hpp" +#include +#include + using webfuse_test::AdapterClient; -using webfuse_test::WsServer2; +using webfuse_test::WsServer; using webfuse_test::MockInvokationHander; using webfuse_test::MockAdapterClientCallback; -using webfuse_test::TimeoutWatcher; using webfuse_test::File; using webfuse_test::Lookup; using testing::_; @@ -26,7 +27,7 @@ using testing::Return; using testing::Throw; using testing::StrEq; -#define TIMEOUT (std::chrono::milliseconds(30 * 1000)) +#define TIMEOUT (std::chrono::seconds(30)) namespace { @@ -58,10 +59,8 @@ TEST(AdapterClient, CreateAndDispose) TEST(AdapterClient, Connect) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(_,_)).Times(0); MockAdapterClientCallback callback; @@ -70,29 +69,27 @@ TEST(AdapterClient, Connect) EXPECT_CALL(callback, Invoke(_, WF_CLIENT_GET_TLS_CONFIG, _)).Times(1); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CLEANUP, nullptr)).Times(1); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, IgnoreNonJsonMessage) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(_,_)).Times(0); MockAdapterClientCallback callback; @@ -101,32 +98,30 @@ TEST(AdapterClient, IgnoreNonJsonMessage) EXPECT_CALL(callback, Invoke(_, WF_CLIENT_GET_TLS_CONFIG, _)).Times(1); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CLEANUP, nullptr)).Times(1); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); server.SendMessage("brummni"); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, IgnoreInvalidJsonMessage) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(_,_)).Times(0); MockAdapterClientCallback callback; @@ -135,32 +130,30 @@ TEST(AdapterClient, IgnoreInvalidJsonMessage) EXPECT_CALL(callback, Invoke(_, WF_CLIENT_GET_TLS_CONFIG, _)).Times(1); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CLEANUP, nullptr)).Times(1); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); json_t * invalid_request = json_object(); server.SendMessage(invalid_request); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, ConnectWithTls) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER, 0, true); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER, 0, true); EXPECT_CALL(handler, Invoke(_,_)).Times(0); MockAdapterClientCallback callback; @@ -175,151 +168,140 @@ TEST(AdapterClient, ConnectWithTls) })); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CLEANUP, nullptr)).Times(1); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, FailedToConnectInvalidPort) { - TimeoutWatcher watcher(TIMEOUT); - - MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_INIT, nullptr)).Times(1); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CREATED, nullptr)).Times(1); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_GET_TLS_CONFIG, _)).Times(1); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CLEANUP, nullptr)).Times(1); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), "ws://localhost:4/"); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, Authenticate) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("authenticate"),_)).Times(1) .WillOnce(Return("{}")); MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, _)).Times(1) .WillOnce(Invoke(GetCredentials)); - bool authenticated = false; + std::promise authenticated; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { authenticated = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { authenticated.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.Authenticate(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return authenticated; })); + ASSERT_EQ(std::future_status::ready, authenticated.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, AuthenticateFailedWithoutConnect) { - TimeoutWatcher watcher(TIMEOUT); - MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, _)).Times(1) .WillOnce(Invoke(GetCredentials)); - bool called = false; + std::promise called; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATION_FAILED, nullptr)).Times(1) - .WillOnce(Invoke([&called] (wf_client *, int, void *) mutable { - called = true; + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { + called.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), ""); client.Authenticate(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return called; })); + ASSERT_EQ(std::future_status::ready, called.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, AuthenticationFailed) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("authenticate"),_)).Times(1) .WillOnce(Throw(std::runtime_error("authentication failed"))); MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATE_GET_CREDENTIALS, _)).Times(1) .WillOnce(Invoke(GetCredentials)); - bool called = false; + std::promise called; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_AUTHENTICATION_FAILED, nullptr)).Times(1) .WillOnce(Invoke([&called] (wf_client *, int, void *) mutable { - called = true; + called.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.Authenticate(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return called; })); + ASSERT_EQ(std::future_status::ready, called.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, AddFileSystem) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("add_filesystem"),_)).Times(1) .WillOnce(Return("{\"id\": \"test\"}")); EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()) @@ -328,38 +310,36 @@ TEST(AdapterClient, AddFileSystem) MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); - bool called = false; + std::promise called; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_FILESYSTEM_ADDED, nullptr)).Times(1) - .WillOnce(Invoke([&called] (wf_client *, int, void *) mutable { - called = true; + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { + called.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.AddFileSystem(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return called; })); + ASSERT_EQ(std::future_status::ready, called.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, FailToAddFileSystemTwice) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("add_filesystem"),_)).Times(1) .WillOnce(Return("{\"id\": \"test\"}")); EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()) @@ -368,47 +348,45 @@ TEST(AdapterClient, FailToAddFileSystemTwice) MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); - bool filesystem_added = false; + std::promise filesystem_added; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_FILESYSTEM_ADDED, nullptr)).Times(1) .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { - filesystem_added = true; + filesystem_added.set_value(); })); - bool filesystem_add_failed = false; + std::promise filesystem_add_failed; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_FILESYSTEM_ADD_FAILED, nullptr)).Times(1) .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { - filesystem_add_failed = true; + filesystem_add_failed.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.AddFileSystem(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return filesystem_added; })); + ASSERT_EQ(std::future_status::ready, filesystem_added.get_future().wait_for(TIMEOUT)); client.AddFileSystem(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return filesystem_add_failed; })); + ASSERT_EQ(std::future_status::ready, filesystem_add_failed.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, FailToAddFileSystemMissingId) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("add_filesystem"),_)).Times(1) .WillOnce(Return("{}")); EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()) @@ -417,38 +395,36 @@ TEST(AdapterClient, FailToAddFileSystemMissingId) MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); - bool filesystem_add_failed = false; + std::promise filesystem_add_failed; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_FILESYSTEM_ADD_FAILED, nullptr)).Times(1) .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { - filesystem_add_failed = true; + filesystem_add_failed.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.AddFileSystem(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return filesystem_add_failed; })); + ASSERT_EQ(std::future_status::ready, filesystem_add_failed.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, FailToAddFileSystemIdNotString) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("add_filesystem"),_)).Times(1) .WillOnce(Return("{\"id\": 42}")); EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()) @@ -457,77 +433,73 @@ TEST(AdapterClient, FailToAddFileSystemIdNotString) MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); - bool filesystem_add_failed = false; + std::promise filesystem_add_failed; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_FILESYSTEM_ADD_FAILED, nullptr)).Times(1) .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { - filesystem_add_failed = true; + filesystem_add_failed.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.AddFileSystem(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return filesystem_add_failed; })); + ASSERT_EQ(std::future_status::ready, filesystem_add_failed.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, AddFileSystemFailed) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("add_filesystem"),_)).Times(1) .WillOnce(Throw(std::runtime_error("failed"))); MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); - bool called = false; + std::promise called; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_FILESYSTEM_ADD_FAILED, nullptr)).Times(1) .WillOnce(Invoke([&called] (wf_client *, int, void *) mutable { - called = true; + called.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.AddFileSystem(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return called; })); + ASSERT_EQ(std::future_status::ready, called.get_future().wait_for(TIMEOUT)); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } TEST(AdapterClient, LookupFile) { - TimeoutWatcher watcher(TIMEOUT); - MockInvokationHander handler; - WsServer2 server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); + WsServer server(handler, WF_PROTOCOL_NAME_PROVIDER_SERVER); EXPECT_CALL(handler, Invoke(StrEq("add_filesystem"),_)).Times(1) .WillOnce(Return("{\"id\": \"test\"}")); EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()) @@ -548,32 +520,32 @@ TEST(AdapterClient, LookupFile) MockAdapterClientCallback callback; EXPECT_CALL(callback, Invoke(_, _, _)).Times(AnyNumber()); - bool connected = false; + std::promise connected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_CONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { connected.set_value(); })); - bool disconnected = false; + std::promise disconnected; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_DISCONNECTED, nullptr)).Times(1) - .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected = true; })); + .WillOnce(Invoke([&] (wf_client *, int, void *) mutable { disconnected.set_value(); })); - bool called = false; + std::promise called; EXPECT_CALL(callback, Invoke(_, WF_CLIENT_FILESYSTEM_ADDED, nullptr)).Times(1) .WillOnce(Invoke([&called] (wf_client *, int, void *) mutable { - called = true; + called.set_value(); })); AdapterClient client(callback.GetCallbackFn(), callback.GetUserData(), server.GetUrl()); client.Connect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return connected; })); + ASSERT_EQ(std::future_status::ready, connected.get_future().wait_for(TIMEOUT)); client.AddFileSystem(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return called; })); + ASSERT_EQ(std::future_status::ready, called.get_future().wait_for(TIMEOUT)); std::string file_name = client.GetDir() + "/Hello.txt"; File file(file_name); ASSERT_TRUE(file.isFile()); client.Disconnect(); - ASSERT_TRUE(watcher.waitUntil([&]() mutable { return disconnected; })); + ASSERT_EQ(std::future_status::ready, disconnected.get_future().wait_for(TIMEOUT)); } diff --git a/test/webfuse/tests/adapter/test_client_tlsconfig.cc b/test/webfuse/test_client_tlsconfig.cc similarity index 95% rename from test/webfuse/tests/adapter/test_client_tlsconfig.cc rename to test/webfuse/test_client_tlsconfig.cc index 788b906..f362ada 100644 --- a/test/webfuse/tests/adapter/test_client_tlsconfig.cc +++ b/test/webfuse/test_client_tlsconfig.cc @@ -1,6 +1,6 @@ #include -#include "webfuse/adapter/client_tlsconfig.h" -#include "webfuse/adapter/impl/client_tlsconfig.h" +#include "webfuse/client_tlsconfig.h" +#include "webfuse/impl/client_tlsconfig.h" TEST(ClientTlsConfig, InitAndCleanup) { diff --git a/test/webfuse/tests/adapter/test_credentials.cc b/test/webfuse/test_credentials.cc similarity index 97% rename from test/webfuse/tests/adapter/test_credentials.cc rename to test/webfuse/test_credentials.cc index 2e11a79..7eea168 100644 --- a/test/webfuse/tests/adapter/test_credentials.cc +++ b/test/webfuse/test_credentials.cc @@ -1,7 +1,7 @@ #include -#include "webfuse/adapter/credentials.h" -#include "webfuse/adapter/impl/credentials.h" +#include "webfuse/credentials.h" +#include "webfuse/impl/credentials.h" #include TEST(Credentials, Type) diff --git a/test/webfuse/tests/adapter/test_fuse_req.cc b/test/webfuse/test_fuse_req.cc similarity index 70% rename from test/webfuse/tests/adapter/test_fuse_req.cc rename to test/webfuse/test_fuse_req.cc index d1264d9..0ef8810 100644 --- a/test/webfuse/tests/adapter/test_fuse_req.cc +++ b/test/webfuse/test_fuse_req.cc @@ -1,5 +1,5 @@ #include -#include "webfuse/adapter/impl/fuse_wrapper.h" +#include "webfuse/impl/fuse_wrapper.h" TEST(libfuse, fuse_req_t_size) { diff --git a/test/webfuse/tests/core/test_message.cc b/test/webfuse/test_message.cc similarity index 62% rename from test/webfuse/tests/core/test_message.cc rename to test/webfuse/test_message.cc index 6212280..0e262fe 100644 --- a/test/webfuse/tests/core/test_message.cc +++ b/test/webfuse/test_message.cc @@ -1,22 +1,22 @@ #include #include -#include "webfuse/core/message.h" +#include "webfuse/impl/message.h" TEST(wf_message, create) { json_t * value = json_object(); - struct wf_message * message = wf_message_create(value); + struct wf_message * message = wf_impl_message_create(value); ASSERT_NE(nullptr, message); ASSERT_EQ(2, message->length); ASSERT_TRUE(0 == strncmp("{}", message->data, 2)); - wf_message_dispose(message); + wf_impl_message_dispose(message); json_decref(value); } TEST(wf_message, fail_to_create) { - struct wf_message * message = wf_message_create(nullptr); + struct wf_message * message = wf_impl_message_create(nullptr); ASSERT_EQ(nullptr, message); } \ No newline at end of file diff --git a/test/webfuse/test_message_queue.cc b/test/webfuse/test_message_queue.cc new file mode 100644 index 0000000..4560cee --- /dev/null +++ b/test/webfuse/test_message_queue.cc @@ -0,0 +1,52 @@ +#include +#include "webfuse/impl/message_queue.h" +#include "webfuse/impl/message.h" +#include "webfuse/impl/util/slist.h" + +namespace +{ + + struct wf_slist_item * create_message(char const * content) + { + json_t * value = json_object(); + json_object_set_new(value, "content", json_string(content)); + struct wf_message * message = wf_impl_message_create(value); + + json_decref(value); + return &message->item; + } + +} + +TEST(wf_message_queue, cleanup_empty_list) +{ + struct wf_slist queue; + wf_impl_slist_init(&queue); + + wf_impl_message_queue_cleanup(&queue); + ASSERT_TRUE(wf_impl_slist_empty(&queue)); +} + +TEST(wf_message_queue, cleanup_one_element) +{ + struct wf_slist queue; + wf_impl_slist_init(&queue); + + wf_impl_slist_append(&queue, create_message("Hello")); + + wf_impl_message_queue_cleanup(&queue); + ASSERT_TRUE(wf_impl_slist_empty(&queue)); +} + +TEST(wf_message_queue, cleanup_multiple_element) +{ + struct wf_slist queue; + wf_impl_slist_init(&queue); + + wf_impl_slist_append(&queue, create_message("Hello")); + wf_impl_slist_append(&queue, create_message("World")); + wf_impl_slist_append(&queue, create_message("!")); + + wf_impl_message_queue_cleanup(&queue); + ASSERT_TRUE(wf_impl_slist_empty(&queue)); +} \ No newline at end of file diff --git a/test/webfuse/tests/adapter/test_mountpoint.cc b/test/webfuse/test_mountpoint.cc similarity index 96% rename from test/webfuse/tests/adapter/test_mountpoint.cc rename to test/webfuse/test_mountpoint.cc index 6bb486b..381c236 100644 --- a/test/webfuse/tests/adapter/test_mountpoint.cc +++ b/test/webfuse/test_mountpoint.cc @@ -1,6 +1,6 @@ #include #include -#include "webfuse/adapter/mountpoint.h" +#include "webfuse/mountpoint.h" namespace { diff --git a/test/webfuse/test_server.cc b/test/webfuse/test_server.cc new file mode 100644 index 0000000..bc4bee5 --- /dev/null +++ b/test/webfuse/test_server.cc @@ -0,0 +1,348 @@ +#include + +#include + +#include "webfuse/server.h" +#include "webfuse/server_config.h" +#include "webfuse/test_util/server.hpp" +#include "webfuse/test_util/ws_client.hpp" +#include "webfuse/test_util/file.hpp" +#include "webfuse/mocks/mock_invokation_handler.hpp" +#include "webfuse/protocol_names.h" +#include "webfuse/mocks/open_matcher.hpp" +#include "webfuse/mocks/getattr_matcher.hpp" +#include "webfuse/mocks/lookup_matcher.hpp" +#include "webfuse/mocks/readdir_matcher.hpp" + +using webfuse_test::MockInvokationHander; +using webfuse_test::WsClient; +using webfuse_test::Server; +using webfuse_test::File; +using webfuse_test::GetAttr; +using webfuse_test::Open; +using webfuse_test::Lookup; +using webfuse_test::ReadDir; +using testing::StrEq; +using testing::_; +using testing::AnyNumber; +using testing::AtMost; +using testing::Return; + +namespace +{ +struct wf_mountpoint * +create_mountpoint( + char const * filesystem, + void * user_data) +{ + (void) filesystem; + (void) user_data; + + return nullptr; +} + +} + +TEST(server, create_dispose) +{ + mkdir("test", 0700); + + struct wf_server_config * config = wf_server_config_create(); + wf_server_config_set_mountpoint_factory(config, &create_mountpoint, nullptr); + struct wf_server * server = wf_server_create(config); + ASSERT_NE(nullptr, server); + + wf_server_dispose(server); + wf_server_config_dispose(config); + + rmdir("test"); +} + +TEST(server, connect) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, add_filesystem) +{ + Server server; + MockInvokationHander handler; + EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()); + EXPECT_CALL(handler, Invoke(StrEq("getattr"), GetAttr(1))).Times(AnyNumber()) + .WillOnce(Return("{\"mode\": 420, \"type\": \"dir\"}")); + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * result = json_object_get(response, "result"); + ASSERT_TRUE(json_is_object(result)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + std::string base_dir = server.GetBaseDir(); + ASSERT_TRUE(File(base_dir).isDirectory()); + File file(base_dir + "/test"); + ASSERT_TRUE(file.isDirectory()); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, add_filesystem_fail_missing_param) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, add_filesystem_fail_invalid_name_type) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [42], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, add_filesystem_fail_invalid_name) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"invalid_1/name\"], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + + +TEST(server, authenticate) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", {\"username\": \"bob\", \"password\": \"secret\"}], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * result = json_object_get(response, "result"); + ASSERT_TRUE(json_is_object(result)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, authenticate_fail_missing_params) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, authenticate_fail_invalid_type) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [42, {\"username\": \"bob\", \"password\": \"secret\"}], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, authenticate_fail_invalid_credentials) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", 42], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, authenticate_fail_missing_credentials) +{ + Server server; + MockInvokationHander handler; + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\"], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, read) +{ + Server server; + MockInvokationHander handler; + EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()); + EXPECT_CALL(handler, Invoke(StrEq("lookup"), Lookup(1, "a.file"))).Times(1) + .WillOnce(Return("{\"inode\": 2, \"mode\": 420, \"type\": \"file\", \"size\": 1}")); + EXPECT_CALL(handler, Invoke(StrEq("getattr"), GetAttr(1))).Times(AnyNumber()) + .WillOnce(Return("{\"mode\": 420, \"type\": \"dir\"}")); + EXPECT_CALL(handler, Invoke(StrEq("open"), Open(2))).Times(1) + .WillOnce(Return("{\"handle\": 42}")); + EXPECT_CALL(handler, Invoke(StrEq("read"), _)).Times(1) + .WillOnce(Return("{\"data\": \"*\", \"format\": \"identity\", \"count\": 1}")); + EXPECT_CALL(handler, Invoke(StrEq("close"), _)).Times(AtMost(1)); + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * result = json_object_get(response, "result"); + ASSERT_TRUE(json_is_object(result)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + std::string base_dir = server.GetBaseDir(); + ASSERT_TRUE(File(base_dir).isDirectory()); + File file(base_dir + "/test/a.file"); + ASSERT_TRUE(file.hasContents("*")); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server, readdir) +{ + Server server; + MockInvokationHander handler; + EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()); + EXPECT_CALL(handler, Invoke(StrEq("getattr"), GetAttr(1))).Times(AnyNumber()) + .WillOnce(Return("{\"mode\": 420, \"type\": \"dir\"}")); + EXPECT_CALL(handler, Invoke(StrEq("readdir"), ReadDir(1))).Times(1) + .WillOnce(Return("[{\"name\": \"foo\", \"inode\": 23}]")); + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER); + ASSERT_TRUE(connected); + + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * result = json_object_get(response, "result"); + ASSERT_TRUE(json_is_object(result)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + + std::string base_dir = server.GetBaseDir(); + ASSERT_TRUE(File(base_dir).isDirectory()); + File file(base_dir + "/test"); + ASSERT_TRUE(file.hasSubdirectory("foo")); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} \ No newline at end of file diff --git a/test/webfuse/tests/adapter/test_server_config.cc b/test/webfuse/test_server_config.cc similarity index 95% rename from test/webfuse/tests/adapter/test_server_config.cc rename to test/webfuse/test_server_config.cc index ceec97d..2e6ce9c 100644 --- a/test/webfuse/tests/adapter/test_server_config.cc +++ b/test/webfuse/test_server_config.cc @@ -1,8 +1,8 @@ #include -#include "webfuse/adapter/server_config.h" -#include "webfuse/adapter/impl/server_config.h" -#include "webfuse/adapter/impl/authenticator.h" -#include "webfuse/utils/tempdir.hpp" +#include "webfuse/server_config.h" +#include "webfuse/impl/server_config.h" +#include "webfuse/impl/authenticator.h" +#include "webfuse/test_util/tempdir.hpp" using webfuse_test::TempDir; diff --git a/test/webfuse/test_server_protocol.cc b/test/webfuse/test_server_protocol.cc new file mode 100644 index 0000000..bc608ba --- /dev/null +++ b/test/webfuse/test_server_protocol.cc @@ -0,0 +1,117 @@ +#include "webfuse/test_util/server_protocol.hpp" +#include "webfuse/test_util/ws_client.hpp" +#include "webfuse/test_util/file.hpp" +#include "webfuse/mocks/mock_invokation_handler.hpp" +#include "webfuse/mocks/getattr_matcher.hpp" +#include "webfuse/protocol_names.h" + +#include +#include + +using webfuse_test::MockInvokationHander; +using webfuse_test::WsClient; +using webfuse_test::ServerProtocol; +using webfuse_test::File; +using webfuse_test::GetAttr; + +using testing::_; +using testing::AnyNumber; +using testing::StrEq; +using testing::Return; + +TEST(server_protocol, add_filesystem) +{ + ServerProtocol server; + MockInvokationHander handler; + EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()); + EXPECT_CALL(handler, Invoke(StrEq("getattr"), GetAttr(1))).Times(AnyNumber()) + .WillOnce(Return("{\"mode\": 420, \"type\": \"dir\"}")); + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER, false); + ASSERT_TRUE(connected); + + { + std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", {\"username\": \"bob\", \"password\": \"secret\"}], \"id\": 23}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * result = json_object_get(response, "result"); + ASSERT_TRUE(json_is_object(result)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(23, json_integer_value(id)); + json_decref(response); + } + + { + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * result = json_object_get(response, "result"); + ASSERT_TRUE(json_is_object(result)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + } + + std::string base_dir = server.GetBaseDir(); + ASSERT_TRUE(File(base_dir).isDirectory()); + File file(base_dir + "/test"); + ASSERT_TRUE(file.isDirectory()); + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server_protocol, add_filesystem_fail_without_authentication) +{ + ServerProtocol server; + MockInvokationHander handler; + EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()); + EXPECT_CALL(handler, Invoke(StrEq("getattr"), GetAttr(1))).Times(AnyNumber()) + .WillOnce(Return("{\"mode\": 420, \"type\": \"dir\"}")); + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER, false); + ASSERT_TRUE(connected); + + { + std::string response_text = client.Invoke("{\"method\": \"add_filesystem\", \"params\": [\"test\"], \"id\": 42}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(42, json_integer_value(id)); + json_decref(response); + } + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} + +TEST(server_protocol, authenticate_fail_wrong_credentials) +{ + ServerProtocol server; + MockInvokationHander handler; + EXPECT_CALL(handler, Invoke(StrEq("lookup"), _)).Times(AnyNumber()); + EXPECT_CALL(handler, Invoke(StrEq("getattr"), GetAttr(1))).Times(AnyNumber()) + .WillOnce(Return("{\"mode\": 420, \"type\": \"dir\"}")); + WsClient client(handler, WF_PROTOCOL_NAME_PROVIDER_CLIENT); + + auto connected = client.Connect(server.GetPort(), WF_PROTOCOL_NAME_ADAPTER_SERVER, false); + ASSERT_TRUE(connected); + + { + std::string response_text = client.Invoke("{\"method\": \"authenticate\", \"params\": [\"username\", {\"username\": \"alice\", \"password\": \"cheshire\"}], \"id\": 23}"); + json_t * response = json_loads(response_text.c_str(), 0, nullptr); + ASSERT_TRUE(json_is_object(response)); + json_t * error = json_object_get(response, "error"); + ASSERT_TRUE(json_is_object(error)); + json_t * id = json_object_get(response, "id"); + ASSERT_EQ(23, json_integer_value(id)); + json_decref(response); + } + + auto disconnected = client.Disconnect(); + ASSERT_TRUE(disconnected); +} diff --git a/test/webfuse/test_status.cc b/test/webfuse/test_status.cc new file mode 100644 index 0000000..5d960e9 --- /dev/null +++ b/test/webfuse/test_status.cc @@ -0,0 +1,30 @@ +#include +#include "webfuse/impl/status.h" + +TEST(wf_status, tostring) +{ + ASSERT_STREQ("Good", wf_impl_status_tostring(WF_GOOD)); + ASSERT_STREQ("Bad", wf_impl_status_tostring(WF_BAD)); + ASSERT_STREQ("Bad (not implemented)", wf_impl_status_tostring(WF_BAD_NOTIMPLEMENTED)); + ASSERT_STREQ("Bad (busy)", wf_impl_status_tostring(WF_BAD_BUSY)); + ASSERT_STREQ("Bad (timeout)", wf_impl_status_tostring(WF_BAD_TIMEOUT)); + ASSERT_STREQ("Bad (format)", wf_impl_status_tostring(WF_BAD_FORMAT)); + ASSERT_STREQ("Bad (no entry)", wf_impl_status_tostring(WF_BAD_NOENTRY)); + ASSERT_STREQ("Bad (access denied)", wf_impl_status_tostring(WF_BAD_ACCESS_DENIED)); + + ASSERT_STREQ("Bad (unknown)", wf_impl_status_tostring(-1)); +} + +TEST(wf_status, to_rc) +{ + ASSERT_EQ(0, wf_impl_status_to_rc(WF_GOOD)); + ASSERT_EQ(-ENOENT, wf_impl_status_to_rc(WF_BAD)); + ASSERT_EQ(-ENOSYS, wf_impl_status_to_rc(WF_BAD_NOTIMPLEMENTED)); + ASSERT_EQ(-ENOENT, wf_impl_status_to_rc(WF_BAD_BUSY)); + ASSERT_EQ(-ETIMEDOUT, wf_impl_status_to_rc(WF_BAD_TIMEOUT)); + ASSERT_EQ(-ENOENT, wf_impl_status_to_rc(WF_BAD_FORMAT)); + ASSERT_EQ(-ENOENT, wf_impl_status_to_rc(WF_BAD_NOENTRY)); + ASSERT_EQ(-EACCES, wf_impl_status_to_rc(WF_BAD_ACCESS_DENIED)); + + ASSERT_EQ(-ENOENT, wf_impl_status_to_rc(-1)); +} \ No newline at end of file diff --git a/test/webfuse/utils/adapter_client.cc b/test/webfuse/test_util/adapter_client.cc similarity index 97% rename from test/webfuse/utils/adapter_client.cc rename to test/webfuse/test_util/adapter_client.cc index d1dbb4e..0822292 100644 --- a/test/webfuse/utils/adapter_client.cc +++ b/test/webfuse/test_util/adapter_client.cc @@ -1,5 +1,5 @@ -#include "webfuse/utils/adapter_client.hpp" -#include "webfuse/utils/tempdir.hpp" +#include "webfuse/test_util/adapter_client.hpp" +#include "webfuse/test_util/tempdir.hpp" #include #include diff --git a/test/webfuse/utils/adapter_client.hpp b/test/webfuse/test_util/adapter_client.hpp similarity index 82% rename from test/webfuse/utils/adapter_client.hpp rename to test/webfuse/test_util/adapter_client.hpp index ceaefcb..8a5aba0 100644 --- a/test/webfuse/utils/adapter_client.hpp +++ b/test/webfuse/test_util/adapter_client.hpp @@ -1,7 +1,7 @@ -#ifndef WF_UTILS_ADAPTER_CLIENT_HPP -#define WF_UTILS_APAPTER_CLIENT_HPP +#ifndef WF_TEST_UTIL_ADAPTER_CLIENT_HPP +#define WF_TEST_UTIL_APAPTER_CLIENT_HPP -#include "webfuse/adapter/client.h" +#include "webfuse/client.h" #include namespace webfuse_test diff --git a/test/webfuse/tests/integration/file.cc b/test/webfuse/test_util/file.cc similarity index 95% rename from test/webfuse/tests/integration/file.cc rename to test/webfuse/test_util/file.cc index 5719382..1ec16b5 100644 --- a/test/webfuse/tests/integration/file.cc +++ b/test/webfuse/test_util/file.cc @@ -1,4 +1,4 @@ -#include "webfuse/tests/integration/file.hpp" +#include "webfuse/test_util/file.hpp" #include #include @@ -77,7 +77,7 @@ bool File::hasSubdirectory(std::string const & subdir) bool File::hasContents(std::string const & contents) { std::stringstream command; - command << "./fs_check -c has_contents -f " << path_ << " -a " << contents; + command << "./fs_check -c has_contents -f " << path_ << " -a \'" << contents << "\'"; return invoke(command.str()); } diff --git a/test/webfuse/tests/integration/file.hpp b/test/webfuse/test_util/file.hpp similarity index 100% rename from test/webfuse/tests/integration/file.hpp rename to test/webfuse/test_util/file.hpp diff --git a/test/webfuse/test_util/invokation_handler.hpp b/test/webfuse/test_util/invokation_handler.hpp new file mode 100644 index 0000000..ac8b7fe --- /dev/null +++ b/test/webfuse/test_util/invokation_handler.hpp @@ -0,0 +1,19 @@ +#ifndef WF_TEST_UTIL_INVOKATION_HANDLER_HPP +#define WF_TEST_UTIL_INVOKATION_HANDLER_HPP + +#include +#include + +namespace webfuse_test +{ + +class InvokationHandler +{ +public: + virtual ~InvokationHandler() = default; + virtual std::string Invoke(char const * method, json_t * params) = 0; +}; + +} + +#endif diff --git a/test/webfuse/utils/jansson_test_environment.cc b/test/webfuse/test_util/jansson_test_environment.cc similarity index 50% rename from test/webfuse/utils/jansson_test_environment.cc rename to test/webfuse/test_util/jansson_test_environment.cc index 24d091f..d7e3c2d 100644 --- a/test/webfuse/utils/jansson_test_environment.cc +++ b/test/webfuse/test_util/jansson_test_environment.cc @@ -7,10 +7,14 @@ namespace webfuse_test class JanssonTestEnvironment: public ::testing::Environment { public: - void SetUp() + ~JanssonTestEnvironment() override { } + + void SetUp() override { json_object_seed(0); } }; -# + +::testing::Environment * const jansson_env = ::testing::AddGlobalTestEnvironment(new JanssonTestEnvironment()); + } \ No newline at end of file diff --git a/test/webfuse/test_util/lws_test_environment.cc b/test/webfuse/test_util/lws_test_environment.cc new file mode 100644 index 0000000..3d6b168 --- /dev/null +++ b/test/webfuse/test_util/lws_test_environment.cc @@ -0,0 +1,18 @@ +#include +#include "webfuse/impl/util/lws_log.h" + +namespace webfuse_test +{ + +class LwsTestEnvironment: public testing::Environment +{ +public: + void SetUp() + { + wf_impl_lwslog_disable(); + } +}; + +::testing::Environment * const lws_env = ::testing::AddGlobalTestEnvironment(new LwsTestEnvironment()); + +} \ No newline at end of file diff --git a/test/webfuse/test_util/mountpoint_factory.cc b/test/webfuse/test_util/mountpoint_factory.cc new file mode 100644 index 0000000..267fd20 --- /dev/null +++ b/test/webfuse/test_util/mountpoint_factory.cc @@ -0,0 +1,41 @@ +#include "webfuse/test_util/mountpoint_factory.hpp" +#include "webfuse/mountpoint.h" + +#include +#include +#include +#include +#include + +extern "C" +{ + +static void +webfuse_test_cleanup_mountpoint( + void * user_data) +{ + char * path = reinterpret_cast(user_data); + rmdir(path); + free(path); +} + +struct wf_mountpoint * +webfuse_test_create_mountpoint( + char const * filesystem, + void * user_data) +{ + char const * base_dir = reinterpret_cast(user_data); + char * path; + asprintf(&path, "%s/%s", base_dir, filesystem); + mkdir(path, 0755); + struct wf_mountpoint * mountpoint = wf_mountpoint_create(path); + wf_mountpoint_set_userdata( + mountpoint, + reinterpret_cast(path), + &webfuse_test_cleanup_mountpoint); + + return mountpoint; +} + + +} \ No newline at end of file diff --git a/test/webfuse/test_util/mountpoint_factory.hpp b/test/webfuse/test_util/mountpoint_factory.hpp new file mode 100644 index 0000000..f66e902 --- /dev/null +++ b/test/webfuse/test_util/mountpoint_factory.hpp @@ -0,0 +1,17 @@ +#ifndef WF_TEST_UTIL_MOUNTPOINT_FACTORY_HPP +#define WF_TEST_UTIL_MOUNTPOINT_FACTORY_HPP + +extern "C" +{ + +struct wf_mountpoint; + +extern wf_mountpoint * +webfuse_test_create_mountpoint( + char const * filesystem, + void * user_data); + + +} + +#endif diff --git a/test/webfuse/test_util/server.cc b/test/webfuse/test_util/server.cc new file mode 100644 index 0000000..f2725c7 --- /dev/null +++ b/test/webfuse/test_util/server.cc @@ -0,0 +1,110 @@ +#include "webfuse/test_util/server.hpp" + +#include "webfuse/test_util/mountpoint_factory.hpp" +#include "webfuse/test_util/tempdir.hpp" +#include "webfuse/impl/server.h" +#include "webfuse/webfuse.h" + +#include +#include + +namespace webfuse_test +{ + +class Server::Private +{ +public: + Private() + : is_shutdown_requested(false) + , tempdir("webfuse_test_server") + { + config = wf_server_config_create(); + wf_server_config_set_port(config, 0); + wf_server_config_set_mountpoint_factory(config, + &webfuse_test_create_mountpoint, + reinterpret_cast(const_cast(tempdir.path()))); + wf_server_config_set_keypath(config, "server-key.pem"); + wf_server_config_set_certpath(config, "server-cert.pem"); + + server = wf_server_create(config); + + while (!wf_impl_server_is_operational(server)) + { + wf_server_service(server); + } + + thread = std::thread(Run, this); + + } + + ~Private() + { + RequestShutdown(); + thread.join(); + wf_server_dispose(server); + wf_server_config_dispose(config); + } + + char const * GetBaseDir() + { + return tempdir.path(); + } + + int GetPort(void) const + { + return wf_server_get_port(server); + } + +private: + static void Run(Private * context) + { + while (!context->IsShutdownRequested()) + { + wf_server_service(context->server); + } + } + + bool IsShutdownRequested() + { + std::lock_guard lock(shutdown_lock); + return is_shutdown_requested; + } + + void RequestShutdown() + { + std::lock_guard lock(shutdown_lock); + is_shutdown_requested = true; + wf_server_interrupt(server); + } + + std::mutex shutdown_lock; + std::thread thread; + bool is_shutdown_requested; + TempDir tempdir; + wf_server_config * config; + wf_server * server; +}; + +Server::Server() +: d(new Server::Private()) +{ + +} + +Server::~Server() +{ + delete d; +} + +char const * Server::GetBaseDir(void) const +{ + return d->GetBaseDir(); +} + +int Server::GetPort(void) const +{ + return d->GetPort(); +} + + +} \ No newline at end of file diff --git a/test/webfuse/tests/integration/server.hpp b/test/webfuse/test_util/server.hpp similarity index 72% rename from test/webfuse/tests/integration/server.hpp rename to test/webfuse/test_util/server.hpp index de7864c..b4d1ac8 100644 --- a/test/webfuse/tests/integration/server.hpp +++ b/test/webfuse/test_util/server.hpp @@ -1,8 +1,6 @@ #ifndef WF_TEST_INTEGRATION_SERVER_HPP #define WF_TEST_INTEGRATION_SERVER_HPP -#include - namespace webfuse_test { @@ -11,10 +9,8 @@ class Server public: Server(); ~Server(); - void Start(void); - void Stop(void); char const * GetBaseDir(void) const; - std::string GetUrl(void) const; + int GetPort(void) const; private: class Private; Private * d; diff --git a/test/webfuse/test_util/server_protocol.cc b/test/webfuse/test_util/server_protocol.cc new file mode 100644 index 0000000..0f2a655 --- /dev/null +++ b/test/webfuse/test_util/server_protocol.cc @@ -0,0 +1,133 @@ +#include "webfuse/test_util/server_protocol.hpp" +#include "webfuse/test_util/mountpoint_factory.hpp" +#include "webfuse/test_util/tempdir.hpp" +#include "webfuse/server_protocol.h" +#include "webfuse/credentials.h" + +#include + +#include +#include +#include + +namespace webfuse_test +{ + +extern "C" bool webfuse_test_server_protocol_authenticate( + wf_credentials const * credentials, + void *) +{ + char const * username = wf_credentials_get(credentials, "username"); + char const * password = wf_credentials_get(credentials, "password"); + + return ((nullptr != username) && (nullptr != password) && + (0 == strcmp("bob", username)) && + (0 == strcmp("secret", password))); +} + + +class ServerProtocol::Private +{ +public: + Private(); + ~Private(); + char const * GetBaseDir(); + int GetPort() const; +private: + static void Run(Private * self); + bool is_shutdown_requested; + TempDir tempdir; + int port; + wf_server_protocol * protocol; + lws_context * context; + lws_context_creation_info info; + lws_protocols protocols[2]; + std::thread thread; + std::mutex mutex; +}; + +ServerProtocol::ServerProtocol() +: d(new Private()) +{ + +} + +ServerProtocol::~ServerProtocol() +{ + delete d; +} + +char const * ServerProtocol::GetBaseDir() const +{ + return d->GetBaseDir(); +} + +int ServerProtocol::GetPort() const +{ + return d->GetPort(); +} + +ServerProtocol::Private::Private() +: is_shutdown_requested(false) +, tempdir("webfuse_test_server_protocol") +{ + protocol = wf_server_protocol_create( + &webfuse_test_create_mountpoint, + reinterpret_cast(const_cast(tempdir.path()))); + + wf_server_protocol_add_authenticator(protocol, "username", + &webfuse_test_server_protocol_authenticate, nullptr); + + memset(protocols, 0, 2 * sizeof(lws_protocols)); + wf_server_protocol_init_lws(protocol, &protocols[0]); + + memset(&info, 0, sizeof(lws_context_creation_info)); + info.port = 0; + info.protocols = protocols; + info.vhost_name = "localhost"; + info.ws_ping_pong_interval = 10; + info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; + info.options |= LWS_SERVER_OPTION_EXPLICIT_VHOSTS; + + context = lws_create_context(&info); + + struct lws_vhost * const vhost = lws_create_vhost(context, &info); + port = lws_get_vhost_port(vhost); + + thread = std::thread(&Run, this); +} + +ServerProtocol::Private::~Private() +{ + std::unique_lock lock(mutex); + is_shutdown_requested = true; + lock.unlock(); + + lws_cancel_service(context); + thread.join(); + lws_context_destroy(context); + wf_server_protocol_dispose(protocol); +} + +char const * ServerProtocol::Private::GetBaseDir() +{ + return tempdir.path(); +} + +int ServerProtocol::Private::GetPort() const +{ + return port; +} + +void ServerProtocol::Private::Run(Private * self) +{ + std::unique_lock lock(self->mutex); + while(!self->is_shutdown_requested) + { + lock.unlock(); + lws_service(self->context, 0); + lock.lock(); + } +} + +} \ No newline at end of file diff --git a/test/webfuse/test_util/server_protocol.hpp b/test/webfuse/test_util/server_protocol.hpp new file mode 100644 index 0000000..70175a6 --- /dev/null +++ b/test/webfuse/test_util/server_protocol.hpp @@ -0,0 +1,22 @@ +#ifndef WF_TEST_UTIL_SERVER_PROTOCOL_HPP +#define WF_TEST_UTIL_SERVER_PROTOCOL_HPP + +namespace webfuse_test +{ + +class ServerProtocol +{ +public: + ServerProtocol(); + ~ServerProtocol(); + char const * GetBaseDir() const; + int GetPort() const; +private: + class Private; + Private * d; +}; + +} + + +#endif diff --git a/test/webfuse/utils/tempdir.cc b/test/webfuse/test_util/tempdir.cc similarity index 91% rename from test/webfuse/utils/tempdir.cc rename to test/webfuse/test_util/tempdir.cc index 46b78a7..783efee 100644 --- a/test/webfuse/utils/tempdir.cc +++ b/test/webfuse/test_util/tempdir.cc @@ -1,4 +1,4 @@ -#include "webfuse/utils/tempdir.hpp" +#include "webfuse/test_util/tempdir.hpp" #include #include diff --git a/test/webfuse/utils/tempdir.hpp b/test/webfuse/test_util/tempdir.hpp similarity index 80% rename from test/webfuse/utils/tempdir.hpp rename to test/webfuse/test_util/tempdir.hpp index 6a03fc5..084febc 100644 --- a/test/webfuse/utils/tempdir.hpp +++ b/test/webfuse/test_util/tempdir.hpp @@ -1,5 +1,5 @@ -#ifndef WF_TEST_TEMPDIR_HPP -#define WF_TEST_TEMPDIR_HPP +#ifndef WF_TEST_UTIL_TEMPDIR_HPP +#define WF_TEST_UTIL_TEMPDIR_HPP namespace webfuse_test { diff --git a/test/webfuse/utils/wrap.hpp b/test/webfuse/test_util/wrap.hpp similarity index 98% rename from test/webfuse/utils/wrap.hpp rename to test/webfuse/test_util/wrap.hpp index 30694de..bd21bae 100644 --- a/test/webfuse/utils/wrap.hpp +++ b/test/webfuse/test_util/wrap.hpp @@ -1,5 +1,5 @@ -#ifndef WF_WRAP_HPP -#define WF_WRAP_HPP +#ifndef WF_TEST_UTIL_WRAP_HPP +#define WF_TEST_UTIL_WRAP_HPP #define WF_WRAP_FUNC0( GLOBAL_VAR, RETURN_TYPE, FUNC_NAME ) \ extern RETURN_TYPE __real_ ## FUNC_NAME (); \ diff --git a/test/webfuse/test_util/ws_client.cc b/test/webfuse/test_util/ws_client.cc new file mode 100644 index 0000000..d074f7b --- /dev/null +++ b/test/webfuse/test_util/ws_client.cc @@ -0,0 +1,444 @@ +#include "webfuse/test_util/ws_client.hpp" +#include "webfuse/test_util/invokation_handler.hpp" +#include "webfuse/status.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#define TIMEOUT (std::chrono::seconds(10)) + +namespace +{ + +class IServer +{ +public: + virtual ~IServer() = default; + virtual void OnConnectionEstablished(lws * wsi) = 0; + virtual void OnConnectionError(lws * wsi) = 0; + virtual void OnConnectionClosed(lws * wsi) = 0; + virtual void OnMessageReceived(lws * wsi, char * data, size_t length) = 0; + virtual int OnWritable(lws * wsi) = 0; +}; + +} + +extern "C" +{ + +static int webfuse_test_WsClient_callback( + lws * wsi, + lws_callback_reasons reason, + void * user, + void * in, + size_t len) +{ + int result = 0; + struct lws_protocols const * protocol = lws_get_protocol(wsi); + IServer * server = (nullptr != protocol) ? reinterpret_cast(protocol->user) : nullptr; + + if (nullptr != server) + { + switch (reason) + { + case LWS_CALLBACK_CLIENT_ESTABLISHED: + server->OnConnectionEstablished(wsi); + break; + case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: + server->OnConnectionError(wsi); + break; + case LWS_CALLBACK_CLIENT_CLOSED: + server->OnConnectionClosed(wsi); + break; + case LWS_CALLBACK_CLIENT_RECEIVE: + server->OnMessageReceived(wsi, reinterpret_cast(in), len); + break; + case LWS_CALLBACK_SERVER_WRITEABLE: + // fall-through + case LWS_CALLBACK_CLIENT_WRITEABLE: + result = server->OnWritable(wsi); + break; + default: + break; + } + } + + return result; +} + +} + +namespace webfuse_test +{ + +class WsClient::Private: public IServer +{ +public: + Private( + InvokationHandler & handler, + std::string const & protocol) + : wsi_(nullptr) + , handler_(handler) + , protocol_(protocol) + , conn_state(connection_state::disconnected) + , await_response(false) + , remote_port(0) + , remote_use_tls(false) + { + IServer * self = this; + + memset(protocols, 0, sizeof(lws_protocols) * 2); + protocols[0].name = protocol_.c_str(); + protocols[0].callback = &webfuse_test_WsClient_callback; + protocols[0].per_session_data_size = 0; + protocols[0].user = self; + + memset(&info, 0, sizeof(lws_context_creation_info)); + info.port = CONTEXT_PORT_NO_LISTEN; + info.protocols = protocols; + info.uid = -1; + info.gid = -1; + info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS; + + context = lws_create_context(&info); + + lws_vhost * vhost = lws_create_vhost(context, & info); + info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; + info.client_ssl_cert_filepath = "client-cert.pem"; + info.client_ssl_private_key_filepath = "client-key.pem"; + info.client_ssl_ca_filepath = "server-cert.pem"; + lws_init_vhost_client_ssl(&info, vhost); + + thread = std::thread(&Run, this); + } + + ~Private() + { + std::unique_lock lock(mutex); + commands.push(command::shutdown); + lock.unlock(); + lws_cancel_service(context); + + thread.join(); + lws_context_destroy(context); + } + + bool Connect(int port, std::string const & protocol, bool use_tls) + { + std::unique_lock lock(mutex); + remote_port = port; + remote_protocol = protocol; + remote_use_tls = use_tls; + conn_state = connection_state::connecting; + commands.push(command::connect); + + lock.unlock(); + lws_cancel_service(context); + lock.lock(); + + convar.wait_for(lock, TIMEOUT, [&]() { + return (conn_state != connection_state::connecting); + }); + + return (connection_state::connected == conn_state); + } + + bool Disconnect() + { + std::unique_lock lock(mutex); + commands.push(command::disconnect); + conn_state = connection_state::disconnecting; + + lock.unlock(); + lws_cancel_service(context); + lock.lock(); + + convar.wait_for(lock, TIMEOUT, [&]() { + return (conn_state != connection_state::disconnecting); + }); + + return (connection_state::disconnected == conn_state); + } + + std::string Invoke(std::string const & message) + { + std::unique_lock lock(mutex); + send_queue.push(message); + commands.push(command::send); + await_response = true; + + lock.unlock(); + lws_cancel_service(context); + lock.lock(); + + convar.wait_for(lock, TIMEOUT, [&]() { + return !await_response; + }); + + return response; + } + + void OnConnectionEstablished(lws * wsi) + { + std::unique_lock lock(mutex); + wsi_ = wsi; + conn_state = connection_state::connected; + convar.notify_all(); + } + + void OnConnectionError(lws * wsi) + { + std::unique_lock lock(mutex); + wsi_ = nullptr; + conn_state = connection_state::disconnected; + convar.notify_all(); + } + + void OnConnectionClosed(lws * wsi) + { + std::unique_lock lock(mutex); + if (wsi == wsi_) + { + wsi_ = nullptr; + conn_state = connection_state::disconnected; + convar.notify_all(); + } + } + + void OnMessageReceived(lws * wsi, char * data, size_t length) + { + std::unique_lock lock(mutex); + if (await_response) + { + response = std::string(data, length); + await_response = false; + convar.notify_all(); + } + else + { + lock.unlock(); + + json_t * request = json_loadb(data, length, 0, nullptr); + if (nullptr != request) + { + json_t * method = json_object_get(request, "method"); + json_t * params = json_object_get(request, "params"); + json_t * id = json_object_get(request, "id"); + + json_t * response = json_object(); + try + { + std::string result_text = handler_.Invoke(json_string_value(method), params); + json_t * result = json_loads(result_text.c_str(), 0, nullptr); + if (nullptr != result) + { + json_object_set_new(response, "result", result); + } + else + { + json_t * error = json_object(); + json_object_set_new(error, "code", json_integer(WF_BAD)); + json_object_set_new(response, "error",error); + } + + } + catch (...) + { + json_t * error = json_object(); + json_object_set_new(error, "code", json_integer(WF_BAD)); + json_object_set_new(response, "error",error); + } + + json_object_set(response, "id", id); + + char * response_text = json_dumps(response, 0); + lock.lock(); + send_queue.push(response_text); + commands.push(command::send); + lock.unlock(); + + lws_cancel_service(context); + + free(response_text); + + json_decref(response); + json_decref(request); + } + } + } + + int OnWritable(lws * wsi) + { + std::unique_lock lock(mutex); + if (conn_state == connection_state::disconnecting) + { + return 1; + } + else if (!send_queue.empty()) + { + std::string message = send_queue.front(); + send_queue.pop(); + bool has_more = !send_queue.empty(); + lock.unlock(); + + unsigned char * data = new unsigned char[LWS_PRE + message.size()]; + memcpy(&data[LWS_PRE], message.c_str(), message.size()); + lws_write(wsi, &data[LWS_PRE], message.size(), LWS_WRITE_TEXT); + delete[] data; + + if (has_more) + { + lws_callback_on_writable(wsi); + } + } + + return 0; + } + + +private: + enum class command + { + run, + shutdown, + connect, + disconnect, + send + }; + + enum class connection_state + { + disconnected, + connected, + connecting, + disconnecting + }; + + static void Run(Private * self) + { + bool is_running = true; + + while (is_running) + { + switch (self->GetCommand()) + { + case command::run: + lws_service(self->context, 0); + break; + case command::shutdown: + is_running = false; + break; + case command::connect: + { + struct lws_client_connect_info info; + memset(&info, 0 ,sizeof(struct lws_client_connect_info)); + { + std::unique_lock lock(self->mutex); + + info.context = self->context; + info.port = self->remote_port; + info.address = "localhost"; + info.path = "/"; + info.host = info.address; + info.origin = info.address; + info.ssl_connection = (self->remote_use_tls) ? LCCSCF_USE_SSL : 0; + info.protocol = self->remote_protocol.c_str(); + info.local_protocol_name = self->protocol_.c_str(); + info.pwsi = nullptr; + } + + lws_client_connect_via_info(&info); + } + break; + case command::disconnect: + // fallthrough + case command::send: + { + std::unique_lock lock(self->mutex); + lws * wsi = self->wsi_; + lock.unlock(); + + if (nullptr != wsi) + { + lws_callback_on_writable(wsi); + } + } + break; + default: + break; + } + } + } + + command GetCommand() + { + std::unique_lock lock(mutex); + + command command = command::run; + if (!commands.empty()) + { + command = commands.front(); + commands.pop(); + } + + return command; + } + + lws * wsi_; + InvokationHandler & handler_; + std::string protocol_; + connection_state conn_state; + bool await_response; + std::string response; + + lws_context_creation_info info; + lws_protocols protocols[2]; + lws_context * context; + std::thread thread; + std::mutex mutex; + std::condition_variable convar; + std::queue commands; + int remote_port; + std::string remote_protocol; + bool remote_use_tls; + + std::queue send_queue; +}; + +WsClient::WsClient( + InvokationHandler& handler, + std::string const & protocol) +: d(new Private(handler, protocol)) +{ + +} + +WsClient::~WsClient() +{ + delete d; +} + +bool WsClient::Connect(int port, std::string const & protocol, bool use_tls) +{ + return d->Connect(port, protocol, use_tls); +} + +bool WsClient::Disconnect() +{ + return d->Disconnect(); +} + +std::string WsClient::Invoke(std::string const & message) +{ + return d->Invoke(message); +} + + +} \ No newline at end of file diff --git a/test/webfuse/test_util/ws_client.hpp b/test/webfuse/test_util/ws_client.hpp new file mode 100644 index 0000000..5c04231 --- /dev/null +++ b/test/webfuse/test_util/ws_client.hpp @@ -0,0 +1,30 @@ +#ifndef WF_TEST_UTIL_WS_CLIENT_HPP +#define WF_TEST_UTIL_WS_CLIENT_HPP + +#include + +namespace webfuse_test +{ + +class InvokationHandler; + +class WsClient +{ + WsClient(WsClient const &) = delete; + WsClient & operator=(WsClient const &) = delete; +public: + WsClient( + InvokationHandler& handler, + std::string const & protocol); + virtual ~WsClient(); + bool Connect(int port, std::string const & protocol, bool use_tls = true); + bool Disconnect(); + std::string Invoke(std::string const & message); +private: + class Private; + Private *d; +}; + +} + +#endif diff --git a/test/webfuse/utils/ws_server2.cc b/test/webfuse/test_util/ws_server.cc similarity index 81% rename from test/webfuse/utils/ws_server2.cc rename to test/webfuse/test_util/ws_server.cc index 21d4a6e..d9631be 100644 --- a/test/webfuse/utils/ws_server2.cc +++ b/test/webfuse/test_util/ws_server.cc @@ -1,5 +1,6 @@ -#include "webfuse/utils/ws_server2.hpp" -#include "webfuse/core/lws_log.h" +#include "webfuse/test_util/ws_server.hpp" +#include "webfuse/test_util/invokation_handler.hpp" +#include "webfuse/impl/util/lws_log.h" #include #include @@ -70,14 +71,13 @@ static int wf_test_utils_ws_server_callback( namespace webfuse_test { -class WsServer2::Private : public IServer +class WsServer::Private : public IServer { Private(Private const &) = delete; Private & operator=(Private const &) = delete; public: - Private(IIvokationHandler & handler, std::string const & protocol, int port, bool enable_tls); + Private(InvokationHandler & handler, std::string const & protocol, int port, bool enable_tls); ~Private(); - bool IsConnected(); std::string const & GetUrl() const; void OnConnected(lws * wsi) override; void OnConnectionClosed(lws * wsi) override; @@ -89,9 +89,8 @@ public: private: static void Run(Private * self); - IIvokationHandler & handler_; + InvokationHandler & handler_; std::string protocol_; - bool is_connected; bool is_shutdown_requested; lws * wsi_; lws_context * ws_context; @@ -103,54 +102,47 @@ private: std::queue writeQueue; }; -WsServer2::WsServer2( - IIvokationHandler& handler, +WsServer::WsServer( + InvokationHandler& handler, std::string const & protocol, int port, bool enable_tls) -: d(new WsServer2::Private(handler, protocol, port, enable_tls)) +: d(new WsServer::Private(handler, protocol, port, enable_tls)) { } -WsServer2::~WsServer2() +WsServer::~WsServer() { delete d; } -bool WsServer2::IsConnected() -{ - return d->IsConnected(); -} - -std::string const & WsServer2::GetUrl() const +std::string const & WsServer::GetUrl() const { return d->GetUrl(); } -void WsServer2::SendMessage(char const * message) +void WsServer::SendMessage(char const * message) { d->SendMessage(message); } -void WsServer2::SendMessage(json_t * message) +void WsServer::SendMessage(json_t * message) { d->SendMessage(message); } -WsServer2::Private::Private( - IIvokationHandler & handler, +WsServer::Private::Private( + InvokationHandler & handler, std::string const & protocol, int port, bool enable_tls) : handler_(handler) , protocol_(protocol) -, is_connected(false) , is_shutdown_requested(false) , wsi_(nullptr) { - wf_lwslog_disable(); IServer * server = this; memset(ws_protocols, 0, sizeof(struct lws_protocols) * 2 ); @@ -186,19 +178,18 @@ WsServer2::Private::Private( context = std::thread(&Run, this); } -WsServer2::Private::~Private() +WsServer::Private::~Private() { - { - std::unique_lock lock(mutex); - is_shutdown_requested = true; - } + std::unique_lock lock(mutex); + is_shutdown_requested = true; + lock.unlock(); lws_cancel_service(ws_context); context.join(); lws_context_destroy(ws_context); } -void WsServer2::Private::Run(Private * self) +void WsServer::Private::Run(Private * self) { bool is_running = true; while (is_running) @@ -211,30 +202,22 @@ void WsServer2::Private::Run(Private * self) } } -bool WsServer2::Private::IsConnected() +void WsServer::Private::OnConnected(lws * wsi) { std::unique_lock lock(mutex); - return is_connected; -} - -void WsServer2::Private::OnConnected(lws * wsi) -{ - std::unique_lock lock(mutex); - is_connected = true; wsi_ = wsi; } -void WsServer2::Private::OnConnectionClosed(lws * wsi) +void WsServer::Private::OnConnectionClosed(lws * wsi) { std::unique_lock lock(mutex); if (wsi == wsi_) { - is_connected = false; wsi_ = nullptr; } } -void WsServer2::Private::OnWritable(struct lws * wsi) +void WsServer::Private::OnWritable(struct lws * wsi) { bool notify = false; @@ -261,7 +244,7 @@ void WsServer2::Private::OnWritable(struct lws * wsi) } } -void WsServer2::Private::SendMessage(char const * message) +void WsServer::Private::SendMessage(char const * message) { lws * wsi = nullptr; @@ -281,7 +264,7 @@ void WsServer2::Private::SendMessage(char const * message) } } -void WsServer2::Private::SendMessage(json_t * message) +void WsServer::Private::SendMessage(json_t * message) { char* message_text = json_dumps(message, JSON_COMPACT); SendMessage(message_text); @@ -289,7 +272,7 @@ void WsServer2::Private::SendMessage(json_t * message) free(message_text); } -void WsServer2::Private::OnMessageReceived(struct lws * wsi, char const * data, size_t length) +void WsServer::Private::OnMessageReceived(struct lws * wsi, char const * data, size_t length) { (void) wsi; @@ -322,7 +305,7 @@ void WsServer2::Private::OnMessageReceived(struct lws * wsi, char const * data, json_decref(request); } -std::string const & WsServer2::Private::GetUrl() const +std::string const & WsServer::Private::GetUrl() const { return url; } diff --git a/test/webfuse/test_util/ws_server.hpp b/test/webfuse/test_util/ws_server.hpp new file mode 100644 index 0000000..e8b0dfe --- /dev/null +++ b/test/webfuse/test_util/ws_server.hpp @@ -0,0 +1,33 @@ +#ifndef WF_TEST_UTIL_WS_SERVER2_HPP +#define WF_TEST_UTIL_WS_SERVER2_HPP + +#include +#include + +namespace webfuse_test +{ + +class InvokationHandler; + +class WsServer +{ + WsServer(WsServer const &) = delete; + WsServer & operator=(WsServer const & ) = delete; +public: + WsServer( + InvokationHandler& handler, + std::string const & protocol, + int port = 0, + bool enable_tls = false); + virtual ~WsServer(); + std::string const & GetUrl() const; + void SendMessage(char const * message); + void SendMessage(json_t * message); +private: + class Private; + Private * d; +}; + +} + +#endif diff --git a/test/webfuse/tests/adapter/test_server.cc b/test/webfuse/tests/adapter/test_server.cc deleted file mode 100644 index 1b2a881..0000000 --- a/test/webfuse/tests/adapter/test_server.cc +++ /dev/null @@ -1,39 +0,0 @@ -#include - -#include -#include -#include -#include - -#include "webfuse/adapter/server.h" -#include "webfuse/adapter/server_config.h" - -namespace -{ -struct wf_mountpoint * -create_mountpoint( - char const * filesystem, - void * user_data) -{ - (void) filesystem; - (void) user_data; - - return nullptr; -} - -} - -TEST(server, create_dispose) -{ - mkdir("test", 0700); - - struct wf_server_config * config = wf_server_config_create(); - wf_server_config_set_mountpoint_factory(config, &create_mountpoint, nullptr); - struct wf_server * server = wf_server_create(config); - ASSERT_NE(nullptr, server); - - wf_server_dispose(server); - wf_server_config_dispose(config); - - rmdir("test"); -} \ No newline at end of file diff --git a/test/webfuse/tests/core/jsonrpc/mock_timer.cc b/test/webfuse/tests/core/jsonrpc/mock_timer.cc deleted file mode 100644 index 3cf8e74..0000000 --- a/test/webfuse/tests/core/jsonrpc/mock_timer.cc +++ /dev/null @@ -1,31 +0,0 @@ -#include "webfuse/tests/core/jsonrpc/mock_timer.hpp" -#include "webfuse/utils/wrap.hpp" - -extern "C" -{ -static wf_jsonrpc_test::ITimer * wf_jsonrpc_MockTimer = nullptr; - -WF_WRAP_FUNC0(wf_jsonrpc_MockTimer, wf_timer_manager *, wf_timer_manager_create); -WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_timer_manager_dispose, wf_timer_manager *); -WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_timer_manager_check, wf_timer_manager *); - -WF_WRAP_FUNC3(wf_jsonrpc_MockTimer, wf_timer *, wf_timer_create, wf_timer_manager *, wf_timer_on_timer_fn *, void *); -WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_timer_dispose, wf_timer *); -WF_WRAP_FUNC2(wf_jsonrpc_MockTimer, void, wf_timer_start, wf_timer *, int); -WF_WRAP_FUNC1(wf_jsonrpc_MockTimer, void, wf_timer_cancel, wf_timer *); - -} - -namespace wf_jsonrpc_test -{ -MockTimer::MockTimer() -{ - wf_jsonrpc_MockTimer = this; -} - -MockTimer::~MockTimer() -{ - wf_jsonrpc_MockTimer = nullptr; -} - -} \ No newline at end of file diff --git a/test/webfuse/tests/core/jsonrpc/mock_timer.hpp b/test/webfuse/tests/core/jsonrpc/mock_timer.hpp deleted file mode 100644 index 5c95852..0000000 --- a/test/webfuse/tests/core/jsonrpc/mock_timer.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef WF_JSONRPC_MOCK_TIMERMANAGER_HPP -#define WF_JSONRPC_MOCK_TIMERMANAGER_HPP - -#include "webfuse/core/timer/timer.h" -#include "webfuse/core/timer/manager.h" -#include - -namespace wf_jsonrpc_test -{ - -class ITimer -{ -public: - virtual ~ITimer() = default; - virtual wf_timer_manager * wf_timer_manager_create() = 0; - virtual void wf_timer_manager_dispose(wf_timer_manager * manager) = 0; - virtual void wf_timer_manager_check(wf_timer_manager * manager) = 0; - virtual wf_timer * wf_timer_create( - wf_timer_manager * manager, - wf_timer_on_timer_fn * on_timer, - void * user_data) = 0; - virtual void wf_timer_dispose(wf_timer * timer) = 0; - virtual void wf_timer_start(wf_timer * timer, int timeout_ms) = 0; - virtual void wf_timer_cancel(wf_timer * timer) = 0; -}; - -class MockTimer: public ITimer -{ -public: - MockTimer(); - ~MockTimer() override; - MOCK_METHOD0(wf_timer_manager_create, wf_timer_manager * ()); - MOCK_METHOD1(wf_timer_manager_dispose, void(wf_timer_manager * manager)); - MOCK_METHOD1(wf_timer_manager_check, void (wf_timer_manager * manager)); - MOCK_METHOD3(wf_timer_create, wf_timer *( - wf_timer_manager * manager, - wf_timer_on_timer_fn * on_timer, - void * user_data)); - MOCK_METHOD1(wf_timer_dispose, void (wf_timer * timer)); - MOCK_METHOD2(wf_timer_start, void (wf_timer * timer, int timeout_ms)); - MOCK_METHOD1(wf_timer_cancel, void (wf_timer * timer)); - -}; - - -} - -#endif diff --git a/test/webfuse/tests/core/test_base64.cc b/test/webfuse/tests/core/test_base64.cc deleted file mode 100644 index e6ae97d..0000000 --- a/test/webfuse/tests/core/test_base64.cc +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include "webfuse/core/base64.h" - -TEST(Base64, EncodedSize) -{ - ASSERT_EQ(4, wf_base64_encoded_size(1)); - ASSERT_EQ(4, wf_base64_encoded_size(2)); - ASSERT_EQ(4, wf_base64_encoded_size(3)); - - ASSERT_EQ(8, wf_base64_encoded_size(4)); - ASSERT_EQ(8, wf_base64_encoded_size(5)); - ASSERT_EQ(8, wf_base64_encoded_size(6)); - - ASSERT_EQ(120, wf_base64_encoded_size(90)); -} - -TEST(Base64, Encode) -{ - char buffer[42]; - - std::string in = "Hello"; - size_t length = wf_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 42); - ASSERT_EQ(8, length); - ASSERT_STREQ("SGVsbG8=", buffer); - - in = "Hello\n"; - length = wf_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 42); - ASSERT_EQ(8, length); - ASSERT_STREQ("SGVsbG8K", buffer); - - in = "Blue"; - length = wf_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 42); - ASSERT_EQ(8, length); - ASSERT_STREQ("Qmx1ZQ==", buffer); -} - -TEST(Base64, FailedToEncodeBufferTooSmall) -{ - char buffer[1]; - - std::string in = "Hello"; - size_t length = wf_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 1); - ASSERT_EQ(0, length); -} - -TEST(Base64, DecodedSize) -{ - std::string in = "SGVsbG8="; // Hello - size_t length = wf_base64_decoded_size(in.c_str(), in.size()); - ASSERT_EQ(5, length); - - in = "SGVsbG8K"; // Hello\n - length = wf_base64_decoded_size(in.c_str(), in.size()); - ASSERT_EQ(6, length); - - in = "Qmx1ZQ=="; // Blue - length = wf_base64_decoded_size(in.c_str(), in.size()); - ASSERT_EQ(4, length); -} - -TEST(Base64, IsValid) -{ - std::string in = "SGVsbG8="; // Hello - ASSERT_TRUE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "SGVsbG8K"; // Hello\n - ASSERT_TRUE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "Qmx1ZQ=="; // Blue - ASSERT_TRUE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "Qmx1ZQ=a"; - ASSERT_FALSE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "Qmx1ZQ"; - ASSERT_FALSE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "Qmx1ZQ="; - ASSERT_FALSE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "Qmx1Z==="; - ASSERT_FALSE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "Qmx1ZQ?="; - ASSERT_FALSE(wf_base64_isvalid(in.c_str(), in.size())); - - in = "Qm?1ZQ=="; - ASSERT_FALSE(wf_base64_isvalid(in.c_str(), in.size())); -} - -TEST(Base64, Decode) -{ - char buffer[42]; - - std::string in = "SGVsbG8="; // Hello - size_t length = wf_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 42); - ASSERT_EQ(5, length); - buffer[length] = '\0'; - ASSERT_STREQ("Hello", buffer); - - in = "SGVsbG8K"; // Hello\n - length = wf_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 42); - ASSERT_EQ(6, length); - buffer[length] = '\0'; - ASSERT_STREQ("Hello\n", buffer); - - in = "Qmx1ZQ=="; // Blue - length = wf_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 42); - ASSERT_EQ(4, length); - buffer[length] = '\0'; - ASSERT_STREQ("Blue", buffer); -} - -TEST(Base64, FailToDecodeBufferTooSmall) -{ - char buffer[1]; - - std::string in = "SGVsbG8="; // Hello - size_t length = wf_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 1); - ASSERT_EQ(0, length); -} - diff --git a/test/webfuse/tests/core/test_message_queue.cc b/test/webfuse/tests/core/test_message_queue.cc deleted file mode 100644 index ef07bed..0000000 --- a/test/webfuse/tests/core/test_message_queue.cc +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include "webfuse/core/message_queue.h" -#include "webfuse/core/message.h" -#include "webfuse/core/slist.h" - -namespace -{ - - struct wf_slist_item * create_message(char const * content) - { - json_t * value = json_object(); - json_object_set_new(value, "content", json_string(content)); - struct wf_message * message = wf_message_create(value); - - json_decref(value); - return &message->item; - } - -} - -TEST(wf_message_queue, cleanup_empty_list) -{ - struct wf_slist queue; - wf_slist_init(&queue); - - wf_message_queue_cleanup(&queue); - ASSERT_TRUE(wf_slist_empty(&queue)); -} - -TEST(wf_message_queue, cleanup_one_element) -{ - struct wf_slist queue; - wf_slist_init(&queue); - - wf_slist_append(&queue, create_message("Hello")); - - wf_message_queue_cleanup(&queue); - ASSERT_TRUE(wf_slist_empty(&queue)); -} - -TEST(wf_message_queue, cleanup_multiple_element) -{ - struct wf_slist queue; - wf_slist_init(&queue); - - wf_slist_append(&queue, create_message("Hello")); - wf_slist_append(&queue, create_message("World")); - wf_slist_append(&queue, create_message("!")); - - wf_message_queue_cleanup(&queue); - ASSERT_TRUE(wf_slist_empty(&queue)); -} \ No newline at end of file diff --git a/test/webfuse/tests/core/test_status.cc b/test/webfuse/tests/core/test_status.cc deleted file mode 100644 index 4558f72..0000000 --- a/test/webfuse/tests/core/test_status.cc +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include "webfuse/core/status_intern.h" - -TEST(wf_status, tostring) -{ - ASSERT_STREQ("Good", wf_status_tostring(WF_GOOD)); - ASSERT_STREQ("Bad", wf_status_tostring(WF_BAD)); - ASSERT_STREQ("Bad (not implemented)", wf_status_tostring(WF_BAD_NOTIMPLEMENTED)); - ASSERT_STREQ("Bad (busy)", wf_status_tostring(WF_BAD_BUSY)); - ASSERT_STREQ("Bad (timeout)", wf_status_tostring(WF_BAD_TIMEOUT)); - ASSERT_STREQ("Bad (format)", wf_status_tostring(WF_BAD_FORMAT)); - ASSERT_STREQ("Bad (no entry)", wf_status_tostring(WF_BAD_NOENTRY)); - ASSERT_STREQ("Bad (access denied)", wf_status_tostring(WF_BAD_ACCESS_DENIED)); - - ASSERT_STREQ("Bad (unknown)", wf_status_tostring(-1)); -} - -TEST(wf_status, to_rc) -{ - ASSERT_EQ(0, wf_status_to_rc(WF_GOOD)); - ASSERT_EQ(-ENOENT, wf_status_to_rc(WF_BAD)); - ASSERT_EQ(-ENOSYS, wf_status_to_rc(WF_BAD_NOTIMPLEMENTED)); - ASSERT_EQ(-ENOENT, wf_status_to_rc(WF_BAD_BUSY)); - ASSERT_EQ(-ETIMEDOUT, wf_status_to_rc(WF_BAD_TIMEOUT)); - ASSERT_EQ(-ENOENT, wf_status_to_rc(WF_BAD_FORMAT)); - ASSERT_EQ(-ENOENT, wf_status_to_rc(WF_BAD_NOENTRY)); - ASSERT_EQ(-EACCES, wf_status_to_rc(WF_BAD_ACCESS_DENIED)); - - ASSERT_EQ(-ENOENT, wf_status_to_rc(-1)); -} \ No newline at end of file diff --git a/test/webfuse/tests/core/timer/test_timepoint.cc b/test/webfuse/tests/core/timer/test_timepoint.cc deleted file mode 100644 index f55adab..0000000 --- a/test/webfuse/tests/core/timer/test_timepoint.cc +++ /dev/null @@ -1,38 +0,0 @@ -#include - -#include "webfuse/core/timer/timepoint.h" - -#include -#include - -using namespace std::chrono_literals; - -TEST(wf_timer_timepoint, now) -{ - wf_timer_timepoint start = wf_timer_timepoint_now(); - std::this_thread::sleep_for(42ms); - wf_timer_timepoint end = wf_timer_timepoint_now(); - - ASSERT_LT(start, end); - ASSERT_LT(end, start + 500); -} - -TEST(wf_timer_timepoint, in_msec) -{ - wf_timer_timepoint now = wf_timer_timepoint_now(); - wf_timer_timepoint later = wf_timer_timepoint_in_msec(42); - - ASSERT_LT(now, later); - ASSERT_LT(later, now + 500); -} - -TEST(wf_timer_timepoint, elapsed) -{ - wf_timer_timepoint now; - - now = wf_timer_timepoint_now(); - ASSERT_TRUE(wf_timer_timepoint_is_elapsed(now - 1)); - - now = wf_timer_timepoint_now(); - ASSERT_FALSE(wf_timer_timepoint_is_elapsed(now + 500)); -} diff --git a/test/webfuse/tests/core/timer/test_timer.cc b/test/webfuse/tests/core/timer/test_timer.cc deleted file mode 100644 index d25b1f5..0000000 --- a/test/webfuse/tests/core/timer/test_timer.cc +++ /dev/null @@ -1,148 +0,0 @@ -#include - -#include -#include -#include - -#include "webfuse/core/timer/timer.h" -#include "webfuse/core/timer/manager.h" - -using std::size_t; -using namespace std::chrono_literals; - -extern "C" -{ - void on_timeout(struct wf_timer * timer, void * user_data) - { - (void) timer; - - bool * triggered = reinterpret_cast(user_data); - *triggered = true; - } -} - -TEST(wf_timer, init) -{ - bool triggered = false; - struct wf_timer_manager * manager = wf_timer_manager_create(); - struct wf_timer * timer = wf_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); - - wf_timer_dispose(timer); - wf_timer_manager_dispose(manager); -} - -TEST(wf_timer, trigger) -{ - bool triggered = false; - struct wf_timer_manager * manager = wf_timer_manager_create(); - struct wf_timer * timer = wf_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); - - wf_timer_start(timer, -1); - wf_timer_manager_check(manager); - - ASSERT_TRUE(triggered); - - wf_timer_dispose(timer); - wf_timer_manager_dispose(manager); -} - -TEST(wf_timer, trigger_on_dispose) -{ - bool triggered = false; - struct wf_timer_manager * manager = wf_timer_manager_create(); - struct wf_timer * timer = wf_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); - - wf_timer_start(timer, (5 * 60 * 1000)); - - wf_timer_manager_dispose(manager); - ASSERT_TRUE(triggered); - - wf_timer_dispose(timer); -} - -TEST(wf_timer, cancel) -{ - bool triggered = false; - struct wf_timer_manager * manager = wf_timer_manager_create(); - struct wf_timer * timer = wf_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); - - wf_timer_start(timer, 250); - std::this_thread::sleep_for(500ms); - wf_timer_cancel(timer); - wf_timer_manager_check(manager); - - ASSERT_FALSE(triggered); - - wf_timer_dispose(timer); - wf_timer_manager_dispose(manager); -} - -TEST(wf_timer, cancel_multiple_timers) -{ - static size_t const count = 5; - struct wf_timer_manager * manager = wf_timer_manager_create(); - struct wf_timer * timer[count]; - - bool triggered = false; - for(size_t i = 0; i < count; i++) - { - timer[i] = wf_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); - wf_timer_start(timer[i], 0); - } - - std::this_thread::sleep_for(10ms); - for(size_t i = 0; i < count; i++) - { - wf_timer_cancel(timer[i]); - } - - wf_timer_manager_check(manager); - ASSERT_FALSE(triggered); - - for(size_t i = 0; i < count; i++) - { - wf_timer_dispose(timer[i]); - } - wf_timer_manager_dispose(manager); -} - -TEST(wf_timer, multiple_timers) -{ - static size_t const count = 5; - struct wf_timer_manager * manager = wf_timer_manager_create(); - struct wf_timer * timer[count]; - bool triggered[count]; - - for(size_t i = 0; i < count; i++) - { - timer[i] = wf_timer_create(manager, &on_timeout, reinterpret_cast(&triggered[i])); - triggered[i] = false; - wf_timer_start(timer[i], (300 - (50 * i))); - } - - for(size_t i = 0; i < count; i++) - { - std::this_thread::sleep_for(100ms); - wf_timer_manager_check(manager); - } - - for(size_t i = 0; i < count; i++) - { - ASSERT_TRUE(triggered[i]); - wf_timer_dispose(timer[i]); - } - - wf_timer_manager_dispose(manager); -} - -TEST(wf_timer, dont_trigger_null_callback) -{ - struct wf_timer_manager * manager = wf_timer_manager_create(); - struct wf_timer * timer = wf_timer_create(manager, nullptr, nullptr); - - wf_timer_start(timer, -1); - wf_timer_manager_check(manager); - - wf_timer_dispose(timer); - wf_timer_manager_dispose(manager); -} diff --git a/test/webfuse/tests/integration/provider.cc b/test/webfuse/tests/integration/provider.cc deleted file mode 100644 index cf3aeca..0000000 --- a/test/webfuse/tests/integration/provider.cc +++ /dev/null @@ -1,148 +0,0 @@ -#include "webfuse/tests/integration/provider.hpp" -#include "webfuse_provider.h" -#include "webfuse/provider/impl/client.h" -#include -#include -#include -#include -#include "webfuse/utils/static_filesystem.h" - -using namespace std::chrono_literals; - -namespace -{ - enum class ConnectionState - { - disconnected, - connected, - connecting - }; -} - -extern "C" -{ - -void -webfuse_test_provider_onconnected( - void * user_data) -{ - auto * fs = reinterpret_cast(user_data); - auto * connection_state = reinterpret_cast(wfp_static_filesystem_get_user_data(fs)); - *connection_state = ConnectionState::connected; -} - -void -webfuse_test_provider_ondisconnected( - void * user_data) -{ - auto * fs = reinterpret_cast(user_data); - auto * connection_state = reinterpret_cast(wfp_static_filesystem_get_user_data(fs)); - *connection_state = ConnectionState::disconnected; -} - -} - -namespace webfuse_test -{ - -class Provider::Private -{ -public: - explicit Private(char const * url) - : is_shutdown_requested(false) - , connection_state(ConnectionState::connecting) - { - config = wfp_client_config_create(); - wfp_client_config_set_certpath(config, "client-cert.pem"); - wfp_client_config_set_keypath(config, "client-key.pem"); - wfp_client_config_set_ca_filepath(config, "server-cert.pem"); - wfp_client_config_set_onconnected(config, &webfuse_test_provider_onconnected); - wfp_client_config_set_ondisconnected(config, &webfuse_test_provider_ondisconnected); - - fs = wfp_static_filesystem_create(config); - wfp_static_filesystem_set_user_data(fs, reinterpret_cast(&connection_state)); - wfp_static_filesystem_add_text(fs, "hello.txt", 0444, "Hello, World"); - - client = wfp_client_create(config); - wfp_client_connect(client, url); - while (ConnectionState::connecting == connection_state) - { - wfp_client_service(client); - } - - if (ConnectionState::connected == connection_state) - { - thread = std::thread(Run, this); - std::this_thread::sleep_for(200ms); - } - else - { - wfp_client_dispose(client); - - wfp_static_filesystem_dispose(fs); - wfp_client_config_dispose(config); - - throw std::runtime_error("unable to connect"); - } - } - - ~Private() - { - RequestShutdown(); - thread.join(); - - wfp_client_disconnect(client); - while (ConnectionState::disconnected != connection_state) - { - wfp_client_service(client); - } - - wfp_client_dispose(client); - - wfp_static_filesystem_dispose(fs); - wfp_client_config_dispose(config); - } - - bool IsShutdownRequested() - { - std::lock_guard lock(shutdown_lock); - return is_shutdown_requested; - } -private: - void RequestShutdown() - { - std::lock_guard lock(shutdown_lock); - is_shutdown_requested = true; - wfp_client_interrupt(client); - } - - static void Run(Provider::Private * context) - { - while (!context->IsShutdownRequested()) - { - wfp_client_service(context->client); - } - } - - std::mutex shutdown_lock; - std::thread thread; - bool is_shutdown_requested; - ConnectionState connection_state; - - wfp_client_config * config; - wfp_static_filesystem * fs; -public: - wfp_client * client; -}; - -Provider::Provider(char const * url) -: d(new Provider::Private(url)) -{ -} - -Provider::~Provider() -{ - delete d; -} - -} \ No newline at end of file diff --git a/test/webfuse/tests/integration/provider.hpp b/test/webfuse/tests/integration/provider.hpp deleted file mode 100644 index c7c60c4..0000000 --- a/test/webfuse/tests/integration/provider.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef WF_TEST_INTEGRATION_PROVIDER -#define WF_TEST_INTEGRATION_PROVIDER - -namespace webfuse_test -{ - -class Provider -{ -public: - explicit Provider(char const * url); - ~Provider(); -private: - class Private; - Private * d; -}; - -} - -#endif diff --git a/test/webfuse/tests/integration/server.cc b/test/webfuse/tests/integration/server.cc deleted file mode 100644 index f175210..0000000 --- a/test/webfuse/tests/integration/server.cc +++ /dev/null @@ -1,154 +0,0 @@ -#include "webfuse/tests/integration/server.hpp" -#include -#include -#include -#include -#include -#include -#include -#include "webfuse_adapter.h" -#include "webfuse/adapter/impl/server.h" - -#define WF_PATH_MAX (100) - -extern "C" -{ - -static void webfuse_test_server_cleanup_mountpoint( - void * user_data) -{ - char * path = reinterpret_cast(user_data); - rmdir(path); - free(path); -} - -static struct wf_mountpoint * -webfuse_test_server_create_mountpoint( - char const * filesystem, - void * user_data) -{ - char const * base_dir = reinterpret_cast(user_data); - char path[WF_PATH_MAX]; - snprintf(path, WF_PATH_MAX, "%s/%s", base_dir, filesystem); - mkdir(path, 0755); - struct wf_mountpoint * mountpoint = wf_mountpoint_create(path); - wf_mountpoint_set_userdata( - mountpoint, - reinterpret_cast(strdup(path)), - &webfuse_test_server_cleanup_mountpoint); - - return mountpoint; -} - -} - -namespace webfuse_test -{ - -class Server::Private -{ -public: - Private() - : is_shutdown_requested(false) - { - snprintf(base_dir, WF_PATH_MAX, "%s", "/tmp/webfuse_test_integration_XXXXXX"); - char const * result = mkdtemp(base_dir); - if (NULL == result) - { - throw std::runtime_error("unable to create temp dir"); - } - - - config = wf_server_config_create(); - wf_server_config_set_port(config, 0); - wf_server_config_set_mountpoint_factory(config, - &webfuse_test_server_create_mountpoint, - reinterpret_cast(base_dir)); - wf_server_config_set_keypath(config, "server-key.pem"); - wf_server_config_set_certpath(config, "server-cert.pem"); - - server = wf_server_create(config); - - while (!wf_impl_server_is_operational(server)) - { - wf_server_service(server); - } - - thread = std::thread(Run, this); - - } - - ~Private() - { - RequestShutdown(); - thread.join(); - rmdir(base_dir); - wf_server_dispose(server); - wf_server_config_dispose(config); - } - - bool IsShutdownRequested() - { - std::lock_guard lock(shutdown_lock); - return is_shutdown_requested; - } - - std::string GetUrl(void) const - { - int const port = wf_server_get_port(server); - std::ostringstream stream; - stream << "wss://localhost:" << port << "/"; - return stream.str(); - } - -private: - void RequestShutdown() - { - std::lock_guard lock(shutdown_lock); - is_shutdown_requested = true; - wf_server_interrupt(server); - } - - static void Run(Server::Private * context) - { - while (!context->IsShutdownRequested()) - { - wf_server_service(context->server); - } - } - - - std::mutex shutdown_lock; - std::thread thread; - bool is_shutdown_requested; - - -public: - char base_dir[WF_PATH_MAX]; - wf_server_config * config; - wf_server * server; -}; - -Server::Server() -: d(new Server::Private()) -{ - -} - -Server::~Server() -{ - delete d; -} - -char const * Server::GetBaseDir(void) const -{ - return d->base_dir; -} - -std::string Server::GetUrl(void) const -{ - return d->GetUrl(); -} - - -} \ No newline at end of file diff --git a/test/webfuse/tests/integration/test_integration.cc b/test/webfuse/tests/integration/test_integration.cc deleted file mode 100644 index ae9033c..0000000 --- a/test/webfuse/tests/integration/test_integration.cc +++ /dev/null @@ -1,97 +0,0 @@ -#include -#include "webfuse/tests/integration/server.hpp" -#include "webfuse/tests/integration/provider.hpp" -#include "webfuse/tests/integration/file.hpp" - -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include "webfuse/core/lws_log.h" - -using webfuse_test::Server; -using webfuse_test::Provider; -using webfuse_test::File; - -namespace -{ - class IntegrationTest: public ::testing::Test - { - public: - IntegrationTest() - : server(nullptr) - , provider(nullptr) - { - json_object_seed(0); - wf_lwslog_disable(); - } - - protected: - void SetUp() - { - server = new Server(); - provider = new Provider(server->GetUrl().c_str()); - } - - void TearDown() - { - delete provider; - delete server; - } - - char const * GetBaseDir() const - { - return server->GetBaseDir(); - } - private: - Server * server; - Provider * provider; - }; -} - -TEST_F(IntegrationTest, HasMountpoint) -{ - struct stat buffer; - int rc = stat(GetBaseDir(), &buffer); - - ASSERT_EQ(0, rc); - ASSERT_TRUE(S_ISDIR(buffer.st_mode)); -} - -TEST_F(IntegrationTest, ProvidesTextFile) -{ - std::string file_name = std::string(GetBaseDir()) + "/cprovider/hello.txt"; - - File file(file_name); - ASSERT_TRUE(file.isFile()); - ASSERT_TRUE(file.hasAccessRights(0444)); - ASSERT_TRUE(file.hasSize(12)); -} - -TEST_F(IntegrationTest, ReadTextFile) -{ - std::string file_name = std::string(GetBaseDir()) + "/cprovider/hello.txt"; - - File file(file_name); - ASSERT_TRUE(file.hasContents("Hello, World")); -} - -TEST_F(IntegrationTest, ReadDir) -{ - std::string dir_name = std::string(GetBaseDir()) + "/cprovider"; - - File dir(dir_name); - ASSERT_TRUE(dir.isDirectory()); - ASSERT_TRUE(dir.hasSubdirectory(".")); - ASSERT_TRUE(dir.hasSubdirectory("..")); - ASSERT_TRUE(dir.hasSubdirectory("hello.txt")); - ASSERT_FALSE(dir.hasSubdirectory("other")); -} \ No newline at end of file diff --git a/test/webfuse/tests/integration/test_lowlevel.cc b/test/webfuse/tests/integration/test_lowlevel.cc deleted file mode 100644 index 0c49192..0000000 --- a/test/webfuse/tests/integration/test_lowlevel.cc +++ /dev/null @@ -1,112 +0,0 @@ -#include "webfuse_adapter.h" -#include "webfuse_provider.h" -#include - -#include "webfuse/utils/tempdir.hpp" - -#include - -using ::webfuse_test::TempDir; - -extern "C" -{ - -wf_mountpoint * -wf_test_integration_lowlevel_create_mountpoint( - char const *, void * user_data) -{ - auto * tempDir = reinterpret_cast(user_data); - return wf_mountpoint_create(tempDir->path()); -} - -void -wf_test_integration_lowlevel_on_connected( - void * user_data) -{ - int * state = reinterpret_cast(user_data); - *state = 1; -} - -void -wf_test_integration_lowlevel_on_disconnected( - void * user_data) -{ - int * state = reinterpret_cast(user_data); - *state = -1; -} - -bool -wf_test_integration_lowlevel_authenticate( - struct wf_credentials const * credentials, - void * ) -{ - char const * username = wf_credentials_get(credentials, "username"); - char const * password = wf_credentials_get(credentials, "password"); - - return ((0 == strcmp(username, "bob")) && (0 == strcmp(password, "secret"))); -} - -void -wf_test_integration_lowlevel_get_credentials( - struct wfp_credentials * credentials, - void * ) -{ - wfp_credentials_set_type(credentials, "username"); - wfp_credentials_add(credentials, "username", "bob"); - wfp_credentials_add(credentials, "password", "secret"); -} - -} - -TEST(integration, lowlevel) -{ - TempDir dir("wf_test"); - - wf_server_protocol * server_protocol = wf_server_protocol_create( - &wf_test_integration_lowlevel_create_mountpoint, - reinterpret_cast(&dir)); - ASSERT_NE(nullptr, server_protocol); - wf_server_protocol_add_authenticator(server_protocol, "username", - &wf_test_integration_lowlevel_authenticate, nullptr); - - int state = 0; - wfp_client_config * client_config = wfp_client_config_create(); - ASSERT_NE(nullptr, client_config); - wfp_client_config_set_userdata(client_config, reinterpret_cast(&state)); - wfp_client_config_set_onconnected(client_config, &wf_test_integration_lowlevel_on_connected); - wfp_client_config_set_ondisconnected(client_config, &wf_test_integration_lowlevel_on_disconnected); - wfp_client_config_enable_authentication(client_config, &wf_test_integration_lowlevel_get_credentials); - - wfp_client_protocol * client_protocol = wfp_client_protocol_create(client_config); - ASSERT_NE(nullptr, client_protocol); - - lws_protocols protocols[3]; - memset(protocols, 0, 3 * sizeof(lws_protocols)); - wf_server_protocol_init_lws(server_protocol, &protocols[0]); - wfp_client_protocol_init_lws(client_protocol, &protocols[1]); - - lws_context_creation_info info; - memset(&info, 0, sizeof(info)); - info.port = 8080; - info.protocols = protocols; - info.vhost_name = "localhost"; - info.ws_ping_pong_interval = 10; - info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; - - struct lws_context * context = lws_create_context(&info); - ASSERT_NE(nullptr, context); - - wfp_client_protocol_connect(client_protocol, context, "ws://localhost:8080/"); - while (0 == state) - { - lws_service(context, 0); - } - - EXPECT_EQ(1, state); - - lws_context_destroy(context); - - wfp_client_protocol_dispose(client_protocol); - wfp_client_config_dispose(client_config); - wf_server_protocol_dispose(server_protocol); -} \ No newline at end of file diff --git a/test/webfuse/tests/provider/operation/test_close.cc b/test/webfuse/tests/provider/operation/test_close.cc deleted file mode 100644 index 3769579..0000000 --- a/test/webfuse/tests/provider/operation/test_close.cc +++ /dev/null @@ -1,99 +0,0 @@ -#include "webfuse/provider/impl/operation/close.h" -#include "webfuse/mocks/mock_provider.hpp" -#include "webfuse/mocks/fake_invokation_context.hpp" - -#include - -using ::webfuse_test::MockProvider; -using ::webfuse_test::create_context; -using ::testing::_; - -TEST(wfp_close, close) -{ - int inode = 42; - int handle = 0xdeadbeef; - int flags = 23; - - MockProvider provider; - EXPECT_CALL(provider, close(inode, handle, flags)).Times(1); - - wfp_impl_invokation_context context = create_context(provider); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(inode)); - json_array_append_new(params, json_integer(handle)); - json_array_append_new(params, json_integer(flags)); - - wfp_impl_close(&context, params, 42); - json_decref(params); -} - -TEST(wfp_close, close_fail_invalid_param_count) -{ - MockProvider provider; - EXPECT_CALL(provider, close(_,_,_)).Times(0); - - wfp_impl_invokation_context context = create_context(provider); - - json_t * params = json_array(); - wfp_impl_close(&context, params, 42); - json_decref(params); -} - -TEST(wfp_close, close_fail_inode_invalid_type) -{ - MockProvider provider; - EXPECT_CALL(provider, close(_,_,_)).Times(0); - - wfp_impl_invokation_context context = create_context(provider); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_string("42")); - json_array_append_new(params, json_integer(0)); - json_array_append_new(params, json_integer(0)); - - wfp_impl_close(&context, params, 42); - json_decref(params); -} - -TEST(wfp_close, close_fail_handle_invalid_type) -{ - MockProvider provider; - EXPECT_CALL(provider, close(_,_,_)).Times(0); - - wfp_impl_invokation_context context = create_context(provider); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(0)); - json_array_append_new(params, json_string("42")); - json_array_append_new(params, json_integer(0)); - - wfp_impl_close(&context, params, 42); - json_decref(params); -} - -TEST(wfp_close, close_fail_flags_invalid_type) -{ - MockProvider provider; - EXPECT_CALL(provider, close(_,_,_)).Times(0); - - wfp_impl_invokation_context context = create_context(provider); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(0)); - json_array_append_new(params, json_integer(0)); - json_array_append_new(params, json_string("42")); - - wfp_impl_close(&context, params, 42); - json_decref(params); -} - - -TEST(wfp_close, default_nop) -{ - wfp_impl_close_default(0, 0, 0, nullptr); -} \ No newline at end of file diff --git a/test/webfuse/tests/provider/operation/test_getattr.cc b/test/webfuse/tests/provider/operation/test_getattr.cc deleted file mode 100644 index 332ab89..0000000 --- a/test/webfuse/tests/provider/operation/test_getattr.cc +++ /dev/null @@ -1,107 +0,0 @@ -#include "webfuse/provider/impl/operation/getattr.h" -#include "webfuse/mocks/mock_request.hpp" -#include "webfuse/mocks/mock_provider.hpp" -#include "webfuse/mocks/fake_invokation_context.hpp" - -#include -#include - -using ::webfuse_test::MockProvider; -using ::webfuse_test::MockRequest; -using ::webfuse_test::StatMatcher; -using ::webfuse_test::create_context; -using ::testing::_; -using ::testing::Invoke; - -namespace -{ - -void free_request(wfp_request * request, ino_t) -{ - free(request); -} - -} - -TEST(wfp_impl_getattr, default_responds_error) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond_error(_,42)).Times(1); - - wfp_impl_getattr_default(req, 0, nullptr); -} - -TEST(wfp_impl_getattr, respond_file) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(StatMatcher(23, 0754, "file"), 42)).Times(1); - - struct stat buffer; - memset(&buffer, 0, sizeof(buffer)); - buffer.st_ino = 23; - buffer.st_mode = S_IFREG | 0754; - wfp_impl_respond_getattr(req, &buffer); -} - -TEST(wfp_impl_getattr, respond_dir) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(StatMatcher(23, 0754, "dir"), 42)).Times(1); - - struct stat buffer; - memset(&buffer, 0, sizeof(buffer)); - buffer.st_ino = 23; - buffer.st_mode = S_IFDIR | 0754; - wfp_impl_respond_getattr(req, &buffer); -} - -TEST(wfp_impl_getattr, invoke_provider) -{ - ino_t inode = 23; - MockProvider provider; - EXPECT_CALL(provider,getattr(_, inode)).Times(1).WillOnce(Invoke(free_request)); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(inode)); - - wfp_impl_getattr(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_getattr, fail_invalid_param_count) -{ - MockProvider provider; - EXPECT_CALL(provider,getattr(_, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - - wfp_impl_getattr(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_getattr, fail_invalid_inode_type) -{ - MockProvider provider; - EXPECT_CALL(provider,getattr(_, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_string("42")); - - wfp_impl_getattr(&context, params, 42); - json_decref(params); -} diff --git a/test/webfuse/tests/provider/operation/test_lookup.cc b/test/webfuse/tests/provider/operation/test_lookup.cc deleted file mode 100644 index 4cbccd4..0000000 --- a/test/webfuse/tests/provider/operation/test_lookup.cc +++ /dev/null @@ -1,129 +0,0 @@ -#include "webfuse/provider/impl/operation/lookup.h" -#include "webfuse/mocks/mock_request.hpp" -#include "webfuse/mocks/mock_provider.hpp" -#include "webfuse/mocks/fake_invokation_context.hpp" - -#include -#include - -using ::webfuse_test::MockProvider; -using ::webfuse_test::MockRequest; -using ::webfuse_test::StatMatcher; -using ::webfuse_test::create_context; -using ::testing::_; -using ::testing::Invoke; -using ::testing::StrEq; - -namespace -{ - -void free_request(wfp_request * request, ino_t, char const *) -{ - free(request); -} - -} - -TEST(wfp_impl_lookup, invoke_provider) -{ - ino_t inode = 42; - MockProvider provider; - EXPECT_CALL(provider,lookup(_, inode,StrEq("some.file"))).Times(1) - .WillOnce(Invoke(free_request)); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(inode)); - json_array_append_new(params, json_string("some.file")); - - wfp_impl_lookup(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_lookup, fail_invalid_param_count) -{ - MockProvider provider; - EXPECT_CALL(provider,lookup(_, _,_)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(23)); - - wfp_impl_lookup(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_lookup, fail_invalid_inode_type) -{ - MockProvider provider; - EXPECT_CALL(provider,lookup(_, _,_)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_string("23")); - json_array_append_new(params, json_string("some.file")); - - wfp_impl_lookup(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_lookup, fail_invalid_name_type) -{ - MockProvider provider; - EXPECT_CALL(provider,lookup(_, _,_)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(23)); - json_array_append_new(params, json_integer(1)); - - wfp_impl_lookup(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_lookup, default_responds_error) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond_error(_,42)).Times(1); - - wfp_impl_lookup_default(req, 1, "some.file", nullptr); -} - -TEST(wfp_impl_lookup, respond_file) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(StatMatcher(23, 0754, "file"), 42)).Times(1); - - struct stat buffer; - memset(&buffer, 0, sizeof(buffer)); - buffer.st_ino = 23; - buffer.st_mode = S_IFREG | 0754; - wfp_impl_respond_lookup(req, &buffer); -} - -TEST(wfp_impl_lookup, respond_dir) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(StatMatcher(23, 0754, "dir"), 42)).Times(1); - - struct stat buffer; - memset(&buffer, 0, sizeof(buffer)); - buffer.st_ino = 23; - buffer.st_mode = S_IFDIR | 0754; - wfp_impl_respond_lookup(req, &buffer); -} diff --git a/test/webfuse/tests/provider/operation/test_open.cc b/test/webfuse/tests/provider/operation/test_open.cc deleted file mode 100644 index 4c52b02..0000000 --- a/test/webfuse/tests/provider/operation/test_open.cc +++ /dev/null @@ -1,114 +0,0 @@ -#include "webfuse/provider/impl/operation/open.h" -#include "webfuse/mocks/mock_request.hpp" -#include "webfuse/mocks/mock_provider.hpp" -#include "webfuse/mocks/fake_invokation_context.hpp" - -#include -#include - -using ::webfuse_test::MockProvider; -using ::webfuse_test::MockRequest; -using ::webfuse_test::OpenMatcher; -using ::webfuse_test::create_context; -using ::testing::_; -using ::testing::Invoke; -using ::testing::StrEq; - -namespace -{ - -void free_request(wfp_request * request, ino_t, int) -{ - free(request); -} - -} - -TEST(wfp_impl_open, invoke_provider) -{ - ino_t inode = 42; - int flags = 0; - MockProvider provider; - EXPECT_CALL(provider,open(_, inode, flags)).Times(1) - .WillOnce(Invoke(free_request)); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(inode)); - json_array_append_new(params, json_integer(flags)); - - wfp_impl_open(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_open, fail_invalid_param_count) -{ - MockProvider provider; - EXPECT_CALL(provider,open(_, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(23)); - - wfp_impl_open(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_open, fail_invalid_inode_type) -{ - MockProvider provider; - EXPECT_CALL(provider,open(_, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_string("")); - json_array_append_new(params, json_integer(0)); - - wfp_impl_open(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_open, fail_invalid_flags_type) -{ - MockProvider provider; - EXPECT_CALL(provider,open(_, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(23)); - json_array_append_new(params, json_string("")); - - wfp_impl_open(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_open, default_responds_error) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond_error(_,42)).Times(1); - - wfp_impl_open_default(req, 1, 0, nullptr); -} - -TEST(wfp_impl_open, respond) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(OpenMatcher(23), 42)).Times(1); - - wfp_impl_respond_open(req, 23); -} - diff --git a/test/webfuse/tests/provider/operation/test_read.cc b/test/webfuse/tests/provider/operation/test_read.cc deleted file mode 100644 index 36bf14f..0000000 --- a/test/webfuse/tests/provider/operation/test_read.cc +++ /dev/null @@ -1,173 +0,0 @@ -#include "webfuse/provider/impl/operation/read.h" -#include "webfuse/mocks/mock_request.hpp" -#include "webfuse/mocks/mock_provider.hpp" -#include "webfuse/mocks/fake_invokation_context.hpp" - -#include -#include - -using ::webfuse_test::MockProvider; -using ::webfuse_test::MockRequest; -using ::webfuse_test::ReadResultMatcher; -using ::webfuse_test::create_context; -using ::testing::_; -using ::testing::Invoke; -using ::testing::StrEq; - -namespace -{ - -void free_request(wfp_request * request, ino_t, uint32_t, size_t ,size_t) -{ - free(request); -} - -} - -TEST(wfp_impl_read, invoke_provider) -{ - ino_t inode = 42; - uint32_t handle = 5; - size_t offset = 2; - size_t length = 1; - MockProvider provider; - EXPECT_CALL(provider, read(_, inode, handle, offset, length)).Times(1) - .WillOnce(Invoke(free_request)); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(inode)); - json_array_append_new(params, json_integer(handle)); - json_array_append_new(params, json_integer(offset)); - json_array_append_new(params, json_integer(length)); - - wfp_impl_read(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_read, fail_invalid_param_count) -{ - MockProvider provider; - EXPECT_CALL(provider, read(_, _, _, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(1)); - json_array_append_new(params, json_integer(2)); - json_array_append_new(params, json_integer(3)); - json_array_append_new(params, json_integer(4)); - json_array_append_new(params, json_integer(5)); - - wfp_impl_read(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_read, fail_invalid_inode_type) -{ - MockProvider provider; - EXPECT_CALL(provider, read(_, _, _, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_string("42")); - json_array_append_new(params, json_integer(2)); - json_array_append_new(params, json_integer(3)); - json_array_append_new(params, json_integer(4)); - - wfp_impl_read(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_read, fail_invalid_handle_type) -{ - MockProvider provider; - EXPECT_CALL(provider, read(_, _, _, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(1)); - json_array_append_new(params, json_string("42")); - json_array_append_new(params, json_integer(3)); - json_array_append_new(params, json_integer(4)); - - wfp_impl_read(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_read, fail_invalid_offset_type) -{ - MockProvider provider; - EXPECT_CALL(provider, read(_, _, _, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(1)); - json_array_append_new(params, json_integer(2)); - json_array_append_new(params, json_string("42")); - json_array_append_new(params, json_integer(4)); - - wfp_impl_read(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_read, fail_invalid_length_type) -{ - MockProvider provider; - EXPECT_CALL(provider, read(_, _, _, _, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(1)); - json_array_append_new(params, json_integer(2)); - json_array_append_new(params, json_integer(3)); - json_array_append_new(params, json_string("42")); - - wfp_impl_read(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_read, default_responds_error) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond_error(_,42)).Times(1); - - wfp_impl_read_default(req, 0, 0, 1, 2, nullptr); -} - -TEST(wfp_impl_read, respond) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(ReadResultMatcher("d2Y=", "base64", 2), 42)).Times(1); - - char const data[] = "wf"; - wfp_impl_respond_read(req, data, 2); -} - -TEST(wfp_impl_read, respond_empty) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(ReadResultMatcher("", "identity", 0), 42)).Times(1); - - wfp_impl_respond_read(req, nullptr, 0); -} diff --git a/test/webfuse/tests/provider/operation/test_readdir.cc b/test/webfuse/tests/provider/operation/test_readdir.cc deleted file mode 100644 index 33557f5..0000000 --- a/test/webfuse/tests/provider/operation/test_readdir.cc +++ /dev/null @@ -1,100 +0,0 @@ -#include "webfuse/provider/impl/operation/readdir.h" -#include "webfuse/mocks/mock_request.hpp" -#include "webfuse/mocks/mock_provider.hpp" -#include "webfuse/mocks/fake_invokation_context.hpp" -#include "webfuse/provider/dirbuffer.h" - -#include -#include - -using ::webfuse_test::MockProvider; -using ::webfuse_test::MockRequest; -using ::webfuse_test::ReaddirMatcher; -using ::webfuse_test::create_context; -using ::testing::_; -using ::testing::Invoke; - -namespace -{ - -void free_request(wfp_request * request, ino_t) -{ - free(request); -} - -} - -TEST(wfp_impl_readdir, invoke_provider) -{ - ino_t inode = 23; - MockProvider provider; - EXPECT_CALL(provider,readdir(_, inode)).Times(1).WillOnce(Invoke(free_request)); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(inode)); - - wfp_impl_readdir(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_readdir, fail_invalid_param_count) -{ - MockProvider provider; - EXPECT_CALL(provider,readdir(_, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_integer(1)); - json_array_append_new(params, json_integer(1)); - - wfp_impl_readdir(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_readdir, fail_invalid_inode_type) -{ - MockProvider provider; - EXPECT_CALL(provider,readdir(_, _)).Times(0); - - wfp_request request = {nullptr, nullptr, 0}; - wfp_impl_invokation_context context = create_context(provider, &request); - - json_t * params = json_array(); - json_array_append_new(params, json_string("test.filesystem")); - json_array_append_new(params, json_string("1")); - - wfp_impl_readdir(&context, params, 42); - json_decref(params); -} - -TEST(wfp_impl_readdir, default_responds_error) -{ - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond_error(_,42)).Times(1); - - wfp_impl_readdir_default(req, 0, nullptr); -} - -TEST(wfp_impl_readdir, respond) -{ - char const item0[] = "some.file"; - char const * items[] = { item0, nullptr }; - - MockRequest request; - auto * req = request.create_request(42); - EXPECT_CALL(request, respond(ReaddirMatcher(items), 42)).Times(1); - - wfp_dirbuffer * buffer = wfp_dirbuffer_create(); - wfp_dirbuffer_add(buffer, item0, 42); - wfp_impl_respond_readdir(req, buffer); - wfp_dirbuffer_dispose(buffer); - -} diff --git a/test/webfuse/tests/provider/test_client_protocol.cc b/test/webfuse/tests/provider/test_client_protocol.cc deleted file mode 100644 index e2fe6b6..0000000 --- a/test/webfuse/tests/provider/test_client_protocol.cc +++ /dev/null @@ -1,268 +0,0 @@ -#include -#include - -#include -#include -#include "webfuse/utils/ws_server.h" -#include "webfuse/mocks/mock_provider_client.hpp" -#include "webfuse/core/protocol_names.h" -#include "webfuse/utils/timeout_watcher.hpp" - -#include - -#include -#include -#include - -using webfuse_test::WsServer; -using webfuse_test::MockProviderClient; -using webfuse_test::IProviderClient; -using webfuse_test::TimeoutWatcher; -using testing::_; -using testing::AtMost; -using testing::Invoke; - -#define DEFAULT_TIMEOUT (std::chrono::milliseconds(5 * 1000)) - -namespace -{ - -class ClientProtocolFixture -{ - ClientProtocolFixture(ClientProtocolFixture const &) = delete; - ClientProtocolFixture& operator=(ClientProtocolFixture const &) = delete; -public: - explicit ClientProtocolFixture(IProviderClient& client, bool enableAuthentication = false) - { - server = new WsServer(WF_PROTOCOL_NAME_ADAPTER_SERVER); - - config = wfp_client_config_create(); - client.AttachTo(config, enableAuthentication); - protocol = wfp_client_protocol_create(config); - - memset(protocols, 0, sizeof(struct lws_protocols) * 2); - wfp_client_protocol_init_lws(protocol, protocols); - - memset(&info, 0, sizeof(struct lws_context_creation_info)); - info.port = CONTEXT_PORT_NO_LISTEN; - info.protocols = protocols; - info.uid = -1; - info.gid = -1; - - context = lws_create_context(&info); - } - - ~ClientProtocolFixture() - { - lws_context_destroy(context); - wfp_client_protocol_dispose(protocol); - wfp_client_config_dispose(config); - delete server; - } - - void Connect() - { - TimeoutWatcher watcher(DEFAULT_TIMEOUT); - - wfp_client_protocol_connect(protocol, context, server->GetUrl().c_str()); - while (!server->IsConnected()) - { - watcher.check(); - lws_service(context, 0); - } - } - - void Disconnect() - { - wfp_client_protocol_disconnect(protocol); - } - - void SendToClient(json_t * request) - { - server->SendMessage(request); - } - - json_t * ReceiveMessageFromClient() - { - TimeoutWatcher watcher(DEFAULT_TIMEOUT); - json_t * result = server->ReceiveMessage(); - while (nullptr == result) - { - watcher.check(); - lws_service(context, 0); - result = server->ReceiveMessage(); - } - - return result; - } - - void AwaitAuthentication( - std::string const & expected_username, - std::string const & expected_password) - { - json_t * request = ReceiveMessageFromClient(); - ASSERT_TRUE(json_is_object(request)); - - json_t * method = json_object_get(request, "method"); - ASSERT_TRUE(json_is_string(method)); - ASSERT_STREQ("authenticate", json_string_value(method)); - - json_t * id = json_object_get(request, "id"); - ASSERT_TRUE(json_is_integer(id)); - - json_t * params = json_object_get(request, "params"); - ASSERT_TRUE(json_is_array(params)); - ASSERT_EQ(2, json_array_size(params)); - - json_t * type = json_array_get(params, 0); - ASSERT_TRUE(json_is_string(type)); - ASSERT_STREQ("username", json_string_value(type)); - - json_t * credentials = json_array_get(params, 1); - ASSERT_TRUE(json_is_object(credentials)); - - json_t * username = json_object_get(credentials, "username"); - ASSERT_TRUE(json_is_string(username)); - ASSERT_STREQ(expected_username.c_str(), json_string_value(username)); - - json_t * password = json_object_get(credentials, "password"); - ASSERT_TRUE(json_is_string(password)); - ASSERT_STREQ(expected_password.c_str(), json_string_value(password)); - - json_t * response = json_object(); - json_object_set_new(response, "result", json_object()); - json_object_set(response, "id", id); - SendToClient(response); - - json_decref(request); - } - - void AwaitAddFilesystem(std::string& filesystemName) - { - json_t * addFilesystemRequest = ReceiveMessageFromClient(); - ASSERT_NE(nullptr, addFilesystemRequest); - ASSERT_TRUE(json_is_object(addFilesystemRequest)); - - json_t * method = json_object_get(addFilesystemRequest, "method"); - ASSERT_TRUE(json_is_string(method)); - ASSERT_STREQ("add_filesystem", json_string_value(method)); - - json_t * params = json_object_get(addFilesystemRequest, "params"); - ASSERT_TRUE(json_is_array(params)); - ASSERT_EQ(1, json_array_size(params)); - - json_t * filesystem = json_array_get(params, 0); - ASSERT_TRUE(json_is_string(filesystem)); - filesystemName = json_string_value(filesystem); - - json_t * id = json_object_get(addFilesystemRequest, "id"); - ASSERT_TRUE(json_is_integer(id)); - - json_t * response = json_object(); - json_t * result = json_object(); - json_object_set(result, "id", filesystem); - json_object_set_new(response, "result", result); - json_object_set(response, "id", id); - - SendToClient(response); - - json_decref(addFilesystemRequest); - } - -private: - WsServer * server; - wfp_client_config * config; - wfp_client_protocol * protocol; - struct lws_context_creation_info info; - struct lws_protocols protocols[2]; - struct lws_context * context; - -}; - -void GetCredentials(wfp_credentials * credentials) -{ - wfp_credentials_set_type(credentials, "username"); - wfp_credentials_add(credentials, "username", "bob"); - wfp_credentials_add(credentials, "password", "secret"); -} - -} - -TEST(client_protocol, connect) -{ - MockProviderClient provider; - ClientProtocolFixture fixture(provider); - - EXPECT_CALL(provider, OnConnected()).Times(AtMost(1)); - EXPECT_CALL(provider, OnDisconnected()).Times(1); - - fixture.Connect(); - if (HasFatalFailure()) { return; } - - std::string filesystem; - fixture.AwaitAddFilesystem(filesystem); - if (HasFatalFailure()) { return; } -} - -TEST(client_protocol, disconnect_without_connect) -{ - MockProviderClient provider; - ClientProtocolFixture fixture(provider); - - EXPECT_CALL(provider, OnDisconnected()).Times(1); - - fixture.Disconnect(); -} - -TEST(client_protocol, connect_with_username_authentication) -{ - MockProviderClient provider; - ClientProtocolFixture fixture(provider, true); - - EXPECT_CALL(provider, OnConnected()).Times(AtMost(1)); - EXPECT_CALL(provider, OnDisconnected()).Times(1); - EXPECT_CALL(provider, GetCredentials(_)).Times(1).WillOnce(Invoke(GetCredentials)); - - fixture.Connect(); - if (HasFatalFailure()) { return; } - - fixture.AwaitAuthentication("bob", "secret"); - if (HasFatalFailure()) { return; } - - std::string filesystem; - fixture.AwaitAddFilesystem(filesystem); - if (HasFatalFailure()) { return; } -} - -TEST(client_protocol, getattr) -{ - MockProviderClient provider; - ClientProtocolFixture fixture(provider); - - EXPECT_CALL(provider, OnConnected()).Times(1); - EXPECT_CALL(provider, OnDisconnected()).Times(1); - EXPECT_CALL(provider, GetAttr(1, _)).Times(1); - - fixture.Connect(); - if (HasFatalFailure()) { return; } - - std::string filesystem; - fixture.AwaitAddFilesystem(filesystem); - if (HasFatalFailure()) { return; } - - json_t * params = json_array(); - json_array_append_new(params, json_string(filesystem.c_str())); - json_array_append_new(params, json_integer(1)); - json_t * request = json_object(); - json_object_set_new(request, "method", json_string("getattr")); - json_object_set_new(request, "params", params); - json_object_set_new(request, "id", json_integer(42)); - - fixture.SendToClient(request); - json_t * response = fixture.ReceiveMessageFromClient(); - ASSERT_TRUE(json_is_object(response)); - - json_decref(response); - - fixture.Disconnect(); -} \ No newline at end of file diff --git a/test/webfuse/tests/provider/test_dirbuffer.cc b/test/webfuse/tests/provider/test_dirbuffer.cc deleted file mode 100644 index b4dfe58..0000000 --- a/test/webfuse/tests/provider/test_dirbuffer.cc +++ /dev/null @@ -1,32 +0,0 @@ -#include "webfuse/provider/impl/dirbuffer.h" -#include - -TEST(DirBuffer, CreateDispose) -{ - wfp_dirbuffer * buffer = wfp_impl_dirbuffer_create(); - wfp_impl_dirbuffer_dispose(buffer); -} - -TEST(DirBuffer, Add) -{ - wfp_dirbuffer * buffer = wfp_impl_dirbuffer_create(); - wfp_impl_dirbuffer_add(buffer, "answer", 42); - - ASSERT_EQ(1, json_array_size(buffer->entries)); - - json_t * entry = json_array_get(buffer->entries, 0); - ASSERT_STREQ("answer", json_string_value(json_object_get(entry, "name"))); - ASSERT_EQ(42, json_integer_value(json_object_get(entry, "inode"))); - - wfp_impl_dirbuffer_dispose(buffer); -} - -TEST(DirBuffer, Take) -{ - wfp_dirbuffer * buffer = wfp_impl_dirbuffer_create(); - json_t * entries = wfp_impl_dirbuffer_take(buffer); - wfp_impl_dirbuffer_dispose(buffer); - - ASSERT_TRUE(json_is_array(entries)); - json_decref(entries); -} diff --git a/test/webfuse/timer/test_timepoint.cc b/test/webfuse/timer/test_timepoint.cc new file mode 100644 index 0000000..194102b --- /dev/null +++ b/test/webfuse/timer/test_timepoint.cc @@ -0,0 +1,38 @@ +#include + +#include "webfuse/impl/timer/timepoint.h" + +#include +#include + +using namespace std::chrono_literals; + +TEST(wf_timer_timepoint, now) +{ + wf_timer_timepoint start = wf_impl_timer_timepoint_now(); + std::this_thread::sleep_for(42ms); + wf_timer_timepoint end = wf_impl_timer_timepoint_now(); + + ASSERT_LT(start, end); + ASSERT_LT(end, start + 500); +} + +TEST(wf_timer_timepoint, in_msec) +{ + wf_timer_timepoint now = wf_impl_timer_timepoint_now(); + wf_timer_timepoint later = wf_impl_timer_timepoint_in_msec(42); + + ASSERT_LT(now, later); + ASSERT_LT(later, now + 500); +} + +TEST(wf_timer_timepoint, elapsed) +{ + wf_timer_timepoint now; + + now = wf_impl_timer_timepoint_now(); + ASSERT_TRUE(wf_impl_timer_timepoint_is_elapsed(now - 1)); + + now = wf_impl_timer_timepoint_now(); + ASSERT_FALSE(wf_impl_timer_timepoint_is_elapsed(now + 500)); +} diff --git a/test/webfuse/timer/test_timer.cc b/test/webfuse/timer/test_timer.cc new file mode 100644 index 0000000..cd8ab5b --- /dev/null +++ b/test/webfuse/timer/test_timer.cc @@ -0,0 +1,148 @@ +#include + +#include +#include +#include + +#include "webfuse/impl/timer/timer.h" +#include "webfuse/impl/timer/manager.h" + +using std::size_t; +using namespace std::chrono_literals; + +extern "C" +{ + void on_timeout(struct wf_timer * timer, void * user_data) + { + (void) timer; + + bool * triggered = reinterpret_cast(user_data); + *triggered = true; + } +} + +TEST(wf_timer, init) +{ + bool triggered = false; + struct wf_timer_manager * manager = wf_impl_timer_manager_create(); + struct wf_timer * timer = wf_impl_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); + + wf_impl_timer_dispose(timer); + wf_impl_timer_manager_dispose(manager); +} + +TEST(wf_timer, trigger) +{ + bool triggered = false; + struct wf_timer_manager * manager = wf_impl_timer_manager_create(); + struct wf_timer * timer = wf_impl_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); + + wf_impl_timer_start(timer, -1); + wf_impl_timer_manager_check(manager); + + ASSERT_TRUE(triggered); + + wf_impl_timer_dispose(timer); + wf_impl_timer_manager_dispose(manager); +} + +TEST(wf_timer, trigger_on_dispose) +{ + bool triggered = false; + struct wf_timer_manager * manager = wf_impl_timer_manager_create(); + struct wf_timer * timer = wf_impl_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); + + wf_impl_timer_start(timer, (5 * 60 * 1000)); + + wf_impl_timer_manager_dispose(manager); + ASSERT_TRUE(triggered); + + wf_impl_timer_dispose(timer); +} + +TEST(wf_timer, cancel) +{ + bool triggered = false; + struct wf_timer_manager * manager = wf_impl_timer_manager_create(); + struct wf_timer * timer = wf_impl_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); + + wf_impl_timer_start(timer, 250); + std::this_thread::sleep_for(500ms); + wf_impl_timer_cancel(timer); + wf_impl_timer_manager_check(manager); + + ASSERT_FALSE(triggered); + + wf_impl_timer_dispose(timer); + wf_impl_timer_manager_dispose(manager); +} + +TEST(wf_timer, cancel_multiple_timers) +{ + static size_t const count = 5; + struct wf_timer_manager * manager = wf_impl_timer_manager_create(); + struct wf_timer * timer[count]; + + bool triggered = false; + for(size_t i = 0; i < count; i++) + { + timer[i] = wf_impl_timer_create(manager, &on_timeout, reinterpret_cast(&triggered)); + wf_impl_timer_start(timer[i], 0); + } + + std::this_thread::sleep_for(10ms); + for(size_t i = 0; i < count; i++) + { + wf_impl_timer_cancel(timer[i]); + } + + wf_impl_timer_manager_check(manager); + ASSERT_FALSE(triggered); + + for(size_t i = 0; i < count; i++) + { + wf_impl_timer_dispose(timer[i]); + } + wf_impl_timer_manager_dispose(manager); +} + +TEST(wf_timer, multiple_timers) +{ + static size_t const count = 5; + struct wf_timer_manager * manager = wf_impl_timer_manager_create(); + struct wf_timer * timer[count]; + bool triggered[count]; + + for(size_t i = 0; i < count; i++) + { + timer[i] = wf_impl_timer_create(manager, &on_timeout, reinterpret_cast(&triggered[i])); + triggered[i] = false; + wf_impl_timer_start(timer[i], (300 - (50 * i))); + } + + for(size_t i = 0; i < count; i++) + { + std::this_thread::sleep_for(100ms); + wf_impl_timer_manager_check(manager); + } + + for(size_t i = 0; i < count; i++) + { + ASSERT_TRUE(triggered[i]); + wf_impl_timer_dispose(timer[i]); + } + + wf_impl_timer_manager_dispose(manager); +} + +TEST(wf_timer, dont_trigger_null_callback) +{ + struct wf_timer_manager * manager = wf_impl_timer_manager_create(); + struct wf_timer * timer = wf_impl_timer_create(manager, nullptr, nullptr); + + wf_impl_timer_start(timer, -1); + wf_impl_timer_manager_check(manager); + + wf_impl_timer_dispose(timer); + wf_impl_timer_manager_dispose(manager); +} diff --git a/test/webfuse/util/test_base64.cc b/test/webfuse/util/test_base64.cc new file mode 100644 index 0000000..7d25eb4 --- /dev/null +++ b/test/webfuse/util/test_base64.cc @@ -0,0 +1,144 @@ +#include +#include "webfuse/impl/util/base64.h" +#include + +TEST(Base64, EncodedSize) +{ + ASSERT_EQ(4, wf_impl_base64_encoded_size(1)); + ASSERT_EQ(4, wf_impl_base64_encoded_size(2)); + ASSERT_EQ(4, wf_impl_base64_encoded_size(3)); + + ASSERT_EQ(8, wf_impl_base64_encoded_size(4)); + ASSERT_EQ(8, wf_impl_base64_encoded_size(5)); + ASSERT_EQ(8, wf_impl_base64_encoded_size(6)); + + ASSERT_EQ(120, wf_impl_base64_encoded_size(90)); +} + +TEST(Base64, Encode) +{ + char buffer[42]; + + std::string in = "Hello"; + size_t length = wf_impl_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 42); + ASSERT_EQ(8, length); + ASSERT_STREQ("SGVsbG8=", buffer); + + in = "Hello\n"; + length = wf_impl_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 42); + ASSERT_EQ(8, length); + ASSERT_STREQ("SGVsbG8K", buffer); + + in = "Blue"; + length = wf_impl_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 42); + ASSERT_EQ(8, length); + ASSERT_STREQ("Qmx1ZQ==", buffer); + + in = "Blue"; + length = wf_impl_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 8); + ASSERT_EQ(8, length); + ASSERT_EQ(0, strncmp("Qmx1ZQ==", buffer, 8)); +} + +TEST(Base64, FailedToEncodeBufferTooSmall) +{ + char buffer[1]; + + std::string in = "Hello"; + size_t length = wf_impl_base64_encode((uint8_t const*) in.c_str(), in.size(), buffer, 1); + ASSERT_EQ(0, length); +} + +TEST(Base64, DecodedSize) +{ + std::string in = "SGVsbG8="; // Hello + size_t length = wf_impl_base64_decoded_size(in.c_str(), in.size()); + ASSERT_EQ(5, length); + + in = "SGVsbG8K"; // Hello\n + length = wf_impl_base64_decoded_size(in.c_str(), in.size()); + ASSERT_EQ(6, length); + + in = "Qmx1ZQ=="; // Blue + length = wf_impl_base64_decoded_size(in.c_str(), in.size()); + ASSERT_EQ(4, length); + + in = "invalid"; + length = wf_impl_base64_decoded_size(in.c_str(), 0); + ASSERT_EQ(0, length); + + in = "invalid"; + length = wf_impl_base64_decoded_size(in.c_str(), 3); + ASSERT_EQ(0, length); +} + +TEST(Base64, IsValid) +{ + std::string in = "SGVsbG8="; // Hello + ASSERT_TRUE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "SGVsbG8K"; // Hello\n + ASSERT_TRUE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "Qmx1ZQ=="; // Blue + ASSERT_TRUE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "Qmx1ZQ=a"; + ASSERT_FALSE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "Qmx1ZQ"; + ASSERT_FALSE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "Qmx1ZQ="; + ASSERT_FALSE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "Qmx1Z==="; + ASSERT_FALSE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "Qmx1ZQ?="; + ASSERT_FALSE(wf_impl_base64_isvalid(in.c_str(), in.size())); + + in = "Qm?1ZQ=="; + ASSERT_FALSE(wf_impl_base64_isvalid(in.c_str(), in.size())); +} + +TEST(Base64, Decode) +{ + char buffer[42]; + + std::string in = "SGVsbG8="; // Hello + size_t length = wf_impl_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 42); + ASSERT_EQ(5, length); + buffer[length] = '\0'; + ASSERT_STREQ("Hello", buffer); + + in = "SGVsbG8K"; // Hello\n + length = wf_impl_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 42); + ASSERT_EQ(6, length); + buffer[length] = '\0'; + ASSERT_STREQ("Hello\n", buffer); + + in = "Qmx1ZQ=="; // Blue + length = wf_impl_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 42); + ASSERT_EQ(4, length); + buffer[length] = '\0'; + ASSERT_STREQ("Blue", buffer); +} + +TEST(Base64, FailToDecodeBufferTooSmall) +{ + char buffer[1]; + + std::string in = "SGVsbG8="; // Hello + size_t length = wf_impl_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 1); + ASSERT_EQ(0, length); +} + +TEST(Base64, FailToDecodeInvalid) +{ + char buffer[42]; + + std::string in = "invalid"; + size_t length = wf_impl_base64_decode(in.c_str(), in.size(), (uint8_t*) buffer, 42); + ASSERT_EQ(0, length); +} diff --git a/test/webfuse/tests/core/test_container_of.cc b/test/webfuse/util/test_container_of.cc similarity index 91% rename from test/webfuse/tests/core/test_container_of.cc rename to test/webfuse/util/test_container_of.cc index 900e180..da8a524 100644 --- a/test/webfuse/tests/core/test_container_of.cc +++ b/test/webfuse/util/test_container_of.cc @@ -1,5 +1,5 @@ #include -#include "webfuse/core/container_of.h" +#include "webfuse/impl/util/container_of.h" namespace { diff --git a/test/webfuse/tests/core/test_slist.cc b/test/webfuse/util/test_slist.cc similarity index 50% rename from test/webfuse/tests/core/test_slist.cc rename to test/webfuse/util/test_slist.cc index ddfb57d..08fa97e 100644 --- a/test/webfuse/tests/core/test_slist.cc +++ b/test/webfuse/util/test_slist.cc @@ -1,16 +1,16 @@ #include -#include "webfuse/core/slist.h" +#include "webfuse/impl/util/slist.h" TEST(wf_slist, init) { struct wf_slist list; - wf_slist_init(&list); + wf_impl_slist_init(&list); ASSERT_EQ(nullptr, list.head.next); ASSERT_EQ(nullptr, list.last->next); ASSERT_EQ(&list.head, list.last); - ASSERT_TRUE(wf_slist_empty(&list)); - ASSERT_EQ(nullptr, wf_slist_first(&list)); + ASSERT_TRUE(wf_impl_slist_empty(&list)); + ASSERT_EQ(nullptr, wf_impl_slist_first(&list)); } TEST(wf_slist, append) @@ -18,32 +18,32 @@ TEST(wf_slist, append) struct wf_slist list; struct wf_slist_item item[3]; - wf_slist_init(&list); - ASSERT_TRUE(wf_slist_empty(&list)); + wf_impl_slist_init(&list); + ASSERT_TRUE(wf_impl_slist_empty(&list)); - wf_slist_append(&list, &item[0]); + wf_impl_slist_append(&list, &item[0]); ASSERT_NE(&list.head, list.last); - ASSERT_FALSE(wf_slist_empty(&list)); - ASSERT_EQ(&item[0], wf_slist_first(&list)); + ASSERT_FALSE(wf_impl_slist_empty(&list)); + ASSERT_EQ(&item[0], wf_impl_slist_first(&list)); ASSERT_EQ(&item[0], list.head.next); ASSERT_EQ(&item[0], list.last); ASSERT_EQ(nullptr, list.last->next); ASSERT_EQ(nullptr, item[0].next); - wf_slist_append(&list, &item[1]); + wf_impl_slist_append(&list, &item[1]); ASSERT_NE(&list.head, list.last); - ASSERT_FALSE(wf_slist_empty(&list)); - ASSERT_EQ(&item[0], wf_slist_first(&list)); + ASSERT_FALSE(wf_impl_slist_empty(&list)); + ASSERT_EQ(&item[0], wf_impl_slist_first(&list)); ASSERT_EQ(&item[0], list.head.next); ASSERT_EQ(&item[1], list.last); ASSERT_EQ(nullptr, list.last->next); ASSERT_EQ(&item[1], item[0].next); ASSERT_EQ(nullptr, item[1].next); - wf_slist_append(&list, &item[2]); + wf_impl_slist_append(&list, &item[2]); ASSERT_NE(&list.head, list.last); - ASSERT_FALSE(wf_slist_empty(&list)); - ASSERT_EQ(&item[0], wf_slist_first(&list)); + ASSERT_FALSE(wf_impl_slist_empty(&list)); + ASSERT_EQ(&item[0], wf_impl_slist_first(&list)); ASSERT_EQ(&item[0], list.head.next); ASSERT_EQ(&item[2], list.last); ASSERT_EQ(nullptr, list.last->next); @@ -57,29 +57,29 @@ TEST(wf_slist_remove_after, remove_first) struct wf_slist list; struct wf_slist_item item[3]; - wf_slist_init(&list); - wf_slist_append(&list, &item[0]); - wf_slist_append(&list, &item[1]); - wf_slist_append(&list, &item[2]); + wf_impl_slist_init(&list); + wf_impl_slist_append(&list, &item[0]); + wf_impl_slist_append(&list, &item[1]); + wf_impl_slist_append(&list, &item[2]); wf_slist_item * removed; - removed = wf_slist_remove_first(&list); - ASSERT_FALSE(wf_slist_empty(&list)); + removed = wf_impl_slist_remove_first(&list); + ASSERT_FALSE(wf_impl_slist_empty(&list)); ASSERT_EQ(&item[0], removed); - removed = wf_slist_remove_first(&list); - ASSERT_FALSE(wf_slist_empty(&list)); + removed = wf_impl_slist_remove_first(&list); + ASSERT_FALSE(wf_impl_slist_empty(&list)); ASSERT_EQ(&item[1], removed); - removed = wf_slist_remove_first(&list); - ASSERT_TRUE(wf_slist_empty(&list)); + removed = wf_impl_slist_remove_first(&list); + ASSERT_TRUE(wf_impl_slist_empty(&list)); ASSERT_EQ(&item[2], removed); ASSERT_EQ(nullptr, list.head.next); ASSERT_EQ(nullptr, list.last->next); ASSERT_EQ(&list.head, list.last); - ASSERT_EQ(nullptr, wf_slist_first(&list)); + ASSERT_EQ(nullptr, wf_impl_slist_first(&list)); } TEST(wf_slist_remove_after, remove_last) @@ -87,29 +87,29 @@ TEST(wf_slist_remove_after, remove_last) struct wf_slist list; struct wf_slist_item item[3]; - wf_slist_init(&list); - wf_slist_append(&list, &item[0]); - wf_slist_append(&list, &item[1]); - wf_slist_append(&list, &item[2]); + wf_impl_slist_init(&list); + wf_impl_slist_append(&list, &item[0]); + wf_impl_slist_append(&list, &item[1]); + wf_impl_slist_append(&list, &item[2]); wf_slist_item * removed; - removed = wf_slist_remove_after(&list, &item[1]); - ASSERT_FALSE(wf_slist_empty(&list)); + removed = wf_impl_slist_remove_after(&list, &item[1]); + ASSERT_FALSE(wf_impl_slist_empty(&list)); ASSERT_EQ(&item[2], removed); - removed = wf_slist_remove_after(&list, &item[0]); - ASSERT_FALSE(wf_slist_empty(&list)); + removed = wf_impl_slist_remove_after(&list, &item[0]); + ASSERT_FALSE(wf_impl_slist_empty(&list)); ASSERT_EQ(&item[1], removed); - removed = wf_slist_remove_after(&list, &list.head); - ASSERT_TRUE(wf_slist_empty(&list)); + removed = wf_impl_slist_remove_after(&list, &list.head); + ASSERT_TRUE(wf_impl_slist_empty(&list)); ASSERT_EQ(&item[0], removed); ASSERT_EQ(nullptr, list.head.next); ASSERT_EQ(nullptr, list.last->next); ASSERT_EQ(&list.head, list.last); - ASSERT_EQ(nullptr, wf_slist_first(&list)); + ASSERT_EQ(nullptr, wf_impl_slist_first(&list)); } TEST(wf_slist_remove_after, remove_after) @@ -117,20 +117,20 @@ TEST(wf_slist_remove_after, remove_after) struct wf_slist list; struct wf_slist_item item[3]; - wf_slist_init(&list); - wf_slist_append(&list, &item[0]); - wf_slist_append(&list, &item[1]); - wf_slist_append(&list, &item[2]); + wf_impl_slist_init(&list); + wf_impl_slist_append(&list, &item[0]); + wf_impl_slist_append(&list, &item[1]); + wf_impl_slist_append(&list, &item[2]); wf_slist_item * removed; - removed = wf_slist_remove_after(&list, &item[0]); - ASSERT_FALSE(wf_slist_empty(&list)); + removed = wf_impl_slist_remove_after(&list, &item[0]); + ASSERT_FALSE(wf_impl_slist_empty(&list)); ASSERT_EQ(&item[1], removed); ASSERT_NE(&list.head, list.last); - ASSERT_FALSE(wf_slist_empty(&list)); - ASSERT_EQ(&item[0], wf_slist_first(&list)); + ASSERT_FALSE(wf_impl_slist_empty(&list)); + ASSERT_EQ(&item[0], wf_impl_slist_first(&list)); ASSERT_EQ(&item[0], list.head.next); ASSERT_EQ(&item[2], list.last); ASSERT_EQ(nullptr, list.last->next); diff --git a/test/webfuse/tests/core/test_url.cc b/test/webfuse/util/test_url.cc similarity index 59% rename from test/webfuse/tests/core/test_url.cc rename to test/webfuse/util/test_url.cc index ba5ba76..0ae29ec 100644 --- a/test/webfuse/tests/core/test_url.cc +++ b/test/webfuse/util/test_url.cc @@ -1,69 +1,69 @@ #include -#include "webfuse/core/url.h" +#include "webfuse/impl/util/url.h" TEST(url, ParseWs) { struct wf_url url; - bool result = wf_url_init(&url, "ws://localhost/"); + bool result = wf_impl_url_init(&url, "ws://localhost/"); ASSERT_TRUE(result); ASSERT_EQ(80, url.port); ASSERT_FALSE(url.use_tls); ASSERT_STREQ("localhost", url.host); ASSERT_STREQ("/", url.path); - wf_url_cleanup(&url); + wf_impl_url_cleanup(&url); } TEST(url, ParswWss) { struct wf_url url; - bool result = wf_url_init(&url, "wss://localhost/"); + bool result = wf_impl_url_init(&url, "wss://localhost/"); ASSERT_TRUE(result); ASSERT_EQ(443, url.port); ASSERT_TRUE(url.use_tls); ASSERT_STREQ("localhost", url.host); ASSERT_STREQ("/", url.path); - wf_url_cleanup(&url); + wf_impl_url_cleanup(&url); } TEST(url, ParseIPAdress) { struct wf_url url; - bool result = wf_url_init(&url, "ws://127.0.0.1/"); + bool result = wf_impl_url_init(&url, "ws://127.0.0.1/"); ASSERT_TRUE(result); ASSERT_EQ(80, url.port); ASSERT_STREQ("127.0.0.1", url.host); ASSERT_STREQ("/", url.path); - wf_url_cleanup(&url); + wf_impl_url_cleanup(&url); } TEST(url, ParsePort) { struct wf_url url; - bool result = wf_url_init(&url, "ws://localhost:54321/"); + bool result = wf_impl_url_init(&url, "ws://localhost:54321/"); ASSERT_TRUE(result); ASSERT_EQ(54321, url.port); - wf_url_cleanup(&url); + wf_impl_url_cleanup(&url); } TEST(url, ParseNonEmptyPath) { struct wf_url url; - bool result = wf_url_init(&url, "ws://localhost/some_path?query"); + bool result = wf_impl_url_init(&url, "ws://localhost/some_path?query"); ASSERT_TRUE(result); ASSERT_STREQ("/some_path?query", url.path); - wf_url_cleanup(&url); + wf_impl_url_cleanup(&url); } TEST(url, FailToParseUnknownProtocol) { struct wf_url url; - bool result = wf_url_init(&url, "unknown://localhost/"); + bool result = wf_impl_url_init(&url, "unknown://localhost/"); ASSERT_FALSE(result); ASSERT_EQ(0, url.port); ASSERT_EQ(nullptr, url.path); @@ -73,7 +73,7 @@ TEST(url, FailToParseUnknownProtocol) TEST(url, FailToParseMissingProtocol) { struct wf_url url; - bool result = wf_url_init(&url, "unknown"); + bool result = wf_impl_url_init(&url, "unknown"); ASSERT_FALSE(result); ASSERT_EQ(0, url.port); ASSERT_EQ(nullptr, url.path); @@ -83,10 +83,19 @@ TEST(url, FailToParseMissingProtocol) TEST(url, FailToParseMissingPath) { struct wf_url url; - bool result = wf_url_init(&url, "ws://localhost"); + bool result = wf_impl_url_init(&url, "ws://localhost"); ASSERT_FALSE(result); ASSERT_EQ(0, url.port); ASSERT_EQ(nullptr, url.path); ASSERT_EQ(nullptr, url.host); } +TEST(url, FailToParseWithPortMissingPath) +{ + struct wf_url url; + bool result = wf_impl_url_init(&url, "ws://localhost:54321"); + ASSERT_FALSE(result); + ASSERT_EQ(0, url.port); + ASSERT_EQ(nullptr, url.path); + ASSERT_EQ(nullptr, url.host); +} diff --git a/test/webfuse/tests/core/test_util.cc b/test/webfuse/util/test_util.cc similarity index 96% rename from test/webfuse/tests/core/test_util.cc rename to test/webfuse/util/test_util.cc index 3e4b75d..41e12f9 100644 --- a/test/webfuse/tests/core/test_util.cc +++ b/test/webfuse/util/test_util.cc @@ -1,5 +1,5 @@ #include -#include "webfuse/core/json_util.h" +#include "webfuse/impl/util/json_util.h" TEST(jsonrpc_util, get_int) { diff --git a/test/webfuse/utils/file_utils.cc b/test/webfuse/utils/file_utils.cc deleted file mode 100644 index 7a3d29c..0000000 --- a/test/webfuse/utils/file_utils.cc +++ /dev/null @@ -1,38 +0,0 @@ -#include "webfuse/utils/file_utils.hpp" - -#include -#include -#include - -namespace webfuse_test -{ - -bool is_dir(std::string const & path) -{ - struct stat info; - int rc = stat(path.c_str(), &info); - - return (0 == rc) && (S_ISDIR(info.st_mode)); -} - -bool is_symlink(std::string const & path) -{ - struct stat info; - int rc = lstat(path.c_str(), &info); - - return (0 == rc) && (S_ISLNK(info.st_mode)); -} - -bool is_same_path(std::string const & path, std::string const & other) -{ - struct stat info; - int rc = stat(path.c_str(), &info); - - struct stat info_other; - int rc_other = stat(other.c_str(), &info_other); - - return (0 == rc) && (0 == rc_other) && (info.st_ino == info_other.st_ino); -} - - -} \ No newline at end of file diff --git a/test/webfuse/utils/file_utils.hpp b/test/webfuse/utils/file_utils.hpp deleted file mode 100644 index 0c8cbc1..0000000 --- a/test/webfuse/utils/file_utils.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef WF_TEST_FILE_UTILS_HPP -#define WF_TEST_FILE_UTILS_HPP - -#include - -namespace webfuse_test -{ - -bool is_dir(std::string const & path); - -bool is_symlink(std::string const & path); - -bool is_same_path(std::string const & path, std::string const & other); - -} - -#endif diff --git a/test/webfuse/utils/path.c b/test/webfuse/utils/path.c deleted file mode 100644 index e63aafb..0000000 --- a/test/webfuse/utils/path.c +++ /dev/null @@ -1,113 +0,0 @@ -#include "webfuse/utils/path.h" -#include -#include - -#define WF_PATH_DEFAULT_CAPACITY (8) - -struct wf_path -{ - char * * elements; - size_t count; - size_t capacity; -}; - -static void -wf_path_add( - struct wf_path * path, - char const * element, - size_t element_size) -{ - if (0 < element_size) - { - if (path->count >= path->capacity) - { - size_t new_capacity = 2 * path->capacity; - size_t new_size = sizeof(char*) * new_capacity; - - char * * elements = realloc(path->elements, new_size); - if (NULL != elements) - { - path->elements = elements; - path->capacity = new_capacity; - } - } - - if (path->count < path->capacity) - { - path->elements[path->count] = strndup(element, element_size); - path->count++; - } - } -} - -struct wf_path * -wf_path_create( - char const * value) -{ - struct wf_path * path = malloc(sizeof(struct wf_path)); - path->elements = malloc(sizeof(char*) * WF_PATH_DEFAULT_CAPACITY); - path->capacity = WF_PATH_DEFAULT_CAPACITY; - path->count = 0; - - char const * remainder = value; - char const * pos = strchr(remainder, '/'); - while (NULL != pos) - { - wf_path_add(path, remainder, (pos - remainder)); - remainder = pos + 1; - pos = strchr(remainder, '/'); - } - - wf_path_add(path, remainder, strlen(remainder)); - - return path; -} - -void -wf_path_dispose( - struct wf_path * path) -{ - for(size_t i = 0; i < path->count; i++) - { - free(path->elements[i]); - } - - free(path->elements); - free(path); - (void) path; -} - -size_t -wf_path_element_count( - struct wf_path * path) -{ - return path->count; -} - -char const * -wf_path_get_element( - struct wf_path * path, - size_t i) -{ - char const * result = NULL; - if (i < path->count) - { - result = path->elements[i]; - } - - return result; -} - -char const * -wf_path_get_filename( - struct wf_path * path) -{ - char const * result = NULL; - - if (0 < path->count) - { - result = path->elements[path->count - 1]; - } - - return result; -} diff --git a/test/webfuse/utils/path.h b/test/webfuse/utils/path.h deleted file mode 100644 index ca31725..0000000 --- a/test/webfuse/utils/path.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef WF_PATH_H -#define WF_PATH_H - -#ifndef __cplusplus -#include -#else -#include -using ::std::size_t; -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wf_path; - -extern struct wf_path * -wf_path_create( - char const * value); - -extern void -wf_path_dispose( - struct wf_path * path); - -extern size_t -wf_path_element_count( - struct wf_path * path); - -extern char const * -wf_path_get_element( - struct wf_path * path, - size_t i); - -extern char const * -wf_path_get_filename( - struct wf_path * path); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/test/webfuse/utils/static_filesystem.c b/test/webfuse/utils/static_filesystem.c deleted file mode 100644 index 0f64733..0000000 --- a/test/webfuse/utils/static_filesystem.c +++ /dev/null @@ -1,421 +0,0 @@ -#include "webfuse/utils/static_filesystem.h" -#include "webfuse/provider/client_config.h" -#include "webfuse/provider/dirbuffer.h" -#include "webfuse/provider/operation/error.h" - -#include "webfuse/utils/path.h" -#include "webfuse/core/util.h" - -#include -#include -#include - -#include -#include -#include -#include - -#define WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY (16) -#define WFP_STATIC_FILSYSTEM_INODE_ROOT (1) -#define WFP_STATIC_FILESYSTEM_MAX_READ_SIZE (4 * 1024) - -struct wfp_static_filesystem_entry -{ - size_t inode; - size_t parent; - char * name; - bool is_file; - int mode; - size_t size; - char * content; - wfp_static_filesystem_read_fn * read; - wfp_static_filesystem_get_info_fn * get_info; - void * user_data; -}; - -struct wfp_static_filesystem -{ - struct wfp_static_filesystem_entry * entries; - size_t size; - size_t capacity; - void * user_data; -}; - -static struct wfp_static_filesystem_entry * -wfp_static_filesystem_get_entry( - struct wfp_static_filesystem * filesystem, - size_t inode) -{ - struct wfp_static_filesystem_entry * entry = NULL; - - if ((0 < inode) && (inode <= filesystem->size)) - { - entry = &filesystem->entries[inode - 1]; - } - - return entry; -} - -static struct wfp_static_filesystem_entry * -wfp_static_filesystem_get_entry_by_name( - struct wfp_static_filesystem * filesystem, - size_t parent, - char const * name) -{ - struct wfp_static_filesystem_entry * entry = NULL; - for(size_t i = 0; i < filesystem->size; i++) - { - struct wfp_static_filesystem_entry * current = &filesystem->entries[i]; - if ((parent == current->parent) && (0 == strcmp(name, current->name))) - { - entry = current; - break; - } - } - - return entry; -} - -static struct wfp_static_filesystem_entry * -wfp_static_filesystem_add_entry( - struct wfp_static_filesystem * filesystem) -{ - struct wfp_static_filesystem_entry * entry = NULL; - - if (filesystem->size >= filesystem->capacity) - { - struct wfp_static_filesystem_entry * entries; - - size_t new_capacity = 2 * filesystem->capacity; - size_t new_size = new_capacity * sizeof(struct wfp_static_filesystem_entry); - entries = realloc(filesystem->entries, new_size); - - if (NULL != entries) - { - filesystem->entries = entries; - filesystem->capacity = new_capacity; - } - } - - if (filesystem->size < filesystem->capacity) - { - entry = &filesystem->entries[filesystem->size]; - entry->inode = filesystem->size + 1; - filesystem->size++; - } - - return entry; -} - -static size_t -wfp_static_filesystem_entry_read( - size_t offset, - char * buffer, - size_t buffer_size, - void * user_data) -{ - size_t result = 0; - struct wfp_static_filesystem_entry * entry = user_data; - if (offset < entry->size) - { - size_t remaining = (entry->size - offset); - result = (buffer_size < remaining) ? buffer_size : remaining; - memcpy(buffer, entry->content, result); - } - - return result; -} - -static void -wfp_static_filesystem_entry_get_info( - void * user_data, - int * result_mode, - size_t * result_size) -{ - struct wfp_static_filesystem_entry * entry = user_data; - *result_mode = entry->mode; - *result_size = entry->size; -} - -static size_t -wfp_static_filesystem_add_dir( - struct wfp_static_filesystem * filesystem, - size_t parent, - char const * name -) -{ - struct wfp_static_filesystem_entry * entry = wfp_static_filesystem_get_entry_by_name(filesystem, parent, name); - if (NULL == entry) - { - entry = wfp_static_filesystem_add_entry(filesystem); - entry->parent = parent; - entry->is_file = false; - entry->mode = 0555; - entry->name = strdup(name); - entry->user_data = entry; - entry->read = &wfp_static_filesystem_entry_read; - entry->get_info = &wfp_static_filesystem_entry_get_info; - entry->size = 0; - entry->content = NULL; - } - - return entry->inode; -} - -static size_t -wfp_static_filesystem_make_parent( - struct wfp_static_filesystem * filesystem, - struct wf_path * path) -{ - size_t result = WFP_STATIC_FILSYSTEM_INODE_ROOT; - - size_t count = wf_path_element_count(path); - if (0 < count) - { - for(size_t i = 0; i < (count - 1); i++) - { - char const * name = wf_path_get_element(path, i); - result = wfp_static_filesystem_add_dir(filesystem, result, name); - } - } - - return result; -} - -static void -wfp_static_filesystem_stat( - struct wfp_static_filesystem_entry * entry, - struct stat * stat -) -{ - memset(stat, 0, sizeof(struct stat)); - - int mode; - size_t size; - entry->get_info(entry->user_data, &mode, &size); - - stat->st_ino = entry->inode; - stat->st_size = entry->size; - stat->st_mode = entry->mode & 0777; - stat->st_mode |= (entry->is_file) ? S_IFREG: S_IFDIR; -} - -static void wfp_static_filesystem_lookup( - struct wfp_request * request, - ino_t parent, - char const * name, - void * user_data) -{ - struct wfp_static_filesystem * filesystem = user_data; - struct wfp_static_filesystem_entry * entry = wfp_static_filesystem_get_entry_by_name(filesystem, parent, name); - - if (NULL != entry) - { - struct stat stat; - wfp_static_filesystem_stat(entry, &stat); - wfp_respond_lookup(request, &stat); - } - else - { - wfp_respond_error(request, WF_BAD_NOENTRY); - } -} - - -static void wfp_static_filesystem_getattr( - struct wfp_request * request, - ino_t inode, - void * user_data) -{ - struct wfp_static_filesystem * filesystem = user_data; - struct wfp_static_filesystem_entry * entry = wfp_static_filesystem_get_entry(filesystem, inode); - - if (NULL != entry) - { - struct stat stat; - wfp_static_filesystem_stat(entry, &stat); - wfp_respond_getattr(request, &stat); - } - else - { - wfp_respond_error(request, WF_BAD_NOENTRY); - } -} - -static void wfp_static_filesystem_readdir( - struct wfp_request * request, - ino_t directory, - void * user_data) -{ - struct wfp_static_filesystem * filesystem = user_data; - struct wfp_static_filesystem_entry * dir = wfp_static_filesystem_get_entry(filesystem, directory); - - if ((NULL != dir) && (!dir->is_file)) - { - struct wfp_dirbuffer * buffer = wfp_dirbuffer_create(); - wfp_dirbuffer_add(buffer, ".", dir->inode); - wfp_dirbuffer_add(buffer, "..", dir->inode); - - for(size_t i = 0; i < filesystem->size; i++) - { - struct wfp_static_filesystem_entry const * entry = &filesystem->entries[i]; - if (directory == entry->parent) - { - wfp_dirbuffer_add(buffer, entry->name, entry->inode); - } - } - - wfp_respond_readdir(request, buffer); - wfp_dirbuffer_dispose(buffer); - } - else - { - wfp_respond_error(request, WF_BAD_NOENTRY); - } -} - -static void wfp_static_filesystem_open( - struct wfp_request * request, - ino_t inode, - int flags, - void * user_data) -{ - struct wfp_static_filesystem * filesystem = user_data; - struct wfp_static_filesystem_entry * entry = wfp_static_filesystem_get_entry(filesystem, inode); - - if ((NULL != entry) && (entry->is_file)) - { - if (O_RDONLY == (flags & O_ACCMODE)) - { - wfp_respond_open(request, 0U); - } - else - { - wfp_respond_error(request, WF_BAD_ACCESS_DENIED); - } - } - else - { - wfp_respond_error(request, WF_BAD_NOENTRY); - } -} - -static void wfp_static_filesystem_read( - struct wfp_request * request, - ino_t inode, - uint32_t WF_UNUSED_PARAM(handle), - size_t offset, - size_t length, - void * user_data) -{ - struct wfp_static_filesystem * filesystem = user_data; - struct wfp_static_filesystem_entry * entry = wfp_static_filesystem_get_entry(filesystem, inode); - - if ((NULL != entry) && (entry->is_file)) - { - char buffer[WFP_STATIC_FILESYSTEM_MAX_READ_SIZE]; - size_t max_size = (length < WFP_STATIC_FILESYSTEM_MAX_READ_SIZE) ? length : WFP_STATIC_FILESYSTEM_MAX_READ_SIZE; - - size_t count = entry->read(offset, buffer, max_size, entry->user_data); - wfp_respond_read(request, buffer, count); - } - else - { - wfp_respond_error(request, WF_BAD_NOENTRY); - } -} - - -struct wfp_static_filesystem * -wfp_static_filesystem_create( - struct wfp_client_config * config) -{ - (void) config; - - struct wfp_static_filesystem * filesystem = malloc(sizeof(struct wfp_static_filesystem)); - filesystem->entries = malloc(sizeof(struct wfp_static_filesystem_entry) * WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY); - filesystem->size = 0; - filesystem->capacity = WFP_STATIC_FILESYSTEM_DEFAULT_CAPACITY; - filesystem->user_data = NULL; - - wfp_static_filesystem_add_dir(filesystem, 0, ""); - - wfp_client_config_set_userdata(config, filesystem); - wfp_client_config_set_onlookup(config, &wfp_static_filesystem_lookup); - wfp_client_config_set_ongetattr(config, &wfp_static_filesystem_getattr); - wfp_client_config_set_onreaddir(config, &wfp_static_filesystem_readdir); - wfp_client_config_set_onopen(config, &wfp_static_filesystem_open); - wfp_client_config_set_onread(config, &wfp_static_filesystem_read); - - return filesystem; -} - -void -wfp_static_filesystem_dispose( - struct wfp_static_filesystem * filesystem) -{ - for(size_t i = 0; i < filesystem->size; i++) - { - struct wfp_static_filesystem_entry * entry = &filesystem->entries[i]; - free(entry->name); - free(entry->content); - } - - free(filesystem->entries); - free(filesystem); -} - -void -wfp_static_filesystem_add( - struct wfp_static_filesystem * filesystem, - char const * path, - int mode, - char const * content, - size_t length) -{ - struct wf_path * path_ = wf_path_create(path); - if (NULL != path_) - { - size_t parent = wfp_static_filesystem_make_parent(filesystem, path_); - struct wfp_static_filesystem_entry * entry = wfp_static_filesystem_add_entry(filesystem); - entry->parent = parent; - entry->is_file = true; - entry->name = strdup(wf_path_get_filename(path_)); - entry->mode = mode; - entry->size = length; - entry->get_info = &wfp_static_filesystem_entry_get_info; - entry->read = &wfp_static_filesystem_entry_read; - entry->user_data = entry; - - entry->content = malloc(length); - memcpy(entry->content, content, length); - - wf_path_dispose(path_); - } -} - -void -wfp_static_filesystem_add_text( - struct wfp_static_filesystem * filesystem, - char const * path, - int mode, - char const * content) -{ - size_t length = strlen(content); - wfp_static_filesystem_add(filesystem, path, mode, content, length); -} - -void -wfp_static_filesystem_set_user_data( - struct wfp_static_filesystem * filesystem, - void * user_data) -{ - filesystem->user_data = user_data; -} - -void * -wfp_static_filesystem_get_user_data( - struct wfp_static_filesystem * filesystem) -{ - return filesystem->user_data; -} diff --git a/test/webfuse/utils/static_filesystem.h b/test/webfuse/utils/static_filesystem.h deleted file mode 100644 index d4d574a..0000000 --- a/test/webfuse/utils/static_filesystem.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef WFP_STATIC_FILESYSTEM_H -#define WFP_STATIC_FILESYSTEM_H - -#ifndef __cplusplus -#include -#else -#include -using ::std::size_t; -#endif - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -struct wfp_client_config; - -struct wfp_static_filesystem; - -typedef size_t -wfp_static_filesystem_read_fn( - size_t offset, - char * buffer, - size_t buffer_size, - void * user_data); - -typedef void -wfp_static_filesystem_get_info_fn( - void * user_data, - int * result_mode, - size_t * result_size); - - -extern WFP_API struct wfp_static_filesystem * -wfp_static_filesystem_create( - struct wfp_client_config * config); - -extern WFP_API void -wfp_static_filesystem_dispose( - struct wfp_static_filesystem * filesystem); - -extern WFP_API void -wfp_static_filesystem_add( - struct wfp_static_filesystem * filesystem, - char const * path, - int mode, - char const * content, - size_t length); - -extern WFP_API void -wfp_static_filesystem_add_text( - struct wfp_static_filesystem * filesystem, - char const * path, - int mode, - char const * content); - -extern void -wfp_static_filesystem_set_user_data( - struct wfp_static_filesystem * filesystem, - void * user_data); - -extern void * -wfp_static_filesystem_get_user_data( - struct wfp_static_filesystem * filesystem); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/test/webfuse/utils/timeout_watcher.cc b/test/webfuse/utils/timeout_watcher.cc deleted file mode 100644 index 705f1f3..0000000 --- a/test/webfuse/utils/timeout_watcher.cc +++ /dev/null @@ -1,58 +0,0 @@ -#include "webfuse/utils/timeout_watcher.hpp" -#include -#include - -using std::chrono::milliseconds; -using std::chrono::duration_cast; -using std::chrono::steady_clock; - -namespace -{ - milliseconds now() - { - return duration_cast(steady_clock::now().time_since_epoch()); - } -} - -namespace webfuse_test -{ - -TimeoutWatcher::TimeoutWatcher(milliseconds timeout) -: startedAt(now()) -, timeout_(timeout) -{ - -} - -TimeoutWatcher::~TimeoutWatcher() -{ - -} - -bool TimeoutWatcher::isTimeout() -{ - return (now() - startedAt) > timeout_; -} - -void TimeoutWatcher::check() -{ - if (isTimeout()) - { - throw std::runtime_error("timeout"); - } -} - -bool TimeoutWatcher::waitUntil(std::function predicate) -{ - bool result = predicate(); - while ((!result) && (!isTimeout())) - { - std::this_thread::yield(); - result = predicate(); - } - - return result; -} - - -} \ No newline at end of file diff --git a/test/webfuse/utils/timeout_watcher.hpp b/test/webfuse/utils/timeout_watcher.hpp deleted file mode 100644 index 3696dd1..0000000 --- a/test/webfuse/utils/timeout_watcher.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef WF_TEST_TIMEOUT_WATCHER_HPP -#define WF_TEST_TIMEOUT_WATCHER_HPP - -#include -#include - -namespace webfuse_test -{ - -class TimeoutWatcher final -{ - TimeoutWatcher(TimeoutWatcher const & other) = delete; - TimeoutWatcher& operator=(TimeoutWatcher const & other) = delete; -public: - explicit TimeoutWatcher(std::chrono::milliseconds timeout); - ~TimeoutWatcher(); - bool isTimeout(); - void check(); - bool waitUntil(std::function predicate); -private: - std::chrono::milliseconds startedAt; - std::chrono::milliseconds timeout_; -}; - -} - - -#endif diff --git a/test/webfuse/utils/ws_server.cc b/test/webfuse/utils/ws_server.cc deleted file mode 100644 index 2c3dcfe..0000000 --- a/test/webfuse/utils/ws_server.cc +++ /dev/null @@ -1,306 +0,0 @@ -#include "webfuse/utils/ws_server.h" -#include "webfuse/core/lws_log.h" - -#include -#include -#include -#include -#include -#include - -namespace -{ - -class IServer -{ -public: - virtual ~IServer() = default; - virtual void OnConnected(lws * wsi) = 0; - virtual void OnConnectionClosed(lws * wsi) = 0; - virtual void OnMessageReceived(struct lws * wsi, char const * data, size_t length) = 0; - virtual void OnWritable(struct lws * wsi) = 0; -}; - -} - -namespace webfuse_test -{ - -class WsServer::Private : IServer -{ - Private(Private const &) = delete; - Private & operator=(Private const &) = delete; -public: - Private(std::string const & protocol, int port); - ~Private(); - bool IsConnected(); - std::string GetUrl() const; - void SendMessage(json_t * message); - json_t * ReceiveMessage(); - void OnConnected(lws * wsi) override; - void OnConnectionClosed(lws * wsi) override; - void OnMessageReceived(struct lws * wsi, char const * data, size_t length) override; - void OnWritable(struct lws * wsi) override; - -private: - static void run(Private * self); - std::string protocol_; - int port_; - bool is_connected; - bool is_shutdown_requested; - lws * wsi_; - lws_context * ws_context; - lws_protocols ws_protocols[2]; - lws_context_creation_info info; - std::thread context; - std::mutex mutex; - std::queue writeQueue; - std::queue recvQueue; -}; - -} - -extern "C" -{ - -static int wf_test_utils_ws_server_callback( - struct lws * wsi, - enum lws_callback_reasons reason, - void * user, - void * in, - size_t len) -{ - int result = 0; - struct lws_protocols const * ws_protocol = lws_get_protocol(wsi); - auto * server = reinterpret_cast(nullptr != ws_protocol ? ws_protocol->user : nullptr); - - if (nullptr != server) - { - switch (reason) - { - case LWS_CALLBACK_ESTABLISHED: - server->OnConnected(wsi); - break; - case LWS_CALLBACK_CLOSED: - server->OnConnectionClosed(wsi); - break; - case LWS_CALLBACK_RECEIVE: - { - auto * data = reinterpret_cast(in); - server->OnMessageReceived(wsi, data, len); - } - break; - case LWS_CALLBACK_SERVER_WRITEABLE: - server->OnWritable(wsi); - break; - default: - break; - } - } - - return result; -} - -} - - -namespace webfuse_test -{ - -WsServer::WsServer(std::string const & protocol, int port) -: d(new Private(protocol, port)) -{ - -} - -WsServer::~WsServer() -{ - delete d; -} - -bool WsServer::IsConnected() -{ - return d->IsConnected(); -} - -void WsServer::SendMessage(json_t * message) -{ - d->SendMessage(message); -} - -json_t * WsServer::ReceiveMessage() -{ - return d->ReceiveMessage(); -} - -std::string WsServer::GetUrl() const -{ - return d->GetUrl(); -} - - -WsServer::Private::Private(std::string const & protocol, int port) -: protocol_(protocol) -, port_(port) -, is_connected(false) -, is_shutdown_requested(false) -, wsi_(nullptr) -{ - wf_lwslog_disable(); - IServer * server = this; - memset(ws_protocols, 0, sizeof(struct lws_protocols) * 2 ); - - ws_protocols[0].name = protocol_.c_str(); - ws_protocols[0].callback = &wf_test_utils_ws_server_callback; - ws_protocols[0].per_session_data_size = 0; - ws_protocols[0].user = reinterpret_cast(server); - - memset(&info, 0, sizeof(struct lws_context_creation_info)); - info.port = port; - info.mounts = NULL; - info.protocols =ws_protocols; - info.vhost_name = "localhost"; - info.ws_ping_pong_interval = 10; - info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; - info.options |= LWS_SERVER_OPTION_EXPLICIT_VHOSTS; - - ws_context = lws_create_context(&info); - - struct lws_vhost * vhost = lws_create_vhost(ws_context, &info); - port_ = lws_get_vhost_port(vhost); - - context = std::thread(&run, this); -} - -WsServer::Private::~Private() -{ - { - std::unique_lock lock(mutex); - is_shutdown_requested = true; - } - - lws_cancel_service(ws_context); - context.join(); - lws_context_destroy(ws_context); -} - -void WsServer::Private::run(Private * self) -{ - bool is_running = true; - while (is_running) - { - lws_service(self->ws_context, 0); - { - std::unique_lock lock(self->mutex); - is_running = !self->is_shutdown_requested; - } - } -} - -bool WsServer::Private::IsConnected() -{ - std::unique_lock lock(mutex); - return is_connected; -} - -void WsServer::Private::OnConnected(lws * wsi) -{ - std::unique_lock lock(mutex); - is_connected = true; - wsi_ = wsi; -} - -void WsServer::Private::OnConnectionClosed(lws * wsi) -{ - std::unique_lock lock(mutex); - if (wsi == wsi_) - { - is_connected = false; - wsi_ = nullptr; - } -} - -void WsServer::Private::OnWritable(struct lws * wsi) -{ - bool notify = false; - - { - std::unique_lock lock(mutex); - - if (!writeQueue.empty()) - { - std::string const & message = writeQueue.front(); - - unsigned char * data = new unsigned char[LWS_PRE + message.size()]; - memcpy(&data[LWS_PRE], message.c_str(), message.size()); - lws_write(wsi, &data[LWS_PRE], message.size(), LWS_WRITE_TEXT); - delete[] data; - - writeQueue.pop(); - notify = !writeQueue.empty(); - } - } - - if (notify) - { - lws_callback_on_writable(wsi); - } -} - - -void WsServer::Private::SendMessage(json_t * message) -{ - lws * wsi = nullptr; - - { - std::unique_lock lock(mutex); - - if (nullptr != wsi_) - { - char* message_text = json_dumps(message, JSON_COMPACT); - writeQueue.push(message_text); - json_decref(message); - free(message_text); - wsi = wsi_; - } - } - - if (nullptr != wsi) - { - lws_callback_on_writable(wsi_); - } -} - -void WsServer::Private::OnMessageReceived(struct lws * wsi, char const * data, size_t length) -{ - std::unique_lock lock(mutex); - if (wsi == wsi_) - { - recvQueue.push(std::string(data, length)); - } -} - -json_t * WsServer::Private::ReceiveMessage() -{ - std::unique_lock lock(mutex); - - json_t * result = nullptr; - if (!recvQueue.empty()) - { - std::string const & message_text = recvQueue.front(); - result = json_loads(message_text.c_str(), JSON_DECODE_ANY, nullptr); - recvQueue.pop(); - } - - return result; -} - -std::string WsServer::Private::GetUrl() const -{ - std::ostringstream stream; - stream << "ws://localhost:" << port_ << "/"; - return stream.str(); -} - - -} \ No newline at end of file diff --git a/test/webfuse/utils/ws_server.h b/test/webfuse/utils/ws_server.h deleted file mode 100644 index a51f695..0000000 --- a/test/webfuse/utils/ws_server.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef WF_TEST_UTILS_WS_SERVER_HPP -#define WF_TEST_UTILS_WS_SERVER_HPP - -#include -#include - -namespace webfuse_test -{ - -class WsServer -{ - WsServer(WsServer const &) = delete; - WsServer & operator=(WsServer const &) = delete; -public: - WsServer(std::string const & protocol, int port = 0); - ~WsServer(); - bool IsConnected(); - std::string GetUrl() const; - void SendMessage(json_t * message); - json_t * ReceiveMessage(); -private: - class Private; - Private * d; -}; - -} - - -#endif diff --git a/test/webfuse/utils/ws_server2.hpp b/test/webfuse/utils/ws_server2.hpp deleted file mode 100644 index b29ffb1..0000000 --- a/test/webfuse/utils/ws_server2.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef WF_TEST_UTILS_WS_SERVER2_HPP -#define WF_TEST_UTILS_WS_SERVER2_HPP - -#include -#include - -namespace webfuse_test -{ - -class IIvokationHandler -{ -public: - virtual ~IIvokationHandler() = default; - virtual std::string Invoke(char const * method, json_t * params) = 0; -}; - -class WsServer2 -{ - WsServer2(WsServer2 const &) = delete; - WsServer2 & operator=(WsServer2 const & ) = delete; -public: - WsServer2( - IIvokationHandler& handler, - std::string const & protocol, - int port = 0, - bool enable_tls = false); - virtual ~WsServer2(); - bool IsConnected(); - std::string const & GetUrl() const; - void SendMessage(char const * message); - void SendMessage(json_t * message); -private: - class Private; - Private * d; -}; - -} - -#endif