1 //
2 // Copyright (c) ZeroC, Inc. All rights reserved.
3 //
4
5 #include <Ice/Ice.h>
6 #include <TestHelper.h>
7 #include <Test.h>
8
9 using namespace std;
10 using namespace Ice;
11 using namespace Test;
12
13 void
allTests(Test::TestHelper * helper,int num)14 allTests(Test::TestHelper* helper, int num)
15 {
16 CommunicatorPtr communicator = helper->communicator();
17 vector<ControllerPrxPtr> proxies;
18 vector<ControllerPrxPtr> indirectProxies;
19 for(int i = 0; i < num; ++i)
20 {
21 {
22 ostringstream os;
23 os << "controller" << i;
24 proxies.push_back(ICE_UNCHECKED_CAST(ControllerPrx, communicator->stringToProxy(os.str())));
25 }
26 {
27 ostringstream os;
28 os << "controller" << i << "@control" << i;
29 indirectProxies.push_back(ICE_UNCHECKED_CAST(ControllerPrx, communicator->stringToProxy(os.str())));
30 }
31 }
32
33 cout << "testing indirect proxies... " << flush;
34 {
35 for(vector<ControllerPrxPtr>::const_iterator p = indirectProxies.begin(); p != indirectProxies.end(); ++p)
36 {
37 (*p)->ice_ping();
38 }
39 }
40 cout << "ok" << endl;
41
42 cout << "testing well-known proxies... " << flush;
43 {
44 for(vector<ControllerPrxPtr>::const_iterator p = proxies.begin(); p != proxies.end(); ++p)
45 {
46 (*p)->ice_ping();
47 }
48 }
49 cout << "ok" << endl;
50
51 cout << "testing object adapter registration... " << flush;
52 {
53 try
54 {
55 communicator->stringToProxy("object @ oa1")->ice_ping();
56 test(false);
57 }
58 catch(const Ice::NoEndpointException&)
59 {
60 }
61
62 proxies[0]->activateObjectAdapter("oa", "oa1", "");
63
64 try
65 {
66 communicator->stringToProxy("object @ oa1")->ice_ping();
67 test(false);
68 }
69 catch(const Ice::ObjectNotExistException&)
70 {
71 }
72
73 proxies[0]->deactivateObjectAdapter("oa");
74
75 try
76 {
77 communicator->stringToProxy("object @ oa1")->ice_ping();
78 test(false);
79 }
80 catch(const Ice::NoEndpointException&)
81 {
82 }
83 }
84 cout << "ok" << endl;
85
86 cout << "testing object adapter migration..." << flush;
87 {
88 proxies[0]->activateObjectAdapter("oa", "oa1", "");
89 proxies[0]->addObject("oa", "object");
90 communicator->stringToProxy("object @ oa1")->ice_ping();
91 proxies[0]->removeObject("oa", "object");
92 proxies[0]->deactivateObjectAdapter("oa");
93
94 proxies[1]->activateObjectAdapter("oa", "oa1", "");
95 proxies[1]->addObject("oa", "object");
96 communicator->stringToProxy("object @ oa1")->ice_ping();
97 proxies[1]->removeObject("oa", "object");
98 proxies[1]->deactivateObjectAdapter("oa");
99 }
100 cout << "ok" << endl;
101
102 cout << "testing object migration..." << flush;
103 {
104 proxies[0]->activateObjectAdapter("oa", "oa1", "");
105 proxies[1]->activateObjectAdapter("oa", "oa2", "");
106
107 proxies[0]->addObject("oa", "object");
108 communicator->stringToProxy("object @ oa1")->ice_ping();
109 communicator->stringToProxy("object")->ice_ping();
110 proxies[0]->removeObject("oa", "object");
111
112 proxies[1]->addObject("oa", "object");
113 communicator->stringToProxy("object @ oa2")->ice_ping();
114 communicator->stringToProxy("object")->ice_ping();
115 proxies[1]->removeObject("oa", "object");
116
117 try
118 {
119 communicator->stringToProxy("object @ oa1")->ice_ping();
120 }
121 catch(const Ice::ObjectNotExistException&)
122 {
123 }
124 try
125 {
126 communicator->stringToProxy("object @ oa2")->ice_ping();
127 }
128 catch(const Ice::ObjectNotExistException&)
129 {
130 }
131
132 proxies[0]->deactivateObjectAdapter("oa");
133 proxies[1]->deactivateObjectAdapter("oa");
134 }
135 cout << "ok" << endl;
136
137 cout << "testing replica groups..." << flush;
138 {
139 proxies[0]->activateObjectAdapter("oa", "oa1", "rg");
140 proxies[1]->activateObjectAdapter("oa", "oa2", "rg");
141 proxies[2]->activateObjectAdapter("oa", "oa3", "rg");
142
143 proxies[0]->addObject("oa", "object");
144 proxies[1]->addObject("oa", "object");
145 proxies[2]->addObject("oa", "object");
146
147 communicator->stringToProxy("object @ oa1")->ice_ping();
148 communicator->stringToProxy("object @ oa2")->ice_ping();
149 communicator->stringToProxy("object @ oa3")->ice_ping();
150
151 communicator->stringToProxy("object @ rg")->ice_ping();
152
153 set<string> adapterIds;
154 adapterIds.insert("oa1");
155 adapterIds.insert("oa2");
156 adapterIds.insert("oa3");
157 TestIntfPrxPtr intf = ICE_UNCHECKED_CAST(TestIntfPrx, communicator->stringToProxy("object"));
158 intf = intf->ice_connectionCached(false)->ice_locatorCacheTimeout(0);
159 while(!adapterIds.empty())
160 {
161 adapterIds.erase(intf->getAdapterId());
162 }
163
164 while(true)
165 {
166 adapterIds.insert("oa1");
167 adapterIds.insert("oa2");
168 adapterIds.insert("oa3");
169 intf = ICE_UNCHECKED_CAST(TestIntfPrx, communicator->stringToProxy("object @ rg"))->ice_connectionCached(false);
170 int nRetry = 100;
171 while(!adapterIds.empty() && --nRetry > 0)
172 {
173 adapterIds.erase(intf->getAdapterId());
174 }
175 if(nRetry > 0)
176 {
177 break;
178 }
179
180 // The previous locator lookup probably didn't return all the replicas... try again.
181 communicator->stringToProxy("object @ rg")->ice_locatorCacheTimeout(0)->ice_ping();
182 }
183
184 proxies[0]->deactivateObjectAdapter("oa");
185 proxies[1]->deactivateObjectAdapter("oa");
186 test(ICE_UNCHECKED_CAST(TestIntfPrx, communicator->stringToProxy("object @ rg"))->getAdapterId() == "oa3");
187 proxies[2]->deactivateObjectAdapter("oa");
188
189 proxies[0]->activateObjectAdapter("oa", "oa1", "rg");
190 proxies[0]->addObject("oa", "object");
191 test(ICE_UNCHECKED_CAST(TestIntfPrx, communicator->stringToProxy("object @ rg"))->getAdapterId() == "oa1");
192 proxies[0]->deactivateObjectAdapter("oa");
193 }
194 cout << "ok" << endl;
195
196 cout << "testing invalid lookup endpoints... " << flush;
197 {
198 string multicast;
199 if(communicator->getProperties()->getProperty("Ice.IPv6") == "1")
200 {
201 multicast = "\"ff15::1\"";
202 }
203 else
204 {
205 multicast = "239.255.0.1";
206 }
207
208 {
209
210 Ice::InitializationData initData;
211 initData.properties = communicator->getProperties()->clone();
212 initData.properties->setProperty("IceDiscovery.Lookup", "udp -h " + multicast + " --interface unknown");
213 Ice::CommunicatorPtr com = Ice::initialize(initData);
214 test(com->getDefaultLocator());
215 try
216 {
217 com->stringToProxy("controller0@control0")->ice_ping();
218 test(false);
219 }
220 catch(const Ice::LocalException&)
221 {
222 }
223 com->destroy();
224 }
225 {
226 Ice::InitializationData initData;
227 initData.properties = communicator->getProperties()->clone();
228 string intf = initData.properties->getProperty("IceDiscovery.Interface");
229 if(!intf.empty())
230 {
231 intf = " --interface \"" + intf + "\"";
232 }
233 string port = initData.properties->getProperty("IceDiscovery.Port");
234 initData.properties->setProperty("IceDiscovery.Lookup",
235 "udp -h " + multicast + " --interface unknown:" +
236 "udp -h " + multicast + " -p " + port + intf);
237 Ice::CommunicatorPtr com = Ice::initialize(initData);
238 test(com->getDefaultLocator());
239 com->stringToProxy("controller0@control0")->ice_ping();
240 com->destroy();
241 }
242 }
243 cout << "ok" << endl;
244
245 cout << "shutting down... " << flush;
246 for(vector<ControllerPrxPtr>::const_iterator p = proxies.begin(); p != proxies.end(); ++p)
247 {
248 (*p)->shutdown();
249 }
250 cout << "ok" << endl;
251 }
252