This file is indexed.

/usr/share/backgroundrb/test/server/test_master_worker.rb is in libbackgroundrb-ruby1.8 1.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
require File.join(File.dirname(__FILE__) + "/..","bdrb_test_helper")


context "Master Worker in general should" do
  def dump_object data
    t = Marshal.dump(data)
    t.length.to_s.rjust(9,'0') + t
  end

  setup do
    @master_worker = BackgrounDRb::MasterWorker.new
    @master_worker.post_init
    class << @master_worker
      attr_accessor :outgoing_data
      attr_accessor :key,:live_workers,:excpetion_type

      def packet_classify(original_string)
        word_parts = original_string.split('_')
        return word_parts.map { |x| x.capitalize}.join
      end

      def gen_worker_key(worker_name,worker_key = nil)
        return worker_name if worker_key.nil?
        return "#{worker_name}_#{worker_key}".to_sym
      end
      def ask_worker key,data
        case @excpetion_type
        when :disconnect
          raise Packet::DisconnectError.new("boy")
        when :generic
          raise "Crap"
        else
          @key = key
          @outgoing_data = data
        end
      end

      def start_worker data
        @outgoing_data = data
      end

      def ask_for_exception type
        @excpetion_type = type
      end
    end

    class DummyLogger
      def method_missing method_id,*args; "boy"; end
    end
    logger = DummyLogger.new
    @master_worker.debug_logger = logger
  end

  specify "read data according to binary protocol and recreate objects" do
    sync_request = {
      :type=>:sync_invoke, :arg=>"boy", :worker=>:foo_worker, :worker_method=>"barbar"
    }
    @master_worker.expects(:method_invoke).with(sync_request).returns(nil)
    @master_worker.receive_data(dump_object(sync_request))
  end

  specify "ignore errors while recreating object" do
    sync_request = {
      :type=>:sync_invoke, :arg=>"boy", :worker=>:foo_worker, :worker_method=>"barbar"
    }
    foo = dump_object(sync_request)
    foo[0] = 'h'
    @master_worker.expects(:method_invoke).never
    @master_worker.receive_data(foo)
  end

  specify "should route async requests" do
    b = {
      :type=>:async_invoke, :arg=>"boy", :worker=>:foo_worker, :worker_method=>"barbar"
    }
    @master_worker.receive_data(dump_object(b))
    @master_worker.outgoing_data.should == {:type=>:request, :data=>{:worker_method=>"barbar", :arg=>"boy"}, :result=>false}
    @master_worker.key.should == :foo_worker
  end

  specify "should route sync requests and return results" do
    a = {:type=>:sync_invoke, :arg=>"boy", :worker=>:foo_worker, :worker_method=>"barbar"}
    @master_worker.receive_data(dump_object(a))
    @master_worker.outgoing_data.should == {:type=>:request, :data=>{:worker_method=>"barbar", :arg=>"boy"}, :result=>true}
    @master_worker.key.should == :foo_worker
  end

  specify "should route start worker requests" do
    d = {:worker_key=>"boy", :type=>:start_worker, :worker=>:foo_worker}
    @master_worker.receive_data(dump_object(d))
    @master_worker.outgoing_data.should == {:type=>:start_worker, :worker_key=>"boy", :worker=>:foo_worker}
  end

  # FIXME: this test should be further broken down
  specify "should run delete worker requests itself" do
    e = {:worker_key=>"boy", :type=>:delete_worker, :worker=>:foo_worker}
    @master_worker.expects(:delete_drb_worker).returns(nil)
    @master_worker.receive_data(dump_object(e))
  end

  specify "should route worker info requests" do
    g = {:worker_key=>"boy", :type=>:worker_info, :worker=>:foo_worker}
    t_reactor = stub()
    live_workers = stub()
    live_workers.expects(:[]).returns(nil)
    t_reactor.expects(:live_workers).returns(live_workers)
    @master_worker.expects(:send_object).with({:worker_key=>"boy", :worker=>:foo_worker, :status=>:stopped}).returns(true)
    @master_worker.expects(:reactor).returns(t_reactor)
    @master_worker.receive_data(dump_object(g))
  end

  specify "should route all_worker_info requests" do
    f = {:type=>:all_worker_info}
    t_reactor = stub()
    live_workers = stub()
    live_workers.stubs(:each).returns(:foo,mock())
    t_reactor.expects(:live_workers).returns(live_workers)
    @master_worker.expects(:send_object).returns(true)
    @master_worker.expects(:reactor).returns(t_reactor)

    @master_worker.receive_data(dump_object(f))
  end

  specify "should route worker result requests" do
    c = {:type=>:get_result, :worker=>:foo_worker, :job_key=>:start_message}
    @master_worker.receive_data(dump_object(c))
    @master_worker.outgoing_data.should == {:type=>:get_result, :data=>{:job_key=>:start_message}, :result=>true}
  end

  specify "should remove the worker from list if error while fetching results" do
    c = {:type=>:get_result, :worker=>:foo_worker, :job_key=>:start_message}
    @master_worker.ask_for_exception(:disconnect)
    t_reactor = mock()
    live_workers = mock()
    live_workers.expects(:delete).returns(true)
    t_reactor.expects(:live_workers).returns(live_workers)
    @master_worker.expects(:reactor).returns(t_reactor)
    @master_worker.receive_data(dump_object(c))
  end

  specify "should ignore generic exceptions while fetching results" do
    c = {:type=>:get_result, :worker=>:foo_worker, :job_key=>:start_message}
    @master_worker.ask_for_exception(:generic)
    @master_worker.receive_data(dump_object(c))
    @master_worker.outgoing_data.should == nil
  end
end