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