pantry 0.0.0 → 0.1.0

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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +19 -0
  5. data/Gemfile +15 -0
  6. data/Guardfile +16 -0
  7. data/LICENSE +20 -0
  8. data/README.md +53 -0
  9. data/Rakefile +18 -0
  10. data/Vagrantfile +86 -0
  11. data/bin/pantry +11 -0
  12. data/bin/pantry-client +38 -0
  13. data/bin/pantry-server +33 -0
  14. data/dist/client.yml +79 -0
  15. data/dist/server.yml +56 -0
  16. data/dist/upstart/pantry-client.conf +12 -0
  17. data/dist/upstart/pantry-server.conf +12 -0
  18. data/doc/message_packet.dot +19 -0
  19. data/doc/message_packet.dot.png +0 -0
  20. data/doc/network_topology.dot +42 -0
  21. data/doc/network_topology.dot.png +0 -0
  22. data/lib/celluloid_zmq_patches.rb +16 -0
  23. data/lib/opt_parse_plus.rb +184 -0
  24. data/lib/pantry.rb +197 -0
  25. data/lib/pantry/cli.rb +154 -0
  26. data/lib/pantry/client.rb +131 -0
  27. data/lib/pantry/client_info.rb +34 -0
  28. data/lib/pantry/client_registry.rb +104 -0
  29. data/lib/pantry/command.rb +194 -0
  30. data/lib/pantry/command_handler.rb +53 -0
  31. data/lib/pantry/command_line.rb +115 -0
  32. data/lib/pantry/commands/create_client.rb +30 -0
  33. data/lib/pantry/commands/download_directory.rb +35 -0
  34. data/lib/pantry/commands/echo.rb +32 -0
  35. data/lib/pantry/commands/edit_application.rb +60 -0
  36. data/lib/pantry/commands/register_client.rb +38 -0
  37. data/lib/pantry/commands/status.rb +78 -0
  38. data/lib/pantry/commands/sync_directory.rb +50 -0
  39. data/lib/pantry/commands/update_application.rb +45 -0
  40. data/lib/pantry/commands/upload_file.rb +68 -0
  41. data/lib/pantry/communication.rb +20 -0
  42. data/lib/pantry/communication/client.rb +75 -0
  43. data/lib/pantry/communication/client_filter.rb +117 -0
  44. data/lib/pantry/communication/file_service.rb +125 -0
  45. data/lib/pantry/communication/file_service/file_progress.rb +164 -0
  46. data/lib/pantry/communication/file_service/receive_file.rb +97 -0
  47. data/lib/pantry/communication/file_service/send_file.rb +74 -0
  48. data/lib/pantry/communication/publish_socket.rb +20 -0
  49. data/lib/pantry/communication/reading_socket.rb +89 -0
  50. data/lib/pantry/communication/receive_socket.rb +23 -0
  51. data/lib/pantry/communication/security.rb +44 -0
  52. data/lib/pantry/communication/security/authentication.rb +98 -0
  53. data/lib/pantry/communication/security/curve_key_store.rb +120 -0
  54. data/lib/pantry/communication/security/curve_security.rb +70 -0
  55. data/lib/pantry/communication/security/null_security.rb +32 -0
  56. data/lib/pantry/communication/send_socket.rb +19 -0
  57. data/lib/pantry/communication/serialize_message.rb +84 -0
  58. data/lib/pantry/communication/server.rb +97 -0
  59. data/lib/pantry/communication/subscribe_socket.rb +33 -0
  60. data/lib/pantry/communication/wait_list.rb +45 -0
  61. data/lib/pantry/communication/writing_socket.rb +46 -0
  62. data/lib/pantry/config.rb +182 -0
  63. data/lib/pantry/file_editor.rb +67 -0
  64. data/lib/pantry/logger.rb +78 -0
  65. data/lib/pantry/message.rb +134 -0
  66. data/lib/pantry/multi_command.rb +36 -0
  67. data/lib/pantry/server.rb +132 -0
  68. data/lib/pantry/test/acceptance.rb +83 -0
  69. data/lib/pantry/test/support/fake_fs.rb +31 -0
  70. data/lib/pantry/test/support/matchers.rb +13 -0
  71. data/lib/pantry/test/support/minitest.rb +13 -0
  72. data/lib/pantry/test/support/mock_ui.rb +23 -0
  73. data/lib/pantry/test/unit.rb +13 -0
  74. data/lib/pantry/ui.rb +68 -0
  75. data/lib/pantry/version.rb +3 -0
  76. data/pantry.gemspec +40 -0
  77. data/test/acceptance/cli/error_handling_test.rb +7 -0
  78. data/test/acceptance/cli/execute_command_on_clients_test.rb +32 -0
  79. data/test/acceptance/cli/request_info_from_server_test.rb +44 -0
  80. data/test/acceptance/communication/client_requests_info_from_server_test.rb +28 -0
  81. data/test/acceptance/communication/heartbeat_test.rb +19 -0
  82. data/test/acceptance/communication/pub_sub_communication_test.rb +53 -0
  83. data/test/acceptance/communication/security_test.rb +117 -0
  84. data/test/acceptance/communication/server_requests_info_from_client_test.rb +41 -0
  85. data/test/acceptance/test_helper.rb +25 -0
  86. data/test/fixtures/config.yml +22 -0
  87. data/test/fixtures/empty.yml +2 -0
  88. data/test/fixtures/file_to_upload +3 -0
  89. data/test/root_dir/.gitkeep +0 -0
  90. data/test/unit/cli_test.rb +173 -0
  91. data/test/unit/client_registry_test.rb +61 -0
  92. data/test/unit/client_test.rb +128 -0
  93. data/test/unit/command_handler_test.rb +79 -0
  94. data/test/unit/command_line_test.rb +5 -0
  95. data/test/unit/command_test.rb +206 -0
  96. data/test/unit/commands/create_client_test.rb +25 -0
  97. data/test/unit/commands/download_directory_test.rb +58 -0
  98. data/test/unit/commands/echo_test.rb +22 -0
  99. data/test/unit/commands/edit_application_test.rb +84 -0
  100. data/test/unit/commands/register_client_test.rb +41 -0
  101. data/test/unit/commands/status_test.rb +81 -0
  102. data/test/unit/commands/sync_directory_test.rb +75 -0
  103. data/test/unit/commands/update_application_test.rb +35 -0
  104. data/test/unit/commands/upload_file_test.rb +51 -0
  105. data/test/unit/communication/client_filter_test.rb +262 -0
  106. data/test/unit/communication/client_test.rb +99 -0
  107. data/test/unit/communication/file_service/receive_file_test.rb +214 -0
  108. data/test/unit/communication/file_service/send_file_test.rb +110 -0
  109. data/test/unit/communication/file_service_test.rb +56 -0
  110. data/test/unit/communication/publish_socket_test.rb +19 -0
  111. data/test/unit/communication/reading_socket_test.rb +110 -0
  112. data/test/unit/communication/receive_socket_test.rb +20 -0
  113. data/test/unit/communication/security/authentication_test.rb +97 -0
  114. data/test/unit/communication/security/curve_key_store_test.rb +110 -0
  115. data/test/unit/communication/security/curve_security_test.rb +44 -0
  116. data/test/unit/communication/security/null_security_test.rb +15 -0
  117. data/test/unit/communication/security_test.rb +49 -0
  118. data/test/unit/communication/send_socket_test.rb +19 -0
  119. data/test/unit/communication/serialize_message_test.rb +128 -0
  120. data/test/unit/communication/server_test.rb +106 -0
  121. data/test/unit/communication/subscribe_socket_test.rb +46 -0
  122. data/test/unit/communication/wait_list_test.rb +60 -0
  123. data/test/unit/communication/writing_socket_test.rb +46 -0
  124. data/test/unit/config_test.rb +150 -0
  125. data/test/unit/logger_test.rb +79 -0
  126. data/test/unit/message_test.rb +179 -0
  127. data/test/unit/multi_command_test.rb +45 -0
  128. data/test/unit/opt_parse_plus_test.rb +218 -0
  129. data/test/unit/pantry_test.rb +82 -0
  130. data/test/unit/server_test.rb +166 -0
  131. data/test/unit/test_helper.rb +25 -0
  132. data/test/unit/ui_test.rb +58 -0
  133. metadata +389 -13
@@ -0,0 +1,19 @@
1
+ require 'unit/test_helper'
2
+
3
+ describe Pantry::Communication::SendSocket do
4
+
5
+ before do
6
+ Celluloid.boot
7
+ end
8
+
9
+ let(:security) { Pantry::Communication::Security.new_client }
10
+
11
+ it "opens a ZMQ DealerSocket, bound to host / port" do
12
+ Celluloid::ZMQ::DealerSocket.any_instance.expects(:linger=).with(0)
13
+ Celluloid::ZMQ::DealerSocket.any_instance.expects(:connect).with("tcp://host:1234")
14
+
15
+ socket = Pantry::Communication::SendSocket.new("host", 1234, security)
16
+ socket.open
17
+ end
18
+
19
+ end
@@ -0,0 +1,128 @@
1
+ require 'unit/test_helper'
2
+
3
+ describe Pantry::Communication::SerializeMessage do
4
+
5
+ describe ".to_zeromq" do
6
+
7
+ let(:pantry_message) do
8
+ message = Pantry::Message.new
9
+ message.to = "to"
10
+ message.from = "from"
11
+ message
12
+ end
13
+
14
+ it "builds a list of message parts containing to, metadata, and body" do
15
+ pantry_message << "Test Body"
16
+
17
+ zmq_message = Pantry::Communication::SerializeMessage.to_zeromq(pantry_message)
18
+
19
+ assert_equal 3, zmq_message.length
20
+ assert_equal "to", zmq_message[0]
21
+ assert_equal "Test Body", zmq_message[2]
22
+ end
23
+
24
+ it "ensures `to` is always a string" do
25
+ pantry_message.to = nil
26
+ zmq_message = Pantry::Communication::SerializeMessage.to_zeromq(pantry_message)
27
+
28
+ assert_equal "", zmq_message[0]
29
+ end
30
+
31
+ it "serializes the metadata as JSON" do
32
+ zmq_message = Pantry::Communication::SerializeMessage.to_zeromq(pantry_message)
33
+
34
+ metadata = JSON.parse(zmq_message[1])
35
+
36
+ assert_equal "to", metadata["to"]
37
+ assert_equal "from", metadata["from"]
38
+ end
39
+
40
+ it "ensures all parts of the body are strings" do
41
+ pantry_message << 1
42
+ pantry_message << 2
43
+
44
+ zmq_message = Pantry::Communication::SerializeMessage.to_zeromq(pantry_message)
45
+
46
+ assert_equal "1", zmq_message[2]
47
+ assert_equal "2", zmq_message[3]
48
+ end
49
+
50
+ it "turns nil entries into strings" do
51
+ pantry_message << nil
52
+ pantry_message << "this"
53
+
54
+ zmq_message = Pantry::Communication::SerializeMessage.to_zeromq(pantry_message)
55
+
56
+ assert_equal "", zmq_message[2]
57
+ assert_equal "this", zmq_message[3]
58
+ end
59
+
60
+ it "converts hashes in the body to JSON" do
61
+ pantry_message << {:key => "value"}
62
+
63
+ zmq_message = Pantry::Communication::SerializeMessage.to_zeromq(pantry_message)
64
+
65
+ body = JSON.parse(zmq_message[2][1..-1])
66
+ assert_equal "value", body["key"]
67
+ end
68
+
69
+ it "converts arrays in the body to JSON" do
70
+ pantry_message << ["some", "values", 1, 2, true]
71
+
72
+ zmq_message = Pantry::Communication::SerializeMessage.to_zeromq(pantry_message)
73
+
74
+ body = JSON.parse(zmq_message[2][1..-1])
75
+ assert_equal ["some", "values", 1, 2, true], body
76
+ end
77
+
78
+ end
79
+
80
+ describe ".from_zeromq" do
81
+
82
+ let(:is_json) { Pantry::Communication::SerializeMessage::IS_JSON }
83
+
84
+ it "takes an array and builds a Message from the parts" do
85
+ parts = [ "source", {}.to_json, "body1" ]
86
+
87
+ message = Pantry::Communication::SerializeMessage.from_zeromq(parts)
88
+
89
+ assert_equal "source", message.to
90
+ assert_equal ["body1"], message.body
91
+ end
92
+
93
+ it "parses out JSON into a Hash" do
94
+ parts = [ "source", {:type => "command"}.to_json, "body1" ]
95
+
96
+ message = Pantry::Communication::SerializeMessage.from_zeromq(parts)
97
+
98
+ assert_equal "command", message.type
99
+ end
100
+
101
+ it "handles JSON based body entries" do
102
+ parts = [ "source", {}.to_json, is_json + {:key => "value"}.to_json ]
103
+
104
+ message = Pantry::Communication::SerializeMessage.from_zeromq(parts)
105
+
106
+ assert_equal "value", message.body[0][:key]
107
+ end
108
+
109
+ it "handles Array based body entries" do
110
+ parts = [ "source", {}.to_json, is_json + [1, 2, 3, "go"].to_json ]
111
+
112
+ message = Pantry::Communication::SerializeMessage.from_zeromq(parts)
113
+
114
+ assert_equal [1, 2, 3, "go"], message.body[0]
115
+ end
116
+
117
+ it "returns raw parts if they don't parse as JSON" do
118
+ parts = [ "source", {}.to_json, "{ blah blah thing", "[notreallyanarray" ]
119
+
120
+ message = Pantry::Communication::SerializeMessage.from_zeromq(parts)
121
+
122
+ assert_equal "{ blah blah thing", message.body[0]
123
+ assert_equal "[notreallyanarray", message.body[1]
124
+ end
125
+
126
+ end
127
+
128
+ end
@@ -0,0 +1,106 @@
1
+ require 'unit/test_helper'
2
+
3
+ describe Pantry::Communication::Server do
4
+
5
+ before do
6
+ Pantry::Communication::PublishSocket.any_instance.stubs(:open)
7
+
8
+ Pantry::Communication::ReceiveSocket.any_instance.stubs(:add_listener)
9
+ Pantry::Communication::ReceiveSocket.any_instance.stubs(:open)
10
+
11
+ Pantry::Communication::FileService.any_instance.stubs(:start_server)
12
+ end
13
+
14
+ it "opens a publish socket for communication" do
15
+ Pantry::Communication::PublishSocket.any_instance.expects(:open)
16
+
17
+ server = Pantry::Communication::Server.new(nil)
18
+ server.run
19
+ end
20
+
21
+ it "opens a receive socket for communication" do
22
+ server = Pantry::Communication::Server.new(nil)
23
+
24
+ Pantry::Communication::ReceiveSocket.any_instance.expects(:add_listener).with(server)
25
+ Pantry::Communication::ReceiveSocket.any_instance.expects(:open)
26
+
27
+ server.run
28
+ end
29
+
30
+ it "starts up a local file service" do
31
+ server = Pantry::Communication::Server.new(nil)
32
+
33
+ Pantry::Communication::FileService.any_instance.expects(:start_server)
34
+
35
+ server.run
36
+ end
37
+
38
+ describe "#publish_message" do
39
+ let(:listener) { Pantry::Server.new }
40
+ let(:msg) { Pantry::Message.new }
41
+ let(:server) { Pantry::Communication::Server.new(listener) }
42
+
43
+ before do
44
+ server.run
45
+ end
46
+
47
+ it "uses the publish socket to send messages to clients" do
48
+ Pantry::Communication::PublishSocket.any_instance.expects(:send_message).with(msg)
49
+
50
+ server.publish_message(msg)
51
+ end
52
+
53
+ it "sets the from of the message to the sender" do
54
+ Pantry::Communication::PublishSocket.any_instance.expects(:send_message).with do |message|
55
+ listener.identity == message.from
56
+ end
57
+
58
+ server.publish_message(msg)
59
+ end
60
+ end
61
+
62
+ describe "Message forwarding" do
63
+ let(:listener) { Pantry::Server.new }
64
+ let(:msg) {
65
+ m = Pantry::Message.new
66
+ m.from = "client427"
67
+ m
68
+ }
69
+ let(:server) { Pantry::Communication::Server.new(listener) }
70
+
71
+ before do
72
+ server.run
73
+ end
74
+
75
+ it "publishes the message to connected clients untouched" do
76
+ msg.to = "pantry"
77
+
78
+ Pantry::Communication::PublishSocket.any_instance.expects(:send_message).with(msg)
79
+ server.forward_message(msg)
80
+
81
+ assert msg.forwarded?, "Message should have been marked as forwarded"
82
+ end
83
+
84
+ it "forwards off responses to forwarded messages" do
85
+ msg.to = "client500"
86
+ msg.forwarded!
87
+
88
+ Pantry::Communication::PublishSocket.any_instance.expects(:send_message).with(msg)
89
+ server.handle_message(msg)
90
+ end
91
+ end
92
+
93
+ it "sends a message to a single client via identity, returning a future" do
94
+ server = Pantry::Communication::Server.new(nil)
95
+ server.run
96
+
97
+ message = Pantry::Message.new("message")
98
+ Pantry::Communication::PublishSocket.any_instance.expects(:send_message).with(message)
99
+
100
+ future = server.send_request(message)
101
+
102
+ assert_not_nil future
103
+ assert_not future.ready?
104
+ end
105
+
106
+ end
@@ -0,0 +1,46 @@
1
+ require 'unit/test_helper'
2
+
3
+ describe Pantry::Communication::SubscribeSocket do
4
+
5
+ before do
6
+ Celluloid.init
7
+
8
+ Celluloid::ZMQ::SubSocket.any_instance.stubs(:linger=)
9
+ Celluloid::ZMQ::SubSocket.any_instance.stubs(:connect)
10
+ Celluloid::ZMQ::SubSocket.any_instance.stubs(:subscribe)
11
+ end
12
+
13
+ let(:security) { Pantry::Communication::Security.new_client }
14
+
15
+ it "binds and subscribes to the given host and port" do
16
+ Celluloid::ZMQ::SubSocket.any_instance.expects(:linger=).with(0)
17
+ Celluloid::ZMQ::SubSocket.any_instance.expects(:connect).with("tcp://host:1235")
18
+ Celluloid::ZMQ::SubSocket.any_instance.expects(:subscribe).with("")
19
+
20
+ socket = Pantry::Communication::SubscribeSocket.new("host", 1235, security)
21
+ socket.open
22
+ end
23
+
24
+ describe "subscription filtering" do
25
+ it "subscribes to the stream according to filter options given" do
26
+ socket = Pantry::Communication::SubscribeSocket.new("host", 1235, security)
27
+ socket.filter_on(Pantry::Communication::ClientFilter.new(application: "pantry"))
28
+
29
+ Celluloid::ZMQ::SubSocket.any_instance.expects(:subscribe).with("pantry")
30
+
31
+ socket.open
32
+ end
33
+
34
+ it "subscribes to multiple streams to support nested scoping" do
35
+ socket = Pantry::Communication::SubscribeSocket.new("host", 1235, security)
36
+ socket.filter_on(Pantry::Communication::ClientFilter.new(
37
+ application: "pantry", environment: "test"))
38
+
39
+ Celluloid::ZMQ::SubSocket.any_instance.expects(:subscribe).with("pantry")
40
+ Celluloid::ZMQ::SubSocket.any_instance.expects(:subscribe).with("pantry.test")
41
+
42
+ socket.open
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,60 @@
1
+ require 'unit/test_helper'
2
+
3
+ describe Pantry::Communication::WaitList do
4
+
5
+ before do
6
+ Celluloid.init
7
+
8
+ @wait_list = Pantry::Communication::WaitList.new
9
+ @message = Pantry::Message.new("do_something")
10
+
11
+ @future = @wait_list.wait_for(@message)
12
+ end
13
+
14
+ it "creates and returns a future waiting for a response for the given identity and message" do
15
+ assert !@future.ready?, "Future should not have been ready with information"
16
+ end
17
+
18
+ it "knows if the given message matches a waiting future" do
19
+ assert @wait_list.waiting_for?(@message), "Wait List should be waiting for this message"
20
+ end
21
+
22
+ it "fulfills the waiting future if a message is received matching the waiting future" do
23
+ @message.from = "identity"
24
+ @message << "The new body"
25
+ @wait_list.received(@message)
26
+
27
+ assert @future.ready?, "Future has not yet received information"
28
+ assert_equal ["The new body"], @future.value.body
29
+
30
+ assert_false @wait_list.waiting_for?(@message), "Future was not removed from the wait list"
31
+ end
32
+
33
+ it "allows multiple entries for a given identity and message type" do
34
+ wait_list = Pantry::Communication::WaitList.new
35
+
36
+ m1 = Pantry::Message.new("do_something")
37
+ m1.from = "client"
38
+
39
+ m2 = Pantry::Message.new("do_something")
40
+ m2.from = "client"
41
+
42
+ m3 = Pantry::Message.new("do_something")
43
+ m3.from = "client"
44
+
45
+ future1 = wait_list.wait_for(m1)
46
+ future2 = wait_list.wait_for(m2)
47
+ future3 = wait_list.wait_for(m3)
48
+
49
+ assert wait_list.waiting_for?(m1)
50
+
51
+ wait_list.received(m1)
52
+ wait_list.received(m2)
53
+ wait_list.received(m3)
54
+
55
+ assert future1.ready?, "First future was not ready"
56
+ assert future2.ready?, "Second future was not ready"
57
+ assert future3.ready?, "Third future was not ready"
58
+ end
59
+
60
+ end
@@ -0,0 +1,46 @@
1
+ require 'unit/test_helper'
2
+
3
+ describe Pantry::Communication::WritingSocket do
4
+
5
+ class TestWriter < Pantry::Communication::WritingSocket
6
+ attr_accessor :socket_impl
7
+
8
+ def build_socket
9
+ @socket_impl
10
+ end
11
+
12
+ def open_socket(socket)
13
+ end
14
+ end
15
+
16
+ let(:security) { Pantry::Communication::Security.new_client }
17
+
18
+ it "serializes a message and sends it down the pipe" do
19
+ zmq_socket = Class.new do
20
+ attr_accessor :written, :linger
21
+
22
+ def set(*options)
23
+ end
24
+
25
+ def write(message_body)
26
+ @written = message_body
27
+ end
28
+ end.new
29
+
30
+ writer = TestWriter.new("host", 1234, security)
31
+ writer.socket_impl = zmq_socket
32
+ writer.open
33
+
34
+ message = Pantry::Message.new("message_type")
35
+ message.to = "stream"
36
+ message << "message_body_1"
37
+ message << "message_body_2"
38
+
39
+ writer.send_message(message)
40
+
41
+ assert_equal(
42
+ ["stream", message.metadata.to_json, "message_body_1", "message_body_2"],
43
+ zmq_socket.written
44
+ )
45
+ end
46
+ end
@@ -0,0 +1,150 @@
1
+ require 'unit/test_helper'
2
+
3
+ describe Pantry::Config do
4
+
5
+ let(:pantry_config) { Pantry::Config.new }
6
+
7
+ it "ensures only one Config object exists via Pantry.config" do
8
+ config = Pantry.config
9
+ assert_same config, Pantry.config
10
+ end
11
+
12
+ describe "Global Configs" do
13
+ it "has an entry for logging destination" do
14
+ pantry_config.log_to = "stdout"
15
+ assert_equal "stdout", pantry_config.log_to
16
+ end
17
+
18
+ it "has an entry for the log level" do
19
+ assert_equal "info", pantry_config.log_level
20
+
21
+ pantry_config.log_level = "warn"
22
+ assert_equal "warn", pantry_config.log_level
23
+ end
24
+
25
+ it "has an entry for the syslog program name" do
26
+ assert_equal "pantry", pantry_config.syslog_program_name
27
+
28
+ pantry_config.syslog_program_name = "client"
29
+ assert_equal "client", pantry_config.syslog_program_name
30
+ end
31
+
32
+ it "has an entry for the data dir" do
33
+ pantry_config.root_dir = "dir"
34
+ assert_equal "dir", pantry_config.root_dir
35
+ end
36
+
37
+ it "can load values from a given YAML file" do
38
+ config_file = fixture_path("config.yml")
39
+ pantry_config.load_file(config_file)
40
+
41
+ assert_equal "/var/log/pantry.log", pantry_config.log_to
42
+ assert_equal "warn", pantry_config.log_level
43
+ assert_equal "testing", pantry_config.syslog_program_name
44
+ assert_equal "/tmp/data", pantry_config.root_dir
45
+ end
46
+
47
+ it "does not set values to nil if not in the config" do
48
+ config_file = fixture_path("empty.yml")
49
+ pantry_config.load_file(config_file)
50
+
51
+ assert_equal "info", pantry_config.log_level
52
+ assert_equal "pantry", pantry_config.syslog_program_name
53
+ end
54
+ end
55
+
56
+ describe "Communication Configuration" do
57
+ it "has an entry for the server host name" do
58
+ pantry_config.server_host = "127.0.0.1"
59
+ assert_equal "127.0.0.1", pantry_config.server_host
60
+ end
61
+
62
+ it "has an entry for the pub / sub port" do
63
+ pantry_config.pub_sub_port = 100
64
+ assert_equal 100, pantry_config.pub_sub_port
65
+ end
66
+
67
+ it "has an entry for the client-info receive port" do
68
+ pantry_config.receive_port = 7788
69
+ assert_equal 7788, pantry_config.receive_port
70
+ end
71
+
72
+ it "has an entry for the file service port" do
73
+ pantry_config.file_service_port = 1122
74
+ assert_equal 1122, pantry_config.file_service_port
75
+ end
76
+
77
+ it "has an entry for the security strategy in use" do
78
+ pantry_config.security = "curve"
79
+ assert_equal "curve", pantry_config.security
80
+ end
81
+
82
+ it "can load values from a given YAML file" do
83
+ config_file = fixture_path("config.yml")
84
+ pantry_config.load_file(config_file)
85
+
86
+ assert_equal "10.0.0.1", pantry_config.server_host
87
+ assert_equal 12345, pantry_config.pub_sub_port
88
+ assert_equal 54321, pantry_config.receive_port
89
+ assert_equal 35412, pantry_config.file_service_port
90
+ assert_equal "curve", pantry_config.security
91
+ end
92
+
93
+ it "does not set values to nil if not in the config" do
94
+ config_file = fixture_path("empty.yml")
95
+ pantry_config.load_file(config_file)
96
+
97
+ assert_equal "127.0.0.1", pantry_config.server_host
98
+ assert_equal 23001, pantry_config.pub_sub_port
99
+ assert_equal 23002, pantry_config.receive_port
100
+ assert_equal 23003, pantry_config.file_service_port
101
+ end
102
+ end
103
+
104
+ describe "Client-side Configuration" do
105
+ it "has an entry for client heartbeat interval" do
106
+ assert_equal 300, pantry_config.client_heartbeat_interval
107
+ pantry_config.client_heartbeat_interval = 5
108
+ assert_equal 5, pantry_config.client_heartbeat_interval
109
+ end
110
+
111
+ it "has an entry for the client's application" do
112
+ pantry_config.client_application = "pantry"
113
+ assert_equal "pantry", pantry_config.client_application
114
+ end
115
+
116
+ it "has an entry for the client's environment" do
117
+ pantry_config.client_environment = "pantry"
118
+ assert_equal "pantry", pantry_config.client_environment
119
+ end
120
+
121
+ it "has an entry for the client's identity" do
122
+ pantry_config.client_identity = "pantry"
123
+ assert_equal "pantry", pantry_config.client_identity
124
+ end
125
+
126
+ it "has an entry for the client's roles" do
127
+ pantry_config.client_roles = ["roles"]
128
+ assert_equal ["roles"], pantry_config.client_roles
129
+ end
130
+
131
+ it "can load values from a given YAML file" do
132
+ config_file = fixture_path("config.yml")
133
+ pantry_config.load_file(config_file)
134
+
135
+ assert_equal 600, pantry_config.client_heartbeat_interval
136
+ assert_equal "pantry-test-1", pantry_config.client_identity
137
+ assert_equal "pantry", pantry_config.client_application
138
+ assert_equal "test", pantry_config.client_environment
139
+ assert_equal %w(database application), pantry_config.client_roles
140
+ end
141
+
142
+ it "does not clobber certain values if config has set to nil" do
143
+ config_file = fixture_path("empty.yml")
144
+ pantry_config.load_file(config_file)
145
+
146
+ assert_equal 300, pantry_config.client_heartbeat_interval
147
+ end
148
+ end
149
+
150
+ end