radiodns 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -18,8 +18,8 @@ Then if you already have the Fully Qualified Domain Name as specified
18
18
  in the [RadioDNS spec](http://radiodns.org/wp-content/uploads/2009/03/rdns011.pdf), you
19
19
  can resolve it into a CNAME like so
20
20
 
21
- cname = RadioDNS::Resolver.resolve('09580.c586.ce1.fm.radiodns.org')
22
- puts cname #=> 'rdns.musicradio.com'
21
+ service = RadioDNS::Resolver.resolve('09580.c586.ce1.fm.radiodns.org')
22
+ puts service.cname #=> 'rdns.musicradio.com'
23
23
 
24
24
  You can also pass in the parameters required to construct the FQDN to
25
25
  the resolve method
@@ -30,10 +30,29 @@ the resolve method
30
30
  :ecc => 'ce1',
31
31
  :bearer => 'fm'
32
32
  }
33
- cname = RadioDNS::Resolver.resolve(params)
33
+ service = RadioDNS::Resolver.resolve(params)
34
34
 
35
35
  The bearers `fm`, `dab`, `drm`, `amss` and `hd` are supported.
36
36
 
37
+ Once you have a service you can perform application discovery
38
+
39
+ radiovis_application = service.radiovis
40
+
41
+ radiovis_application.host #=> "_radiovis._tcp.rdns.musicradio.com"
42
+ radiovis_application.port #=> 61613
43
+
44
+ Or to get an array of supported applications
45
+
46
+ service.applications
47
+
48
+ Returns an array of Applications
49
+
50
+ [#<RadioDNS::Application @host="_radioepg._tcp.rdns.musicradio.com", @port=61613>,
51
+ #<RadioDNS::Application @host="_radiovis._tcp.rdns.musicradio.com", @port=61613>]
52
+
53
+ In the future these may become instances of specific classes that
54
+ implement the application-specific behaviour.
55
+
37
56
  ## TODO
38
57
 
39
58
  - better error checking of supplied parameters. The code current
@@ -43,5 +62,3 @@ The bearers `fm`, `dab`, `drm`, `amss` and `hd` are supported.
43
62
 
44
63
  - return an appropriate error if DNS look-up does not resolve to
45
64
  CNAME.
46
-
47
- - service discovery
data/lib/radiodns.rb CHANGED
@@ -1,6 +1,56 @@
1
1
  require 'resolv'
2
2
 
3
3
  module RadioDNS
4
+ class Service
5
+ attr_accessor :cname
6
+ def initialize(cname)
7
+ @cname = cname
8
+ end
9
+
10
+ def radiovis
11
+ application(:radiovis)
12
+ end
13
+
14
+ def radioepg
15
+ application(:radioepg)
16
+ end
17
+
18
+ def radiotag
19
+ application(:radiotag)
20
+ end
21
+
22
+ def applications
23
+ applications = []
24
+ [:radiotag, :radioepg, :radiovis].each do |method_name|
25
+ application = self.send(method_name)
26
+ applications << application if application
27
+ end
28
+ applications
29
+ end
30
+
31
+ def application(service)
32
+ resolver = Resolv::DNS.new
33
+
34
+ prefix = "_#{service.to_s}._tcp."
35
+ host = prefix + cname
36
+ begin
37
+ resource = resolver.getresource(host,
38
+ Resolv::DNS::Resource::IN::SRV)
39
+ Application.new :host => host, :port => resource.port
40
+ rescue Resolv::ResolvError
41
+ nil
42
+ end
43
+ end
44
+ end
45
+
46
+ class Application
47
+ attr_accessor :host, :port
48
+ def initialize(params)
49
+ @host = params[:host]
50
+ @port = params[:port]
51
+ end
52
+ end
53
+
4
54
  class Resolver
5
55
  def self.resolve(fqdn)
6
56
  if fqdn.is_a? Hash
@@ -9,7 +59,7 @@ module RadioDNS
9
59
 
10
60
  resolver = Resolv::DNS.new
11
61
  cname = resolver.getresource(fqdn, Resolv::DNS::Resource::IN::CNAME)
12
- cname.name.to_s
62
+ Service.new(cname.name.to_s)
13
63
  end
14
64
 
15
65
  def self.construct_fqdn(params)
@@ -1,3 +1,3 @@
1
1
  module Radiodns
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -3,6 +3,65 @@ require 'minitest/autorun'
3
3
  require 'mocha'
4
4
  require 'radiodns'
5
5
 
6
+ describe "RadioDNS::Service" do
7
+ before(:each) do
8
+ @service = RadioDNS::Service.new('rdns.musicradio.com')
9
+ end
10
+
11
+ it "has a cname" do
12
+ assert @service.respond_to? :cname
13
+ end
14
+
15
+ it "looks up radiovis application" do
16
+ @service.expects(:application).with(:radiovis).returns(nil)
17
+ @service.radiovis
18
+ end
19
+
20
+ it "looks up radiotag application" do
21
+ @service.expects(:application).with(:radiotag).returns(nil)
22
+ @service.radiotag
23
+ end
24
+
25
+ it "looks up radioepg application" do
26
+ @service.expects(:application).with(:radioepg).returns(nil)
27
+ @service.radioepg
28
+ end
29
+
30
+ it "has an array of supported applications" do
31
+ @service.expects(:application).with(:radioepg).returns(:epg)
32
+ @service.expects(:application).with(:radiovis).returns(:vis)
33
+ @service.expects(:application).with(:radiotag).returns(:tag)
34
+ assert_equal [:tag, :epg, :vis], @service.applications
35
+ end
36
+
37
+ it "performs SVR lookups" do
38
+ mock_resolver = mock()
39
+ mock_resource = mock()
40
+ mock_resolver.expects(:getresource).
41
+ with('_some_application._tcp.rdns.musicradio.com', Resolv::DNS::Resource::IN::SRV).once.
42
+ returns(mock_resource)
43
+ mock_resource.expects(:port).returns(1234)
44
+ Resolv::DNS.expects(:new).returns(mock_resolver)
45
+
46
+ application = @service.application(:some_application)
47
+
48
+ assert_equal application.host, "_some_application._tcp.rdns.musicradio.com"
49
+ assert_equal application.port, 1234
50
+ end
51
+
52
+ it "returns nil when lookup fails" do
53
+ mock_resolver = mock()
54
+ mock_resource = mock()
55
+ mock_resolver.expects(:getresource).
56
+ with('_some_application._tcp.rdns.musicradio.com', Resolv::DNS::Resource::IN::SRV).once.
57
+ raises(Resolv::ResolvError)
58
+ Resolv::DNS.expects(:new).returns(mock_resolver)
59
+
60
+ application = @service.application(:some_application)
61
+ assert application.nil?
62
+ end
63
+ end
64
+
6
65
  describe "RadioDNS::Resolver" do
7
66
  describe "resolve" do
8
67
  before(:each) do
@@ -16,8 +75,8 @@ describe "RadioDNS::Resolver" do
16
75
  Resolv::DNS.expects(:new).returns(mock_resolver)
17
76
  end
18
77
  it "should query radiodns.org" do
19
- cname = RadioDNS::Resolver.resolve('09580.c586.ce1.fm.radiodns.org')
20
- assert_equal 'rdns.musicradio.com', cname
78
+ service = RadioDNS::Resolver.resolve('09580.c586.ce1.fm.radiodns.org')
79
+ assert_equal 'rdns.musicradio.com', service.cname
21
80
  end
22
81
 
23
82
  it "should accept hash params too" do
@@ -27,8 +86,8 @@ describe "RadioDNS::Resolver" do
27
86
  :ecc => 'ce1',
28
87
  :bearer => 'fm'
29
88
  }
30
- cname = RadioDNS::Resolver.resolve(params)
31
- assert_equal 'rdns.musicradio.com', cname
89
+ service = RadioDNS::Resolver.resolve(params)
90
+ assert_equal 'rdns.musicradio.com', service.cname
32
91
  end
33
92
  end
34
93
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: radiodns
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Lowis