summaryrefslogtreecommitdiff
path: root/vendor/gems/couchrest_session_store/test
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gems/couchrest_session_store/test')
-rw-r--r--vendor/gems/couchrest_session_store/test/couch_tester.rb27
-rw-r--r--vendor/gems/couchrest_session_store/test/database_rotation_test.rb88
-rw-r--r--vendor/gems/couchrest_session_store/test/session_document_test.rb27
-rwxr-xr-xvendor/gems/couchrest_session_store/test/setup_couch.sh7
-rw-r--r--vendor/gems/couchrest_session_store/test/stress_test.rb51
-rw-r--r--vendor/gems/couchrest_session_store/test/test_clock.rb12
-rw-r--r--vendor/gems/couchrest_session_store/test/test_helper.rb9
7 files changed, 221 insertions, 0 deletions
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!