about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-11-08 22:11:21 +0000
committerEric Wong <normalperson@yhbt.net>2011-11-08 22:14:36 +0000
commit60a31e86ee57d5d1f3b25bde6d2ea1e718f0353b (patch)
tree5459c9e4f6b69bb8b32c6ea10f2de2f5b47d501e
parent8bc17c29ef5024802fc7207023cdaa7f1b5eda5f (diff)
downloadmogilefs-client-60a31e86ee57d5d1f3b25bde6d2ea1e718f0353b.tar.gz
get_paths may take a Hash for its optional arguments and
now supports the optional :pathcount argument.
There may now be a default @zone for MogileFS::MogileFS
objects as well (specified via :zone).
-rw-r--r--lib/mogilefs/mogilefs.rb24
-rw-r--r--test/test_mogilefs.rb50
2 files changed, 69 insertions, 5 deletions
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index 1850723..f132dd7 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -23,6 +23,7 @@ class MogileFS::MogileFS < MogileFS::Client
 
   def initialize(args = {})
     @domain = args[:domain]
+    @zone = args[:zone]
 
     @get_file_data_timeout = 5
 
@@ -73,9 +74,22 @@ class MogileFS::MogileFS < MogileFS::Client
   ##
   # Get the paths for +key+.
 
-  def get_paths(key, noverify = true, zone = nil)
-    opts = { :domain => @domain, :key => key,
-             :noverify => noverify ? 1 : 0, :zone => zone }
+  def get_paths(key, *args)
+    opts = {
+      :domain => @domain,
+      :key => key,
+      :noverify => args[0],
+      :zone => args[1],
+    }
+    if Hash === args[0]
+      args = args[0]
+      opts[:noverify] = args[:noverify]
+      opts[:zone] = args[:zone]
+      pathcount = args[:pathcount] and opts[:pathcount] = pathcount.to_i
+    end
+
+    opts[:zone] ||= @zone
+    opts[:noverify] = opts[:noverify] ? 1 : 0
     @backend.respond_to?(:_get_paths) and return @backend._get_paths(opts)
     res = @backend.get_paths(opts)
     (1..res['paths'].to_i).map { |i| res["path#{i}"] }.compact
@@ -84,8 +98,8 @@ class MogileFS::MogileFS < MogileFS::Client
   ##
   # Get the URIs for +key+.
 
-  def get_uris(key, noverify = true, zone = nil)
-    get_paths(key, noverify, zone).map! { |path| URI.parse(path) }
+  def get_uris(key, *args)
+    get_paths(key, *args).map! { |path| URI.parse(path) }
   end
 
   ##
diff --git a/test/test_mogilefs.rb b/test/test_mogilefs.rb
index 6e9ec7f..d85cbf8 100644
--- a/test/test_mogilefs.rb
+++ b/test/test_mogilefs.rb
@@ -518,6 +518,56 @@ class TestMogileFS__MogileFS < TestMogileFS
     assert_equal 'readonly mogilefs', e.message
   end
 
+  def test_get_paths_args
+    sock = TCPServer.new("127.0.0.1", 0)
+    args = { :hosts => [ "127.0.0.1:#{sock.addr[1]}" ], :domain => "foo" }
+    c = MogileFS::MogileFS.new(args)
+    received = []
+    th = Thread.new do
+      a = sock.accept
+      6.times do
+        line = a.gets
+        received << line
+        a.write("OK paths=2&path1=http://0/a&path2=http://0/b\r\n")
+      end
+      a.close
+    end
+    expect = %w(http://0/a http://0/b)
+    assert_equal expect, c.get_paths("f")
+    assert_equal expect, c.get_paths("f",true,"alt")
+    assert_equal expect, c.get_paths("f",:noverify=>true,:zone=>"alt")
+    assert_equal expect,
+                c.get_paths("f",:noverify=>true,:zone=>"alt",:pathcount=>666)
+    c.instance_variable_set(:@zone, "alt")
+    assert_equal expect, c.get_paths("f")
+    assert_equal expect, c.get_paths("f", :zone=>"zzz")
+    th.join
+
+    backend = c.instance_variable_get(:@backend)
+    expect = { "domain"=>"foo", "key"=>"f", "noverify"=>"0", "zone"=>"" }
+    tmp = backend.url_decode(received[0].split(/\s+/)[1])
+    assert_equal expect, tmp
+    expect["noverify"] = "1"
+    expect["zone"] = "alt"
+    tmp = backend.url_decode(received[1].split(/\s+/)[1])
+    assert_equal expect, tmp
+
+    tmp = backend.url_decode(received[2].split(/\s+/)[1])
+    assert_equal expect, tmp
+
+    expect["pathcount"] = "666"
+    tmp = backend.url_decode(received[3].split(/\s+/)[1])
+    assert_equal expect, tmp
+
+    expect = { "domain"=>"foo", "key"=>"f", "noverify"=>"0", "zone"=>"alt" }
+    tmp = backend.url_decode(received[4].split(/\s+/)[1])
+
+    expect = { "domain"=>"foo", "key"=>"f", "noverify"=>"0", "zone"=>"zzz" }
+    tmp = backend.url_decode(received[5].split(/\s+/)[1])
+    ensure
+      sock.close
+  end
+
   def test_sleep
     @backend.sleep = {}
     assert_nothing_raised do