radiodns 0.0.3 → 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.
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