1require 'test/unit'
2require 'cgi'
3require 'cgi/session'
4require 'cgi/session/pstore'
5require 'stringio'
6require 'tmpdir'
7
8class CGISessionTest < Test::Unit::TestCase
9  def setup
10    @session_dir = Dir.mktmpdir(%w'session dir')
11  end
12
13  def teardown
14    @environ.each do |key, val| ENV.delete(key) end
15    $stdout = STDOUT
16    FileUtils.rm_rf(@session_dir)
17  end
18
19  def test_cgi_session_filestore
20    @environ = {
21      'REQUEST_METHOD'  => 'GET',
22  #    'QUERY_STRING'    => 'id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F',
23  #    'HTTP_COOKIE'     => '_session_id=12345; name1=val1&val2;',
24      'SERVER_SOFTWARE' => 'Apache 2.2.0',
25      'SERVER_PROTOCOL' => 'HTTP/1.1',
26    }
27    value1="value1"
28    value2="\x8F\xBC\x8D]"
29    value2.force_encoding("SJIS") if defined?(::Encoding)
30    ENV.update(@environ)
31    cgi = CGI.new
32    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir)
33    session["key1"]=value1
34    session["key2"]=value2
35    assert_equal(value1,session["key1"])
36    assert_equal(value2,session["key2"])
37    session.close
38    $stdout = StringIO.new
39    cgi.out{""}
40
41    @environ = {
42      'REQUEST_METHOD'  => 'GET',
43      # 'HTTP_COOKIE'     => "_session_id=#{session_id}",
44      'QUERY_STRING'    => "_session_id=#{session.session_id}",
45      'SERVER_SOFTWARE' => 'Apache 2.2.0',
46      'SERVER_PROTOCOL' => 'HTTP/1.1',
47    }
48    ENV.update(@environ)
49    cgi = CGI.new
50    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir)
51    $stdout = StringIO.new
52    assert_equal(value1,session["key1"])
53    assert_equal(value2,session["key2"])
54    session.close
55
56  end
57  def test_cgi_session_pstore
58    @environ = {
59      'REQUEST_METHOD'  => 'GET',
60  #    'QUERY_STRING'    => 'id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F',
61  #    'HTTP_COOKIE'     => '_session_id=12345; name1=val1&val2;',
62      'SERVER_SOFTWARE' => 'Apache 2.2.0',
63      'SERVER_PROTOCOL' => 'HTTP/1.1',
64    }
65    value1="value1"
66    value2="\x8F\xBC\x8D]"
67    value2.force_encoding("SJIS") if defined?(::Encoding)
68    ENV.update(@environ)
69    cgi = CGI.new
70    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir,"database_manager"=>CGI::Session::PStore)
71    session["key1"]=value1
72    session["key2"]=value2
73    assert_equal(value1,session["key1"])
74    assert_equal(value2,session["key2"])
75    session.close
76    $stdout = StringIO.new
77    cgi.out{""}
78
79    @environ = {
80      'REQUEST_METHOD'  => 'GET',
81      # 'HTTP_COOKIE'     => "_session_id=#{session_id}",
82      'QUERY_STRING'    => "_session_id=#{session.session_id}",
83      'SERVER_SOFTWARE' => 'Apache 2.2.0',
84      'SERVER_PROTOCOL' => 'HTTP/1.1',
85    }
86    ENV.update(@environ)
87    cgi = CGI.new
88    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir,"database_manager"=>CGI::Session::PStore)
89    $stdout = StringIO.new
90    assert_equal(value1,session["key1"])
91    assert_equal(value2,session["key2"])
92    session.close
93  end
94  def test_cgi_session_specify_session_id
95    @environ = {
96      'REQUEST_METHOD'  => 'GET',
97  #    'QUERY_STRING'    => 'id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F',
98  #    'HTTP_COOKIE'     => '_session_id=12345; name1=val1&val2;',
99      'SERVER_SOFTWARE' => 'Apache 2.2.0',
100      'SERVER_PROTOCOL' => 'HTTP/1.1',
101    }
102    value1="value1"
103    value2="\x8F\xBC\x8D]"
104    value2.force_encoding("SJIS") if defined?(::Encoding)
105    ENV.update(@environ)
106    cgi = CGI.new
107    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir,"session_id"=>"foo")
108    session["key1"]=value1
109    session["key2"]=value2
110    assert_equal(value1,session["key1"])
111    assert_equal(value2,session["key2"])
112    assert_equal("foo",session.session_id)
113    #session_id=session.session_id
114    session.close
115    $stdout = StringIO.new
116    cgi.out{""}
117
118    @environ = {
119      'REQUEST_METHOD'  => 'GET',
120      # 'HTTP_COOKIE'     => "_session_id=#{session_id}",
121      'QUERY_STRING'    => "_session_id=#{session.session_id}",
122      'SERVER_SOFTWARE' => 'Apache 2.2.0',
123      'SERVER_PROTOCOL' => 'HTTP/1.1',
124    }
125    ENV.update(@environ)
126    cgi = CGI.new
127    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir)
128    $stdout = StringIO.new
129    assert_equal(value1,session["key1"])
130    assert_equal(value2,session["key2"])
131    assert_equal("foo",session.session_id)
132    session.close
133  end
134  def test_cgi_session_specify_session_key
135    @environ = {
136      'REQUEST_METHOD'  => 'GET',
137  #    'QUERY_STRING'    => 'id=123&id=456&id=&str=%40h+%3D%7E+%2F%5E%24%2F',
138  #    'HTTP_COOKIE'     => '_session_id=12345; name1=val1&val2;',
139      'SERVER_SOFTWARE' => 'Apache 2.2.0',
140      'SERVER_PROTOCOL' => 'HTTP/1.1',
141    }
142    value1="value1"
143    value2="\x8F\xBC\x8D]"
144    value2.force_encoding("SJIS") if defined?(::Encoding)
145    ENV.update(@environ)
146    cgi = CGI.new
147    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir,"session_key"=>"bar")
148    session["key1"]=value1
149    session["key2"]=value2
150    assert_equal(value1,session["key1"])
151    assert_equal(value2,session["key2"])
152    session_id=session.session_id
153    session.close
154    $stdout = StringIO.new
155    cgi.out{""}
156
157    @environ = {
158      'REQUEST_METHOD'  => 'GET',
159      'HTTP_COOKIE'     => "bar=#{session_id}",
160      # 'QUERY_STRING'    => "bar=#{session.session_id}",
161      'SERVER_SOFTWARE' => 'Apache 2.2.0',
162      'SERVER_PROTOCOL' => 'HTTP/1.1',
163    }
164    ENV.update(@environ)
165    cgi = CGI.new
166    session = CGI::Session.new(cgi,"tmpdir"=>@session_dir,"session_key"=>"bar")
167    $stdout = StringIO.new
168    assert_equal(value1,session["key1"])
169    assert_equal(value2,session["key2"])
170    session.close
171  end
172end
173