Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #9823: mem_cache_store_fixed_session_initialization.diff

File mem_cache_store_fixed_session_initialization.diff, 5.3 kB (added by kamk, 1 year ago)
  • actionpack/test/controller/session/mem_cache_store_test.rb

    old new  
     1require "#{File.dirname(__FILE__)}/../../abstract_unit" 
     2require 'action_controller/cgi_process' 
     3require 'action_controller/cgi_ext' 
     4 
     5class 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 
     128end 
  • actionpack/lib/action_controller/session/mem_cache_store.rb

    old new  
    5757          @expires = options['expires'] || 0 
    5858          @session_key = "session:#{id}" 
    5959          @session_data = {} 
     60          # Add this key to the store if haven't done so yet 
     61          @cache.add(@session_key, @session_data, @expires) \ 
     62            unless @cache.get(@session_key) 
    6063        end 
    6164 
    6265        # Restore session state from the session's memcache entry. 
    6366        # 
    6467        # Returns the session state as a hash. 
    6568        def restore 
    66           begin 
    67             @session_data = @cache[@session_key] || {} 
    68           rescue 
    69             @session_data = {} 
    70           end 
     69          @session_data = @cache[@session_key] || {} 
    7170        end 
    7271 
    7372        # Save session state to the session's memcache entry. 
    7473        def update 
    75           begin 
    76             @cache.set(@session_key, @session_data, @expires) 
    77           rescue 
    78             # Ignore session update failures. 
    79           end 
     74          @cache.set(@session_key, @session_data, @expires) 
    8075        end 
    8176       
    8277        # Update and close the session's memcache entry. 
     
    8681 
    8782        # Delete the session's memcache entry. 
    8883        def delete 
    89           begin 
    90             @cache.delete(@session_key) 
    91           rescue 
    92             # Ignore session delete failures. 
    93           end 
     84          @cache.delete(@session_key) 
    9485          @session_data = {} 
    9586        end 
    9687         
    9788        def data 
    9889          @session_data 
    9990        end 
     91 
    10092      end 
    10193    end 
    10294  end