From 16da29309cdb117e2ac40eb93286fc265c3135d5 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 23 Mar 2016 21:53:29 +0100 Subject: vendoring couchrest session store for development 0.4.0 has not been released yet. But travis needs it to run. So i vendor it for now. Will remove it again when the build is getting stable. --- .../couchrest_session_store/test/couch_tester.rb | 27 +++++++ .../test/database_rotation_test.rb | 88 ++++++++++++++++++++++ .../test/session_document_test.rb | 27 +++++++ .../couchrest_session_store/test/setup_couch.sh | 7 ++ .../couchrest_session_store/test/stress_test.rb | 51 +++++++++++++ .../couchrest_session_store/test/test_clock.rb | 12 +++ .../couchrest_session_store/test/test_helper.rb | 9 +++ 7 files changed, 221 insertions(+) create mode 100644 vendor/gems/couchrest_session_store/test/couch_tester.rb create mode 100644 vendor/gems/couchrest_session_store/test/database_rotation_test.rb create mode 100644 vendor/gems/couchrest_session_store/test/session_document_test.rb create mode 100755 vendor/gems/couchrest_session_store/test/setup_couch.sh create mode 100644 vendor/gems/couchrest_session_store/test/stress_test.rb create mode 100644 vendor/gems/couchrest_session_store/test/test_clock.rb create mode 100644 vendor/gems/couchrest_session_store/test/test_helper.rb (limited to 'vendor/gems/couchrest_session_store/test') diff --git a/vendor/gems/couchrest_session_store/test/couch_tester.rb b/vendor/gems/couchrest_session_store/test/couch_tester.rb new file mode 100644 index 0000000..b623044 --- /dev/null +++ b/vendor/gems/couchrest_session_store/test/couch_tester.rb @@ -0,0 +1,27 @@ +# +# Access the couch directly so we can test its state without relying +# on the SessionStore +# + +class CouchTester < CouchRest::Document + include CouchRest::Model::Configuration + include CouchRest::Model::Connection + include CouchRest::Model::Rotation + + rotate_database 'sessions', + :every => 1.month, :expiration_field => :expires + + def initialize(options = {}) + end + + def get(sid) + database.get(sid) + end + + def update(sid, diff) + doc = database.get(sid) + doc.merge! diff + database.save_doc(doc) + end + +end diff --git a/vendor/gems/couchrest_session_store/test/database_rotation_test.rb b/vendor/gems/couchrest_session_store/test/database_rotation_test.rb new file mode 100644 index 0000000..856db11 --- /dev/null +++ b/vendor/gems/couchrest_session_store/test/database_rotation_test.rb @@ -0,0 +1,88 @@ +require_relative 'test_helper' + +class RotationTest < MiniTest::Test + + class Token < CouchRest::Model::Base + include CouchRest::Model::Rotation + property :token, String + rotate_database 'test_rotate', :every => 1.day + end + + TEST_DB_RE = /test_rotate_\d+/ + + def test_rotate + delete_all_dbs + doc = nil + original_name = nil + next_db_name = nil + + Time.stub :now, Time.gm(2015,3,7,0) do + Token.create_database! + doc = Token.create!(:token => 'aaaa') + original_name = Token.rotated_database_name + assert database_exists?(original_name) + assert_equal 1, count_dbs + end + + # do nothing yet + Time.stub :now, Time.gm(2015,3,7,22) do + Token.rotate_database_now(:window => 1.hour) + assert_equal original_name, Token.rotated_database_name + assert_equal 1, count_dbs + end + + # create next db, but don't switch yet. + Time.stub :now, Time.gm(2015,3,7,23) do + Token.rotate_database_now(:window => 1.hour) + assert_equal 2, count_dbs + next_db_name = Token.rotated_database_name(Time.gm(2015,3,8)) + assert original_name != next_db_name + assert database_exists?(next_db_name) + sleep 0.2 # allow time for documents to replicate + assert_equal( + Token.get(doc.id).token, + Token.get(doc.id, database(next_db_name)).token + ) + end + + # use next db + Time.stub :now, Time.gm(2015,3,8) do + Token.rotate_database_now(:window => 1.hour) + assert_equal 2, count_dbs + assert_equal next_db_name, Token.rotated_database_name + token = Token.get(doc.id) + token.update_attributes(:token => 'bbbb') + assert_equal 'bbbb', Token.get(doc.id).token + assert_equal 'aaaa', Token.get(doc.id, database(original_name)).token + end + + # delete prior db + Time.stub :now, Time.gm(2015,3,8,1) do + Token.rotate_database_now(:window => 1.hour) + assert_equal 1, count_dbs + end + end + + private + + def database(db_name) + Token.server.database(Token.db_name_with_prefix(db_name)) + end + + def database_exists?(dbname) + Token.database_exists?(dbname) + end + + def delete_all_dbs(regexp=TEST_DB_RE) + Token.server.databases.each do |db| + if regexp.match(db) + Token.server.database(db).delete! + end + end + end + + def count_dbs(regexp=TEST_DB_RE) + Token.server.databases.grep(regexp).count + end + +end diff --git a/vendor/gems/couchrest_session_store/test/session_document_test.rb b/vendor/gems/couchrest_session_store/test/session_document_test.rb new file mode 100644 index 0000000..2125d10 --- /dev/null +++ b/vendor/gems/couchrest_session_store/test/session_document_test.rb @@ -0,0 +1,27 @@ +require File.expand_path(File.dirname(__FILE__) + '/test_helper') + +class SessionDocumentTest < MiniTest::Test + + def test_storing_session + sid = '1234' + session = {'a' => 'b'} + options = {} + doc = CouchRest::Session::Document.build_or_update(sid, session, options) + doc.save + doc.fetch(sid) + assert_equal session, doc.to_session + end + + def test_storing_session_with_conflict + sid = '1234' + session = {'a' => 'b'} + options = {} + doc = CouchRest::Session::Document.build_or_update(sid, session, options) + doc2 = CouchRest::Session::Document.build_or_update(sid, session, options) + doc.save + doc2.save + doc2.fetch(sid) + assert_equal session, doc2.to_session + end + +end diff --git a/vendor/gems/couchrest_session_store/test/setup_couch.sh b/vendor/gems/couchrest_session_store/test/setup_couch.sh new file mode 100755 index 0000000..731534b --- /dev/null +++ b/vendor/gems/couchrest_session_store/test/setup_couch.sh @@ -0,0 +1,7 @@ +HOST="http://localhost:5984" +echo "couch version :" +curl -X GET $HOST + +curl -X PUT $HOST/couchrest_sessions +curl -X PUT $HOST/couchrest_sessions/_design/Session --data @design/Session.json + diff --git a/vendor/gems/couchrest_session_store/test/stress_test.rb b/vendor/gems/couchrest_session_store/test/stress_test.rb new file mode 100644 index 0000000..b74b132 --- /dev/null +++ b/vendor/gems/couchrest_session_store/test/stress_test.rb @@ -0,0 +1,51 @@ +require_relative 'test_helper' + +# +# This doesn't really test much, but is useful if you want to see what happens +# when you have a lot of documents. +# + +class StressTest < MiniTest::Test + + COUNT = 200 # change to 200,000 if you dare + + class Stress < CouchRest::Model::Base + include CouchRest::Model::Rotation + property :token, String + property :expires_at, Time + rotate_database 'stress_test', :every => 1.day, :expiration_field => :expires_at + end + + def test_stress + delete_all_dbs /^couchrest_stress_test_\d+$/ + + Stress.database! + COUNT.times do |i| + doc = Stress.create!(:token => SecureRandom.hex(32), :expires_at => expires(i)) + end + + Time.stub :now, 1.day.from_now do + Stress.rotate_database_now(:window => 1.hour) + sleep 0.5 + assert_equal (COUNT/100)+1, Stress.database.info["doc_count"] + end + end + + private + + def delete_all_dbs(regexp=TEST_DB_RE) + Stress.server.databases.each do |db| + if regexp.match(db) + Stress.server.database(db).delete! + end + end + end + + def expires(i) + if i % 100 == 0 + 1.hour.from_now.utc + else + 1.hour.ago.utc + end + end +end diff --git a/vendor/gems/couchrest_session_store/test/test_clock.rb b/vendor/gems/couchrest_session_store/test/test_clock.rb new file mode 100644 index 0000000..4170763 --- /dev/null +++ b/vendor/gems/couchrest_session_store/test/test_clock.rb @@ -0,0 +1,12 @@ +class TestClock + attr_accessor :now + + def initialize(tick = 60) + @tick = tick + @now = Time.now + end + + def tick(seconds = nil) + @now += seconds || @tick + end +end diff --git a/vendor/gems/couchrest_session_store/test/test_helper.rb b/vendor/gems/couchrest_session_store/test/test_helper.rb new file mode 100644 index 0000000..32f147d --- /dev/null +++ b/vendor/gems/couchrest_session_store/test/test_helper.rb @@ -0,0 +1,9 @@ +require "rubygems" +gem 'minitest' +require 'minitest/autorun' +require File.expand_path(File.dirname(__FILE__) + '/../lib/couchrest_session_store.rb') +require File.expand_path(File.dirname(__FILE__) + '/couch_tester.rb') +require File.expand_path(File.dirname(__FILE__) + '/test_clock.rb') + +# Create the session db if it does not already exist. +CouchRest::Session::Document.create_database! -- cgit v1.2.3