PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/p2p/test/java/hgtest/p2p/TestCACT.java

http://hypergraphdb.googlecode.com/
Java | 348 lines | 318 code | 28 blank | 2 comment | 25 complexity | 78172b88a46cb32a2d5d08042af190ee MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause
  1. package hgtest.p2p;
  2. import java.io.File;
  3. import java.net.InetAddress;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import java.util.Set;
  9. import java.util.concurrent.Future;
  10. import hgtest.beans.SimpleBean;
  11. import hgtest.T;
  12. import hgtest.beans.ComplexBean;
  13. import hgtest.beans.PlainBean;
  14. import mjson.Json;
  15. import org.hypergraphdb.HGEnvironment;
  16. import org.hypergraphdb.HGHandle;
  17. import org.hypergraphdb.HGQuery.hg;
  18. import org.hypergraphdb.HGSearchResult;
  19. import org.hypergraphdb.HyperGraph;
  20. import org.hypergraphdb.HyperNode;
  21. import org.hypergraphdb.atom.HGSubsumes;
  22. import org.hypergraphdb.peer.HyperGraphPeer;
  23. import org.hypergraphdb.peer.PeerConfig;
  24. import org.hypergraphdb.peer.PeerHyperNode;
  25. import org.hypergraphdb.peer.Performative;
  26. import org.hypergraphdb.peer.bootstrap.AffirmIdentityBootstrap;
  27. import org.hypergraphdb.peer.bootstrap.CACTBootstrap;
  28. import org.hypergraphdb.peer.cact.DefineAtom;
  29. import org.hypergraphdb.peer.cact.RemoteQueryExecution;
  30. import org.hypergraphdb.peer.cact.RunRemoteQuery;
  31. import org.hypergraphdb.peer.cact.GetAtom;
  32. import org.hypergraphdb.peer.workflow.WorkflowState;
  33. import org.hypergraphdb.query.HGQueryCondition;
  34. import org.hypergraphdb.util.HGUtils;
  35. import org.hypergraphdb.util.Pair;
  36. import org.testng.Assert;
  37. import org.testng.annotations.AfterClass;
  38. import org.testng.annotations.BeforeClass;
  39. import org.testng.annotations.Test;
  40. public class TestCACT
  41. {
  42. boolean both = true;
  43. private boolean which = false; // true for peer 1, falsefor peer 2
  44. private HyperGraph graph1, graph2;
  45. private HyperGraphPeer peer1, peer2;
  46. private File locationBase = new File(T.getTmpDirectory());
  47. private File locationGraph1 = new File(locationBase, "hgp2p1");
  48. private File locationGraph2 = new File(locationBase, "hgp2p2");
  49. private HyperGraphPeer startPeer(String dblocation, String username,
  50. String hostname)
  51. {
  52. Json config = Json.object();
  53. config.set(PeerConfig.INTERFACE_TYPE,
  54. "org.hypergraphdb.peer.xmpp.XMPPPeerInterface");
  55. config.set(PeerConfig.LOCAL_DB, dblocation);
  56. Json interfaceConfig = Json.object();
  57. interfaceConfig.set("user", username);
  58. interfaceConfig.set("password", "hgpassword");
  59. interfaceConfig.set("serverUrl", hostname);
  60. interfaceConfig.set("room", "hgtest@conference." + hostname);
  61. interfaceConfig.set("autoRegister", true);
  62. config.set(PeerConfig.INTERFACE_CONFIG, interfaceConfig);
  63. // bootstrap activities
  64. config.set(PeerConfig.BOOTSTRAP,
  65. Json.array(Json.object("class",
  66. AffirmIdentityBootstrap.class.getName(),
  67. "config",
  68. Json.object()),
  69. Json.object("class",
  70. CACTBootstrap.class.getName(),
  71. "config",
  72. Json.object())));
  73. HyperGraphPeer peer = new HyperGraphPeer(config);
  74. Future<Boolean> startupResult = peer.start();
  75. try
  76. {
  77. if (startupResult.get())
  78. {
  79. System.out.println("Peer " + username
  80. + " started successfully.");
  81. }
  82. else
  83. {
  84. System.out.println("Peer failed to start.");
  85. HGUtils.throwRuntimeException(peer.getStartupFailedException());
  86. }
  87. }
  88. catch (Exception e)
  89. {
  90. peer.stop();
  91. throw new RuntimeException(e);
  92. }
  93. return peer;
  94. }
  95. @BeforeClass
  96. public void setUp()
  97. {
  98. String localhost = "localhost";
  99. try { localhost = InetAddress.getLocalHost().getHostName(); }
  100. catch (Throwable t) { }
  101. if (which || both)
  102. {
  103. HGUtils.dropHyperGraphInstance(locationGraph1.getAbsolutePath());
  104. graph1 = HGEnvironment.get(locationGraph1.getAbsolutePath());
  105. peer1 = startPeer(locationGraph1.getAbsolutePath(), "cact1", localhost);
  106. }
  107. if (!which || both)
  108. {
  109. HGUtils.dropHyperGraphInstance(locationGraph2.getAbsolutePath());
  110. graph2 = HGEnvironment.get(locationGraph2.getAbsolutePath());
  111. peer2 = startPeer(locationGraph2.getAbsolutePath(), "cact2", localhost);
  112. }
  113. }
  114. @AfterClass
  115. public void tearDown()
  116. {
  117. if (which || both)
  118. {
  119. try { peer1.stop(); } catch (Throwable t) {}
  120. try { graph1.close(); } catch (Throwable t) {}
  121. try { HGUtils.dropHyperGraphInstance(locationGraph1.getAbsolutePath()); } catch (Throwable t) {}
  122. }
  123. if (!which || both)
  124. {
  125. try { peer2.stop(); } catch (Throwable t) {}
  126. try { graph2.close(); } catch (Throwable t) {}
  127. try { HGUtils.dropHyperGraphInstance(locationGraph1.getAbsolutePath()); } catch (Throwable t) {}
  128. }
  129. }
  130. @Test
  131. public void testDefineAtom()
  132. {
  133. HGHandle fromPeer1 = graph1.add("From Peer1");
  134. peer1.getActivityManager().initiateActivity(new DefineAtom(peer1,
  135. fromPeer1, peer2.getIdentity()));
  136. T.sleep(2000);
  137. String received = graph2.get(graph1.getPersistentHandle(fromPeer1));
  138. if (received != null)
  139. System.out.println("Peer 2 received " + received);
  140. else
  141. Assert.fail("peer 2 didn't received message");
  142. }
  143. @Test
  144. public void testGetAtom()
  145. {
  146. Object atom = "Get Atom In Peer1";
  147. HGHandle fromPeer1 = hg.assertAtom(graph1, atom);
  148. try
  149. {
  150. while (peer2.getConnectedPeers().isEmpty())
  151. Thread.sleep(500);
  152. GetAtom activity = new GetAtom(peer2,
  153. graph1.getPersistentHandle(fromPeer1), peer1.getIdentity());
  154. peer2.getActivityManager().initiateActivity(activity);
  155. activity.getFuture().get();
  156. Assert.assertEquals(activity.getState(), WorkflowState.Completed);
  157. Assert.assertEquals(activity.getOneAtom(), atom);
  158. }
  159. catch (Throwable t)
  160. {
  161. Assert.fail("Exception during GetAtom activity", t);
  162. }
  163. }
  164. @Test
  165. public void testRemoveAtom()
  166. {
  167. Object atom = "Get Atom In Peer1";
  168. HGHandle fromPeer1 = hg.assertAtom(graph1, atom);
  169. try
  170. {
  171. while (peer2.getConnectedPeers().isEmpty())
  172. Thread.sleep(500);
  173. GetAtom activity = new GetAtom(peer2,
  174. graph1.getPersistentHandle(fromPeer1), peer1.getIdentity());
  175. peer2.getActivityManager().initiateActivity(activity);
  176. activity.getFuture().get();
  177. Assert.assertEquals(activity.getState(), WorkflowState.Completed);
  178. Assert.assertEquals(activity.getOneAtom(), atom);
  179. }
  180. catch (Throwable t)
  181. {
  182. Assert.fail("Exception during GetAtom activity", t);
  183. }
  184. }
  185. @Test
  186. public void testRemoteQuery()
  187. {
  188. try
  189. {
  190. while (peer2.getConnectedPeers().isEmpty())
  191. Thread.sleep(500);
  192. HGQueryCondition expression = hg.dfs(graph1.getTypeSystem().getTop(),
  193. hg.type(HGSubsumes.class), null, false, true);
  194. RemoteQueryExecution<HGHandle> activity =
  195. new RemoteQueryExecution<HGHandle>(peer1, expression, peer2.getIdentity());
  196. peer1.getActivityManager().initiateActivity(activity);
  197. activity.getState().getFuture(RemoteQueryExecution.ResultSetOpen).get();
  198. List<HGHandle> received = new ArrayList<HGHandle>();
  199. HGSearchResult<HGHandle> rs = activity.getSearchResult();
  200. while (rs.hasNext())
  201. received.add(rs.next());
  202. rs.close();
  203. Assert.assertEquals(hg.findAll(graph2, expression), received);
  204. }
  205. catch (Throwable t)
  206. {
  207. Assert.fail("Exception during RemoteQuery Activity activity", t);
  208. }
  209. }
  210. @Test
  211. public void testRemoteQueryBulk()
  212. {
  213. try
  214. {
  215. while (peer2.getConnectedPeers().isEmpty())
  216. Thread.sleep(500);
  217. HGQueryCondition expression = hg.dfs(graph1.getTypeSystem().getTop(),
  218. hg.type(HGSubsumes.class), null, false, true);
  219. RunRemoteQuery activity =
  220. new RunRemoteQuery(peer1, expression, false, -1, peer2.getIdentity());
  221. peer1.getActivityManager().initiateActivity(activity);
  222. activity.getFuture().get();
  223. @SuppressWarnings("unchecked")
  224. List<HGHandle> received = (List<HGHandle>)(List<?>)activity.getResult();
  225. Assert.assertEquals(hg.findAll(graph2, expression), received);
  226. List<Object> beans = new ArrayList<Object>();
  227. for (int i = 0; i < 158; i++)
  228. beans.add(new PlainBean(i));
  229. for (Object x : beans)
  230. graph2.add(x);
  231. activity = new RunRemoteQuery(peer1, hg.type(PlainBean.class), true, -1, peer2.getIdentity());
  232. peer1.getActivityManager().initiateActivity(activity);
  233. activity.getFuture().get();
  234. List<Object> result = new ArrayList<Object>();
  235. for (Object x : activity.getResult())
  236. {
  237. // System.out.println(((Pair<?, Object>)x).getSecond());
  238. result.add(((Pair<?, Object>)x).getSecond());
  239. }
  240. Assert.assertEqualsNoOrder(result.toArray(), beans.toArray());
  241. }
  242. catch (Throwable t)
  243. {
  244. Assert.fail("Exception during RemoteQuery Activity activity", t);
  245. }
  246. }
  247. @Test
  248. public void testHyperNode() throws Throwable
  249. {
  250. while (peer2.getConnectedPeers().isEmpty())
  251. Thread.sleep(500);
  252. HyperNode node = new PeerHyperNode(peer1, peer2.getIdentity());
  253. HGHandle stringType = graph1.getTypeSystem().getTypeHandle(String.class);
  254. HGHandle beanType = graph1.getTypeSystem().getTypeHandle(ComplexBean.class);
  255. HGHandle intType = graph1.getTypeSystem().getTypeHandle(Integer.class);
  256. HGHandle listType = graph1.getTypeSystem().getTypeHandle(ArrayList.class);
  257. HGHandle x1 = node.add("Hello World", stringType, 0);
  258. HGHandle x2 = graph1.getHandleFactory().makeHandle();
  259. ComplexBean complexBean = new ComplexBean();
  260. complexBean.setStableField("HYPERNODE");
  261. complexBean.setStableNested(new SimpleBean());
  262. node.define(x2, beanType, complexBean, 0);
  263. HGHandle toBeRemoved = node.add(10, intType, 0);
  264. HGHandle toBeReplaced = node.add(Arrays.asList(new Integer[]{1,2,3,4,5,6}), listType, 0);
  265. ArrayList<Integer> ints = new ArrayList<Integer>();
  266. for (int i = 0; i < 37; i++)
  267. {
  268. ints.add(i);
  269. node.add(i, intType, 0);
  270. }
  271. node.replace(toBeReplaced, ints, listType);
  272. Assert.assertTrue(node.remove(toBeRemoved));
  273. Assert.assertEquals(node.count(hg.eq(10)), 1);
  274. Assert.assertEquals(node.get(x1), "Hello World");
  275. Assert.assertEquals(node.get(x2), complexBean);
  276. HGSearchResult<HGHandle> rs = node.find(hg.type(intType));
  277. Set<Integer> intSet = new HashSet<Integer>();
  278. intSet.addAll(ints);
  279. ArrayList<HGHandle> intHandles = new ArrayList<HGHandle>();
  280. while (rs.hasNext())
  281. {
  282. Assert.assertTrue(intSet.contains(node.get(rs.next())));
  283. intSet.remove(node.get(rs.current()));
  284. intHandles.add(rs.current());
  285. if (rs.hasPrev())
  286. {
  287. rs.prev();
  288. rs.next();
  289. }
  290. }
  291. rs.close();
  292. Assert.assertTrue(intSet.isEmpty());
  293. Assert.assertEqualsNoOrder(node.findAll(hg.type(intType)).toArray(new HGHandle[0]),
  294. intHandles.toArray(new HGHandle[0]));
  295. Integer[] II = node.getAll(hg.type(intType)).toArray(new Integer[0]);
  296. Assert.assertEqualsNoOrder(II, ints.toArray(new Integer[0]));
  297. Assert.assertEquals(node.get(toBeReplaced), ints);
  298. }
  299. public static void main(String[] argv)
  300. {
  301. TestCACT test = new TestCACT();
  302. try
  303. {
  304. test.setUp();
  305. if (test.which || test.both)
  306. test.testHyperNode();
  307. else
  308. T.sleep(1000*60*60*5);
  309. System.out.println("test passed successfully");
  310. }
  311. catch (Throwable t)
  312. {
  313. t.printStackTrace(System.err);
  314. }
  315. finally
  316. {
  317. test.tearDown();
  318. }
  319. }
  320. }