right_agent 2.0.7-x86-mingw32

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 (176) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +82 -0
  3. data/Rakefile +113 -0
  4. data/lib/right_agent.rb +59 -0
  5. data/lib/right_agent/actor.rb +182 -0
  6. data/lib/right_agent/actor_registry.rb +76 -0
  7. data/lib/right_agent/actors/agent_manager.rb +232 -0
  8. data/lib/right_agent/agent.rb +1149 -0
  9. data/lib/right_agent/agent_config.rb +480 -0
  10. data/lib/right_agent/agent_identity.rb +210 -0
  11. data/lib/right_agent/agent_tag_manager.rb +237 -0
  12. data/lib/right_agent/audit_formatter.rb +107 -0
  13. data/lib/right_agent/clients.rb +31 -0
  14. data/lib/right_agent/clients/api_client.rb +383 -0
  15. data/lib/right_agent/clients/auth_client.rb +247 -0
  16. data/lib/right_agent/clients/balanced_http_client.rb +369 -0
  17. data/lib/right_agent/clients/base_retry_client.rb +495 -0
  18. data/lib/right_agent/clients/right_http_client.rb +279 -0
  19. data/lib/right_agent/clients/router_client.rb +493 -0
  20. data/lib/right_agent/command.rb +30 -0
  21. data/lib/right_agent/command/agent_manager_commands.rb +150 -0
  22. data/lib/right_agent/command/command_client.rb +136 -0
  23. data/lib/right_agent/command/command_constants.rb +33 -0
  24. data/lib/right_agent/command/command_io.rb +126 -0
  25. data/lib/right_agent/command/command_parser.rb +87 -0
  26. data/lib/right_agent/command/command_runner.rb +118 -0
  27. data/lib/right_agent/command/command_serializer.rb +63 -0
  28. data/lib/right_agent/connectivity_checker.rb +179 -0
  29. data/lib/right_agent/console.rb +65 -0
  30. data/lib/right_agent/core_payload_types.rb +44 -0
  31. data/lib/right_agent/core_payload_types/cookbook.rb +61 -0
  32. data/lib/right_agent/core_payload_types/cookbook_position.rb +46 -0
  33. data/lib/right_agent/core_payload_types/cookbook_repository.rb +116 -0
  34. data/lib/right_agent/core_payload_types/cookbook_sequence.rb +70 -0
  35. data/lib/right_agent/core_payload_types/dev_repositories.rb +100 -0
  36. data/lib/right_agent/core_payload_types/dev_repository.rb +76 -0
  37. data/lib/right_agent/core_payload_types/event_categories.rb +38 -0
  38. data/lib/right_agent/core_payload_types/executable_bundle.rb +130 -0
  39. data/lib/right_agent/core_payload_types/login_policy.rb +72 -0
  40. data/lib/right_agent/core_payload_types/login_user.rb +79 -0
  41. data/lib/right_agent/core_payload_types/planned_volume.rb +94 -0
  42. data/lib/right_agent/core_payload_types/recipe_instantiation.rb +73 -0
  43. data/lib/right_agent/core_payload_types/repositories_bundle.rb +50 -0
  44. data/lib/right_agent/core_payload_types/right_script_attachment.rb +95 -0
  45. data/lib/right_agent/core_payload_types/right_script_instantiation.rb +94 -0
  46. data/lib/right_agent/core_payload_types/runlist_policy.rb +44 -0
  47. data/lib/right_agent/core_payload_types/secure_document.rb +66 -0
  48. data/lib/right_agent/core_payload_types/secure_document_location.rb +63 -0
  49. data/lib/right_agent/core_payload_types/software_repository_instantiation.rb +61 -0
  50. data/lib/right_agent/daemonize.rb +35 -0
  51. data/lib/right_agent/dispatched_cache.rb +109 -0
  52. data/lib/right_agent/dispatcher.rb +272 -0
  53. data/lib/right_agent/enrollment_result.rb +221 -0
  54. data/lib/right_agent/exceptions.rb +87 -0
  55. data/lib/right_agent/history.rb +145 -0
  56. data/lib/right_agent/log.rb +460 -0
  57. data/lib/right_agent/minimal.rb +46 -0
  58. data/lib/right_agent/monkey_patches.rb +30 -0
  59. data/lib/right_agent/monkey_patches/ruby_patch.rb +55 -0
  60. data/lib/right_agent/monkey_patches/ruby_patch/array_patch.rb +29 -0
  61. data/lib/right_agent/monkey_patches/ruby_patch/darwin_patch.rb +24 -0
  62. data/lib/right_agent/monkey_patches/ruby_patch/linux_patch.rb +24 -0
  63. data/lib/right_agent/monkey_patches/ruby_patch/linux_patch/file_patch.rb +30 -0
  64. data/lib/right_agent/monkey_patches/ruby_patch/object_patch.rb +49 -0
  65. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch.rb +32 -0
  66. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/file_patch.rb +60 -0
  67. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/process_patch.rb +63 -0
  68. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/stdio_patch.rb +27 -0
  69. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/time_patch.rb +55 -0
  70. data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/win32ole_patch.rb +34 -0
  71. data/lib/right_agent/multiplexer.rb +102 -0
  72. data/lib/right_agent/offline_handler.rb +270 -0
  73. data/lib/right_agent/operation_result.rb +300 -0
  74. data/lib/right_agent/packets.rb +673 -0
  75. data/lib/right_agent/payload_formatter.rb +104 -0
  76. data/lib/right_agent/pending_requests.rb +128 -0
  77. data/lib/right_agent/pid_file.rb +159 -0
  78. data/lib/right_agent/platform.rb +770 -0
  79. data/lib/right_agent/platform/unix/darwin/platform.rb +102 -0
  80. data/lib/right_agent/platform/unix/linux/platform.rb +305 -0
  81. data/lib/right_agent/platform/unix/platform.rb +226 -0
  82. data/lib/right_agent/platform/windows/mingw/platform.rb +447 -0
  83. data/lib/right_agent/platform/windows/mswin/platform.rb +236 -0
  84. data/lib/right_agent/platform/windows/platform.rb +1808 -0
  85. data/lib/right_agent/protocol_version_mixin.rb +69 -0
  86. data/lib/right_agent/retryable_request.rb +195 -0
  87. data/lib/right_agent/scripts/agent_controller.rb +543 -0
  88. data/lib/right_agent/scripts/agent_deployer.rb +400 -0
  89. data/lib/right_agent/scripts/common_parser.rb +160 -0
  90. data/lib/right_agent/scripts/log_level_manager.rb +192 -0
  91. data/lib/right_agent/scripts/stats_manager.rb +268 -0
  92. data/lib/right_agent/scripts/usage.rb +58 -0
  93. data/lib/right_agent/secure_identity.rb +92 -0
  94. data/lib/right_agent/security.rb +32 -0
  95. data/lib/right_agent/security/cached_certificate_store_proxy.rb +77 -0
  96. data/lib/right_agent/security/certificate.rb +102 -0
  97. data/lib/right_agent/security/certificate_cache.rb +89 -0
  98. data/lib/right_agent/security/distinguished_name.rb +56 -0
  99. data/lib/right_agent/security/encrypted_document.rb +83 -0
  100. data/lib/right_agent/security/rsa_key_pair.rb +76 -0
  101. data/lib/right_agent/security/signature.rb +86 -0
  102. data/lib/right_agent/security/static_certificate_store.rb +85 -0
  103. data/lib/right_agent/sender.rb +792 -0
  104. data/lib/right_agent/serialize.rb +29 -0
  105. data/lib/right_agent/serialize/message_pack.rb +107 -0
  106. data/lib/right_agent/serialize/secure_serializer.rb +151 -0
  107. data/lib/right_agent/serialize/secure_serializer_initializer.rb +47 -0
  108. data/lib/right_agent/serialize/serializable.rb +151 -0
  109. data/lib/right_agent/serialize/serializer.rb +159 -0
  110. data/lib/right_agent/subprocess.rb +38 -0
  111. data/lib/right_agent/tracer.rb +124 -0
  112. data/right_agent.gemspec +101 -0
  113. data/spec/actor_registry_spec.rb +80 -0
  114. data/spec/actor_spec.rb +162 -0
  115. data/spec/agent_config_spec.rb +235 -0
  116. data/spec/agent_identity_spec.rb +78 -0
  117. data/spec/agent_spec.rb +734 -0
  118. data/spec/agent_tag_manager_spec.rb +319 -0
  119. data/spec/clients/api_client_spec.rb +423 -0
  120. data/spec/clients/auth_client_spec.rb +272 -0
  121. data/spec/clients/balanced_http_client_spec.rb +576 -0
  122. data/spec/clients/base_retry_client_spec.rb +635 -0
  123. data/spec/clients/router_client_spec.rb +594 -0
  124. data/spec/clients/spec_helper.rb +111 -0
  125. data/spec/command/agent_manager_commands_spec.rb +51 -0
  126. data/spec/command/command_io_spec.rb +93 -0
  127. data/spec/command/command_parser_spec.rb +79 -0
  128. data/spec/command/command_runner_spec.rb +107 -0
  129. data/spec/command/command_serializer_spec.rb +51 -0
  130. data/spec/connectivity_checker_spec.rb +83 -0
  131. data/spec/core_payload_types/dev_repositories_spec.rb +64 -0
  132. data/spec/core_payload_types/dev_repository_spec.rb +33 -0
  133. data/spec/core_payload_types/executable_bundle_spec.rb +67 -0
  134. data/spec/core_payload_types/login_user_spec.rb +102 -0
  135. data/spec/core_payload_types/recipe_instantiation_spec.rb +81 -0
  136. data/spec/core_payload_types/right_script_attachment_spec.rb +65 -0
  137. data/spec/core_payload_types/right_script_instantiation_spec.rb +79 -0
  138. data/spec/core_payload_types/spec_helper.rb +23 -0
  139. data/spec/dispatched_cache_spec.rb +136 -0
  140. data/spec/dispatcher_spec.rb +324 -0
  141. data/spec/enrollment_result_spec.rb +53 -0
  142. data/spec/history_spec.rb +246 -0
  143. data/spec/log_spec.rb +192 -0
  144. data/spec/monkey_patches/eventmachine_spec.rb +62 -0
  145. data/spec/multiplexer_spec.rb +48 -0
  146. data/spec/offline_handler_spec.rb +340 -0
  147. data/spec/operation_result_spec.rb +208 -0
  148. data/spec/packets_spec.rb +461 -0
  149. data/spec/pending_requests_spec.rb +136 -0
  150. data/spec/platform/spec_helper.rb +216 -0
  151. data/spec/platform/unix/darwin/platform_spec.rb +181 -0
  152. data/spec/platform/unix/linux/platform_spec.rb +540 -0
  153. data/spec/platform/unix/spec_helper.rb +149 -0
  154. data/spec/platform/windows/mingw/platform_spec.rb +222 -0
  155. data/spec/platform/windows/mswin/platform_spec.rb +259 -0
  156. data/spec/platform/windows/spec_helper.rb +720 -0
  157. data/spec/retryable_request_spec.rb +306 -0
  158. data/spec/secure_identity_spec.rb +50 -0
  159. data/spec/security/cached_certificate_store_proxy_spec.rb +62 -0
  160. data/spec/security/certificate_cache_spec.rb +71 -0
  161. data/spec/security/certificate_spec.rb +49 -0
  162. data/spec/security/distinguished_name_spec.rb +46 -0
  163. data/spec/security/encrypted_document_spec.rb +55 -0
  164. data/spec/security/rsa_key_pair_spec.rb +55 -0
  165. data/spec/security/signature_spec.rb +66 -0
  166. data/spec/security/static_certificate_store_spec.rb +58 -0
  167. data/spec/sender_spec.rb +1045 -0
  168. data/spec/serialize/message_pack_spec.rb +131 -0
  169. data/spec/serialize/secure_serializer_spec.rb +132 -0
  170. data/spec/serialize/serializable_spec.rb +90 -0
  171. data/spec/serialize/serializer_spec.rb +197 -0
  172. data/spec/spec.opts +2 -0
  173. data/spec/spec.win32.opts +1 -0
  174. data/spec/spec_helper.rb +130 -0
  175. data/spec/tracer_spec.rb +114 -0
  176. metadata +447 -0
@@ -0,0 +1,131 @@
1
+ #
2
+ # Copyright (c) 2009-2011 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
24
+
25
+ module RightScale
26
+ class TestClass
27
+ include Serializable
28
+
29
+ attr_accessor :var1, :var2
30
+
31
+ def initialize(*a)
32
+ @var1 = a[0]
33
+ @var2 = a[1]
34
+ end
35
+
36
+ def serialized_members
37
+ [@var1, @var2]
38
+ end
39
+
40
+ def ==(rhs)
41
+ @var1 == rhs.var1 && @var2 == rhs.var2
42
+ end
43
+ end
44
+ end
45
+
46
+ class NonSerializableTestClass
47
+ attr_accessor :var1
48
+
49
+ def initialize(*a)
50
+ @var1 = a[0]
51
+ end
52
+
53
+ def to_msgpack(*a)
54
+ {
55
+ 'msgpack_class' => self.class.name,
56
+ 'data' => serialized_members
57
+ }.to_msgpack(*a)
58
+ end
59
+
60
+ def serialized_members
61
+ [@var1]
62
+ end
63
+ end
64
+
65
+ describe MessagePack do
66
+
67
+ it "should serialize an object when dump and unserialize when load to produce equivalent object" do
68
+ object = [1, 3.14, {"key" => "value"}]
69
+ MessagePack.load(MessagePack.dump(object)).should == object
70
+ end
71
+
72
+ it "should behave like JSON in terms of not preserving symbols" do
73
+ object = [1, 3.14, {:key => "value"}]
74
+ MessagePack.load(MessagePack.dump(object)).should == [1, 3.14, {"key" => "value"}]
75
+ end
76
+
77
+ it "should serialize arbitrary objects when dump and recreate when load" do
78
+ object = RightScale::TestClass.new({"key" => "value"}, [1, 2, "abc"])
79
+ data = MessagePack.dump(object)
80
+ (data =~ /msgpack_class.*RightScale::TestClass/).should be_true
81
+ MessagePack.load(data).should == object
82
+ end
83
+
84
+ it "should do nested creation of objects within arrays" do
85
+ test = RightScale::TestClass.new({"key" => "value"}, [1, 2, "abc"])
86
+ object = [1, 3.14, test]
87
+ data = MessagePack.dump(object)
88
+ (data =~ /msgpack_class.*RightScale::TestClass/).should be_true
89
+ MessagePack.load(data).should == object
90
+ end
91
+
92
+ it "should do nested creation of objects within hashes" do
93
+ test = RightScale::TestClass.new({"key" => "value"}, [1, 2, "abc"])
94
+ object = {"my_data" => [99, 4.3, 712345], "my_test" => test}
95
+ data = MessagePack.dump(object)
96
+ (data =~ /msgpack_class.*RightScale::TestClass/).should be_true
97
+ MessagePack.load(data).should == object
98
+ end
99
+
100
+ it "should do nested creation of objects recursively" do
101
+ test1 = RightScale::TestClass.new("some", "test")
102
+ test2 = RightScale::TestClass.new({"key" => "value"}, [1, 2, "abc"])
103
+ object = [{"my_data" => [99, 4.3, 712345], "my_tests" => {"test1" => test1, "test2" => test2}}, test1, test2]
104
+ data = MessagePack.dump(object)
105
+ (data =~ /msgpack_class.*RightScale::TestClass/).should be_true
106
+ MessagePack.load(data).should == object
107
+ end
108
+
109
+ it "should do nested creation of objects that are arguments in the creation of nested objects" do
110
+ test1 = RightScale::TestClass.new("some", "test")
111
+ test2 = RightScale::TestClass.new({"key" => "value"}, test1)
112
+ object = [{"my_data" => [99, 4.3, 712345], "my_tests" => {"test1" => test1, "test2" => test2}}, test1, test2]
113
+ data = MessagePack.dump(object)
114
+ (data =~ /msgpack_class.*RightScale::TestClass/).should be_true
115
+ MessagePack.load(data).should == object
116
+ end
117
+
118
+ it "should raise an exception if it finds a msgpack_class but there is no msgpack_generate method" do
119
+ data = MessagePack.dump(NonSerializableTestClass.new(nil))
120
+ (data =~ /msgpack_class.*NonSerializableTestClass/).should be_true
121
+ lambda { MessagePack.load(data) }.should raise_error(ArgumentError, /missing msgpack_create method/)
122
+ end
123
+
124
+ it "should raise an exception if it cannot resolve a named msgpack_class" do
125
+ object = [1, 3.14, {"msgpack_class" => "RightScale::BogusClass"}]
126
+ data = MessagePack.dump(object)
127
+ (data =~ /msgpack_class.*RightScale::BogusClass/).should be_true
128
+ lambda { MessagePack.load(data) }.should raise_error(ArgumentError, /Cannot find const/)
129
+ end
130
+
131
+ end
@@ -0,0 +1,132 @@
1
+ #
2
+ # Copyright (c) 2009-2013 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
24
+
25
+ module RightScale
26
+
27
+ # Add the ability to compare results for test purposes
28
+ class Result
29
+ def ==(other)
30
+ @token == other.token && @to == other.to && @from == other.from && @results == other.results
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ describe RightScale::SecureSerializer do
37
+
38
+ include RightScale::SpecHelper
39
+
40
+ before(:all) do
41
+ @dump_cert, @dump_key = issue_cert
42
+ @load_cert, @load_key = issue_cert
43
+ @dump_store = RightScale::StaticCertificateStore.new(@dump_cert, @dump_key, @load_cert, @load_cert)
44
+ @load_store = RightScale::StaticCertificateStore.new(@load_cert, @load_key, @dump_cert, @dump_cert)
45
+ @dump_id = RightScale::AgentIdentity.new("rs", "dump_agent", 1).to_s
46
+ @load_id = RightScale::AgentIdentity.new("rs", "load_agent", 1).to_s
47
+ end
48
+
49
+ it "must be initialized before use" do
50
+ data = RightScale::Result.new("token", "to", ["results"], "from")
51
+ lambda { RightScale::SecureSerializer.dump(data) }.should raise_error(Exception, "Secure serializer not initialized")
52
+ end
53
+
54
+ it "must specify agent identity" do
55
+ lambda { RightScale::SecureSerializer.init(RightScale::Serializer.new, nil, @load_store, false) }.
56
+ should raise_error(Exception, "Missing local agent identity")
57
+ end
58
+
59
+ it "must specify a credentials store" do
60
+ lambda { RightScale::SecureSerializer.init(RightScale::Serializer.new, @load_id, nil, false) }.
61
+ should raise_error(Exception, "Missing credentials store")
62
+ end
63
+
64
+ it "certificate store must contain certificate and key for agent" do
65
+ flexmock(@load_store).should_receive(:get_receiver).and_return([nil, nil]).once
66
+ lambda { RightScale::SecureSerializer.init(RightScale::Serializer.new, @load_id, @load_store, false) }.
67
+ should raise_error(Exception, "Missing local agent public certificate")
68
+ end
69
+
70
+ it "data must be serialized with MessagePack or JSON" do
71
+ data = RightScale::Result.new("token", "to", ["results"], "from")
72
+ RightScale::SecureSerializer.init(RightScale::Serializer.new, @load_id, @load_store, false)
73
+ lambda { RightScale::SecureSerializer.load(Marshal.dump(data)) }.should raise_error(RightScale::Serializer::SerializationError)
74
+ lambda { RightScale::SecureSerializer.load(YAML.dump(data)) }.should raise_error(RightScale::Serializer::SerializationError)
75
+ end
76
+
77
+ # Test with protocol versions on the boundary where msgpack was first supported
78
+ [[:msgpack, version_can_handle_msgpack_result, JSON],
79
+ [:json, version_cannot_handle_msgpack_result, MessagePack]].each do |type, version, other_class|
80
+
81
+ context "using #{type.inspect}" do
82
+
83
+ before(:each) do
84
+ flexmock(other_class).should_receive(:dump).never
85
+ flexmock(other_class).should_receive(:load).never
86
+ @data = RightScale::Result.new("token", "to", ["results"], "from", nil, nil, nil, nil, [version, version])
87
+ @serializer = RightScale::Serializer.new(type)
88
+ end
89
+
90
+ it "unserializes signed data" do
91
+ RightScale::SecureSerializer.init(@serializer, @dump_id, @dump_store, false)
92
+ data = RightScale::SecureSerializer.dump(@data)
93
+ RightScale::SecureSerializer.init(@serializer, @load_id, @load_store, false)
94
+ RightScale::SecureSerializer.load(data).should == @data
95
+ end
96
+
97
+ it "unserializes encrypted data" do
98
+ RightScale::SecureSerializer.init(@serializer, @dump_id, @dump_store, true)
99
+ data = RightScale::SecureSerializer.dump(@data)
100
+ @serializer.load(data)["encrypted"].should be_true
101
+ RightScale::SecureSerializer.init(@serializer, @load_id, @load_store, false)
102
+ RightScale::SecureSerializer.load(data).should == @data
103
+ end
104
+
105
+ it "encrypt option on initialization overrides dump option" do
106
+ RightScale::SecureSerializer.init(@serializer, @dump_id, @dump_store, true)
107
+ data = RightScale::SecureSerializer.dump(@data, false)
108
+ @serializer.load(data)["encrypted"].should be_true
109
+ end
110
+
111
+ it "uses id when supplied to choose credentials" do
112
+ RightScale::SecureSerializer.init(@serializer, @dump_id, @dump_store, true)
113
+ data = RightScale::SecureSerializer.dump(@data)
114
+ RightScale::SecureSerializer.init(@serializer, @load_id, @load_store, false)
115
+ flexmock(@load_store).should_receive(:get_receiver).with("id").and_return([@load_cert, @load_key]).once
116
+ RightScale::SecureSerializer.load(data, "id").should == @data
117
+ end
118
+
119
+ it "must be able to retrieve certificate and key to decrypt message" do
120
+ RightScale::SecureSerializer.init(@serializer, @dump_id, @dump_store, true)
121
+ data = RightScale::SecureSerializer.dump(@data)
122
+ RightScale::SecureSerializer.init(@serializer, @dump_id, @load_store, false)
123
+ flexmock(@load_store).should_receive(:get_receiver).with("id").and_return([nil, @load_key], [@load_cert, nil]).twice
124
+ lambda { RightScale::SecureSerializer.load(data, "id") }.
125
+ should raise_error(RightScale::SecureSerializer::MissingCertificate, /Could not find a certificate/)
126
+ lambda { RightScale::SecureSerializer.load(data, "id") }.
127
+ should raise_error(RightScale::SecureSerializer::MissingPrivateKey, /Could not find a private key/)
128
+ end
129
+ end
130
+ end
131
+
132
+ end
@@ -0,0 +1,90 @@
1
+ #
2
+ # Copyright (c) 2009-2011 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
24
+ require 'json/ext'
25
+
26
+ class TestClass1
27
+
28
+ include RightScale::Serializable
29
+
30
+ attr_accessor :name, :array, :date
31
+
32
+ def initialize(*args)
33
+ @name = args[0] if args.size > 0
34
+ @array = args[1] if args.size > 1
35
+ @date = args[2] if args.size > 2
36
+ end
37
+
38
+ def serialized_members
39
+ [@name, @array, @date]
40
+ end
41
+ end
42
+
43
+ class TestClass2
44
+
45
+ include RightScale::Serializable
46
+
47
+ attr_accessor :attr1, :attr2
48
+
49
+ def initialize(*args)
50
+ attr1 = args[0]
51
+ attr2 = args[1] if args.size > 1
52
+ end
53
+
54
+ def serialized_members
55
+ [@attr1, @attr2]
56
+ end
57
+
58
+ end
59
+
60
+ describe RightScale::Serializable do
61
+
62
+ it 'should serialize using MessagePack' do
63
+ a1 = TestClass1.new
64
+ a1.name = "Test1"
65
+ a1.array = ["some", "stuff" ]
66
+
67
+ b1 = TestClass1.new
68
+ b1.name = "Test2"
69
+ b1.array = ["some", "more", "stuff"]
70
+
71
+ c = TestClass2.new([a1, b1], 1234)
72
+ a1.to_msgpack
73
+ TestClass2.msgpack_create(c.to_msgpack).should == c
74
+ end
75
+
76
+ it 'should serialize using JSON' do
77
+ a1 = TestClass1.new
78
+ a1.name = "Test1"
79
+ a1.array = ["some", "stuff" ]
80
+
81
+ b1 = TestClass1.new
82
+ b1.name = "Test2"
83
+ b1.array = ["some", "more", "stuff"]
84
+
85
+ c = TestClass2.new([a1, b1], 1234)
86
+ a1.to_json
87
+ TestClass2.json_create(c.to_msgpack).should == c
88
+ end
89
+
90
+ end
@@ -0,0 +1,197 @@
1
+ #
2
+ # Copyright (c) 2009-2013 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
24
+
25
+ describe RightScale::Serializer do
26
+
27
+ describe "Format" do
28
+
29
+ it "supports MessagePack format" do
30
+ [ :msgpack, "msgpack" ].each do |format|
31
+ lambda { RightScale::Serializer.new(format).format.should == :msgpack }.should_not raise_error
32
+ end
33
+ end
34
+
35
+ it "supports JSON format" do
36
+ [ :json, "json" ].each do |format|
37
+ lambda { RightScale::Serializer.new(format).format.should == :json }.should_not raise_error
38
+ end
39
+ end
40
+
41
+ it "supports secure format" do
42
+ [ :secure, "secure" ].each do |format|
43
+ lambda { RightScale::Serializer.new(format).format.should == :secure }.should_not raise_error
44
+ end
45
+ end
46
+
47
+ it "should default to MessagePack format if none specified" do
48
+ RightScale::Serializer.new.format.should == :msgpack
49
+ end
50
+
51
+ it "should raise error if unsupported format specified" do
52
+ lambda { RightScale::Serializer.new(:yaml) }.should raise_error(ArgumentError)
53
+ end
54
+
55
+ end # Format
56
+
57
+ describe "Serialization" do
58
+
59
+ it "should use MessagePack as default serializer and not cascade to others" do
60
+ serializer = RightScale::Serializer.new
61
+ flexmock(serializer).should_receive(:cascade_serializers).with(:dump, "hello", [MessagePack]).once
62
+ serializer.dump("hello")
63
+ end
64
+
65
+ it "should use preferred serializer if specified and not cascade to others" do
66
+ serializer = RightScale::Serializer.new(:json)
67
+ flexmock(serializer).should_receive(:cascade_serializers).with(:dump, "hello", [JSON]).once
68
+ serializer.dump("hello")
69
+ end
70
+
71
+ it "should raise SerializationError if packet could not be serialized and not try other serializer" do
72
+ flexmock(MessagePack).should_receive(:dump).with("hello").and_raise(StandardError).once
73
+ flexmock(JSON).should_receive(:dump).with("hello").and_raise(StandardError).once
74
+ serializer = RightScale::Serializer.new(:msgpack)
75
+ lambda { serializer.dump("hello") }.should raise_error(RightScale::Serializer::SerializationError)
76
+ serializer = RightScale::Serializer.new(:json)
77
+ lambda { serializer.dump("hello") }.should raise_error(RightScale::Serializer::SerializationError)
78
+ end
79
+
80
+ it "should return serialized packet" do
81
+ serialized_packet = flexmock("Packet")
82
+ flexmock(MessagePack).should_receive(:dump).with("hello").and_return(serialized_packet).once
83
+ serializer = RightScale::Serializer.new
84
+ serializer.dump("hello").should == serialized_packet
85
+ end
86
+
87
+ it "should be able to override preferred format" do
88
+ serializer = RightScale::Serializer.new(:json)
89
+ flexmock(serializer).should_receive(:cascade_serializers).with(:dump, "hello", [MessagePack]).once
90
+ flexmock(serializer).should_receive(:cascade_serializers).with(:dump, "hello", [JSON]).never
91
+ serializer.dump("hello", :msgpack)
92
+ end
93
+
94
+ it "should not be able to override preferred format when secure" do
95
+ serializer = RightScale::Serializer.new(:secure)
96
+ flexmock(serializer).should_receive(:cascade_serializers).with(:dump, "hello", [RightScale::SecureSerializer]).once
97
+ flexmock(serializer).should_receive(:cascade_serializers).with(:dump, "hello", [MessagePack]).never
98
+ serializer.dump("hello", :msgpack)
99
+ end
100
+
101
+ describe "MessagePack for common classes" do
102
+
103
+ it "should serialize Date object" do
104
+ serializer = RightScale::Serializer.new(:msgpack)
105
+ date = Date.today
106
+ data = serializer.dump(date)
107
+ Date.strptime(serializer.load(data), "%Y-%m-%d").should == date
108
+ end
109
+
110
+ it "should serialize Time object" do
111
+ serializer = RightScale::Serializer.new(:msgpack)
112
+ time = Time.now
113
+ data = serializer.dump(time)
114
+ if RUBY_VERSION < "1.9.0"
115
+ Time.parse(serializer.load(data)).to_i.should == time.to_i
116
+ else
117
+ DateTime.parse(serializer.load(data)).to_time.to_i.should == time.to_i
118
+ end
119
+ end
120
+
121
+ it "should serialize DateTime object" do
122
+ serializer = RightScale::Serializer.new(:msgpack)
123
+ date_time = DateTime.now
124
+ data = serializer.dump(date_time)
125
+ DateTime.parse(serializer.load(data)).to_s.should == date_time.to_s
126
+ end
127
+
128
+ end
129
+
130
+ end # Serialization of Packet
131
+
132
+ describe "Unserialization" do
133
+
134
+ it "should cascade through available serializers" do
135
+ serializer = RightScale::Serializer.new
136
+ flexmock(serializer).should_receive(:cascade_serializers).with(:load, "olleh", [JSON, MessagePack], nil).once
137
+ serializer.load("olleh")
138
+ end
139
+
140
+ it "should try all supported formats (MessagePack, JSON)" do
141
+ flexmock(MessagePack).should_receive(:load).with("olleh").and_raise(StandardError).once
142
+ flexmock(JSON).should_receive(:load).with("olleh").and_raise(StandardError).once
143
+ lambda { RightScale::Serializer.new.load("olleh") }.should raise_error(RightScale::Serializer::SerializationError)
144
+ end
145
+
146
+ it "should try JSON format first if looks like JSON even if MessagePack preferred" do
147
+ object = [1, 2, 3]
148
+ serialized = object.to_json
149
+ flexmock(MessagePack).should_receive(:load).with(serialized).never
150
+ flexmock(JSON).should_receive(:load).with(serialized).and_return(object).once
151
+ RightScale::Serializer.new(:msgpack).load(serialized)
152
+ end
153
+
154
+ it "should try MessagePack format first if looks like MessagePack even if JSON preferred" do
155
+ object = [1, 2, 3]
156
+ serialized = object.to_msgpack
157
+ flexmock(JSON).should_receive(:load).with(serialized).never
158
+ flexmock(MessagePack).should_receive(:load).with(serialized).and_return(object).once
159
+ RightScale::Serializer.new(:json).load(serialized)
160
+ end
161
+
162
+ it "should pass optional id to SecureSerializer" do
163
+ object = [1, 2, 3]
164
+ serialized = "securely serialized"
165
+ flexmock(RightScale::SecureSerializer).should_receive(:load).with(serialized, "id").and_return(object).once
166
+ RightScale::Serializer.new(:secure).load(serialized, "id")
167
+ end
168
+
169
+ it "should not pass optional id to MessagePack serializer" do
170
+ object = [1, 2, 3]
171
+ serialized = object.to_msgpack
172
+ RightScale::Serializer.new(:msgpack).load(serialized, "id").should == object
173
+ end
174
+
175
+ it "should not pass optional id to JSON serializer" do
176
+ object = [1, 2, 3]
177
+ serialized = object.to_json
178
+ RightScale::Serializer.new(:json).load(serialized, "id").should == object
179
+ end
180
+
181
+ it "should raise SerializationError if packet could not be unserialized" do
182
+ flexmock(MessagePack).should_receive(:load).with("olleh").and_raise(StandardError).once
183
+ flexmock(JSON).should_receive(:load).with("olleh").and_raise(StandardError).once
184
+ serializer = RightScale::Serializer.new
185
+ lambda { serializer.load("olleh") }.should raise_error(RightScale::Serializer::SerializationError)
186
+ end
187
+
188
+ it "should return unserialized packet" do
189
+ unserialized_packet = flexmock("Packet")
190
+ flexmock(MessagePack).should_receive(:load).with("olleh").and_return(unserialized_packet).once
191
+ serializer = RightScale::Serializer.new(:msgpack)
192
+ serializer.load("olleh").should == unserialized_packet
193
+ end
194
+
195
+ end # De-Serialization of Packet
196
+
197
+ end # RightScale::Serializer