appswarm 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. data/.autotest +124 -0
  2. data/History.txt +7 -0
  3. data/Manifest.txt +304 -0
  4. data/README.txt +373 -0
  5. data/Rakefile +153 -0
  6. data/TODO +7 -0
  7. data/apps/README.txt +17 -0
  8. data/apps/admin/admin.rb +79 -0
  9. data/apps/admin/controllers/admin.rb +81 -0
  10. data/apps/admin/controllers/settings.rb +63 -0
  11. data/apps/admin/controllers/users.rb +3 -0
  12. data/apps/admin/features/access.feature +21 -0
  13. data/apps/admin/features/mountLocal.feature +12 -0
  14. data/apps/admin/features/settings.feature +68 -0
  15. data/apps/admin/features/startApps.feature +27 -0
  16. data/apps/admin/layouts/main.rhtml +10 -0
  17. data/apps/admin/lib/settings.rb +52 -0
  18. data/apps/admin/static/admin.css +23 -0
  19. data/apps/admin/views/_log.rhtml +21 -0
  20. data/apps/admin/views/index.rhtml +43 -0
  21. data/apps/admin/views/info.rhtml +7 -0
  22. data/apps/admin/views/settings.rhtml +9 -0
  23. data/apps/admin/views/settings/_http_app.rhtml +15 -0
  24. data/apps/admin/views/settings/_web_server.rhtml +32 -0
  25. data/apps/admin/views/settings/index.rhtml +3 -0
  26. data/apps/admin/views/users/index.rhtml +6 -0
  27. data/apps/application_provider/application_provider.rb +11 -0
  28. data/apps/blog/blog.rb +27 -0
  29. data/apps/blog/controllers/blog.rb +29 -0
  30. data/apps/blog/views/index.rhtml +27 -0
  31. data/apps/browser_starter/browser_starter.rb +32 -0
  32. data/apps/crypto/crypto.rb +47 -0
  33. data/apps/crypto/crypto_rsa.rb +102 -0
  34. data/apps/crypto/spec/crypto_spec.rb +10 -0
  35. data/apps/directory_service/directory_service.rb +107 -0
  36. data/apps/directory_service/net_application.rb +92 -0
  37. data/apps/directory_service/spec/directory_service_spec.rb +36 -0
  38. data/apps/directory_service/spec/net_application_spec.rb +3 -0
  39. data/apps/global_application_interface/global_application.rb +52 -0
  40. data/apps/global_application_interface/global_application_interface.rb +84 -0
  41. data/apps/global_application_interface/spec/app_api_spec.rb +5 -0
  42. data/apps/global_tuple_space/global_tuple_space.rb +27 -0
  43. data/apps/global_web_proxy/features/session_handling.feature +7 -0
  44. data/apps/global_web_proxy/global_web_proxy.rb +221 -0
  45. data/apps/global_web_proxy/proxy/HTTPProxyServer-Dateien/rdoc-style.css +208 -0
  46. data/apps/global_web_proxy/proxy/HTTPProxyServer.html +566 -0
  47. data/apps/global_web_proxy/proxy/dnstest.rb +30 -0
  48. data/apps/global_web_proxy/proxy/proxy.rb +86 -0
  49. data/apps/global_web_proxy/proxy/wiki.html +267 -0
  50. data/apps/global_web_proxy/proxy/wiki.rb +115 -0
  51. data/apps/global_web_proxy/spec/res1 +112 -0
  52. data/apps/global_web_proxy/spec/res2 +125 -0
  53. data/apps/global_web_proxy/spec/web_proxy_spec.rb +88 -0
  54. data/apps/global_web_server/global_web_server.rb +120 -0
  55. data/apps/global_web_server/global_web_servlet.rb +6 -0
  56. data/apps/hello_world/controllers/hello_world.rb +11 -0
  57. data/apps/hello_world/features/show_on_local_web_server.feature +44 -0
  58. data/apps/hello_world/features/starting_apps.feature +6 -0
  59. data/apps/hello_world/features/through_global.feature +12 -0
  60. data/apps/hello_world/hello_world.rb +3 -0
  61. data/apps/hello_world/views/get.rhtml +10 -0
  62. data/apps/hello_world/views/index.rhtml +9 -0
  63. data/apps/hello_world/views/post.rhtml +10 -0
  64. data/apps/home/controllers/home.rb +11 -0
  65. data/apps/home/home.rb +12 -0
  66. data/apps/home/layouts/main.rhtml +16 -0
  67. data/apps/home/static/Zeichnung.svg +240 -0
  68. data/apps/home/static/home.css +134 -0
  69. data/apps/home/static/menu.css +99 -0
  70. data/apps/home/views/_appInfo.rhtml +22 -0
  71. data/apps/home/views/_dummy_fill.rhtml +3 -0
  72. data/apps/home/views/_info.rhtml +6 -0
  73. data/apps/home/views/_menu.rhtml +17 -0
  74. data/apps/home/views/index.rhtml +4 -0
  75. data/apps/home/views/overview.rhtml +2 -0
  76. data/apps/local_chunk_store/chunk_store.rb +15 -0
  77. data/apps/local_chunk_store/local_chunk_store.rb +123 -0
  78. data/apps/local_chunk_store/spec/local_chunk_store_spec.rb +30 -0
  79. data/apps/local_file_store/app_configuration.rb +78 -0
  80. data/apps/local_file_store/app_file_store.rb +32 -0
  81. data/apps/local_file_store/cached_file_store.rb +94 -0
  82. data/apps/local_file_store/features/testbed_handling_of_directories.feature +20 -0
  83. data/apps/local_file_store/local_file_store.rb +47 -0
  84. data/apps/local_file_store/spec/app_configuration_spec.rb +30 -0
  85. data/apps/local_file_store/spec/local_file_store_spec.rb +54 -0
  86. data/apps/local_object_storage/lib/cell.rb +29 -0
  87. data/apps/local_object_storage/lib/cellmgr.rb +57 -0
  88. data/apps/local_object_storage/lib/index.rb +43 -0
  89. data/apps/local_object_storage/lib/marshal.rb +96 -0
  90. data/apps/local_object_storage/lib/pagefile.rb +6 -0
  91. data/apps/local_object_storage/lib/persistent_object.rb +126 -0
  92. data/apps/local_object_storage/local_object_storage.rb +148 -0
  93. data/apps/local_object_storage/spec/local_object_storage_spec.rb +123 -0
  94. data/apps/local_secure_file_store/local_secure_file_store.rb +64 -0
  95. data/apps/local_secure_file_store/spec/local_secure_file_store_spec.rb +23 -0
  96. data/apps/local_tuple_space/local_tuple_space.rb +92 -0
  97. data/apps/local_tuple_space/spec/tuple_space_spec.rb +25 -0
  98. data/apps/local_web_server/features/parsing_args.feature +18 -0
  99. data/apps/local_web_server/local_web_server.rb +166 -0
  100. data/apps/logger/logger.rb +27 -0
  101. data/apps/master/master.rb +46 -0
  102. data/apps/master/spec/master_spec.rb +31 -0
  103. data/apps/my_spec_spec.rb +15 -0
  104. data/apps/name_service/name_service.rb +75 -0
  105. data/apps/name_service/spec/name_service_spec.rb +51 -0
  106. data/apps/network_discovery/network_discovery.rb +45 -0
  107. data/apps/network_discovery_localstore/network_discovery_localstore.rb +20 -0
  108. data/apps/network_discovery_udp/network_discovery_udp.rb +51 -0
  109. data/apps/network_lookup/network_lookup.rb +61 -0
  110. data/apps/network_node/abstract_node.rb +104 -0
  111. data/apps/network_node/drb_node.rb +90 -0
  112. data/apps/network_node/network_app.rb +9 -0
  113. data/apps/network_node/network_node.rb +471 -0
  114. data/apps/network_node/remote_service.rb +45 -0
  115. data/apps/network_node/secure_node.rb +125 -0
  116. data/apps/network_node/spec/drb_spec.rb +41 -0
  117. data/apps/network_node/spec/network_node_spec_not.rb +264 -0
  118. data/apps/new_network_node/new_network_node.rb +427 -0
  119. data/apps/new_network_node/spec/new_network_node_spec.rb +186 -0
  120. data/apps/node_broadcast/node_broadcast.rb +167 -0
  121. data/apps/node_broadcast/spec/node_broadcast_spec.rb +59 -0
  122. data/apps/permaspace/permaspace.rb +47 -0
  123. data/apps/plaindb/lib/btree.rb +38 -0
  124. data/apps/plaindb/plaindb.rb +199 -0
  125. data/apps/plaindb/spec/table_write_spec.rb +36 -0
  126. data/apps/routed_network/routed_network.rb +23 -0
  127. data/apps/routed_network/spec/routed_network_spec.rb +17 -0
  128. data/apps/session_manager/session_manager.rb +18 -0
  129. data/apps/spec_output.html +222 -0
  130. data/apps/todo/controllers/todo.rb +87 -0
  131. data/apps/todo/model/comment.rb +10 -0
  132. data/apps/todo/model/project.rb +20 -0
  133. data/apps/todo/model/todo.rb +16 -0
  134. data/apps/todo/model/user.rb +5 -0
  135. data/apps/todo/todo.rb +21 -0
  136. data/apps/todo/views/_commentList.rhtml +7 -0
  137. data/apps/todo/views/_createProject.rhtml +5 -0
  138. data/apps/todo/views/_partList.rhtml +12 -0
  139. data/apps/todo/views/_projectList.rhtml +16 -0
  140. data/apps/todo/views/edit.rhtml +11 -0
  141. data/apps/todo/views/editPart.rhtml +10 -0
  142. data/apps/todo/views/index.rhtml +2 -0
  143. data/apps/todo/views/question.rhtml +4 -0
  144. data/apps/transparent_network/transparent_network.rb +7 -0
  145. data/apps/udp_network/big_transfer.rb +97 -0
  146. data/apps/udp_network/features/information.feature +7 -0
  147. data/apps/udp_network/message_queue.rb +84 -0
  148. data/apps/udp_network/network_interface_api.rb +39 -0
  149. data/apps/udp_network/qos_queue.rb +186 -0
  150. data/apps/udp_network/simple_api.rb +180 -0
  151. data/apps/udp_network/spec/big_transfer_spec.rb +0 -0
  152. data/apps/udp_network/spec/qos_queue_spec.rb +99 -0
  153. data/apps/udp_network/spec/simple_api_spec.rb +35 -0
  154. data/apps/udp_network/spec/udp_network_spec.rb +115 -0
  155. data/apps/udp_network/spec/udp_transceiver_spec.rb +90 -0
  156. data/apps/udp_network/udp_network.rb +196 -0
  157. data/apps/udp_network/udp_transceiver.rb +329 -0
  158. data/apps/wiki/controllers/wiki.rb +56 -0
  159. data/apps/wiki/features/editing.feature +21 -0
  160. data/apps/wiki/layouts/main.rhtml +18 -0
  161. data/apps/wiki/lib/media_wiki_html.rb +35 -0
  162. data/apps/wiki/lib/wikicreole.rb +2147 -0
  163. data/apps/wiki/lib/wikicreole.tt +135 -0
  164. data/apps/wiki/lib/wikitest.rb +158 -0
  165. data/apps/wiki/lib/wikitest.tt +17 -0
  166. data/apps/wiki/model/menu.rb +15 -0
  167. data/apps/wiki/model/page.rb +31 -0
  168. data/apps/wiki/spec/wiki_creole_spec.rb +20 -0
  169. data/apps/wiki/spec/wiki_spec.rb +19 -0
  170. data/apps/wiki/static/Zeichnung.svg +240 -0
  171. data/apps/wiki/static/home.css +134 -0
  172. data/apps/wiki/static/mainMenu.css +32 -0
  173. data/apps/wiki/static/menu.css +99 -0
  174. data/apps/wiki/views/_mainMenu.rhtml +3 -0
  175. data/apps/wiki/views/_menu.rhtml +13 -0
  176. data/apps/wiki/views/edit.rhtml +13 -0
  177. data/apps/wiki/views/index.rhtml +2 -0
  178. data/apps/wiki/views/save.rhtml +1 -0
  179. data/apps/wiki/wiki.rb +17 -0
  180. data/bin/appswarm +47 -0
  181. data/cucumber.yml +2 -0
  182. data/data/PermaspaceApp/AFS_WikiApp_wiki_config +6 -0
  183. data/data/draft.txt +63 -0
  184. data/docs/appswarm_motivation.graffle +0 -0
  185. data/docs/appswarm_pics.graffle/QuickLook/Preview.pdf +0 -0
  186. data/docs/appswarm_pics.graffle/QuickLook/Thumbnail.tiff +0 -0
  187. data/docs/appswarm_pics.graffle/data.plist +63494 -0
  188. data/docs/appswarm_pics.graffle/image1.tiff +0 -0
  189. data/docs/appswarm_pics.graffle/image2.tif +0 -0
  190. data/docs/appswarm_pics.graffle/image3.tif +0 -0
  191. data/docs/appswarm_pics.graffle/image4.tif +0 -0
  192. data/docs/appswarm_pics.graffle/image5.tiff +0 -0
  193. data/docs/routing.graffle +0 -0
  194. data/features/step_definitions/appstart_steps.rb +28 -0
  195. data/features/step_definitions/cluster_steps.rb +18 -0
  196. data/features/step_definitions/testbed_steps.rb +64 -0
  197. data/features/step_definitions/webapp_steps.rb +257 -0
  198. data/features/support/env.rb +7 -0
  199. data/lib/appswarm.rb +127 -0
  200. data/lib/appswarm/README.txt +67 -0
  201. data/lib/appswarm/app_config.rb +19 -0
  202. data/lib/appswarm/application.rb +267 -0
  203. data/lib/appswarm/breaking_mutex.rb +41 -0
  204. data/lib/appswarm/cluster_funcs.rb +157 -0
  205. data/lib/appswarm/cross_spectool.rb +153 -0
  206. data/lib/appswarm/crypt.rb +10 -0
  207. data/lib/appswarm/crypt/crypto.rb +90 -0
  208. data/lib/appswarm/crypt/rsa_key +15 -0
  209. data/lib/appswarm/crypt/rsa_key.pub +5 -0
  210. data/lib/appswarm/crypt/test.rb +27 -0
  211. data/lib/appswarm/dir_tool.rb +41 -0
  212. data/lib/appswarm/event_api.rb +7 -0
  213. data/lib/appswarm/features_helper.rb +44 -0
  214. data/lib/appswarm/global_service.rb +38 -0
  215. data/lib/appswarm/http.rb +1 -0
  216. data/lib/appswarm/http/http_app.rb +257 -0
  217. data/lib/appswarm/http/http_controller.rb +267 -0
  218. data/lib/appswarm/http/http_provider.rb +80 -0
  219. data/lib/appswarm/http/static/favicon.ico +0 -0
  220. data/lib/appswarm/http/static/javascript/._prototype.js +0 -0
  221. data/lib/appswarm/http/static/javascript/prototype.js +2515 -0
  222. data/lib/appswarm/http/webrick_logger.rb +12 -0
  223. data/lib/appswarm/net_service.rb +69 -0
  224. data/lib/appswarm/package.rb +88 -0
  225. data/lib/appswarm/parallel_each.rb +46 -0
  226. data/lib/appswarm/protocols/protocol_dice.rb +25 -0
  227. data/lib/appswarm/proxy_testing.rb +48 -0
  228. data/lib/appswarm/public_api.rb +35 -0
  229. data/lib/appswarm/routing/matrix_math.rb +57 -0
  230. data/lib/appswarm/routing/pca.rb +211 -0
  231. data/lib/appswarm/routing/routetest.rb +85 -0
  232. data/lib/appswarm/routing/routing.rb +326 -0
  233. data/lib/appswarm/routing/spec/nods_spec.rb +23 -0
  234. data/lib/appswarm/routing/spec/pca_spec.rb +27 -0
  235. data/lib/appswarm/routing/spec/routing_spec.rb +91 -0
  236. data/lib/appswarm/secure_con.rb +437 -0
  237. data/lib/appswarm/secure_connection.rb +79 -0
  238. data/lib/appswarm/secure_marshal.rb +137 -0
  239. data/lib/appswarm/service.rb +76 -0
  240. data/lib/appswarm/simple_marshal.rb +96 -0
  241. data/lib/appswarm/simple_marshal_parser.rb +1243 -0
  242. data/lib/appswarm/simple_marshal_parser.tt +158 -0
  243. data/lib/appswarm/spec/application_spec.rb +50 -0
  244. data/lib/appswarm/spec/cluster_spec.rb +2 -0
  245. data/lib/appswarm/spec/hexdist_spec.rb +13 -0
  246. data/lib/appswarm/spec/http_controller_spec.rb +18 -0
  247. data/lib/appswarm/spec/main_spec.rb +6 -0
  248. data/lib/appswarm/spec/parallel_each_spec.rb +30 -0
  249. data/lib/appswarm/spec/secure_connection_spec.rb +108 -0
  250. data/lib/appswarm/spec/secure_marshal_spec.rb +93 -0
  251. data/lib/appswarm/spec/simple_marshal_spec.rb +87 -0
  252. data/lib/appswarm/spec/tools_spec.rb +13 -0
  253. data/lib/appswarm/spec/whiteboard_spec.rb +20 -0
  254. data/lib/appswarm/spec_helper.rb +18 -0
  255. data/lib/appswarm/test_bed.rb +207 -0
  256. data/lib/appswarm/tools.rb +284 -0
  257. data/lib/appswarm/tools/http_tunnel_client.rb +139 -0
  258. data/lib/appswarm/tools/http_tunnel_common.rb +8 -0
  259. data/lib/appswarm/tools/http_tunnel_server.rb +78 -0
  260. data/lib/appswarm/tools/parser/example_data.simple +102 -0
  261. data/lib/appswarm/tools/parser/match_test.rb +14 -0
  262. data/lib/appswarm/tools/parser/parser_lib.rb +165 -0
  263. data/lib/appswarm/tools/parser/parser_test.rb +104 -0
  264. data/lib/appswarm/tools/parser/spec/parser_spec.rb +44 -0
  265. data/lib/appswarm/tools/pipes.rb +95 -0
  266. data/lib/appswarm/tools/spec/tracing_spec.rb +16 -0
  267. data/lib/appswarm/tools/spec/waiting_queue_spec.rb +15 -0
  268. data/lib/appswarm/tools/thread_tool.rb +61 -0
  269. data/lib/appswarm/tools/tracing.rb +84 -0
  270. data/lib/appswarm/tools/treetop_test.rb +20 -0
  271. data/lib/appswarm/tools/treetop_test_grammar.rb +114 -0
  272. data/lib/appswarm/tools/treetop_test_grammar.tt +7 -0
  273. data/lib/appswarm/tools/waiting_prio_queue.rb +47 -0
  274. data/lib/appswarm/tools/waiting_queue.rb +34 -0
  275. data/lib/appswarm/whiteboard.rb +73 -0
  276. data/nettest.rb +50 -0
  277. data/packages/README.txt +1 -0
  278. data/packages/msandbox/data/packages/store/my.txt +1 -0
  279. data/packages/msandbox/interfaces.rb +172 -0
  280. data/packages/msandbox/old/defa.rb +3 -0
  281. data/packages/msandbox/old/test.rb +14 -0
  282. data/packages/msandbox/old/test2.rb +56 -0
  283. data/packages/msandbox/package.rb +67 -0
  284. data/packages/msandbox/packages/store/config.yml +1 -0
  285. data/packages/msandbox/packages/store/main.rb +27 -0
  286. data/packages/msandbox/packages/store/myinclude.rb +7 -0
  287. data/packages/msandbox/packages/store_test/config.yml +1 -0
  288. data/packages/msandbox/packages/store_test/main.rb +9 -0
  289. data/packages/msandbox/server.rb +146 -0
  290. data/packages/msandbox/test.rb +13 -0
  291. data/packages/msandbox/test2.rb +29 -0
  292. data/templates/web/appswarm/controllers/appswarm.rb +41 -0
  293. data/templates/web/appswarm/layouts/main.rhtml +20 -0
  294. data/templates/web/appswarm/models/asmenu.rb +14 -0
  295. data/templates/web/appswarm/models/asuser.rb +30 -0
  296. data/templates/web/appswarm/static/custom.css +15 -0
  297. data/templates/web/appswarm/static/home.css +134 -0
  298. data/templates/web/appswarm/static/mainMenu.css +32 -0
  299. data/templates/web/appswarm/static/menu.css +99 -0
  300. data/templates/web/appswarm/views/_mainMenu.rhtml +5 -0
  301. data/templates/web/appswarm/views/_menu.rhtml +13 -0
  302. data/templates/web/appswarm/views/_userInfo.rhtml +7 -0
  303. data/templates/web/appswarm/views/login.rhtml +9 -0
  304. data/tools/checkPort.rb +11 -0
  305. metadata +379 -0
@@ -0,0 +1,87 @@
1
+ require 'pp'
2
+ require 'simple_marshal.rb'
3
+ require 'lib/appswarm/spec/secure_marshal_spec.rb'
4
+ require 'treetop'
5
+
6
+ describe "Simple marshaling" do
7
+ it_should_behave_like "secure marshaling"
8
+
9
+
10
+ it "should be possible to double backslashes" do
11
+ data="92 \\"
12
+ x=data.gsub("\\","\\\\\\")
13
+ pp data,x
14
+ x.should_not == data
15
+ x.should == "92 \\\\"
16
+ end
17
+
18
+ it "should map arrays correcty" do
19
+ a=[1,2,3,"abc",345.45,true,false]
20
+ s=Simple::Marshal::dump(a)
21
+ s.should== "[\n 1,\n 2,\n 3,\n \"abc\",\n 345.45,\n true,\n false\n]"
22
+ #sd
23
+ end
24
+ it "should map strings correctly" do
25
+ Simple::Marshal::dump("abc\"").should =="\"abc\\\"\""
26
+ end
27
+ it "should map hashes correctly" do
28
+ Simple::Marshal::dump({1=>2,3=>4}).should == "{\n 1 => 2,\n 3 => 4\n}"
29
+ end
30
+ it "should map structs correctly" do
31
+ MyStruct=Struct.new(:a,:b)
32
+ a=MyStruct.new(1,2)
33
+ ["(MyStruct\n :a => 1,\n :b => 2\n)","(MyStruct\n :b => 2,\n :a => 1\n)"].should be_member(Simple::Marshal::dump(a))
34
+ end
35
+ #if false
36
+ it "should restore numbers" do
37
+ check(123)
38
+ check(123.123)
39
+ check(-123)
40
+ end
41
+
42
+ it "should restore Time" do
43
+ a=Time.now
44
+ d=Simple::Marshal::dump(a)
45
+ b=Simple::Marshal::load(d)
46
+ pp "A:",a,b,d,a.class,b.class,a==b,a===b
47
+ a.to_s.should ==b.to_s
48
+ #check(Time.now)
49
+ end
50
+
51
+ it "should ignore newlines" do
52
+ Simple::Marshal::load("[\n123]").should == [123]
53
+ end
54
+
55
+ it "should restore arrays" do
56
+ a=[1,2,3,"abc",345.45,true,false]
57
+ check(a)
58
+ end
59
+
60
+ it "should parse structs" do
61
+ MyStruct=Struct.new(:a,:b)
62
+ a=MyStruct.new(1,2)
63
+ str=Simple::Marshal::dump(a).gsub("\n","")
64
+ pp str
65
+ #str="(MyStruct :a=>:b)"
66
+ Simple::Marshal::load(str).should == a
67
+ end
68
+
69
+
70
+ def check(a)
71
+ pp "A:",a
72
+ #0.upto(a.length-1) { |i|
73
+ # pp a[i]
74
+ #}
75
+ str=Simple::Marshal::dump(a)
76
+ pp "DUMPED:",str
77
+ #0.upto(str.length-1) { |i|
78
+ # pp str[i]
79
+ #}
80
+ #pp a.length,str.length
81
+ #puts str
82
+ # str.gsub!("\n","")
83
+ # pp str
84
+ Simple::Marshal::load(str).should == a
85
+
86
+ end
87
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper.rb'
2
+ require 'tools.rb'
3
+
4
+ describe "Tools" do
5
+ describe "- getClass" do
6
+ it "should not call eval" do
7
+ lambda{getClass("String")}.should_not cross(:instance_eval)
8
+ end
9
+ it "should find the correct class" do
10
+ getClass("Mutex").should == Mutex
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ require 'whiteboard.rb'
2
+
3
+ describe "Whiteboard" do
4
+ it "should work at all" do
5
+ w=Whiteboard.new
6
+
7
+ t=Thread.new(w){|x|
8
+ begin
9
+ puts "A: #{w.get(:a).inspect}"
10
+ w.put(:b,2)
11
+ rescue Object=>e
12
+ pp e
13
+ end
14
+ }
15
+ sleep(0.1)
16
+ w.put(:a,1)
17
+ pp w.get(:b)
18
+ t.join
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec/expectations'
2
+ require 'spec/example'
3
+ require 'spec/dsl'
4
+ require 'spec'
5
+
6
+ require File.expand_path('../features_helper.rb',__FILE__)
7
+
8
+ share_examples_for "AppSwarm Test" do
9
+ before(:each) do
10
+ (Thread.list-[Thread.main]).each{|t|t.kill!}
11
+ checkThreads("before")
12
+ end
13
+
14
+ after(:each) do
15
+ checkThreads("after")
16
+ end
17
+ end
18
+
@@ -0,0 +1,207 @@
1
+ class TestBed
2
+ include ClusterFuncs
3
+
4
+ attr_reader :apps,:options,:testbedId
5
+
6
+ def initialize(ops={})
7
+ @@testbeds||=[]
8
+
9
+ @@testbeds<<self
10
+ @appClasses=loadApps(self)
11
+ @apps=[]
12
+ @options={:cronTime=>100000}
13
+ @tbedThreads={}
14
+ ops.each{|k,v|@options[k]=v}
15
+ @stopped=false
16
+ @stopping=false
17
+ @stopMutex=Mutex.new
18
+
19
+ @testbedId=ops[:testbedId]
20
+
21
+ @testbedId||=Crypt::hexdigest(rand.to_s)
22
+
23
+ trap("INT"){ stop! }
24
+ end
25
+
26
+ def appswarmBaseDir
27
+ File.join(ENV["HOME"],".appswarm")
28
+ end
29
+
30
+
31
+ def runCluster
32
+ Appswarm::BASIC_APPS.each{|app|run(app,{})}
33
+ end
34
+
35
+ def log(*s)
36
+ TestLogger::log(*s)
37
+ end
38
+
39
+ def log_line(line)
40
+ TestLogger::log(line)
41
+ end
42
+
43
+ def getThread(app)
44
+ @tbedThreads[app.object_id]
45
+ end
46
+
47
+ def getApp(type)
48
+ getApps(type)[0]
49
+ end
50
+ def getAppByName(name)
51
+ @apps.select{|app|app.getAppName==name}[0]
52
+ end
53
+
54
+ def closeApp(app)
55
+ if @apps.member?(app)
56
+ app.stop
57
+ @apps.delete(app)
58
+ end
59
+ end
60
+ def getGlobalServices
61
+ @apps.select{|a|a.is_a?(GlobalService)}.map{|a|a.serviceID}
62
+ end
63
+
64
+ def stop!
65
+ stop
66
+ killOtherThreads!
67
+ end
68
+ def stop
69
+ @stopping=true
70
+ @stopMutex.synchronize {
71
+ @apps.p_each{|app|
72
+ log "APP: #{app}"
73
+ app.quit
74
+ }
75
+ log "QUITED"
76
+ @apps.each{|app|
77
+ log "Stopping #{app}"
78
+ begin
79
+ measureTime {
80
+ app.stop
81
+ }
82
+ rescue Object=>e
83
+ log"Failed to stop #{app} with error #{e}"
84
+ log e.backtrace
85
+ end
86
+ log "Stopped #{app}"
87
+ }
88
+ log "Waiting to shut down"
89
+ tries=10
90
+ while tries>0 and @tbedThreads.select{|k,t|t.alive?}.length>0
91
+ sleep 0.2
92
+ tries-=1
93
+ end
94
+
95
+ log "Joining threads of #{self}"
96
+ @tbedThreads.each{|k,v|
97
+ log v.stacktrace
98
+ }
99
+
100
+ @tbedThreads.each{|k,v|
101
+ v.kill if v.alive?
102
+ }
103
+ @tbedThreads.each{|k,v|
104
+ v.kill! if v.alive?
105
+ }
106
+ @tbedThreads.each{|k,v|
107
+ log "CRASH:",v.crashtrace if v.crashtrace?
108
+ }
109
+ @@testbeds.delete(self)
110
+
111
+
112
+
113
+
114
+ log "Stopped Testbed #{self}"
115
+ @stopped=true
116
+ }
117
+ end
118
+
119
+ def appswarmBaseDir
120
+ File.join(TestBed.appswarmTestingDir,@testbedId)
121
+ end
122
+
123
+ def self.appswarmTestingDir
124
+ File.join(ENV["HOME"],".appswarm_testing")
125
+ end
126
+
127
+ def self.testbeds
128
+ @@testbeds||=[]
129
+ end
130
+
131
+ def self.finishTesting
132
+ Dir.rmdir_f(appswarmTestingDir)
133
+ end
134
+
135
+ end
136
+
137
+
138
+ FRAG=0.1
139
+ def sleepDebug(time)
140
+ t=0
141
+ while t<time
142
+ puts "Waiting in #{caller[0]} #{t} of #{time}"
143
+ sleep FRAG
144
+ t+=FRAG
145
+ end
146
+ end
147
+
148
+
149
+ def killOtherThreads!
150
+ # kill eveything that's aroudn
151
+ if Thread.list.length>1
152
+ (Thread.list-[Thread.current]).select{|x|x.alive?}.each{|t|
153
+ log "KILLING #{t} #{t.stacktrace}"
154
+ t.kill!
155
+ log "KILLED #{t} #{t.crashtrace}"
156
+
157
+ }
158
+ end
159
+ end
160
+
161
+
162
+ class NetworkTestBed
163
+ def initialize(count=10)
164
+ @testbeds=(1..count).to_a.map{|i|TestBed.new}
165
+ end
166
+
167
+ def run(*klasses)
168
+ klasses.each{|klass|
169
+ @testbeds.p_each{|b|b.run(klass)}
170
+ }
171
+ end
172
+
173
+ def runOnOne(*klasses)
174
+ klasses.each{|klass|
175
+ @testbeds[0].run(klass)
176
+ }
177
+ end
178
+
179
+ def length
180
+ @testbeds.length
181
+ end
182
+
183
+ def app(appName,i)
184
+ @testbeds[i].getApp(appName)
185
+ end
186
+
187
+ def log(*x)
188
+ pp x
189
+ end
190
+
191
+
192
+ def eachApp(appName,&block)
193
+ @testbeds.each{|b|block.call(b.getApp(appName))}
194
+ end
195
+ def p_eachApp(appName,&block)
196
+ @testbeds.p_each{|b|block.call(b.getApp(appName))}
197
+ end
198
+
199
+ def first(appName)
200
+ @testbeds[0].getApp(appName)
201
+ end
202
+ def stop
203
+ @testbeds.p_each{|b|b.stop}
204
+
205
+ killOtherThreads!
206
+ end
207
+ end
@@ -0,0 +1,284 @@
1
+ require 'thread'
2
+ require 'ftools'
3
+
4
+ require 'parallel_each.rb'
5
+ require 'tools/thread_tool.rb'
6
+
7
+ def asBaseDir
8
+ File.expand_path('../..',__FILE__)
9
+ end
10
+
11
+ class File
12
+ def self.load(filename)
13
+ return nil unless File.file?(filename)
14
+ File.open(filename) {|f|f.read}
15
+ end
16
+ end
17
+
18
+ class Class
19
+ def deprecated(*funcs)
20
+ #puts "WARNING: #{funcs} are deprecated!!!"
21
+ end
22
+ end
23
+
24
+ class Dir
25
+ def self.mkdir_save(*args)
26
+ return if File.directory?(*args)
27
+ begin
28
+ self.mkdir(*args)
29
+ rescue Object=>e
30
+ d=*args
31
+ p=File.split(d)[0]
32
+ self.mkdir_save(p) if p!=d
33
+ self.mkdir(*args)
34
+ end
35
+ end
36
+
37
+ def self.rmdir_f(dir)
38
+ if File.directory?(dir)
39
+ files=Dir[File.join(dir,"*")]
40
+ files.each{|f|rmdir_f(f)}
41
+ Dir.delete(dir)
42
+ elsif File.file?(dir)
43
+ File.delete(dir)
44
+ end
45
+ end
46
+ end
47
+
48
+ class String
49
+ # convert lowercase underscored strings to camelcase
50
+ def camelCase
51
+ return self if length<2
52
+ (self[0..0].upcase+self[1..-1]).gsub(/(_.)/){|s|s[1..-1].upcase}
53
+ end
54
+
55
+ def underscored
56
+ (self[0..0].downcase+self[1..-1]).gsub(/([A-Z])/){|s|"_"+s.downcase}
57
+ end
58
+
59
+ # convert camelcase to lowercase underscored
60
+ def dirName
61
+ underscored
62
+ end
63
+
64
+ # convvert (some) html-entities
65
+ def to_hents
66
+ self.gsub("&","&amp;").gsub("<","&lt;").gsub(">","&gt;")
67
+ end
68
+
69
+ # convert plaintext to html (entities and newlines)
70
+ def to_h
71
+ self.to_hents.gsub("\n","<br>\n")
72
+ end
73
+
74
+ def to_base64
75
+ [self].pack("m")
76
+ end
77
+ end
78
+
79
+ class AssertionFailed<Exception
80
+
81
+ end
82
+
83
+ def assert(&b)
84
+ unless b.call
85
+ dcaller=caller[0]
86
+ file,line,func=dcaller.split(":")
87
+ content=assertReadLine(file,line.to_i)
88
+ s="Assertion failed #{content} in #{file}:#{line}"
89
+ body=caller.join("\n")
90
+ glog(s+"\n"+body)
91
+ puts s
92
+ raise AssertionFailed.new
93
+ end
94
+ end
95
+
96
+
97
+ def assertReadLine(file,line)
98
+ f=File.open(file,"r")
99
+ all=f.read
100
+ lines=all.split("\n")
101
+ l=lines[line-1]
102
+ f.close
103
+ l
104
+ end
105
+
106
+ class Array
107
+
108
+ class Groups<Hash
109
+ def max_by_value(&block)
110
+ r={}
111
+ each{|k,vs|
112
+ value=nil
113
+ vs.each{|e|
114
+ curValue=block.call(e)
115
+ value||=curValue
116
+ value=[curValue,value].max
117
+ }
118
+ r[k]=value
119
+ }
120
+ r
121
+ end
122
+ end
123
+
124
+ alias :oldUniq :uniq
125
+ def uniq(&block)
126
+ if block.nil?
127
+ return oldUniq
128
+ else
129
+ a=[]
130
+ ks=[]
131
+ each{|v|
132
+ k=block.call(v)
133
+ unless ks.member?(k)
134
+ ks<<k
135
+ a<<v
136
+ end
137
+ }
138
+ a
139
+ end
140
+ end
141
+
142
+ def shuffle!
143
+ sort_by {|a,b|rand}
144
+ end
145
+ def shuffle
146
+ dup.sort_by {|a,b|rand}
147
+ end
148
+ def map2hash(&b)
149
+ h={}
150
+ each{|e|
151
+ res=b.call(e)
152
+ h[e]=res
153
+ }
154
+ h
155
+ end
156
+
157
+ def uniq_count(&b)
158
+ h={}
159
+ each{|e|
160
+ v=b.call(e)
161
+ h[v]||=0
162
+ h[v]+=1
163
+ }
164
+ h
165
+ end
166
+
167
+ def group_by(&block)
168
+ groups=Groups.new
169
+
170
+ each{|e|
171
+ g=block.call(e)
172
+ groups[g]||=[]
173
+ groups[g] << e
174
+ }
175
+ groups
176
+ end
177
+ end
178
+
179
+ class Hash
180
+ def map_to_h(&b)
181
+ h={}
182
+ self.each{|k,v|
183
+ h[k]=b.call(k,v)
184
+ }
185
+ h
186
+ end
187
+ def map_to_a(&b)
188
+ h=[]
189
+ self.each{|k,v|
190
+ h << b.call(k,v)
191
+ }
192
+ h
193
+ end
194
+ alias :select_to_a :select
195
+ def select(&b)
196
+ h={}
197
+ self.each{|k,v|
198
+ if b.call(k,v)
199
+ h[k]=v
200
+ end
201
+ }
202
+ h
203
+ end
204
+ end
205
+
206
+ class Symbol
207
+ def <=>(o)
208
+ self.to_s<=>o.to_s
209
+ end
210
+ end
211
+
212
+ def getClass(name)
213
+ #pp "TRY GETCLASS #{name}"
214
+ $CLASS_CACHE||={}
215
+
216
+ unless $CLASS_CACHE.key?(name)
217
+ c=nil
218
+ begin
219
+ ObjectSpace.each_object{|o|
220
+ c=o if o.to_s==name and o.is_a?(Class)
221
+ }
222
+ rescue
223
+ c=instance_eval(name)
224
+ end
225
+
226
+ $CLASS_CACHE[name]=c
227
+ end
228
+ $CLASS_CACHE[name]
229
+ end
230
+
231
+ class FalseClass
232
+ # make booleans sortable
233
+ def <=>(o)
234
+ case o
235
+ when FalseClass
236
+ 0
237
+ when TrueClass
238
+ 1
239
+ else
240
+ 0
241
+ end
242
+ end
243
+ end
244
+
245
+
246
+ class TrueClass
247
+ def <=>(o)
248
+ case o
249
+ when FalseClass
250
+ -1
251
+ when TrueClass
252
+ 0
253
+ else
254
+ 0
255
+ end
256
+ end
257
+ end
258
+
259
+ def hexDist(hash1,hash2)
260
+ assert{hash1.length==hash2.length}
261
+ dist=0
262
+ (0...hash1.length).each{|i|
263
+ current=(hash1[i]^hash2[i])
264
+ dist*=256
265
+ dist+=current
266
+ #r+=c
267
+ }
268
+ dist
269
+
270
+ end
271
+
272
+
273
+ def glog(*s)
274
+ #puts "GLOBAL LOG #{caller[0]} #{Time.now} "+(s.map{|x|x.to_s}.join("; "))
275
+ end
276
+
277
+ def measureTime(depth=1,&block)
278
+ startTime=Time.now
279
+ r=block.call
280
+ endTime=Time.now
281
+ glog caller[0...depth],"TIME:",(endTime-startTime)
282
+ r
283
+ end
284
+