| | 1 | require "#{File.dirname(__FILE__)}/../../abstract_unit" |
|---|
| | 2 | require 'action_controller/cgi_process' |
|---|
| | 3 | require 'action_controller/cgi_ext' |
|---|
| | 4 | |
|---|
| | 5 | class MemCacheStoreTest < Test::Unit::TestCase |
|---|
| | 6 | |
|---|
| | 7 | CONN_TEST_KEY = 'connection_test' |
|---|
| | 8 | TEST_DATA = 'Hello test' |
|---|
| | 9 | |
|---|
| | 10 | @@init_error = nil |
|---|
| | 11 | begin |
|---|
| | 12 | require 'memcache' |
|---|
| | 13 | CACHE = MemCache.new('127.0.0.1') |
|---|
| | 14 | # Test availability of the connection |
|---|
| | 15 | CACHE.set(CONN_TEST_KEY, 1) |
|---|
| | 16 | unless CACHE.get(CONN_TEST_KEY) == 1 |
|---|
| | 17 | @@init_error = 'Communication with memcache server failed' |
|---|
| | 18 | CACHE = nil |
|---|
| | 19 | end |
|---|
| | 20 | rescue LoadError |
|---|
| | 21 | @@init_error = "Client for memcache not installed." |
|---|
| | 22 | CACHE = nil |
|---|
| | 23 | rescue MemCache::MemCacheError |
|---|
| | 24 | @@init_error = 'Could not connect to memcache server.' |
|---|
| | 25 | end |
|---|
| | 26 | puts @@init_error + ' Skiping MemCacheStoreTest.' if @@init_error |
|---|
| | 27 | |
|---|
| | 28 | |
|---|
| | 29 | def run(result) |
|---|
| | 30 | return if @@init_error |
|---|
| | 31 | super |
|---|
| | 32 | end |
|---|
| | 33 | |
|---|
| | 34 | |
|---|
| | 35 | def test_initialization |
|---|
| | 36 | new_session do |s| |
|---|
| | 37 | assert_raise(ArgumentError) { new_session('session_id' => '!invalid_id') } |
|---|
| | 38 | end |
|---|
| | 39 | new_session do |s| |
|---|
| | 40 | assert_equal Hash.new, CACHE.get('session:' + s.session_id) |
|---|
| | 41 | end |
|---|
| | 42 | end |
|---|
| | 43 | |
|---|
| | 44 | def test_storage |
|---|
| | 45 | d = rand(0xffff) |
|---|
| | 46 | new_session do |s| |
|---|
| | 47 | s[:test] = d |
|---|
| | 48 | s.close |
|---|
| | 49 | assert_equal d, CACHE.get('session:' + s.session_id)[:test] |
|---|
| | 50 | assert_equal d, s[:test] |
|---|
| | 51 | end |
|---|
| | 52 | end |
|---|
| | 53 | |
|---|
| | 54 | def test_deletion |
|---|
| | 55 | new_session do |s| |
|---|
| | 56 | s[:test] = rand(0xffff) |
|---|
| | 57 | s.delete |
|---|
| | 58 | assert_nil CACHE.get('session:' + s.session_id) |
|---|
| | 59 | end |
|---|
| | 60 | end |
|---|
| | 61 | |
|---|
| | 62 | def test_other_session_retrieval |
|---|
| | 63 | new_session do |sa| |
|---|
| | 64 | sa[:test] = TEST_DATA |
|---|
| | 65 | sa.close |
|---|
| | 66 | new_session('session_id' => sa.session_id) do |sb| |
|---|
| | 67 | assert_equal(TEST_DATA, sb[:test]) |
|---|
| | 68 | end |
|---|
| | 69 | end |
|---|
| | 70 | end |
|---|
| | 71 | |
|---|
| | 72 | def test_multiple_sessions |
|---|
| | 73 | s_slots = Array.new(10) |
|---|
| | 74 | operation = :write |
|---|
| | 75 | last_data = nil |
|---|
| | 76 | reads = writes = 0 |
|---|
| | 77 | 50.times do |
|---|
| | 78 | current = rand(10) |
|---|
| | 79 | s_slots[current] ||= new_session('session_id' => '0123456789', |
|---|
| | 80 | 'new_session' => true) |
|---|
| | 81 | s = s_slots[current] |
|---|
| | 82 | case operation |
|---|
| | 83 | when :write |
|---|
| | 84 | last_data = rand(0xffff) |
|---|
| | 85 | s[:test] = last_data |
|---|
| | 86 | s.close |
|---|
| | 87 | writes += 1 |
|---|
| | 88 | when :read |
|---|
| | 89 | # Make CGI::Session#[] think there was no data retrieval yet. |
|---|
| | 90 | # Normally, the session caches the data during its lifetime. |
|---|
| | 91 | s.instance_variable_set(:@data, nil) |
|---|
| | 92 | d = s[:test] |
|---|
| | 93 | assert_equal(last_data, d, "OK reads: #{reads}, OK writes: #{writes}") |
|---|
| | 94 | reads += 1 |
|---|
| | 95 | end |
|---|
| | 96 | operation = rand(5) == 0 ? :write : :read |
|---|
| | 97 | end |
|---|
| | 98 | end |
|---|
| | 99 | |
|---|
| | 100 | |
|---|
| | 101 | |
|---|
| | 102 | private |
|---|
| | 103 | def obtain_session_options |
|---|
| | 104 | { 'database_manager' => CGI::Session::MemCacheStore, |
|---|
| | 105 | 'session_key' => '_test_app_session' |
|---|
| | 106 | } |
|---|
| | 107 | end |
|---|
| | 108 | |
|---|
| | 109 | |
|---|
| | 110 | def new_session(options = {}) |
|---|
| | 111 | with_cgi do |cgi| |
|---|
| | 112 | @options = obtain_session_options.merge(options) |
|---|
| | 113 | session = CGI::Session.new(cgi, @options) |
|---|
| | 114 | yield session if block_given? |
|---|
| | 115 | return session |
|---|
| | 116 | end |
|---|
| | 117 | end |
|---|
| | 118 | |
|---|
| | 119 | def with_cgi |
|---|
| | 120 | ENV['REQUEST_METHOD'] = 'GET' |
|---|
| | 121 | ENV['HTTP_HOST'] = 'example.com' |
|---|
| | 122 | ENV['QUERY_STRING'] = '' |
|---|
| | 123 | |
|---|
| | 124 | cgi = CGI.new('query', StringIO.new('')) |
|---|
| | 125 | yield cgi if block_given? |
|---|
| | 126 | cgi |
|---|
| | 127 | end |
|---|
| | 128 | end |