pantry 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +9 -0
- data/.ruby-version +1 -0
- data/.travis.yml +19 -0
- data/Gemfile +15 -0
- data/Guardfile +16 -0
- data/LICENSE +20 -0
- data/README.md +53 -0
- data/Rakefile +18 -0
- data/Vagrantfile +86 -0
- data/bin/pantry +11 -0
- data/bin/pantry-client +38 -0
- data/bin/pantry-server +33 -0
- data/dist/client.yml +79 -0
- data/dist/server.yml +56 -0
- data/dist/upstart/pantry-client.conf +12 -0
- data/dist/upstart/pantry-server.conf +12 -0
- data/doc/message_packet.dot +19 -0
- data/doc/message_packet.dot.png +0 -0
- data/doc/network_topology.dot +42 -0
- data/doc/network_topology.dot.png +0 -0
- data/lib/celluloid_zmq_patches.rb +16 -0
- data/lib/opt_parse_plus.rb +184 -0
- data/lib/pantry.rb +197 -0
- data/lib/pantry/cli.rb +154 -0
- data/lib/pantry/client.rb +131 -0
- data/lib/pantry/client_info.rb +34 -0
- data/lib/pantry/client_registry.rb +104 -0
- data/lib/pantry/command.rb +194 -0
- data/lib/pantry/command_handler.rb +53 -0
- data/lib/pantry/command_line.rb +115 -0
- data/lib/pantry/commands/create_client.rb +30 -0
- data/lib/pantry/commands/download_directory.rb +35 -0
- data/lib/pantry/commands/echo.rb +32 -0
- data/lib/pantry/commands/edit_application.rb +60 -0
- data/lib/pantry/commands/register_client.rb +38 -0
- data/lib/pantry/commands/status.rb +78 -0
- data/lib/pantry/commands/sync_directory.rb +50 -0
- data/lib/pantry/commands/update_application.rb +45 -0
- data/lib/pantry/commands/upload_file.rb +68 -0
- data/lib/pantry/communication.rb +20 -0
- data/lib/pantry/communication/client.rb +75 -0
- data/lib/pantry/communication/client_filter.rb +117 -0
- data/lib/pantry/communication/file_service.rb +125 -0
- data/lib/pantry/communication/file_service/file_progress.rb +164 -0
- data/lib/pantry/communication/file_service/receive_file.rb +97 -0
- data/lib/pantry/communication/file_service/send_file.rb +74 -0
- data/lib/pantry/communication/publish_socket.rb +20 -0
- data/lib/pantry/communication/reading_socket.rb +89 -0
- data/lib/pantry/communication/receive_socket.rb +23 -0
- data/lib/pantry/communication/security.rb +44 -0
- data/lib/pantry/communication/security/authentication.rb +98 -0
- data/lib/pantry/communication/security/curve_key_store.rb +120 -0
- data/lib/pantry/communication/security/curve_security.rb +70 -0
- data/lib/pantry/communication/security/null_security.rb +32 -0
- data/lib/pantry/communication/send_socket.rb +19 -0
- data/lib/pantry/communication/serialize_message.rb +84 -0
- data/lib/pantry/communication/server.rb +97 -0
- data/lib/pantry/communication/subscribe_socket.rb +33 -0
- data/lib/pantry/communication/wait_list.rb +45 -0
- data/lib/pantry/communication/writing_socket.rb +46 -0
- data/lib/pantry/config.rb +182 -0
- data/lib/pantry/file_editor.rb +67 -0
- data/lib/pantry/logger.rb +78 -0
- data/lib/pantry/message.rb +134 -0
- data/lib/pantry/multi_command.rb +36 -0
- data/lib/pantry/server.rb +132 -0
- data/lib/pantry/test/acceptance.rb +83 -0
- data/lib/pantry/test/support/fake_fs.rb +31 -0
- data/lib/pantry/test/support/matchers.rb +13 -0
- data/lib/pantry/test/support/minitest.rb +13 -0
- data/lib/pantry/test/support/mock_ui.rb +23 -0
- data/lib/pantry/test/unit.rb +13 -0
- data/lib/pantry/ui.rb +68 -0
- data/lib/pantry/version.rb +3 -0
- data/pantry.gemspec +40 -0
- data/test/acceptance/cli/error_handling_test.rb +7 -0
- data/test/acceptance/cli/execute_command_on_clients_test.rb +32 -0
- data/test/acceptance/cli/request_info_from_server_test.rb +44 -0
- data/test/acceptance/communication/client_requests_info_from_server_test.rb +28 -0
- data/test/acceptance/communication/heartbeat_test.rb +19 -0
- data/test/acceptance/communication/pub_sub_communication_test.rb +53 -0
- data/test/acceptance/communication/security_test.rb +117 -0
- data/test/acceptance/communication/server_requests_info_from_client_test.rb +41 -0
- data/test/acceptance/test_helper.rb +25 -0
- data/test/fixtures/config.yml +22 -0
- data/test/fixtures/empty.yml +2 -0
- data/test/fixtures/file_to_upload +3 -0
- data/test/root_dir/.gitkeep +0 -0
- data/test/unit/cli_test.rb +173 -0
- data/test/unit/client_registry_test.rb +61 -0
- data/test/unit/client_test.rb +128 -0
- data/test/unit/command_handler_test.rb +79 -0
- data/test/unit/command_line_test.rb +5 -0
- data/test/unit/command_test.rb +206 -0
- data/test/unit/commands/create_client_test.rb +25 -0
- data/test/unit/commands/download_directory_test.rb +58 -0
- data/test/unit/commands/echo_test.rb +22 -0
- data/test/unit/commands/edit_application_test.rb +84 -0
- data/test/unit/commands/register_client_test.rb +41 -0
- data/test/unit/commands/status_test.rb +81 -0
- data/test/unit/commands/sync_directory_test.rb +75 -0
- data/test/unit/commands/update_application_test.rb +35 -0
- data/test/unit/commands/upload_file_test.rb +51 -0
- data/test/unit/communication/client_filter_test.rb +262 -0
- data/test/unit/communication/client_test.rb +99 -0
- data/test/unit/communication/file_service/receive_file_test.rb +214 -0
- data/test/unit/communication/file_service/send_file_test.rb +110 -0
- data/test/unit/communication/file_service_test.rb +56 -0
- data/test/unit/communication/publish_socket_test.rb +19 -0
- data/test/unit/communication/reading_socket_test.rb +110 -0
- data/test/unit/communication/receive_socket_test.rb +20 -0
- data/test/unit/communication/security/authentication_test.rb +97 -0
- data/test/unit/communication/security/curve_key_store_test.rb +110 -0
- data/test/unit/communication/security/curve_security_test.rb +44 -0
- data/test/unit/communication/security/null_security_test.rb +15 -0
- data/test/unit/communication/security_test.rb +49 -0
- data/test/unit/communication/send_socket_test.rb +19 -0
- data/test/unit/communication/serialize_message_test.rb +128 -0
- data/test/unit/communication/server_test.rb +106 -0
- data/test/unit/communication/subscribe_socket_test.rb +46 -0
- data/test/unit/communication/wait_list_test.rb +60 -0
- data/test/unit/communication/writing_socket_test.rb +46 -0
- data/test/unit/config_test.rb +150 -0
- data/test/unit/logger_test.rb +79 -0
- data/test/unit/message_test.rb +179 -0
- data/test/unit/multi_command_test.rb +45 -0
- data/test/unit/opt_parse_plus_test.rb +218 -0
- data/test/unit/pantry_test.rb +82 -0
- data/test/unit/server_test.rb +166 -0
- data/test/unit/test_helper.rb +25 -0
- data/test/unit/ui_test.rb +58 -0
- metadata +389 -13
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'acceptance/test_helper'
|
2
|
+
|
3
|
+
describe "Server requests info from the Client" do
|
4
|
+
|
5
|
+
it "asks a client for info and waits for the response" do
|
6
|
+
set_up_environment(ports_start_at: 10600)
|
7
|
+
|
8
|
+
message = Pantry::Commands::Echo.new("Hello Client").to_message
|
9
|
+
response_future = @server.send_request(@client1, message)
|
10
|
+
|
11
|
+
assert_equal ["Hello Client"], response_future.value(1).body
|
12
|
+
end
|
13
|
+
|
14
|
+
it "asks multiple clients for info and matches responses with requests" do
|
15
|
+
set_up_environment(ports_start_at: 10610)
|
16
|
+
|
17
|
+
message1 = Pantry::Commands::Echo.new("Hello Client1").to_message
|
18
|
+
message2 = Pantry::Commands::Echo.new("Hello Client2").to_message
|
19
|
+
|
20
|
+
future1 = @server.send_request(@client1, message1)
|
21
|
+
future2 = @server.send_request(@client2, message2)
|
22
|
+
|
23
|
+
assert_equal ["Hello Client1"], future1.value(1).body
|
24
|
+
assert_equal ["Hello Client2"], future2.value(1).body
|
25
|
+
end
|
26
|
+
|
27
|
+
it "handles multiple subsequent requests of the same type to the same client" do
|
28
|
+
set_up_environment(ports_start_at: 10620)
|
29
|
+
|
30
|
+
futures = []
|
31
|
+
10.times do |i|
|
32
|
+
message = Pantry::Commands::Echo.new("Hello Client #{i}").to_message
|
33
|
+
futures << @server.send_request(@client1, message)
|
34
|
+
end
|
35
|
+
|
36
|
+
10.times do |i|
|
37
|
+
assert_equal ["Hello Client #{i}"], futures[i].value(5).body
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'pantry/test/acceptance'
|
2
|
+
|
3
|
+
# Swap these lines to turn on the logger in tests
|
4
|
+
Pantry.logger.disable!
|
5
|
+
#Pantry.config.log_level = :debug
|
6
|
+
|
7
|
+
class Minitest::Test
|
8
|
+
|
9
|
+
def setup
|
10
|
+
Pantry.config.root_dir = File.expand_path("../../root_dir", __FILE__)
|
11
|
+
clean_up_pantry_root
|
12
|
+
end
|
13
|
+
|
14
|
+
# Ensure Pantry.root is always clean for each test.
|
15
|
+
def clean_up_pantry_root
|
16
|
+
Dir["#{Pantry.root}/**/*"].each do |file|
|
17
|
+
FileUtils.rm_rf file
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def fixture_path(file_path)
|
22
|
+
File.join(File.dirname(__FILE__), "..", "fixtures", file_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
log_to: /var/log/pantry.log
|
3
|
+
log_level: warn
|
4
|
+
syslog_program_name: testing
|
5
|
+
root_dir: /tmp/data
|
6
|
+
|
7
|
+
networking:
|
8
|
+
server_host: 10.0.0.1
|
9
|
+
pub_sub_port: 12345
|
10
|
+
receive_port: 54321
|
11
|
+
file_service_port: 35412
|
12
|
+
security: curve
|
13
|
+
|
14
|
+
client:
|
15
|
+
heartbeat_interval: 600
|
16
|
+
identity: "pantry-test-1"
|
17
|
+
application: "pantry"
|
18
|
+
environment: "test"
|
19
|
+
roles:
|
20
|
+
- database
|
21
|
+
- application
|
22
|
+
|
File without changes
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'unit/test_helper'
|
2
|
+
|
3
|
+
describe Pantry::CLI do
|
4
|
+
|
5
|
+
let(:filter) { Pantry::Communication::ClientFilter.new }
|
6
|
+
|
7
|
+
mock_ui!
|
8
|
+
|
9
|
+
def build_cli(command)
|
10
|
+
Pantry::CLI.new([command].flatten)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "defaults identity to the current ENV['USER']" do
|
14
|
+
assert_equal ENV["USER"], build_cli("echo").identity
|
15
|
+
end
|
16
|
+
|
17
|
+
it "builds a message from a command request and sends it to the server" do
|
18
|
+
cli = build_cli("status")
|
19
|
+
Pantry::Command.any_instance.stubs(:wait_for_finish)
|
20
|
+
|
21
|
+
cli.expects(:send_message).with do |message|
|
22
|
+
assert_equal "Status", message.type
|
23
|
+
end
|
24
|
+
|
25
|
+
cli.run
|
26
|
+
end
|
27
|
+
|
28
|
+
it "passes along arguments to the command handler" do
|
29
|
+
cli = build_cli(["echo", "Hello World"])
|
30
|
+
Pantry::Command.any_instance.stubs(:wait_for_finish)
|
31
|
+
|
32
|
+
cli.expects(:send_message).with do |message|
|
33
|
+
assert message.requires_response?, "Message not flagged to require response"
|
34
|
+
assert_equal "Echo", message.type
|
35
|
+
assert_equal "Hello World", message.body[0]
|
36
|
+
end
|
37
|
+
|
38
|
+
cli.run
|
39
|
+
end
|
40
|
+
|
41
|
+
it "includes global options when passing options to a command handler" do
|
42
|
+
cli = build_cli(["-a", "pantry", "-e", "test", "echo", "Hello World"])
|
43
|
+
Pantry::Command.any_instance.stubs(:wait_for_finish)
|
44
|
+
|
45
|
+
Pantry::Commands::Echo.any_instance.expects(:prepare_message).with do |options|
|
46
|
+
assert_equal "pantry", options["application"]
|
47
|
+
assert_equal "test", options["environment"]
|
48
|
+
end.returns(stub_everything)
|
49
|
+
|
50
|
+
cli.stubs(:send_message)
|
51
|
+
|
52
|
+
cli.run
|
53
|
+
end
|
54
|
+
|
55
|
+
it "sets the logging level to info on -v" do
|
56
|
+
Pantry.config.expects(:refresh)
|
57
|
+
|
58
|
+
capture_io do
|
59
|
+
cli = build_cli(["-v"])
|
60
|
+
cli.run
|
61
|
+
end
|
62
|
+
|
63
|
+
assert_equal :info, Pantry.config.log_level
|
64
|
+
end
|
65
|
+
|
66
|
+
it "sets logging level to debug on -d" do
|
67
|
+
Pantry.config.expects(:refresh)
|
68
|
+
|
69
|
+
capture_io do
|
70
|
+
cli = build_cli(["-d"])
|
71
|
+
cli.run
|
72
|
+
end
|
73
|
+
|
74
|
+
assert_equal :debug, Pantry.config.log_level
|
75
|
+
end
|
76
|
+
|
77
|
+
it "sets the hostname of the server to communicate with" do
|
78
|
+
capture_io do
|
79
|
+
cli = build_cli(["-h", "localhost"])
|
80
|
+
cli.run
|
81
|
+
end
|
82
|
+
|
83
|
+
assert_equal "localhost", Pantry.config.server_host
|
84
|
+
end
|
85
|
+
|
86
|
+
it "prints out the version of pantry when requested" do
|
87
|
+
cli = build_cli(["-V"])
|
88
|
+
cli.run
|
89
|
+
|
90
|
+
assert_equal Pantry::VERSION, stdout.strip
|
91
|
+
end
|
92
|
+
|
93
|
+
it "prints the help if nothing given on the command line" do
|
94
|
+
out, err = capture_io do
|
95
|
+
cli = build_cli([])
|
96
|
+
cli.run
|
97
|
+
end
|
98
|
+
|
99
|
+
assert_match /Usage:/, out
|
100
|
+
end
|
101
|
+
|
102
|
+
it "can be given a set of filters to limit the request to a certain subset of clients" do
|
103
|
+
cli = build_cli(["-a", "pantry", "-e", "test", "echo", "Hello World"])
|
104
|
+
Pantry::Command.any_instance.stubs(:wait_for_finish)
|
105
|
+
|
106
|
+
cli.expects(:send_message).with do |message|
|
107
|
+
assert_equal "Echo", message.type
|
108
|
+
assert_equal "pantry.test", message.to
|
109
|
+
end
|
110
|
+
|
111
|
+
cli.run
|
112
|
+
end
|
113
|
+
|
114
|
+
it "reads a local config file and sets default options" do
|
115
|
+
File.open(Pantry.root.join("config"), "w+") do |f|
|
116
|
+
f.puts("-a pantry")
|
117
|
+
f.puts("--environment test")
|
118
|
+
f.puts("-r app")
|
119
|
+
end
|
120
|
+
|
121
|
+
cli = build_cli(["echo", "Hello World"])
|
122
|
+
Pantry::Command.any_instance.stubs(:wait_for_finish)
|
123
|
+
|
124
|
+
cli.expects(:send_message).with do |message|
|
125
|
+
assert_equal "Echo", message.type
|
126
|
+
assert_equal "pantry.test.app", message.to
|
127
|
+
end
|
128
|
+
|
129
|
+
cli.run
|
130
|
+
end
|
131
|
+
|
132
|
+
it "turns on Curve and sets keys if --curve-key-file is set" do
|
133
|
+
break unless Pantry::Communication::Security.curve_supported?
|
134
|
+
Pantry::Command.any_instance.stubs(:wait_for_finish)
|
135
|
+
|
136
|
+
File.open(Pantry.root.join("keys.yml"), "w+") do |f|
|
137
|
+
f.write(YAML.dump(
|
138
|
+
"server_public_key" => "x" * 40,
|
139
|
+
"public_key" => "y" * 40,
|
140
|
+
"private_key" => "z" * 40
|
141
|
+
))
|
142
|
+
end
|
143
|
+
|
144
|
+
capture_io do
|
145
|
+
cli = build_cli(["--curve-key-file", "keys.yml"])
|
146
|
+
cli.run
|
147
|
+
end
|
148
|
+
|
149
|
+
assert_equal "curve", Pantry.config.security
|
150
|
+
|
151
|
+
assert FileUtils.compare_file(
|
152
|
+
Pantry.root.join("keys.yml"),
|
153
|
+
Pantry.root.join("security", "curve", "client_keys.yml")
|
154
|
+
), "Did not copy the keys file into a client-ready position"
|
155
|
+
end
|
156
|
+
|
157
|
+
it "errors if the curve-key-file is not found"
|
158
|
+
|
159
|
+
it "forwards messages received to the current command" do
|
160
|
+
cli = build_cli("status")
|
161
|
+
cli.stubs(:send_message)
|
162
|
+
|
163
|
+
command = Pantry::Command.new
|
164
|
+
cli.async.request(filter, command, {})
|
165
|
+
|
166
|
+
message = Pantry::Message.new
|
167
|
+
message.from = Pantry::SERVER_IDENTITY
|
168
|
+
|
169
|
+
cli.receive_message(message)
|
170
|
+
assert command.finished?, "Command was not marked as finished"
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'unit/test_helper'
|
2
|
+
|
3
|
+
describe Pantry::ClientRegistry do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@c1 = Pantry::ClientInfo.new identity: "client1", application: "pantry", environment: "test"
|
7
|
+
@c2 = Pantry::ClientInfo.new identity: "client2", environment: "test"
|
8
|
+
|
9
|
+
@registry = Pantry::ClientRegistry.new
|
10
|
+
@registry.check_in(@c1)
|
11
|
+
@registry.check_in(@c2)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "marks a client as checked in" do
|
15
|
+
assert @registry.include?(@c1)
|
16
|
+
assert @registry.include?(@c2)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "does not duplicate clients in the list from multiple check-ins" do
|
20
|
+
@registry.check_in(@c1)
|
21
|
+
@registry.check_in(@c1)
|
22
|
+
@registry.check_in(@c1)
|
23
|
+
|
24
|
+
assert_equal [@c1, @c2], @registry.all
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns all known clients that match the given stream" do
|
28
|
+
assert_equal [@c1, @c2], @registry.all_matching("")
|
29
|
+
assert_equal [@c1], @registry.all_matching("pantry.test")
|
30
|
+
assert_equal [@c1], @registry.all_matching("client1")
|
31
|
+
assert_equal [@c2], @registry.all_matching("client2")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns all known clients that match a given ClientFilter" do
|
35
|
+
assert_equal [@c1, @c2], @registry.all_matching(Pantry::Communication::ClientFilter.new)
|
36
|
+
|
37
|
+
filter = Pantry::Communication::ClientFilter.new(application: "pantry", environment: "test")
|
38
|
+
assert_equal [@c1], @registry.all_matching(filter)
|
39
|
+
|
40
|
+
filter = Pantry::Communication::ClientFilter.new(environment: "test")
|
41
|
+
assert_equal [@c2], @registry.all_matching(filter)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "processes each found client via the block if given" do
|
45
|
+
found = @registry.all_matching(Pantry::Communication::ClientFilter.new) do |client, record|
|
46
|
+
client.identity
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_equal [@c1.identity, @c2.identity], found
|
50
|
+
end
|
51
|
+
|
52
|
+
it "can return all known clients" do
|
53
|
+
assert_equal [@c1, @c2], @registry.all
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns the client who matches the given identity" do
|
57
|
+
assert_equal @c1, @registry.find("client1")
|
58
|
+
assert_nil @registry.find("unknown")
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'unit/test_helper'
|
2
|
+
|
3
|
+
describe Pantry::Client do
|
4
|
+
|
5
|
+
class FakeNetworkStack
|
6
|
+
def initialize(listener)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.new_link(listener)
|
10
|
+
new(listener)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
FakeNetworkStack.any_instance.stubs(:send_message)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "can take a list of roles this Client manages" do
|
19
|
+
client = Pantry::Client.new roles: %w(app db)
|
20
|
+
assert_equal %w(app db), client.roles
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can take an application to manage" do
|
24
|
+
client = Pantry::Client.new application: "pantry"
|
25
|
+
assert_equal "pantry", client.application
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can take an environment to manage" do
|
29
|
+
client = Pantry::Client.new environment: "production"
|
30
|
+
assert_equal "production", client.environment
|
31
|
+
end
|
32
|
+
|
33
|
+
it "packages up all filter information into a Filter object" do
|
34
|
+
client = Pantry::Client.new environment: "production", application: "pantry"
|
35
|
+
|
36
|
+
filter = Pantry::Communication::ClientFilter.new(
|
37
|
+
environment: "production", application: "pantry", identity: client.identity)
|
38
|
+
|
39
|
+
assert_equal filter, client.filter
|
40
|
+
assert_equal "production", client.environment
|
41
|
+
end
|
42
|
+
|
43
|
+
it "starts up and shuts down the networking stack" do
|
44
|
+
FakeNetworkStack.any_instance.expects(:run)
|
45
|
+
|
46
|
+
client = Pantry::Client.new(network_stack_class: FakeNetworkStack)
|
47
|
+
client.run
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sends a registration packet once networking is up" do
|
51
|
+
client = Pantry::Client.new(identity: "johnson", network_stack_class: FakeNetworkStack)
|
52
|
+
|
53
|
+
FakeNetworkStack.any_instance.stubs(:run)
|
54
|
+
FakeNetworkStack.any_instance.expects(:send_message).with do |message|
|
55
|
+
assert_equal "RegisterClient", message.type
|
56
|
+
end
|
57
|
+
|
58
|
+
client.run
|
59
|
+
end
|
60
|
+
|
61
|
+
it "executes callbacks when a message matches" do
|
62
|
+
client = Pantry::Client.new
|
63
|
+
|
64
|
+
Pantry::CommandHandler.any_instance.stubs(:can_handle?).returns(true)
|
65
|
+
Pantry::CommandHandler.any_instance.expects(:process).with do |message|
|
66
|
+
message.type == "test_message"
|
67
|
+
end
|
68
|
+
|
69
|
+
client.receive_message(Pantry::Message.new("test_message"))
|
70
|
+
end
|
71
|
+
|
72
|
+
it "builds and sends a response message if message flagged as needing one" do
|
73
|
+
client = Pantry::Client.new(network_stack_class: FakeNetworkStack)
|
74
|
+
|
75
|
+
Pantry::CommandHandler.any_instance.stubs(:can_handle?).returns(true)
|
76
|
+
Pantry::CommandHandler.any_instance.expects(:process).returns("A response message")
|
77
|
+
|
78
|
+
message = Pantry::Message.new("test_message")
|
79
|
+
message.requires_response!
|
80
|
+
|
81
|
+
FakeNetworkStack.any_instance.expects(:send_message).with do |response_message|
|
82
|
+
assert_equal "test_message", response_message.type
|
83
|
+
assert_equal ["A response message"], response_message.body
|
84
|
+
end
|
85
|
+
|
86
|
+
client.receive_message(message)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "keeps all object formatting of the response message" do
|
90
|
+
client = Pantry::Client.new(network_stack_class: FakeNetworkStack)
|
91
|
+
|
92
|
+
Pantry::CommandHandler.any_instance.stubs(:can_handle?).returns(true)
|
93
|
+
Pantry::CommandHandler.any_instance.expects(:process).returns([%w(A response message)])
|
94
|
+
|
95
|
+
message = Pantry::Message.new("test_message")
|
96
|
+
message.requires_response!
|
97
|
+
|
98
|
+
FakeNetworkStack.any_instance.expects(:send_message).with do |response_message|
|
99
|
+
assert_equal [["A", "response", "message"]], response_message.body
|
100
|
+
end
|
101
|
+
|
102
|
+
client.receive_message(message)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "can request info of a the server" do
|
106
|
+
client = Pantry::Client.new(network_stack_class: FakeNetworkStack)
|
107
|
+
message = Pantry::Message.new("test message")
|
108
|
+
|
109
|
+
FakeNetworkStack.any_instance.expects(:send_request).with(message)
|
110
|
+
|
111
|
+
client.send_request( message)
|
112
|
+
|
113
|
+
assert message.requires_response?, "Message should require a response from the server"
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "Identity" do
|
117
|
+
it "can be given a specific identity" do
|
118
|
+
c = Pantry::Client.new identity: "My Test Client"
|
119
|
+
assert_equal "My Test Client", c.identity
|
120
|
+
end
|
121
|
+
|
122
|
+
it "defaults to the hostname of the machine" do
|
123
|
+
c = Pantry::Client.new
|
124
|
+
assert_equal `hostname`.strip, c.identity
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|