77#include < gtest/gtest.h>
88#include < http/server/simple_sessions.hpp>
99#include < future>
10+ #include < map>
1011
1112namespace http = network::http;
1213namespace net = network;
@@ -20,42 +21,39 @@ TEST(simple_sessions_test, constructor) {
2021
2122TEST (simple_sessions_test, lookup) {
2223 http::simple_sessions simple_sessions;
23- http::session& session = simple_sessions.lookup (" sessionid" );
24+ http::session session = simple_sessions.lookup (" sessionid" );
2425 (void ) session;
2526}
2627
2728TEST (simple_sessions_test, update) {
2829 http::simple_sessions simple_sessions;
2930 {
30- http::session& session = simple_sessions.lookup (" sessionid" );
31+ http::session session = simple_sessions.lookup (" sessionid" );
3132 session.set (" user" ," some-user" );
33+ simple_sessions.update (" sessionid" ,std::move (session));
3234 }
3335 {
34- http::session& session = simple_sessions.lookup (" sessionid" );
36+ http::session session = simple_sessions.lookup (" sessionid" );
3537EXPECT_EQ (" some-user" , session[" user" ]);
3638 }
3739}
3840
3941TEST (simple_sessions_test, threaded_sessions) {
4042 http::simple_sessions simple_sessions;
41- auto f0 =std::async ([&]() {
42- http::session &session = simple_sessions.lookup (" " );
43- return session[" id" ];
44- });
45- auto f1 =std::async ([&]() {
46- http::session &session = simple_sessions.lookup (" " );
47- return session[" id" ];
48- });
49- auto f2 =std::async ([&]() {
50- http::session &session = simple_sessions.lookup (" " );
51- return session[" id" ];
52- });
53- std::string session0 = f0.get (),
54- session1 = f1.get (),
55- session2 = f2.get ();
56- EXPECT_NE (session0, session1);
57- EXPECT_NE (session1, session2);
58- EXPECT_NE (session0, session2);
43+ // Run many asynchronous functions (hoping that there will be many threads
44+ // created) so that we may be able to exercise the atomics and the
45+ // concurrency of the simple session manager.
46+ std::vector<std::future<std::string>> futures;
47+ constexpr size_t max_sessions =1000 ;
48+ for (size_t counter =0 ; counter < max_sessions; ++counter) {
49+ futures.emplace_back (std::async (std::launch::async, [&]() {
50+ return simple_sessions.lookup (" " )[" id" ];
51+ }));
52+ }
53+ std::set<std::string> ids;
54+ for (auto &future : futures)
55+ ids.emplace (future.get ());
56+ EXPECT_EQ (max_sessions, ids.size ());
5957}
6058
6159}// namespace