siffer 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/LICENSE +1 -1
  2. data/README +93 -0
  3. data/lib/siffer.rb +13 -16
  4. data/lib/siffer/agent.rb +39 -31
  5. data/lib/siffer/core_ext/hash.rb +15 -0
  6. data/lib/siffer/messages.rb +38 -4
  7. data/lib/siffer/messages/ack.rb +160 -35
  8. data/lib/siffer/messages/event.rb +20 -0
  9. data/lib/siffer/messages/message.rb +47 -58
  10. data/lib/siffer/messages/provide.rb +25 -0
  11. data/lib/siffer/messages/provision.rb +17 -0
  12. data/lib/siffer/messages/register.rb +42 -52
  13. data/lib/siffer/messages/request.rb +138 -0
  14. data/lib/siffer/messages/response.rb +48 -0
  15. data/lib/siffer/messages/subscribe.rb +17 -0
  16. data/lib/siffer/messages/system_control.rb +94 -0
  17. data/lib/siffer/models.rb +1 -0
  18. data/lib/siffer/models/address.rb +39 -0
  19. metadata +25 -146
  20. data/README.rdoc +0 -65
  21. data/Rakefile +0 -64
  22. data/bin/siffer +0 -71
  23. data/doc/SIF ImplementationSpecification.pdf +0 -0
  24. data/doc/rdoc/classes/Siffer.html +0 -259
  25. data/doc/rdoc/classes/Siffer/Agent.html +0 -177
  26. data/doc/rdoc/classes/Siffer/Container.html +0 -165
  27. data/doc/rdoc/classes/Siffer/Messages.html +0 -81
  28. data/doc/rdoc/classes/Siffer/Messages/Ack.html +0 -115
  29. data/doc/rdoc/classes/Siffer/Messages/Acl.html +0 -83
  30. data/doc/rdoc/classes/Siffer/Messages/Error.html +0 -157
  31. data/doc/rdoc/classes/Siffer/Messages/Message.html +0 -235
  32. data/doc/rdoc/classes/Siffer/Messages/Message/Header.html +0 -107
  33. data/doc/rdoc/classes/Siffer/Messages/Register.html +0 -154
  34. data/doc/rdoc/classes/Siffer/Messages/RequestBody.html +0 -185
  35. data/doc/rdoc/classes/Siffer/Messages/Status.html +0 -156
  36. data/doc/rdoc/classes/Siffer/Messaging.html +0 -212
  37. data/doc/rdoc/classes/Siffer/Protocol.html +0 -254
  38. data/doc/rdoc/classes/Siffer/Protocol/NonPostRequest.html +0 -54
  39. data/doc/rdoc/classes/Siffer/Protocol/UnknownPath.html +0 -54
  40. data/doc/rdoc/classes/Siffer/Registration.html +0 -251
  41. data/doc/rdoc/classes/Siffer/Request.html +0 -103
  42. data/doc/rdoc/classes/Siffer/RequestLogger.html +0 -109
  43. data/doc/rdoc/classes/Siffer/Response.html +0 -91
  44. data/doc/rdoc/classes/Siffer/Server.html +0 -156
  45. data/doc/rdoc/created.rid +0 -1
  46. data/doc/rdoc/files/LICENSE.html +0 -76
  47. data/doc/rdoc/files/README_rdoc.html +0 -131
  48. data/doc/rdoc/files/lib/siffer/agent_rb.html +0 -49
  49. data/doc/rdoc/files/lib/siffer/container_rb.html +0 -57
  50. data/doc/rdoc/files/lib/siffer/messages/ack_rb.html +0 -49
  51. data/doc/rdoc/files/lib/siffer/messages/acl_rb.html +0 -49
  52. data/doc/rdoc/files/lib/siffer/messages/error_rb.html +0 -49
  53. data/doc/rdoc/files/lib/siffer/messages/message_rb.html +0 -49
  54. data/doc/rdoc/files/lib/siffer/messages/register_rb.html +0 -49
  55. data/doc/rdoc/files/lib/siffer/messages/request_body_rb.html +0 -49
  56. data/doc/rdoc/files/lib/siffer/messages/status_rb.html +0 -49
  57. data/doc/rdoc/files/lib/siffer/messages_rb.html +0 -63
  58. data/doc/rdoc/files/lib/siffer/messaging_rb.html +0 -49
  59. data/doc/rdoc/files/lib/siffer/protocol_rb.html +0 -49
  60. data/doc/rdoc/files/lib/siffer/registration_rb.html +0 -49
  61. data/doc/rdoc/files/lib/siffer/request_logger_rb.html +0 -49
  62. data/doc/rdoc/files/lib/siffer/request_rb.html +0 -49
  63. data/doc/rdoc/files/lib/siffer/response_rb.html +0 -49
  64. data/doc/rdoc/files/lib/siffer/server_rb.html +0 -49
  65. data/doc/rdoc/files/lib/siffer_rb.html +0 -64
  66. data/doc/rdoc/fr_class_index.html +0 -25
  67. data/doc/rdoc/fr_file_index.html +0 -39
  68. data/doc/rdoc/fr_method_index.html +0 -4539
  69. data/doc/rdoc/index.html +0 -15
  70. data/doc/rdoc/rdoc-style.css +0 -319
  71. data/lib/siffer/container.rb +0 -94
  72. data/lib/siffer/messages/acl.rb +0 -25
  73. data/lib/siffer/messages/error.rb +0 -174
  74. data/lib/siffer/messages/request_body.rb +0 -66
  75. data/lib/siffer/messages/status.rb +0 -55
  76. data/lib/siffer/messaging.rb +0 -99
  77. data/lib/siffer/protocol.rb +0 -164
  78. data/lib/siffer/registration.rb +0 -87
  79. data/lib/siffer/request.rb +0 -28
  80. data/lib/siffer/request_logger.rb +0 -32
  81. data/lib/siffer/response.rb +0 -26
  82. data/lib/siffer/server.rb +0 -42
  83. data/spec/agent_spec.rb +0 -48
  84. data/spec/cli_spec.rb +0 -40
  85. data/spec/container_spec.rb +0 -103
  86. data/spec/default_agent +0 -6
  87. data/spec/default_server +0 -5
  88. data/spec/message_specs/ack_spec.rb +0 -28
  89. data/spec/message_specs/error_spec.rb +0 -24
  90. data/spec/message_specs/header_spec.rb +0 -25
  91. data/spec/message_specs/message_spec.rb +0 -57
  92. data/spec/message_specs/register_spec.rb +0 -86
  93. data/spec/message_specs/request_body_spec.rb +0 -58
  94. data/spec/message_specs/status_spec.rb +0 -25
  95. data/spec/messaging_spec.rb +0 -85
  96. data/spec/protocol_spec.rb +0 -50
  97. data/spec/registration_spec.rb +0 -33
  98. data/spec/request_logger_spec.rb +0 -28
  99. data/spec/request_spec.rb +0 -25
  100. data/spec/response_spec.rb +0 -24
  101. data/spec/server_spec.rb +0 -30
  102. data/spec/spec_helper.rb +0 -35
@@ -1,24 +0,0 @@
1
- require File.join(File.dirname(__FILE__),"..","spec_helper")
2
-
3
- describe Siffer::Messages::Error do
4
-
5
- it "should properly match the SIF Spec (random crap test)" do
6
- error = Siffer::Messages::Error.new(8,3)
7
- error.category.should == "Request and Response"
8
- error.code.should == "Invalid object"
9
-
10
- error = Siffer::Messages::Error.new(5,2)
11
- error.category.should == "Registration"
12
- error.code.should == "The SIF_SourceId is invalid"
13
- end
14
-
15
- it "should output xml through read method" do
16
- error = Siffer::Messages::Error.new(4,8, "Added Extended")
17
- error.read.should match(/SIF_Error/)
18
- error.read.should match(/SIF_Category>4<\/SIF_Category/)
19
- error.read.should match(/SIF_Code>8<\/SIF_Code/)
20
- error.read.should match(/SIF_Desc>#{error.code}<\/SIF_Desc/)
21
- error.read.should match(/SIF_ExtendedDesc>Added Extended<\/SIF_Extended/)
22
- end
23
-
24
- end
@@ -1,25 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "spec_helper")
2
-
3
- include Siffer::Messages
4
-
5
- describe Message::Header do
6
-
7
- before(:each) do
8
- @header = Message::Header.new "source_name"
9
- end
10
-
11
- it "should have a timestamp" do
12
- @header.timestamp.should_not be_nil
13
- end
14
-
15
- it "should have a GUID/UUID" do
16
- @header.msg_id.should_not be_nil
17
- end
18
-
19
- it "should have a GUID/UUID that matches SIF textual format" do
20
- @header = Message::Header.new "source_name"
21
- @header.msg_id.should_not match(/^[a-z\-\s]+$/)
22
- @header.msg_id.should match(/^[A-Z0-9]+$/)
23
- end
24
-
25
- end
@@ -1,57 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "..", "spec_helper")
2
-
3
- include Siffer::Messages
4
-
5
- describe Message do
6
-
7
- before(:each) do
8
- @message = Message.new("source_name")
9
- end
10
-
11
- it "should have SIF version" do
12
- @message.version.should == Siffer.sif_version
13
- end
14
-
15
- it "should have SIF xml namespace" do
16
- @message.xmlns.should == Siffer.sif_xmlns
17
- end
18
-
19
- it "should have a header" do
20
- @message.header.should_not be_nil
21
- @message.header.source_id.should == "source_name"
22
- end
23
-
24
- it "should raise exception for missing source identifier" do
25
- lambda{
26
- @message = Message.new(nil)
27
- }.should raise_error("Source not provided.")
28
- end
29
-
30
- it "should render SIF compliant instruct line" do
31
- @message.content.should match(/<SIF_Message/)
32
- @message.content.should match(/xmlns="#{Siffer.sif_xmlns}"/)
33
- @message.content.should match(/version="#{Siffer.sif_version}"/)
34
- @message.content.should match(/<\/SIF_Message>/)
35
- end
36
-
37
- it "should respond to 'to_str'" do
38
- @message.should respond_to("to_str")
39
- @message.to_str.should match(/SIF_Message/)
40
- end
41
-
42
- it "should respond to 'read'" do
43
- @message.should respond_to("read")
44
- @message.read.should match(/SIF_Message/)
45
- end
46
-
47
- it "should allow xmlns override" do
48
- @message = Message.new("source", :xmlns => "bogus")
49
- @message.xmlns.should == "bogus"
50
- end
51
-
52
- it "should allow version override" do
53
- @message = Message.new("source", :version => '9.9')
54
- @message.version.should == "9.9"
55
- end
56
-
57
- end
@@ -1,86 +0,0 @@
1
- require File.join(File.dirname(__FILE__),"..","spec_helper")
2
-
3
- include Siffer::Messages
4
-
5
- describe Siffer::Messages::Register do
6
-
7
- it "should reqiure a name of the Registering Agent" do
8
- lambda {
9
- reg = Register.new("source",nil)
10
- }.should raise_error("Agent name required")
11
- end
12
-
13
- end
14
-
15
- describe Siffer::Messages::Register, "defaults" do
16
-
17
- before(:each) do
18
- @reg = Register.new("source", "agent")
19
- end
20
-
21
- it "should default to Siffer.version version" do
22
- @reg.version.should == Siffer.sif_version
23
- end
24
-
25
- it "should defaut to Pull mode" do
26
- @reg.mode.should == 'Pull'
27
- end
28
-
29
- it "should default to 1024 max buffer" do
30
- @reg.max_buffer.should == 1024
31
- end
32
-
33
- it "should default vendor to h3o(software)" do
34
- @reg.vendor.should == Siffer.vendor
35
- end
36
-
37
- end
38
-
39
- describe Siffer::Messages::Register, "overrides" do
40
- it "should allow sif version override" do
41
- reg = Register.new("source","agent",:version => '9.9')
42
- reg.version.should == '9.9'
43
- end
44
-
45
- it "should allow max_buffer override" do
46
- reg = Register.new("source", "agent", :max_buffer => 2048)
47
- reg.max_buffer.should == 2048
48
- end
49
-
50
- it "should allow mode override" do
51
- reg = Register.new("source", "agent", :mode => 'Push')
52
- reg.mode.should == "Push"
53
- end
54
- end
55
-
56
- describe Siffer::Messages::Register, "content" do
57
-
58
- before(:each) do
59
- @reg = Register.new("source", "agent")
60
- end
61
-
62
- it "should have max buffer size" do
63
- @reg.content.should match(/SIF_MaxBufferSize>1024<\/SIF_MaxBufferSize/)
64
- end
65
-
66
- it "should have agent name" do
67
- @reg.content.should match(/SIF_Name>agent<\/SIF_Name>/)
68
- end
69
-
70
- it "should parse name from body" do
71
- Register.parse(@reg.content).name.should == "agent"
72
- end
73
-
74
- it "should parse SIF version from body" do
75
- Register.parse(@reg.content).version.should == Siffer.sif_version
76
- end
77
-
78
- it "should parse max buffer size from body" do
79
- Register.parse(@reg.content).max_buffer.should == 1024
80
- end
81
-
82
- it "should parse mode from body" do
83
- Register.parse(@reg.content).mode.should == "Pull"
84
- end
85
-
86
- end
@@ -1,58 +0,0 @@
1
- require File.join(File.dirname(__FILE__),"..","spec_helper")
2
-
3
- describe Siffer::Messages::RequestBody do
4
-
5
- before(:each) do
6
- @xml = Siffer::Messages::Register.new("Clints Agent", "test server name")
7
- @msg = Siffer::Messages::RequestBody.parse(@xml)
8
- end
9
-
10
- it "should require 'read'able input" do
11
- lambda {
12
- Siffer::Messages::RequestBody.parse([])
13
- }.should raise_error("Unable to read Xml")
14
- end
15
-
16
- it "should allow StringIO input" do
17
- lambda {
18
- Siffer::Messages::RequestBody.parse(StringIO.new(@xml))
19
- }.should_not raise_error
20
- end
21
-
22
- it "should allow string input" do
23
- lambda {
24
- Siffer::Messages::RequestBody.parse(@xml)
25
- }.should_not raise_error
26
- end
27
-
28
- it "should parse message type" do
29
- @msg.type.should == "Register"
30
- end
31
-
32
- it "should parse message type within SystemControl" do
33
- ping = "<SIF_Message><SIF_SystemControl><SIF_Ping /></SIF_SystemControl></SIF_Message>"
34
- @msg = Siffer::Messages::RequestBody.parse(ping)
35
- @msg.type.should == "Ping"
36
- end
37
-
38
- it "should raise error when type not parsible" do
39
- lambda {
40
- Siffer::Messages::RequestBody.parse("<SIF_Message></SIF_Message>").type
41
- }.should
42
- raise_error("Failed to parse <SIF_Message></SIF_Message> for SIF Type")
43
- end
44
-
45
- it "should parse source id" do
46
- @msg.source_id.should == @xml.source_id
47
- end
48
-
49
- it "should parse msg id" do
50
- @msg.msg_id.should == @xml.msg_id
51
- end
52
-
53
- it "should drop SIF_ from element names" do
54
- msg = Siffer::Messages::RequestBody.new("test")
55
- msg.send("drop_sif","SIF_Test").should == "Test"
56
- end
57
-
58
- end
@@ -1,25 +0,0 @@
1
- require File.join(File.dirname(__FILE__),"..","spec_helper")
2
-
3
- describe Siffer::Messages::Status do
4
- it "should return message for each status code" do
5
- Siffer::Messages::Status::CODES.each do |key,value|
6
- msg = Siffer::Messages::Status.send(value.downcase)
7
- msg.should_not be_nil
8
- msg.code.should == key
9
- msg.description.should == value
10
- msg.data.should be_nil
11
- end
12
- end
13
-
14
- it "should have a SIF_Status element body" do
15
- success = Siffer::Messages::Status.success
16
- success.read.should match(/SIF_Status/)
17
- success.read.should match(/SIF_Code>0<\/SIF_Code/)
18
- success.read.should match(/SIF_Description>Success</)
19
- end
20
-
21
- it "should allow data to hold other SIF_Message(s)" do
22
- data = Siffer::Messages::Status.success(Siffer::Messages::Message.new("source"))
23
- data.read.should match(/SIF_Data><SIF_Message/)
24
- end
25
- end
@@ -1,85 +0,0 @@
1
- require File.join(File.dirname(__FILE__),"spec_helper")
2
-
3
- # The messaging is best tested doing a full request/response
4
- # cycle using both Server and Agent components
5
-
6
- [Siffer::Server, Siffer::Agent].each do |component|
7
-
8
- # Stage the component a little bit:
9
- # Agents require Servers
10
- # Both require central-admin
11
- component = component.new("admin" => 'none', "server" => '')
12
- msg = Siffer::Messages::Message.new("source").content{|xml| xml.SIF_Bogus}
13
-
14
- describe component, "Messaging - response" do
15
- it "should always return Ack for proper SIF_Messages" do
16
- for_every_path(:on => component, :input => msg) do |res|
17
- res.body.should match(/SIF_Ack/)
18
- end
19
- end
20
- end
21
-
22
- describe component, "Messaging - content-type" do
23
- it "should always respond with application/xml" do
24
- for_every_path(:on => component, :input => msg) do |res|
25
- res.content_type.should == Siffer::Messaging::MIME_TYPES["appxmlencoded"]
26
- end
27
- end
28
-
29
- it "should only receive application/xml" do
30
- for_every_path(:on => component,"CONTENT_TYPE" => "x") do |res|
31
- res.should be_client_error
32
- res.status.should == 406
33
- end
34
- end
35
- end
36
-
37
- describe component, "Messaging - validation" do
38
-
39
- it "should return Xml Error code for bad message (xml)" do
40
- %w[<Junk>>>> <Junk> </Junk> Junk !@ex].each do |msg|
41
- for_every_path(:on => component, :input => msg) do |res|
42
- res.body.should match(/SIF_Error/)
43
- res.body.should match(/SIF_Category>1<\/SIF_Category/)
44
- res.body.should match(/SIF_Code>2<\/SIF_Code>/)
45
- res.body.should match(/Message is not well-formed/)
46
- # spec says Oringals should be included and empty
47
- res.body.should match(/SIF_OriginalSourceId\s*\/>/)
48
- res.body.should match(/SIF_OriginalMsgId\s*\/>/)
49
- end
50
- end
51
- end
52
-
53
- it "should validaate message is SIF_Message" do
54
- msg = "<someotherkind><of>XML</of></someotherkind>"
55
- for_every_path(:on => component, :input => msg) do |res|
56
- res.body.should match(/SIF_Category>12/)
57
- res.body.should match(/SIF_Code>2/)
58
- end
59
- end
60
-
61
- it "should validate message xmlns" do
62
- msg = Siffer::Messages::Register.new(
63
- "bad-xmlns",
64
- component.name,
65
- :xmlns => 'http://bogus.xmlns')
66
- for_every_path(:on => component, :input => msg) do |res|
67
- res.body.should match(/SIF_Category>1<\/SIF_Category/)
68
- res.body.should match(/SIF_Code>4<\/SIF_Code/)
69
- res.body.should match(/SIF_ExtendedDesc>XMLNS not compatible with SIF/)
70
- end
71
- end
72
-
73
- it "should validate SIF version" do
74
- msg = Siffer::Messages::Register.new(
75
- "bad-version",
76
- component.name,
77
- :version => '99.99')
78
- for_every_path(:on => component, :input => msg) do |res|
79
- res.body.should match(/SIF_Category>12<\/SIF_Category/)
80
- res.body.should match(/SIF_Code>3<\/SIF_Code>/)
81
- end
82
- end
83
- end
84
-
85
- end
@@ -1,50 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "spec_helper")
2
-
3
- [Siffer::Server, Siffer::Agent].each do |component|
4
-
5
- # Stage the component a little bit:
6
- # Agents require Servers
7
- # Both require central-admin
8
- component = component.new("admin" => 'none', "server" => '')
9
-
10
- describe component, "Protocol - /unknown_path" do
11
- it "should return 404" do
12
- res = Rack::MockRequest.new(component).post("/bad_path")
13
- res.should be_not_found
14
- end
15
- end
16
-
17
- describe component, "Protocol - Accepted Paths except Root URL" do
18
- it "should only allow POST method" do
19
- Siffer::Protocol::ACCEPTABLE_PATHS.each do |name,path|
20
- if(path != "/")
21
- res = Rack::MockRequest.new(component).get(path)
22
- res.should be_client_error
23
- end
24
- end
25
- end
26
- end
27
-
28
- describe component, "Protocol - Root URL on GET" do
29
- it "should display component info" do
30
- res = Rack::MockRequest.new(component).get("/")
31
- res.should be_ok
32
- res.body.should match(/<h1>Siffer Endpoint<\/h1>/)
33
- end
34
- end
35
-
36
- describe component, "Protocol - URI" do
37
-
38
- it "should respond to uri" do
39
- component.uri.should == "http://localhost:8300"
40
- end
41
-
42
- it "should respond to full url in uri" do
43
- component = component.class.new("admin" => "none",
44
- "server" => "",
45
- "host" => "http://localhost")
46
- component.uri.should == "http://localhost:8300"
47
- end
48
- end
49
-
50
- end
@@ -1,33 +0,0 @@
1
- require File.join(File.dirname(__FILE__),"spec_helper")
2
-
3
- # Registration is best tested through the Siffer::Server component
4
-
5
- describe Siffer::Registration do
6
-
7
- before(:each) do
8
- @server = Siffer::Server.new("admin" => "none")
9
- end
10
-
11
- it "should determine agent registration" do
12
- @server.registered?("Default Agent").should be_false
13
- @server.agents["Default Agent"] = "http://localhost"
14
- @server.registered?("Default Agent").should be_true
15
- end
16
-
17
- it "should return not registered message for non-registered agents" do
18
- msg = Siffer::Messages::Message.new("Default Agent")
19
- msg.content do |xml|
20
- xml.SIF_Ping
21
- end
22
- res = response_to(msg)
23
- res.body.should match(/SIF_Category>4/)
24
- res.body.should match(/SIF_Code>9/)
25
- end
26
-
27
- it "should return ACL for successful registration" do
28
- msg = Siffer::Messages::Register.new("Default Agent", "Default Agent")
29
- res = response_to(msg)
30
- res.body.should match(/SIF_Ack/)
31
- res.body.should match(/SIF_Status/)
32
- end
33
- end