diff --git a/examples/wsperf/stress_aggregate.cpp b/examples/wsperf/stress_aggregate.cpp new file mode 100644 index 0000000000..82ea397dcc --- /dev/null +++ b/examples/wsperf/stress_aggregate.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "stress_aggregate.hpp" + +using wsperf::stress_aggregate; + +// Construct a message_test from a wscmd command +/* Reads values from the wscmd object into member variables. The cmd object is + * passed to the parent constructor for extracting values common to all test + * cases. + * + * Any of the constructors may throw a `case_exception` if required parameters + * are not found or default values don't make sense. + * + * Values that message_test checks for: + * + * uri=[string]; + * Example: uri=ws://localhost:9000; + * URI of the server to connect to + * + * token=[string]; + * Example: token=foo; + * String value that will be returned in the `token` field of all test related + * messages. A separate token should be sent for each unique test. + * + * quantile_count=[integer]; + * Example: quantile_count=10; + * How many histogram quantiles to return in the test results + * + * rtts=[bool]; + * Example: rtts:true; + * Whether or not to return the full list of round trip times for each message + * primarily useful for debugging. + */ +stress_aggregate::stress_aggregate(wscmd::cmd& cmd) + : stress_handler(cmd) +{} + +void stress_aggregate::start(connection_ptr con) {} + +void stress_aggregate::on_message(connection_ptr con,websocketpp::message::data_ptr msg) { + std::string hash = websocketpp::md5_hash_hex(msg->get_payload()); + + boost::lock_guard lock(m_lock); + m_msg_stats[hash]++; +} + +/*std::string stress_aggregate::get_data() const { + std::stringstream data; + + std::string sep = ""; + + data << "{"; + + std::map::iterator it; + + { + boost::lock_guard lock(m_lock); + for (it = m_msg_stats.begin(); it != m_msg_stats.end(); it++) { + data << sep << "\"" << (*it)->first << "\":" << (*it)->second; + sep = ","; + } + } + + data << "}"; + + return data; +}*/ + diff --git a/examples/wsperf/stress_aggregate.hpp b/examples/wsperf/stress_aggregate.hpp new file mode 100644 index 0000000000..fca6dcf99b --- /dev/null +++ b/examples/wsperf/stress_aggregate.hpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef WSPERF_STRESS_AGGREGATE_HPP +#define WSPERF_STRESS_AGGREGATE_HPP + +#include "stress_handler.hpp" + +namespace wsperf { + +class stress_aggregate : public stress_handler { +public: + typedef stress_aggregate type; + + /// Construct a stress test from a wscmd command + explicit stress_aggregate(wscmd::cmd& cmd); + + void on_message(connection_ptr con,websocketpp::message::data_ptr msg); + + void start(connection_ptr con); + void end(); + + const std::string get_data() const; +protected: + std::map m_msg_stats; +}; + +typedef boost::shared_ptr stress_aggregate_ptr; + +} // namespace wsperf + +#endif // WSPERF_STRESS_AGGREGATE_HPP diff --git a/examples/wsperf/stress_handler.cpp b/examples/wsperf/stress_handler.cpp new file mode 100644 index 0000000000..07be09405a --- /dev/null +++ b/examples/wsperf/stress_handler.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "stress_handler.hpp" + +using wsperf::stress_handler; + +// Construct a message_test from a wscmd command +/* Reads values from the wscmd object into member variables. The cmd object is + * passed to the parent constructor for extracting values common to all test + * cases. + * + * Any of the constructors may throw a `case_exception` if required parameters + * are not found or default values don't make sense. + * + * Values that message_test checks for: + * + * uri=[string]; + * Example: uri=ws://localhost:9000; + * URI of the server to connect to + * + * token=[string]; + * Example: token=foo; + * String value that will be returned in the `token` field of all test related + * messages. A separate token should be sent for each unique test. + * + * quantile_count=[integer]; + * Example: quantile_count=10; + * How many histogram quantiles to return in the test results + * + * rtts=[bool]; + * Example: rtts:true; + * Whether or not to return the full list of round trip times for each message + * primarily useful for debugging. + */ +stress_handler::stress_handler(wscmd::cmd& cmd) + : m_current_connections(0) + , m_max_connections(0) + , m_total_connections(0) + , m_failed_connections(0) +{ +} + +void stress_handler::on_open(connection_ptr con) { + { + boost::lock_guard lock(m_lock); + + m_current_connections++; + m_total_connections++; + + if (m_current_connections > m_max_connections) { + m_max_connections = m_current_connections; + } + } + + start(con); +} + +void stress_handler::on_close(connection_ptr con) { + boost::lock_guard lock(m_lock); + + m_current_connections--; + + // TODO: log close reason? +} + +void stress_handler::on_fail(connection_ptr con) { + boost::lock_guard lock(m_lock); + + m_failed_connections++; + + // TODO: log failure reason +} + +void stress_handler::start(connection_ptr con) {} + +std::string stress_handler::get_data() const { + std::stringstream data; + + data << "{"; + + { + boost::lock_guard lock(m_lock); + data << "\"current_connections\":" << m_current_connections; + data << ",\"max_connections\":" << m_max_connections; + data << ",\"total_connections\":" << m_total_connections; + data << ",\"failed_connections\":" << m_failed_connections; + } + + data << "}"; + + return data.str(); +} diff --git a/examples/wsperf/stress_handler.hpp b/examples/wsperf/stress_handler.hpp new file mode 100644 index 0000000000..c93db854a1 --- /dev/null +++ b/examples/wsperf/stress_handler.hpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef WSPERF_STRESS_HANDLER_HPP +#define WSPERF_STRESS_HANDLER_HPP + +#include "wscmd.hpp" + +#include "../../src/roles/client.hpp" +#include "../../src/websocketpp.hpp" + +#include +#include + +#include + +using websocketpp::client; + +namespace wsperf { + +class stress_handler : public client::handler { +public: + typedef stress_handler type; + + /// Construct a stress test from a wscmd command + explicit stress_handler(wscmd::cmd& cmd); + + void on_open(connection_ptr con); + void on_close(connection_ptr con); + void on_fail(connection_ptr con); + + void start(connection_ptr con); + void end(); + + std::string get_data() const; +protected: + size_t m_current_connections; + size_t m_max_connections; + size_t m_total_connections; + size_t m_failed_connections; + + // Stats update timer + size_t m_timeout; + boost::shared_ptr m_timer; + + mutable boost::mutex m_lock; +}; + +typedef boost::shared_ptr stress_handler_ptr; + +} // namespace wsperf + +#endif // WSPERF_STRESS_HANDLER_HPP