test/setup.rb in couchbase-0.9.8 vs test/setup.rb in couchbase-1.0.0

- old
+ new

@@ -1,28 +1,117 @@ +# Author:: Couchbase <info@couchbase.com> +# Copyright:: 2011, 2012 Couchbase, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + require 'minitest/autorun' -require 'mocha' require 'couchbase' -require 'yajl' -class MiniTest::Unit::TestCase - # retry block +attempts+ times and fail if time is out - def assert_operation_completed(attempts = 10) - timeout = 1 - attempts.times do - sleep(timeout) - return if yield - timeout *= 2 +require 'socket' + +class CouchbaseMock + Monitor = Struct.new(:pid, :client, :socket, :port) + + attr_accessor :host, :port, :buckets_spec, :num_nodes, :num_vbuckets + + def initialize(params = {}) + @host = "127.0.0.1" + @port = 0 + @num_nodes = 10 + @num_vbuckets = 4096 + @buckets_spec = "default:" # "default:,protected:secret,cache::memcache" + params.each do |key, value| + send("#{key}=", value) end - flunk "Time is out!" + yield self if block_given? + if @num_vbuckets < 1 || (@num_vbuckets & (@num_vbuckets - 1) != 0) + raise ArgumentError, "Number of vbuckets should be a power of two and greater than zero" + end end - # fetch list of databases and check if all vbuckets database ready - def database_ready(bucket) - all_dbs_uri = bucket.next_node.couch_api_base.sub(bucket.name, '_all_dbs') - bucket.http_get(all_dbs_uri).grep(/#{bucket.name}\/\d+/).size == bucket.vbuckets.size + def start + @monitor = Monitor.new + @monitor.socket = TCPServer.new(nil, 0) + @monitor.socket.listen(10) + _, @monitor.port, _, _ = @monitor.socket.addr + trap("CLD") do + puts "CouchbaseMock.jar died unexpectedly during startup" + exit(1) + end + @monitor.pid = fork + if @monitor.pid.nil? + rc = exec(command_line("--harakiri-monitor=:#{@monitor.port}")) + else + trap("CLD", "SIG_DFL") + @monitor.client, _ = @monitor.socket.accept + @port = @monitor.client.recv(100).to_i + end end - def json_fixture(path, options = {}) - data = File.read(File.join(File.dirname(__FILE__), 'support', path)) - options[:raw] ? data : Yajl::Parser.parse(data) + def stop + @monitor.client.close + @monitor.socket.close + Process.kill("TERM", @monitor.pid) + Process.wait(@monitor.pid) + end + + def failover_node(index, bucket = "default") + @monitor.client.send("failover,#{index},#{bucket}", 0) + end + + def respawn_node(index, bucket = "default") + @monitor.client.send("respawn,#{index},#{bucket}", 0) + end + + protected + + def command_line(extra = nil) + cmd = "java -jar #{File.dirname(__FILE__)}/CouchbaseMock.jar" + cmd << " --host #{@host}" if @host + cmd << " --port #{@port}" if @port + cmd << " --nodes #{@num_nodes}" if @num_nodes + cmd << " --vbuckets #{@num_vbuckets}" if @num_vbuckets + cmd << " --buckets #{@buckets_spec}" if @buckets_spec + cmd << " #{extra}" + cmd + end +end + +class MiniTest::Unit::TestCase + + def start_mock(params = {}) + mock = CouchbaseMock.new(params) + mock.start + mock + end + + def stop_mock(mock) + assert(mock) + mock.stop + end + + def with_mock(params = {}) + mock = nil + if block_given? + mock = start_mock(params) + yield mock + end + ensure + stop_mock(mock) if mock + end + + def test_id(*suffixes) + [caller.first[/.*[` ](.*)'/, 1], suffixes].join("_") end end