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,23 @@
1
+ require 'local_secure_file_store.rb'
2
+
3
+ describe "Local Secure File Store" do
4
+ it "should store a file using a specified key" do
5
+ TestBed::testbeds.should == []
6
+ bed=TestBed.new
7
+ store=bed.run("LocalSecureFileStore")
8
+ me="1234"
9
+ filename="myfile"
10
+ content="testcontent"
11
+ store.store(filename,me,content)
12
+
13
+ fs=store.files(me)
14
+ fs.should == [filename]
15
+
16
+ store.load(filename,me).should == content
17
+
18
+
19
+ bed.stop
20
+ TestBed::testbeds.should == []
21
+
22
+ end
23
+ end
@@ -0,0 +1,92 @@
1
+ require 'global_service.rb'
2
+ require 'crypt.rb'
3
+ require 'ostruct'
4
+
5
+ class LocalTupleSpaceApp<GlobalService
6
+ provides :localTupleSpace
7
+ MARSHAL=Marshal
8
+
9
+ MAX_LEND_TIME=2
10
+
11
+ Lent=Struct.new(:time, :transaction)
12
+
13
+ def initialize(cluster,options)
14
+ super(cluster,options,:localTupleSpace)
15
+ @dataFile=File.open(File.join(getAppDataPath,"data.bin"),"w+")
16
+ @indexFile=File.open(File.join(getAppDataPath,"index.bin"),"w+")
17
+ @index={}
18
+ @lent={}
19
+ @transactions={}
20
+ @mutex=Mutex.new
21
+ end
22
+
23
+ def read(ref)
24
+ loadInternal(ref)
25
+ end
26
+
27
+ def lend(ref,timeout=0.3)
28
+ old=Time.now
29
+ while Time.now-old<timeout
30
+ if @lent[ref]
31
+ @mutex.synchronize do
32
+ if @lent[ref]
33
+ if Time.now-@lent[ref].time>MAX_LEND_TIME
34
+ @transactions.delete(@lent[ref].transaction)
35
+ @lent.delete(ref)
36
+ end
37
+ end
38
+ end
39
+ sleep(timeout/10)
40
+ else
41
+ @mutex.synchronize do
42
+ unless @lent[ref]
43
+ thxid=getTransactionID
44
+ @lent[ref]=Lent.new(Time.now,thxid)
45
+ @transactions[thxid]=true
46
+ return loadInternal(ref)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ return nil
52
+ end
53
+
54
+ def store(ref,object)
55
+ unless @lent.member?(ref)
56
+ unless @index[ref].nil?
57
+ raise "object not lent!"
58
+ end
59
+ end
60
+ @mutex.synchronize do
61
+ storeInternal(ref,object)
62
+ @lent.delete(ref)
63
+ end
64
+ puts "STORED #{ref}:=#{object}"
65
+ true
66
+ end
67
+
68
+ private
69
+ def storeInternal(ref,object)
70
+ pp "STORING #{ref} #{object}"
71
+ @index[ref]=MARSHAL.dump(object)
72
+ end
73
+ def loadInternal(ref)
74
+ #pp "GETTING #{ref} #{@index[ref]}"
75
+ if @index[ref]
76
+ MARSHAL.load(@index[ref])
77
+ #@index[ref].dup
78
+ else
79
+ nil
80
+ end
81
+ end
82
+
83
+ # This function shold be called with synchronized mode only !
84
+ def getTransactionID
85
+ begin
86
+ tx=Crypt::digest(rand)
87
+ end while @transactions[tx]
88
+ tx
89
+ end
90
+
91
+
92
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper.rb'
2
+ require 'local_tuple_space.rb'
3
+
4
+ describe "Local Tuple Space" do
5
+
6
  before(:each) do
7
+ @t=LocalTupleSpaceApp.new(nil,{})
1
8
  end
9
+
10
+ it "should not lend twice" do
11
+ TestBed::testbeds.should == []
12
+ @t.store(:a,[])
13
+ a=@t.lend(:a)
14
+ a<<1
15
+ b=@t.lend(:a)
16
+ a.should_not be_nil
17
+ b.should be_nil
18
+ @t.store(:a,a)
19
+ b=@t.lend(:a)
20
+ a<<2
21
+ b.should_not be_nil
22
+ @t.store(:a,b)
23
+ a<<3
24
+ b.should == [1]
25
+ TestBed::testbeds.should == []
26
+
27
+ end
@@ -0,0 +1,18 @@
1
+ Feature: Parsing of paramters
2
+
3
+ @parameters
4
+ Scenario:
5
+ Given a testbed with a "LocalWebServer" application
6
+ And a "HelloWorld" application in it
7
+ And I create a "default" instance on the "HelloWorld" http-application
8
+ When the "default" instance of "HelloWorld" is offered on path "/" on the "LocalWebServer" application
9
+ And a client accesses the "LocalWebServer" on "/"
10
+ And I click on "PostForm"
11
+ And I enter "Schmuhl%yzt& hupe" into "Text"
12
+ And click on "Submit"
13
+ Then the resulting page contains "Schmuhl%yzt& hupe"
14
+ When a client accesses the "LocalWebServer" on "/"
15
+ And I click on "GetForm"
16
+ And I enter "Schmuhl%yzt& hupe" into "Text"
17
+ And click on "Submit"
18
+ Then the resulting page contains "Schmuhl%yzt& hupe"
@@ -0,0 +1,166 @@
1
+ require 'http/webrick_logger.rb'
2
+
3
+ require 'lib/settings.rb'
4
+ require 'cgi.rb'
5
+
6
+ class LocalWebServerSettings<AdminAppSettings
7
+ data({:path=>String}=>
8
+ {:instance=>HTTPApp::Instance})
9
+ end
10
+
11
+
12
+ class LocalWebServerApp<Service
13
+ require 'webrick'
14
+ include WEBrick
15
+
16
+ provides :localWebServer
17
+ provides :webServer
18
+
19
+ attr_reader :settings, :mounts
20
+
21
+ Mount=Struct.new(:mountPoint,:instance)
22
+
23
+ def initialize(cluster,ops)
24
+ super(cluster,ops,:webServer)
25
+
26
+ port=ops[:httpPort]||4000
27
+ @port=port
28
+ @s = HTTPServer.new(
29
+ :Port => port,
30
+ :DocumentRoot=>File.expand_path("../http/static",__FILE__),
31
+ :BindAddress=>"127.0.0.1",
32
+ :Logger=>WebrickLogger.new(self),
33
+ :AccessLog=>[]
34
+ )
35
+ @started=false
36
+
37
+ @mutex=Mutex.new
38
+
39
+ #@settings=LocalWebServerSettings.new(self)
40
+ @mounts=[]
41
+ end
42
+
43
+
44
+ def quit
45
+ saveMounts
46
+ super
47
+ end
48
+
49
+ def startup
50
+ loadMounts
51
+ super
52
+ end
53
+
54
+
55
+ def mount(url,instance)
56
+
57
+ @mutex.synchronize {
58
+
59
+ raise "Url not defined" unless url.is_a?(String)
60
+ raise "Instance not valid" unless instance.is_a?(HTTPApp::Instance)
61
+ url="/#{url}" unless url[0..0]=='/'
62
+
63
+ @mounts.each{|mnt|
64
+ if mnt.mountPoint==url
65
+ if mnt.instance==instance
66
+ return
67
+ else
68
+ raise "URL is already used!"
69
+ end
70
+ end
71
+ }
72
+
73
+ @mounts<<Mount.new(url,instance)
74
+
75
+
76
+ log "MOUNTING #{url} #{instance}"
77
+ raise "Invalid instance" unless instance and instance.instanceType
78
+ mount=@s.mount_proc(url){|req,res|
79
+ begin
80
+ app=cluster.getApp(instance.instanceType)
81
+ log "ORIG PATH:",req.path_info
82
+ log "INSTANCE:",instance
83
+ args=req.query.dup
84
+ args.each{|k,v|
85
+ args[k]= CGI::unescape(v)
86
+ }
87
+
88
+ (req.query_string||'').gsub(/\?/,'').split("&").each{|arg|
89
+ n,v=arg.split("=")
90
+ unless args.key?(n)
91
+ args[n]=v
92
+ end
93
+ }
94
+
95
+ sessionId=nil
96
+ # log "COOKIES:",req.cookies,req.cookies.class
97
+ req.cookies.each{|cookie|
98
+ if cookie.name=='_session_id'
99
+ sessionId=cookie.value
100
+ end
101
+ }
102
+ req.path_info=req.path_info.sub(/^#{url}\//,'')
103
+ app.handle(req,res,args,sessionId,instance,url)
104
+ res.header["content-length"]=res.body.length if res.body # FIX for some webrick bug
105
+ log "SEEMS ok"
106
+ rescue Object=>e
107
+ puts "ERROR:",e
108
+ log e.backtrace
109
+ end
110
+ }
111
+ }
112
+ #pp mount,mount.methods.sort
113
+ end
114
+
115
+ def deleteMount(mount)
116
+ @s.unmount(mount)
117
+ @mounts.delete_if do |m|
118
+ m.mountPoint==mount
119
+ end
120
+ end
121
+
122
+
123
+
124
+ def run
125
+ @thread=Thread.new {
126
+ trap("INT"){ @s.shutdown }
127
+ log "Starting Webrick #{@s}"
128
+ unless @started
129
+ @started=true
130
+ begin
131
+ @s.start
132
+ rescue WEBrick::HTTPStatus::EOFError=>e
133
+ log e,e.backtrace
134
+ rescue WEBrick::HTTPStatus::NotFound=>e
135
+ log e,e.backtrace
136
+ end
137
+ end
138
+ }
139
+ end
140
+ def stop
141
+ @s.shutdown
142
+ @thread.kill
143
+ end
144
+
145
+ def url
146
+ "http://localhost:#{@port}"
147
+ end
148
+
149
+
150
+ private
151
+ def saveMounts
152
+ config=retrieveConfig
153
+ config["mounts"]=@mounts
154
+ end
155
+
156
+ def loadMounts
157
+ config=retrieveConfig
158
+ mounts=config["mounts"].content
159
+ if mounts.is_a?(Array)
160
+ mounts.each{|mnt|
161
+ #@mounts<<mnt
162
+ mount(mnt.mountPoint,mnt.instance)
163
+ }
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,27 @@
1
+ require 'service.rb'
2
+ require 'ostruct.rb'
3
+
4
+ class LoggerApp<Service
5
+
6
+ Log=Struct.new(:time,:klass,:appname,:what)
7
+
8
+ def initialize(cluster,options)
9
+ super(cluster,options,:logger)
10
+ @log=[]
11
+ end
12
+
13
+ def log(klass,appname,*what)
14
+ @log<<Log.new(Time.now,klass,appname,what.join("; "))
15
+ end
16
+
17
+ def read(count=100)
18
+ return @log[(-count)..-1] if @log.length>count
19
+ @log
20
+ end
21
+
22
+ def info
23
+ @log.map{|entry|
24
+ [entry.time,entry.klass.to_s,entry.appname,entry.what]
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ require 'net_service.rb'
2
+
3
+
4
+ class MasterApp<NetService
5
+ MASTER_SERVICE_PORT=9999
6
+ EXPIRE_SECONDS=180
7
+
8
+ def initialize(cluster,options)
9
+ options[:port]||=MASTER_SERVICE_PORT
10
+ super(cluster,options)
11
+ @clients={}
12
+ @clMutex=Mutex.new
13
+ end
14
+ def clients
15
+ #log "reading clients #{@clients.length}"
16
+ @clMutex.synchronize {
17
+ pp @clients
18
+ @clients.keys.select{|c|(Time.now-@clients[c])<EXPIRE_SECONDS}
19
+ }
20
+ end
21
+
22
+ def info
23
+ {:clients=>@clients.length}
24
+ end
25
+
26
+ def register(client)
27
+ log "#{client} registered"
28
+ @clMutex.synchronize {
29
+ @clients[client]=Time.now
30
+ }
31
+ # TODO: checkClientExists
32
+ end
33
+
34
+ def unregister(client)
35
+ log "#{client} removed"
36
+ @clMutex.synchronize {
37
+ @clients.delete(client)
38
+ }
39
+ # TODO: check Client wants to leave
40
+ end
41
+
42
+ def client
43
+ pp self.class.included_modules
44
+ pp self.pretty_inspect
45
+ end
46
+ end
@@ -0,0 +1,31 @@
1
+ require 'master.rb'
2
+ require 'network_lookup.rb'
3
+
4
+ describe "Master Server" do
5
+ it "should timeout clients after <n> seconds" do
6
+ TestBed::testbeds.should == []
7
+ m=MasterApp.new(nil,{})
8
+ m.run
9
+ sleep 0.3
10
+ m.valid.should be_true
11
+ n=NetworkLookupApp.new(nil,{})
12
+ n.register(:client)
13
+ m.clients.should == [:client]
14
+ sleep 1
15
+ n2=NetworkLookupApp.new(nil,{})
16
+ n.register(:client2)
17
+ m.clients.length.should <= 2
18
+
19
+ (m.clients.sort).should == [:client,:client2]
20
+ class MasterApp
21
+ EXPIRE_SECONDS=1
22
+ end
23
+ m.clients.should == [:client2]
24
+ sleep 1
25
+ m.clients.should == []
26
+
27
+ m.stop
28
+ n.stop
29
+ n2.stop
30
+ TestBed::testbeds.should == []
31
+ end
@@ -0,0 +1,15 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ require 'my_spec'
5
+
6
+ describe MySpec do
7
+ before(:each) do
8
+ @my_spec = MySpec.new
9
+ end
10
+
11
+ it "should desc" do
12
+ # TODO
13
+ end
14
+ end
15
+