spec/riak/stamp_spec.rb in riak-client-2.3.0 vs spec/riak/stamp_spec.rb in riak-client-2.3.1

- old
+ new

@@ -1,54 +1,54 @@ -require 'spec_helper' -require 'riak/stamp' - -describe Riak::Stamp, test_client: true do - subject { described_class.new test_client } - it "generates always increasing integer identifiers" do - 1000.times do - one = subject.next - two = subject.next - expect([one, two]).to be_all {|i| Integer === i } - expect(two).to be > one - end - end - - it "delays until the next millisecond when the sequence overflows" do - old = subject.instance_variable_get(:@timestamp) + 0 - subject.instance_variable_set(:@sequence, described_class::SEQUENCE_MASK) - count = 0 - # Simulate the time_gen method returning the same thing multiple times - allow(subject).to receive(:time_gen) do - count += 1 - if count < 10 - old - else - old + 1 - end - end - expect((subject.next >> described_class::TIMESTAMP_SHIFT) & described_class::TIMESTAMP_MASK).to eq(old + 1) - end - - it "raises an exception when the system clock moves backwards" do - old = subject.instance_variable_get(:@timestamp) - expect(subject).to receive(:time_gen).and_return(old - 10) - expect { - subject.next - }.to raise_error(Riak::BackwardsClockError) - end - - # The client/worker ID should be used for disambiguation, not for - # primary ordering. This breaks from the Snowflake model where the - # worker ID is in more significant bits. - it "uses the client ID as the bottom component of the identifier" do - expect(subject.next & described_class::CLIENT_ID_MASK).to eq(subject.client.client_id.hash & described_class::CLIENT_ID_MASK) - end - - context "using a non-integer client ID" do - subject { described_class.new(Riak::Client.new(:client_id => "ripple")) } - let(:hash) { "ripple".hash } - - it "uses the hash of the client ID as the bottom component of the identifier" do - expect(subject.next & described_class::CLIENT_ID_MASK).to eq(subject.client.client_id.hash & described_class::CLIENT_ID_MASK) - end - end -end +require 'spec_helper' +require 'riak/stamp' + +describe Riak::Stamp, test_client: true do + subject { described_class.new test_client } + it "generates always increasing integer identifiers" do + 1000.times do + one = subject.next + two = subject.next + expect([one, two]).to be_all {|i| Integer === i } + expect(two).to be > one + end + end + + it "delays until the next millisecond when the sequence overflows" do + old = subject.instance_variable_get(:@timestamp) + 0 + subject.instance_variable_set(:@sequence, described_class::SEQUENCE_MASK) + count = 0 + # Simulate the time_gen method returning the same thing multiple times + allow(subject).to receive(:time_gen) do + count += 1 + if count < 10 + old + else + old + 1 + end + end + expect((subject.next >> described_class::TIMESTAMP_SHIFT) & described_class::TIMESTAMP_MASK).to eq(old + 1) + end + + it "raises an exception when the system clock moves backwards" do + old = subject.instance_variable_get(:@timestamp) + expect(subject).to receive(:time_gen).and_return(old - 10) + expect { + subject.next + }.to raise_error(Riak::BackwardsClockError) + end + + # The client/worker ID should be used for disambiguation, not for + # primary ordering. This breaks from the Snowflake model where the + # worker ID is in more significant bits. + it "uses the client ID as the bottom component of the identifier" do + expect(subject.next & described_class::CLIENT_ID_MASK).to eq(subject.client.client_id.hash & described_class::CLIENT_ID_MASK) + end + + context "using a non-integer client ID" do + subject { described_class.new(Riak::Client.new(:client_id => "ripple")) } + let(:hash) { "ripple".hash } + + it "uses the hash of the client ID as the bottom component of the identifier" do + expect(subject.next & described_class::CLIENT_ID_MASK).to eq(subject.client.client_id.hash & described_class::CLIENT_ID_MASK) + end + end +end