In tests use BOOST_AUTO_UNIT_TEST instead of BOOST_AUTO_TEST_CASE
[metaproxy-moved-to-github.git] / src / test_thread_pool_observer.cpp
1 /* $Id: test_thread_pool_observer.cpp,v 1.8 2005-12-02 12:21:07 adam Exp $
2    Copyright (c) 2005, Index Data.
3
4 %LICENSE%
5  */
6 /* $Id: test_thread_pool_observer.cpp,v 1.8 2005-12-02 12:21:07 adam Exp $
7    Copyright (c) 1998-2005, Index Data.
8
9 This file is part of the yaz-proxy.
10
11 YAZ proxy is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 2, or (at your option) any later
14 version.
15
16 YAZ proxy is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19 for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with YAZ proxy; see the file LICENSE.  If not, write to the
23 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 02111-1307, USA.
25  */
26
27 #include "config.hpp"
28 #include <stdlib.h>
29 #include <ctype.h>
30
31 #include <yaz++/pdu-assoc.h>
32 #include <yaz++/socket-manager.h>
33 #include <yaz/log.h>
34 #include "pipe.hpp"
35 #include "thread_pool_observer.hpp"
36
37 #define BOOST_AUTO_TEST_MAIN
38 #include <boost/test/auto_unit_test.hpp>
39
40 using namespace boost::unit_test;
41 using namespace yazpp_1;
42
43 class My_Timer_Thread;
44
45 class My_Msg : public yp2::IThreadPoolMsg {
46 public:
47     yp2::IThreadPoolMsg *handle();
48     void result();
49     int m_val;
50     My_Timer_Thread *m_timer;
51 };
52
53 class My_Timer_Thread : public ISocketObserver {
54 private:
55     ISocketObservable *m_obs;
56     yp2::Pipe m_pipe;
57     yp2::ThreadPoolSocketObserver *m_t;
58 public:
59     int m_sum;
60     int m_requests;
61     int m_responses;
62     My_Timer_Thread(ISocketObservable *obs, yp2::ThreadPoolSocketObserver *t);
63     void socketNotify(int event);
64 };
65
66
67 yp2::IThreadPoolMsg *My_Msg::handle()
68 {
69     My_Msg *res = new My_Msg;
70
71     if (m_val == 7)
72         sleep(1);
73
74     res->m_val = m_val;
75     res->m_timer = m_timer;
76     return res;
77 }
78
79 void My_Msg::result()
80 {
81     m_timer->m_sum += m_val;
82     m_timer->m_responses++;
83 }
84
85 My_Timer_Thread::My_Timer_Thread(ISocketObservable *obs,
86                                  yp2::ThreadPoolSocketObserver *t) : 
87     m_obs(obs), m_pipe(9123) 
88 {
89     m_t = t;
90     m_sum = 0;
91     m_requests = 0;
92     m_responses = 0;
93     obs->addObserver(m_pipe.read_fd(), this);
94     obs->maskObserver(this, SOCKET_OBSERVE_READ);
95     obs->timeoutObserver(this, 0);
96 }
97
98 void My_Timer_Thread::socketNotify(int event)
99 {
100     My_Msg *m = new My_Msg;
101     m->m_val = m_requests++;
102     m->m_timer = this;
103     m_t->put(m);
104 }
105
106 BOOST_AUTO_UNIT_TEST( thread_pool_observer1 ) 
107 {
108     SocketManager mySocketManager;
109
110     yp2::ThreadPoolSocketObserver m(&mySocketManager, 3);
111     My_Timer_Thread t(&mySocketManager, &m) ;
112     while (t.m_responses < 30 && mySocketManager.processEvent() > 0)
113         ;
114     BOOST_CHECK_EQUAL(t.m_responses, 30);
115     BOOST_CHECK(t.m_sum >= 435);
116 }
117
118 /*
119  * Local variables:
120  * c-basic-offset: 4
121  * indent-tabs-mode: nil
122  * c-file-style: "stroustrup"
123  * End:
124  * vim: shiftwidth=4 tabstop=8 expandtab
125  */
126