rims 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/ChangeLog +379 -0
  4. data/Gemfile +11 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +566 -0
  7. data/Rakefile +29 -0
  8. data/bin/rims +11 -0
  9. data/lib/rims.rb +45 -0
  10. data/lib/rims/auth.rb +133 -0
  11. data/lib/rims/cksum_kvs.rb +68 -0
  12. data/lib/rims/cmd.rb +809 -0
  13. data/lib/rims/daemon.rb +338 -0
  14. data/lib/rims/db.rb +793 -0
  15. data/lib/rims/error.rb +23 -0
  16. data/lib/rims/gdbm_kvs.rb +76 -0
  17. data/lib/rims/hash_kvs.rb +66 -0
  18. data/lib/rims/kvs.rb +101 -0
  19. data/lib/rims/lock.rb +151 -0
  20. data/lib/rims/mail_store.rb +663 -0
  21. data/lib/rims/passwd.rb +251 -0
  22. data/lib/rims/pool.rb +88 -0
  23. data/lib/rims/protocol.rb +71 -0
  24. data/lib/rims/protocol/decoder.rb +1469 -0
  25. data/lib/rims/protocol/parser.rb +1114 -0
  26. data/lib/rims/rfc822.rb +456 -0
  27. data/lib/rims/server.rb +567 -0
  28. data/lib/rims/test.rb +391 -0
  29. data/lib/rims/version.rb +11 -0
  30. data/load_test/Rakefile +93 -0
  31. data/rims.gemspec +38 -0
  32. data/test/test_auth.rb +174 -0
  33. data/test/test_cksum_kvs.rb +121 -0
  34. data/test/test_config.rb +533 -0
  35. data/test/test_daemon_status_file.rb +169 -0
  36. data/test/test_daemon_waitpid.rb +72 -0
  37. data/test/test_db.rb +602 -0
  38. data/test/test_db_recovery.rb +732 -0
  39. data/test/test_error.rb +97 -0
  40. data/test/test_gdbm_kvs.rb +32 -0
  41. data/test/test_hash_kvs.rb +116 -0
  42. data/test/test_lock.rb +161 -0
  43. data/test/test_mail_store.rb +750 -0
  44. data/test/test_passwd.rb +203 -0
  45. data/test/test_protocol.rb +91 -0
  46. data/test/test_protocol_auth.rb +121 -0
  47. data/test/test_protocol_decoder.rb +6490 -0
  48. data/test/test_protocol_fetch.rb +994 -0
  49. data/test/test_protocol_request.rb +332 -0
  50. data/test/test_protocol_search.rb +974 -0
  51. data/test/test_rfc822.rb +696 -0
  52. metadata +174 -0
@@ -0,0 +1,97 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'logger'
4
+ require 'pp' if $DEBUG
5
+ require 'rims'
6
+ require 'test/unit'
7
+
8
+ module RIMS::Test
9
+ class TestError < Test::Unit::TestCase
10
+ class FooError < StandardError
11
+ end
12
+
13
+ class BarError < StandardError
14
+ end
15
+
16
+ def setup
17
+ @logger = Logger.new(STDOUT)
18
+ @logger.level = ($DEBUG) ? Logger::DEBUG : Logger::FATAL
19
+ @flow_list = []
20
+ end
21
+
22
+ def teardown
23
+ pp @flow_list if $DEBUG
24
+ end
25
+
26
+ def test_suppress_2nd_error_at_resource_closing_no_error
27
+ begin
28
+ @flow_list << :main
29
+ ensure
30
+ RIMS::Error.suppress_2nd_error_at_resource_closing{ @flow_list << :close }
31
+ end
32
+ assert_equal([ :main, :close ], @flow_list)
33
+
34
+ begin
35
+ @flow_list << :main
36
+ ensure
37
+ RIMS::Error.suppress_2nd_error_at_resource_closing(logger: @logger) { @flow_list << :close }
38
+ end
39
+ assert_equal([ :main, :close, :main, :close ], @flow_list)
40
+ end
41
+
42
+ def test_suppress_2nd_error_at_resource_closing_raise_1st_error
43
+ assert_raise(FooError) {
44
+ begin
45
+ raise FooError
46
+ @flow_list << :main
47
+ ensure
48
+ RIMS::Error.suppress_2nd_error_at_resource_closing{ @flow_list << :close }
49
+ end
50
+ }
51
+ assert_equal([ :close ], @flow_list)
52
+
53
+ assert_raise(FooError) {
54
+ begin
55
+ raise FooError
56
+ @flow_list << :main
57
+ ensure
58
+ RIMS::Error.suppress_2nd_error_at_resource_closing(logger: @logger) { @flow_list << :close }
59
+ end
60
+ }
61
+ assert_equal([ :close, :close ], @flow_list)
62
+ end
63
+
64
+ def test_suppress_2nd_error_at_resource_closing_suppress_2nd_error
65
+ assert_raise(FooError) {
66
+ begin
67
+ raise FooError
68
+ @flow_list << :main
69
+ ensure
70
+ RIMS::Error.suppress_2nd_error_at_resource_closing{
71
+ raise BarError
72
+ @flow_list << :close
73
+ }
74
+ end
75
+ }
76
+ assert_equal([], @flow_list)
77
+
78
+ assert_raise(FooError) {
79
+ begin
80
+ raise FooError
81
+ @flow_list << :main
82
+ ensure
83
+ RIMS::Error.suppress_2nd_error_at_resource_closing(logger: @logger) {
84
+ raise BarError
85
+ @flow_list << :close
86
+ }
87
+ end
88
+ }
89
+ assert_equal([], @flow_list)
90
+ end
91
+ end
92
+ end
93
+
94
+ # Local Variables:
95
+ # mode: Ruby
96
+ # indent-tabs-mode: nil
97
+ # End:
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'gdbm'
4
+ require 'rims'
5
+ require 'test/unit'
6
+
7
+ module RIMS::Test
8
+ class GDBM_KeyValueStoreTest < Test::Unit::TestCase
9
+ include KeyValueStoreTestUtility
10
+
11
+ def open_database
12
+ GDBM.new(@name)
13
+ end
14
+
15
+ def make_key_value_store
16
+ RIMS::GDBM_KeyValueStore.new(@db, @name)
17
+ end
18
+ end
19
+
20
+ class GDBM_KeyValueStoreOpenCloseTest < Test::Unit::TestCase
21
+ include KeyValueStoreOpenCloseTestUtility
22
+
23
+ def get_kvs_name
24
+ 'gdbm'
25
+ end
26
+ end
27
+ end
28
+
29
+ # Local Variables:
30
+ # mode: Ruby
31
+ # indent-tabs-mode: nil
32
+ # End:
@@ -0,0 +1,116 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'pp' if $DEBUG
4
+ require 'rims'
5
+ require 'test/unit'
6
+
7
+ module RIMS::Test
8
+ class Hash_KeyValueStoreTest < Test::Unit::TestCase
9
+ def setup
10
+ @db = {}
11
+ @kvs = RIMS::Hash_KeyValueStore.new(@db)
12
+ end
13
+
14
+ def teardown
15
+ pp @db if $DEBUG
16
+ end
17
+
18
+ def test_store_fetch
19
+ assert_nil(@db['foo'])
20
+ assert_nil(@kvs['foo'])
21
+
22
+ assert_equal('apple', (@kvs['foo'] = 'apple'))
23
+ assert_equal({ 'foo' => 'apple' }, @db)
24
+
25
+ assert_equal('apple', @db['foo'])
26
+ assert_equal('apple', @kvs['foo'])
27
+ end
28
+
29
+ def test_delete
30
+ assert_nil(@kvs.delete('foo'))
31
+
32
+ @kvs['foo'] = 'apple'
33
+ assert_equal({ 'foo' => 'apple' }, @db)
34
+ assert_equal('apple', @kvs.delete('foo'))
35
+ assert_equal({}, @db)
36
+
37
+ assert_nil(@db['foo'])
38
+ assert_nil(@kvs['foo'])
39
+ end
40
+
41
+ def test_key?
42
+ assert_equal(false, (@db.key? 'foo'))
43
+ assert_equal(false, (@kvs.key? 'foo'))
44
+
45
+ @kvs['foo'] = 'apple'
46
+ assert_equal({ 'foo' => 'apple' }, @db)
47
+ assert_equal(true, (@db.key? 'foo'))
48
+ assert_equal(true, (@kvs.key? 'foo'))
49
+
50
+ @kvs.delete('foo')
51
+ assert_equal({}, @db)
52
+ assert_equal(false, (@db.key? 'foo'))
53
+ assert_equal(false, (@kvs.key? 'foo'))
54
+ end
55
+
56
+ def test_each_key
57
+ assert_equal(%w[], @db.each_key.to_a)
58
+ assert_equal(%w[], @kvs.each_key.to_a)
59
+
60
+ @kvs['foo'] = 'apple'
61
+ assert_equal({ 'foo' => 'apple' }, @db)
62
+ assert_equal(%w[ foo ], @db.each_key.to_a)
63
+ assert_equal(%w[ foo ], @kvs.each_key.to_a)
64
+ assert_equal(%w[ apple ], @kvs.each_value.to_a)
65
+ assert_equal([ %w[ foo apple ] ], @kvs.each_pair.to_a)
66
+
67
+ @kvs['bar'] = 'banana'
68
+ assert_equal({ 'foo' => 'apple', 'bar' => 'banana' }, @db)
69
+ assert_equal(%w[ foo bar ], @db.each_key.to_a)
70
+ assert_equal(%w[ foo bar ], @kvs.each_key.to_a)
71
+ assert_equal(%w[ apple banana ], @kvs.each_value.to_a)
72
+ assert_equal([ %w[ foo apple ], %w[ bar banana ] ], @kvs.each_pair.to_a)
73
+
74
+ @kvs['baz'] = 'orange'
75
+ assert_equal({ 'foo' => 'apple', 'bar' => 'banana', 'baz' => 'orange' }, @db)
76
+ assert_equal(%w[ foo bar baz ], @db.each_key.to_a)
77
+ assert_equal(%w[ foo bar baz ], @kvs.each_key.to_a)
78
+ assert_equal(%w[ apple banana orange ], @kvs.each_value.to_a)
79
+ assert_equal([ %w[ foo apple ], %w[ bar banana ], %w[ baz orange ] ], @kvs.each_pair.to_a)
80
+
81
+ @kvs.delete('bar')
82
+ assert_equal({ 'foo' => 'apple', 'baz' => 'orange' }, @db)
83
+ assert_equal(%w[ foo baz ], @db.each_key.to_a)
84
+ assert_equal(%w[ foo baz ], @kvs.each_key.to_a)
85
+ assert_equal(%w[ apple orange ], @kvs.each_value.to_a)
86
+ assert_equal([ %w[ foo apple ], %w[ baz orange ] ], @kvs.each_pair.to_a)
87
+ end
88
+
89
+ def test_sync
90
+ @kvs.sync
91
+ end
92
+
93
+ def test_close
94
+ @kvs.close
95
+
96
+ # nil exception
97
+ assert_raise(NoMethodError) { @kvs['foo'] }
98
+ assert_raise(NoMethodError) { @kvs['foo'] = 'apple' }
99
+ assert_raise(NoMethodError) { @kvs.delete('foo') }
100
+ assert_raise(NoMethodError) { @kvs.key? 'foo' }
101
+ assert_raise(NoMethodError) { @kvs.each_key.to_a }
102
+ assert_raise(NoMethodError) { @kvs.each_value.to_a }
103
+ assert_raise(NoMethodError) { @kvs.each_pair.to_a }
104
+ assert_equal({}, @db)
105
+ end
106
+
107
+ def test_destroy
108
+ @kvs.destroy
109
+ end
110
+ end
111
+ end
112
+
113
+ # Local Variables:
114
+ # mode: Ruby
115
+ # indent-tabs-mode: nil
116
+ # End:
@@ -0,0 +1,161 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rims'
4
+ require 'test/unit'
5
+
6
+ Thread.abort_on_exception = true if $DEBUG
7
+
8
+ module RIMS::Test
9
+ class ReadWriteLockTest < Test::Unit::TestCase
10
+ def setup
11
+ @lock = RIMS::ReadWriteLock.new
12
+ end
13
+
14
+ def test_read_lock
15
+ count = 0
16
+ @lock.read_synchronize{ count += 1 }
17
+ assert_equal(1, count)
18
+ end
19
+
20
+ def test_read_lock_simultaneous
21
+ count = 0
22
+ @lock.read_synchronize{
23
+ @lock.read_synchronize{
24
+ count += 1
25
+ }
26
+ }
27
+ assert_equal(1, count)
28
+ end
29
+
30
+ def test_write_lock
31
+ count = 0
32
+ @lock.write_synchronize{ count += 1 }
33
+ assert_equal(1, count)
34
+ end
35
+
36
+ def test_read_lock_timeout
37
+ assert_raise(RIMS::ReadLockTimeoutError) {
38
+ @lock.write_synchronize{
39
+ @lock.read_synchronize(0) {}
40
+ }
41
+ }
42
+ end
43
+
44
+ def test_write_lock_timeout
45
+ assert_raise(RIMS::WriteLockTimeoutError) {
46
+ @lock.write_synchronize{
47
+ @lock.write_synchronize(0) {}
48
+ }
49
+ }
50
+ end
51
+
52
+ def calculate_threa_work_seconds
53
+ t0 = Time.now
54
+ 1000.times{|i| i.succ }
55
+ t1 = Time.now
56
+ wait_seconds = t1 - t0
57
+ p format('%.9f', wait_seconds) if $DEBUG
58
+
59
+ wait_seconds
60
+ end
61
+ private :calculate_threa_work_seconds
62
+
63
+ def test_read_write_lock_multithread
64
+ lock_wait_seconds = calculate_threa_work_seconds
65
+
66
+ count = 0
67
+ read_thread_num = 10
68
+ write_thread_num = 5
69
+ write_loop_num = 100
70
+
71
+ mutex = Thread::Mutex.new
72
+ end_of_read = false
73
+
74
+ read_thread_list = []
75
+ read_thread_num.times do |i|
76
+ read_thread_list << Thread.new(i) {|th_id|
77
+ until (mutex.synchronize{ end_of_read })
78
+ @lock.read_synchronize{
79
+ sleep(lock_wait_seconds)
80
+ assert(count >= 0, "read thread #{th_id}")
81
+ }
82
+ end
83
+ }
84
+ end
85
+
86
+ sleep(lock_wait_seconds)
87
+
88
+ write_thread_list = []
89
+ write_thread_num.times do |i|
90
+ write_thread_list << Thread.new(i) {|th_id|
91
+ write_loop_num.times do
92
+ @lock.write_synchronize{
93
+ tmp_count = count
94
+ count = -1
95
+ sleep(lock_wait_seconds)
96
+ count = tmp_count + 1
97
+ }
98
+ end
99
+ }
100
+ end
101
+
102
+ for t in write_thread_list
103
+ t.join
104
+ end
105
+
106
+ mutex.synchronize{ end_of_read = true }
107
+ for t in read_thread_list
108
+ t.join
109
+ end
110
+
111
+ assert_equal(write_loop_num * write_thread_num, count)
112
+ end
113
+
114
+ def test_write_lock_timeout_detach
115
+ logger = Logger.new(STDOUT)
116
+ logger.level = ($DEBUG) ? Logger::DEBUG : Logger::FATAL
117
+ wait_seconds = calculate_threa_work_seconds
118
+
119
+ t_list = []
120
+ assert_nil(RIMS::ReadWriteLock.write_lock_timeout_detach(wait_seconds, wait_seconds * 2, logger: logger ) {|timeout_seconds|
121
+ @lock.write_synchronize(timeout_seconds) { t_list << timeout_seconds }
122
+ })
123
+ assert_equal([ wait_seconds ], t_list)
124
+
125
+ t_list = []
126
+ detached_thread = nil
127
+ @lock.write_synchronize{
128
+ detached_thread = RIMS::ReadWriteLock.write_lock_timeout_detach(wait_seconds, wait_seconds * 2, logger: logger ) {|timeout_seconds|
129
+ @lock.write_synchronize(timeout_seconds) { t_list << timeout_seconds }
130
+ }
131
+ assert_instance_of(Thread, detached_thread)
132
+ 10.times do
133
+ sleep(wait_seconds)
134
+ end
135
+ }
136
+
137
+ assert_nil(detached_thread.value)
138
+ assert_equal([ wait_seconds * 2 ], t_list)
139
+
140
+ detached_thread = nil
141
+ @lock.write_synchronize{
142
+ detached_thread = RIMS::ReadWriteLock.write_lock_timeout_detach(wait_seconds, wait_seconds * 2, logger: logger ) {|timeout_seconds|
143
+ @lock.write_synchronize(timeout_seconds) { raise 'test' }
144
+ }
145
+ assert_instance_of(Thread, detached_thread)
146
+ 10.times do
147
+ sleep(wait_seconds)
148
+ end
149
+ }
150
+
151
+ assert(error = detached_thread.value)
152
+ assert_equal('test', error.message)
153
+ end
154
+ end
155
+ end
156
+
157
+ # Local Variables:
158
+ # mode: Ruby
159
+ # indent-tabs-mode: nil
160
+ # End:
161
+
@@ -0,0 +1,750 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'logger'
4
+ require 'pp' if $DEBUG
5
+ require 'rims'
6
+ require 'test/unit'
7
+ require 'time'
8
+
9
+ module RIMS::Test
10
+ class MailStoreTest < Test::Unit::TestCase
11
+ include AssertUtility
12
+
13
+ def setup
14
+ @kvs = Hash.new{|h, k| h[k] = Hash.new }
15
+ @kvs_open = proc{|name| RIMS::Hash_KeyValueStore.new(@kvs[name]) }
16
+ @mail_store = RIMS::MailStore.new(RIMS::DB::Meta.new(@kvs_open.call('meta')),
17
+ RIMS::DB::Message.new(@kvs_open.call('msg'))) {|mbox_id|
18
+ RIMS::DB::Mailbox.new(@kvs_open.call("mbox_#{mbox_id}"))
19
+ }
20
+ end
21
+
22
+ def teardown
23
+ @mail_store.close if @mail_store
24
+ pp @kvs if $DEBUG
25
+ end
26
+
27
+ def test_mbox
28
+ assert_equal(0, @mail_store.cnum)
29
+ assert_equal(1, @mail_store.uidvalidity)
30
+ assert_equal([], @mail_store.each_mbox_id.to_a)
31
+
32
+ assert_equal(1, @mail_store.add_mbox('INBOX'))
33
+ assert_equal(1, @mail_store.cnum)
34
+ assert_equal(2, @mail_store.uidvalidity)
35
+ assert_strenc_equal('utf-8', 'INBOX', @mail_store.mbox_name(1))
36
+ assert_equal(1, @mail_store.mbox_id('INBOX'))
37
+ assert_equal([ 1 ], @mail_store.each_mbox_id.to_a)
38
+
39
+ assert_equal('INBOX', @mail_store.rename_mbox(1, 'foo'))
40
+ assert_equal(2, @mail_store.cnum)
41
+ assert_equal(2, @mail_store.uidvalidity)
42
+ assert_strenc_equal('utf-8', 'foo', @mail_store.mbox_name(1))
43
+ assert_equal(1, @mail_store.mbox_id('foo'))
44
+ assert_nil(@mail_store.mbox_id('INBOX'))
45
+ assert_equal([ 1 ], @mail_store.each_mbox_id.to_a)
46
+
47
+ assert_equal('foo', @mail_store.del_mbox(1))
48
+ assert_equal(3, @mail_store.cnum)
49
+ assert_equal(2, @mail_store.uidvalidity)
50
+ assert_nil(@mail_store.mbox_name(1))
51
+ assert_nil(@mail_store.mbox_id('foo'))
52
+ assert_equal([], @mail_store.each_mbox_id.to_a)
53
+
54
+ assert_equal(2, @mail_store.add_mbox('INBOX'))
55
+ assert_equal(4, @mail_store.cnum)
56
+ assert_equal(3, @mail_store.uidvalidity)
57
+ assert_strenc_equal('utf-8', 'INBOX', @mail_store.mbox_name(2))
58
+ assert_equal(2, @mail_store.mbox_id('INBOX'))
59
+ assert_equal([ 2 ], @mail_store.each_mbox_id.to_a)
60
+ end
61
+
62
+ def test_msg
63
+ cnum = @mail_store.cnum
64
+ mbox_id = @mail_store.add_mbox('INBOX')
65
+ assert_equal(0, @mail_store.mbox_msg_num(mbox_id))
66
+ assert_equal([], @mail_store.each_msg_uid(mbox_id).to_a)
67
+ assert(! (@mail_store.msg_exist? mbox_id, 1))
68
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
69
+ uid = @mail_store.add_msg(mbox_id, 'foo', Time.parse('1975-11-19 12:34:56'))
70
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
71
+ assert_equal(1, @mail_store.mbox_msg_num(mbox_id))
72
+ assert((@mail_store.msg_exist? mbox_id, 1))
73
+ assert_equal([ uid ], @mail_store.each_msg_uid(mbox_id).to_a)
74
+
75
+ assert_equal('foo', @mail_store.msg_text(mbox_id, uid))
76
+ assert_equal(Time.parse('1975-11-19 12:34:56'), @mail_store.msg_date(mbox_id, uid))
77
+
78
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'seen'))
79
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'answered'))
80
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'flagged'))
81
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'deleted'))
82
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'draft'))
83
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'recent'))
84
+
85
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'seen'))
86
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'answered'))
87
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'flagged'))
88
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'deleted'))
89
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'draft'))
90
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'recent'))
91
+
92
+ copy_mbox_id = @mail_store.add_mbox('copy_test')
93
+ assert_equal(0, @mail_store.mbox_msg_num(copy_mbox_id))
94
+ assert_equal([], @mail_store.each_msg_uid(copy_mbox_id).to_a)
95
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
96
+ copy_uid = @mail_store.copy_msg(uid, mbox_id, copy_mbox_id)
97
+ assert_equal(1, copy_uid)
98
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
99
+ assert_equal(1, @mail_store.mbox_msg_num(copy_mbox_id))
100
+ assert_equal([ uid ], @mail_store.each_msg_uid(copy_mbox_id).to_a)
101
+
102
+ assert_equal('foo', @mail_store.msg_text(copy_mbox_id, uid))
103
+ assert_equal(Time.parse('1975-11-19 12:34:56'), @mail_store.msg_date(copy_mbox_id, uid))
104
+
105
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
106
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
107
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
108
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
109
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
110
+ assert_equal(1, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
111
+
112
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
113
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
114
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
115
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
116
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
117
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
118
+
119
+ # duplicated message copy
120
+ copy2_uid = @mail_store.copy_msg(uid, mbox_id, copy_mbox_id)
121
+ assert_equal(2, copy2_uid)
122
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
123
+ assert_equal(2, @mail_store.mbox_msg_num(copy_mbox_id))
124
+ assert_equal([ uid, uid + 1 ], @mail_store.each_msg_uid(copy_mbox_id).to_a)
125
+
126
+ assert_equal('foo', @mail_store.msg_text(copy_mbox_id, uid))
127
+ assert_equal(Time.parse('1975-11-19 12:34:56'), @mail_store.msg_date(copy_mbox_id, uid))
128
+
129
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
130
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
131
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
132
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
133
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
134
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
135
+
136
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
137
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
138
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
139
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
140
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
141
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
142
+
143
+ @mail_store.set_msg_flag(mbox_id, uid, 'seen', true)
144
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
145
+
146
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'seen'))
147
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'answered'))
148
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'flagged'))
149
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'deleted'))
150
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'draft'))
151
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'recent'))
152
+
153
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'seen'))
154
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'answered'))
155
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'flagged'))
156
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'deleted'))
157
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'draft'))
158
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'recent'))
159
+
160
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
161
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
162
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
163
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
164
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
165
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
166
+
167
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
168
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
169
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
170
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
171
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
172
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
173
+
174
+ # duplicated flag settings
175
+ @mail_store.set_msg_flag(mbox_id, uid, 'seen', true)
176
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
177
+
178
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'seen'))
179
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'answered'))
180
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'flagged'))
181
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'deleted'))
182
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'draft'))
183
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'recent'))
184
+
185
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'seen'))
186
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'answered'))
187
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'flagged'))
188
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'deleted'))
189
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'draft'))
190
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'recent'))
191
+
192
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
193
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
194
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
195
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
196
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
197
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
198
+
199
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
200
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
201
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
202
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
203
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
204
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
205
+
206
+ @mail_store.set_msg_flag(mbox_id, uid, 'recent', false)
207
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
208
+
209
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'seen'))
210
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'answered'))
211
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'flagged'))
212
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'deleted'))
213
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'draft'))
214
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'recent'))
215
+
216
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'seen'))
217
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'answered'))
218
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'flagged'))
219
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'deleted'))
220
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'draft'))
221
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'recent'))
222
+
223
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
224
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
225
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
226
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
227
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
228
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
229
+
230
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
231
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
232
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
233
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
234
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
235
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
236
+
237
+ # duplicated
238
+ @mail_store.set_msg_flag(mbox_id, uid, 'recent', false)
239
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
240
+
241
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'seen'))
242
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'answered'))
243
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'flagged'))
244
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'deleted'))
245
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'draft'))
246
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'recent'))
247
+
248
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'seen'))
249
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'answered'))
250
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'flagged'))
251
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'deleted'))
252
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'draft'))
253
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'recent'))
254
+
255
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
256
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
257
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
258
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
259
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
260
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
261
+
262
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
263
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
264
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
265
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
266
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
267
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
268
+
269
+ @mail_store.set_msg_flag(mbox_id, uid, 'deleted', true)
270
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
271
+
272
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'seen'))
273
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'answered'))
274
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'flagged'))
275
+ assert_equal(1, @mail_store.mbox_flag_num(mbox_id, 'deleted'))
276
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'draft'))
277
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'recent'))
278
+
279
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'seen'))
280
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'answered'))
281
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'flagged'))
282
+ assert_equal(true, @mail_store.msg_flag(mbox_id, uid, 'deleted'))
283
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'draft'))
284
+ assert_equal(false, @mail_store.msg_flag(mbox_id, uid, 'recent'))
285
+
286
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
287
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
288
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
289
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
290
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
291
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
292
+
293
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
294
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
295
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
296
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
297
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
298
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
299
+
300
+ @mail_store.expunge_mbox(mbox_id)
301
+ assert(@mail_store.cnum > cnum); cnum = @mail_store.cnum
302
+ assert_equal(0, @mail_store.mbox_msg_num(mbox_id))
303
+ assert_equal([], @mail_store.each_msg_uid(mbox_id).to_a)
304
+
305
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'seen'))
306
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'answered'))
307
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'flagged'))
308
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'deleted'))
309
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'draft'))
310
+ assert_equal(0, @mail_store.mbox_flag_num(mbox_id, 'recent'))
311
+
312
+ assert_equal(2, @mail_store.mbox_msg_num(copy_mbox_id))
313
+ assert_equal([ uid, uid + 1 ], @mail_store.each_msg_uid(copy_mbox_id).to_a)
314
+
315
+ assert_equal(2, @mail_store.mbox_flag_num(copy_mbox_id, 'seen'))
316
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'answered'))
317
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'flagged'))
318
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'deleted'))
319
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'draft'))
320
+ assert_equal(0, @mail_store.mbox_flag_num(copy_mbox_id, 'recent'))
321
+
322
+ assert_equal(true, @mail_store.msg_flag(copy_mbox_id, uid, 'seen'))
323
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'answered'))
324
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'flagged'))
325
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'deleted'))
326
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'draft'))
327
+ assert_equal(false, @mail_store.msg_flag(copy_mbox_id, uid, 'recent'))
328
+ end
329
+
330
+ def test_mail_folder
331
+ mbox_id = @mail_store.add_mbox('INBOX')
332
+ folder = @mail_store.select_mbox(mbox_id)
333
+ assert_equal(mbox_id, folder.mbox_id)
334
+ assert_equal(false, folder.read_only)
335
+ assert_equal(true, folder.updated?)
336
+
337
+ folder.reload
338
+ assert_equal(false, folder.updated?)
339
+ assert_equal([], folder.each_msg.to_a)
340
+
341
+ @mail_store.add_msg(mbox_id, 'foo')
342
+ assert_equal(true, folder.updated?)
343
+ folder.reload
344
+ assert_equal(false, folder.updated?)
345
+ assert_equal(1, folder[0].num)
346
+ assert_equal(1, folder[0].uid)
347
+ assert_equal([ [ 1, 1 ] ], folder.each_msg.map{|i| i.to_a })
348
+ end
349
+
350
+ def each_msg_src
351
+ return enum_for(:each_msg_src) unless block_given?
352
+ s = 'a'
353
+ loop do
354
+ yield(s)
355
+ s.succ!
356
+ end
357
+ end
358
+ private :each_msg_src
359
+
360
+ def test_mail_folder_parse_msg_set
361
+ mbox_id = @mail_store.add_mbox('INBOX')
362
+
363
+ msg_src = each_msg_src
364
+ 100.times do
365
+ @mail_store.add_msg(mbox_id, msg_src.next)
366
+ end
367
+ @mail_store.each_msg_uid(mbox_id) do |id|
368
+ if (id % 2 == 0) then
369
+ @mail_store.set_msg_flag(mbox_id, id, 'deleted', true)
370
+ end
371
+ end
372
+ @mail_store.expunge_mbox(mbox_id)
373
+
374
+ folder = @mail_store.select_mbox(mbox_id).reload
375
+
376
+ assert_equal([ 1 ].to_set, folder.parse_msg_set('1'))
377
+ assert_equal([ 1 ].to_set, folder.parse_msg_set('1', uid: false))
378
+ assert_equal([ 1 ].to_set, folder.parse_msg_set('1', uid: true))
379
+
380
+ assert_equal([ 2 ].to_set, folder.parse_msg_set('2'))
381
+ assert_equal([ 2 ].to_set, folder.parse_msg_set('2', uid: false))
382
+ assert_equal([ 2 ].to_set, folder.parse_msg_set('2', uid: true))
383
+
384
+ assert_equal([ 50 ].to_set, folder.parse_msg_set('*'))
385
+ assert_equal([ 50 ].to_set, folder.parse_msg_set('*', uid: false))
386
+ assert_equal([ 99 ].to_set, folder.parse_msg_set('*', uid: true))
387
+
388
+ assert_equal((1..50).to_set, folder.parse_msg_set('1:*'))
389
+ assert_equal((1..50).to_set, folder.parse_msg_set('1:*', uid: false))
390
+ assert_equal((1..99).to_set, folder.parse_msg_set('1:*', uid: true))
391
+
392
+ assert_raise(RIMS::MessageSetSyntaxError) {
393
+ folder.parse_msg_set('detarame')
394
+ }
395
+ end
396
+
397
+ def test_mail_folder_parse_msg_set_empty
398
+ mbox_id = @mail_store.add_mbox('INBOX')
399
+ assert_equal([], @mail_store.each_msg_uid(mbox_id).to_a)
400
+ folder = @mail_store.select_mbox(mbox_id).reload
401
+
402
+ assert_equal([ 1 ].to_set, folder.parse_msg_set('1'))
403
+ assert_equal([ 1 ].to_set, folder.parse_msg_set('1', uid: false))
404
+ assert_equal([ 1 ].to_set, folder.parse_msg_set('1', uid: true))
405
+
406
+ assert_equal([ 0 ].to_set, folder.parse_msg_set('*'))
407
+ assert_equal([ 0 ].to_set, folder.parse_msg_set('*', uid: false))
408
+ assert_equal([ 0 ].to_set, folder.parse_msg_set('*', uid: true))
409
+
410
+ assert_equal([].to_set, folder.parse_msg_set('1:*'))
411
+ assert_equal([].to_set, folder.parse_msg_set('1:*', uid: false))
412
+ assert_equal([].to_set, folder.parse_msg_set('1:*', uid: true))
413
+ end
414
+
415
+ def test_mail_folder_expunge_mbox
416
+ mbox_id = @mail_store.add_mbox('INBOX')
417
+ @mail_store.add_msg(mbox_id, 'a') # 1 deleted
418
+ @mail_store.add_msg(mbox_id, 'b') # 2 deleted
419
+ @mail_store.add_msg(mbox_id, 'c') # 3
420
+ @mail_store.add_msg(mbox_id, 'd') # 4
421
+ @mail_store.add_msg(mbox_id, 'e') # 5
422
+ @mail_store.add_msg(mbox_id, 'f') # 6 deleted
423
+ @mail_store.add_msg(mbox_id, 'g') # 7
424
+ @mail_store.add_msg(mbox_id, 'h') # 8 deleted
425
+
426
+ folder = @mail_store.select_mbox(mbox_id).reload
427
+ assert_equal(8, folder.each_msg.count)
428
+
429
+ client_msg_list = folder.each_msg.to_a
430
+ @mail_store.set_msg_flag(mbox_id, client_msg_list[0].uid, 'deleted', true)
431
+ @mail_store.set_msg_flag(mbox_id, client_msg_list[7].uid, 'deleted', true)
432
+ @mail_store.set_msg_flag(mbox_id, client_msg_list[1].uid, 'deleted', true)
433
+ @mail_store.set_msg_flag(mbox_id, client_msg_list[5].uid, 'deleted', true)
434
+
435
+ folder.expunge_mbox do |msg_num|
436
+ client_msg_list.delete_at(msg_num - 1)
437
+ end
438
+ folder.reload
439
+
440
+ assert_equal(folder.each_msg.map(&:uid), client_msg_list.map(&:uid))
441
+ end
442
+
443
+ def test_close_open
444
+ mbox_id1 = @mail_store.add_mbox('INBOX')
445
+ msg_uid1 = @mail_store.add_msg(mbox_id1, 'foo', Time.local(2014, 5, 6, 12, 34, 56))
446
+ msg_uid2 = @mail_store.add_msg(mbox_id1, 'bar', Time.local(2014, 5, 6, 12, 34, 57))
447
+ msg_uid3 = @mail_store.add_msg(mbox_id1, 'baz', Time.local(2014, 5, 6, 12, 34, 58))
448
+ mbox_id2 = @mail_store.add_mbox('foo')
449
+ mbox_id3 = @mail_store.add_mbox('bar')
450
+
451
+ assert_equal(mbox_id3 + 1, @mail_store.uidvalidity)
452
+ assert_equal([ mbox_id1, mbox_id2, mbox_id3 ], @mail_store.each_mbox_id.to_a)
453
+ assert_equal('INBOX', @mail_store.mbox_name(mbox_id1))
454
+ assert_equal('foo', @mail_store.mbox_name(mbox_id2))
455
+ assert_equal('bar', @mail_store.mbox_name(mbox_id3))
456
+ assert_equal(mbox_id1, @mail_store.mbox_id('INBOX'))
457
+ assert_equal(mbox_id2, @mail_store.mbox_id('foo'))
458
+ assert_equal(mbox_id3, @mail_store.mbox_id('bar'))
459
+ assert_equal(mbox_id3 + 1, @mail_store.uid(mbox_id1))
460
+ assert_equal(1, @mail_store.uid(mbox_id2))
461
+ assert_equal(1, @mail_store.uid(mbox_id3))
462
+ assert_equal(3, @mail_store.mbox_msg_num(mbox_id1))
463
+ assert_equal(0, @mail_store.mbox_msg_num(mbox_id2))
464
+ assert_equal(0, @mail_store.mbox_msg_num(mbox_id2))
465
+
466
+ assert_equal([ msg_uid1, msg_uid2, msg_uid3 ], @mail_store.each_msg_uid(mbox_id1).to_a)
467
+ assert_equal('foo', @mail_store.msg_text(mbox_id1, msg_uid1))
468
+ assert_equal('bar', @mail_store.msg_text(mbox_id1, msg_uid2))
469
+ assert_equal('baz', @mail_store.msg_text(mbox_id1, msg_uid3))
470
+ assert_equal(Time.local(2014, 5, 6, 12, 34, 56), @mail_store.msg_date(mbox_id1, msg_uid1))
471
+ assert_equal(Time.local(2014, 5, 6, 12, 34, 57), @mail_store.msg_date(mbox_id1, msg_uid2))
472
+ assert_equal(Time.local(2014, 5, 6, 12, 34, 58), @mail_store.msg_date(mbox_id1, msg_uid3))
473
+
474
+ @mail_store.close
475
+ @mail_store = RIMS::MailStore.new(RIMS::DB::Meta.new(@kvs_open.call('meta')),
476
+ RIMS::DB::Message.new(@kvs_open.call('msg'))) {|mbox_id|
477
+ RIMS::DB::Mailbox.new(@kvs_open.call("mbox_#{mbox_id}"))
478
+ }
479
+
480
+ assert_equal(mbox_id3 + 1, @mail_store.uidvalidity)
481
+ assert_equal([ mbox_id1, mbox_id2, mbox_id3 ], @mail_store.each_mbox_id.to_a)
482
+ assert_equal('INBOX', @mail_store.mbox_name(mbox_id1))
483
+ assert_equal('foo', @mail_store.mbox_name(mbox_id2))
484
+ assert_equal('bar', @mail_store.mbox_name(mbox_id3))
485
+ assert_equal(mbox_id1, @mail_store.mbox_id('INBOX'))
486
+ assert_equal(mbox_id2, @mail_store.mbox_id('foo'))
487
+ assert_equal(mbox_id3, @mail_store.mbox_id('bar'))
488
+ assert_equal(mbox_id3 + 1, @mail_store.uid(mbox_id1))
489
+ assert_equal(1, @mail_store.uid(mbox_id2))
490
+ assert_equal(1, @mail_store.uid(mbox_id3))
491
+ assert_equal(3, @mail_store.mbox_msg_num(mbox_id1))
492
+ assert_equal(0, @mail_store.mbox_msg_num(mbox_id2))
493
+ assert_equal(0, @mail_store.mbox_msg_num(mbox_id2))
494
+
495
+ assert_equal([ msg_uid1, msg_uid2, msg_uid3 ], @mail_store.each_msg_uid(mbox_id1).to_a)
496
+ assert_equal('foo', @mail_store.msg_text(mbox_id1, msg_uid1))
497
+ assert_equal('bar', @mail_store.msg_text(mbox_id1, msg_uid2))
498
+ assert_equal('baz', @mail_store.msg_text(mbox_id1, msg_uid3))
499
+ assert_equal(Time.local(2014, 5, 6, 12, 34, 56), @mail_store.msg_date(mbox_id1, msg_uid1))
500
+ assert_equal(Time.local(2014, 5, 6, 12, 34, 57), @mail_store.msg_date(mbox_id1, msg_uid2))
501
+ assert_equal(Time.local(2014, 5, 6, 12, 34, 58), @mail_store.msg_date(mbox_id1, msg_uid3))
502
+ end
503
+ end
504
+
505
+ class MailFolderClassMethodTest < Test::Unit::TestCase
506
+ def test_parse_msg_seq
507
+ assert_equal(1..1, RIMS::MailFolder.parse_msg_seq('1', 99))
508
+ assert_equal(99..99, RIMS::MailFolder.parse_msg_seq('*', 99))
509
+ assert_equal(1..10, RIMS::MailFolder.parse_msg_seq('1:10', 99))
510
+ assert_equal(1..99, RIMS::MailFolder.parse_msg_seq('1:*', 99))
511
+ assert_equal(99..99, RIMS::MailFolder.parse_msg_seq('*:*', 99))
512
+ assert_raise(RIMS::MessageSetSyntaxError) {
513
+ RIMS::MailFolder.parse_msg_seq('detarame', 99)
514
+ }
515
+ end
516
+
517
+ def test_parse_msg_set
518
+ assert_equal([ 1 ].to_set, RIMS::MailFolder.parse_msg_set('1', 99))
519
+ assert_equal([ 99 ].to_set, RIMS::MailFolder.parse_msg_set('*', 99))
520
+ assert_equal((1..10).to_set, RIMS::MailFolder.parse_msg_set('1:10', 99))
521
+ assert_equal((1..99).to_set, RIMS::MailFolder.parse_msg_set('1:*', 99))
522
+ assert_equal((99..99).to_set, RIMS::MailFolder.parse_msg_set('*:*', 99))
523
+
524
+ assert_equal([ 1, 5, 7, 99 ].to_set, RIMS::MailFolder.parse_msg_set('1,5,7,*', 99))
525
+ assert_equal([ 1, 2, 3, 11, 97, 98, 99 ].to_set, RIMS::MailFolder.parse_msg_set('1:3,11,97:*', 99))
526
+ assert_equal((1..99).to_set, RIMS::MailFolder.parse_msg_set('1:70,30:*', 99))
527
+
528
+ assert_raise(RIMS::MessageSetSyntaxError) {
529
+ RIMS::MailFolder.parse_msg_set('detarame', 99)
530
+ }
531
+ assert_raise(RIMS::MessageSetSyntaxError) {
532
+ RIMS::MailFolder.parse_msg_set('1,2,X', 99)
533
+ }
534
+ end
535
+ end
536
+
537
+ class MailStoreRecoveryTest < Test::Unit::TestCase
538
+ def setup
539
+ @logger = Logger.new(STDOUT)
540
+ @logger.level = ($DEBUG) ? Logger::DEBUG : Logger::FATAL
541
+
542
+ @kvs = Hash.new{|h, k| h[k] = Hash.new }
543
+ @kvs_open = proc{|name| RIMS::Hash_KeyValueStore.new(@kvs[name]) }
544
+ @mbox_db_factory = proc{|mbox_id| RIMS::DB::Mailbox.new(@kvs_open.call("mbox_#{mbox_id}")) }
545
+ end
546
+
547
+ def teardown
548
+ pp @kvs if $DEBUG
549
+ end
550
+
551
+ def make_mail_store
552
+ RIMS::MailStore.new(RIMS::DB::Meta.new(@kvs_open.call('meta')),
553
+ RIMS::DB::Message.new(@kvs_open.call('msg'))) {|mbox_id|
554
+ RIMS::DB::Mailbox.new(@kvs_open.call("mbox_#{mbox_id}"))
555
+ }
556
+ end
557
+ private :make_mail_store
558
+
559
+ def test_no_recovery
560
+ mail_store = make_mail_store
561
+ assert_equal(false, mail_store.abort_transaction?)
562
+ mail_store.close
563
+
564
+ mail_store = make_mail_store
565
+ assert_equal(false, mail_store.abort_transaction?)
566
+ mail_store.close
567
+ end
568
+
569
+ def test_recovery_empty
570
+ mail_store = make_mail_store
571
+ assert_equal(false, mail_store.abort_transaction?)
572
+ assert_raise(RuntimeError) {
573
+ mail_store.transaction do
574
+ raise 'abort'
575
+ end
576
+ }
577
+ assert_equal(true, mail_store.abort_transaction?)
578
+ mail_store.close
579
+
580
+ mail_store = make_mail_store
581
+ assert_equal(true, mail_store.abort_transaction?)
582
+ mail_store.recovery_data(logger: @logger)
583
+ assert_equal(false, mail_store.abort_transaction?)
584
+ mail_store.close
585
+ end
586
+
587
+ def test_recovery_some_msgs_mboxes
588
+ mail_store = make_mail_store
589
+ inbox_id = mail_store.add_mbox('INBOX')
590
+ mail_store.add_msg(inbox_id, 'foo')
591
+ mail_store.add_msg(inbox_id, 'bar')
592
+ mail_store.add_msg(inbox_id, 'baz')
593
+ mail_store.add_mbox('foo')
594
+ mail_store.add_mbox('bar')
595
+
596
+ assert_equal(false, mail_store.abort_transaction?)
597
+ assert_raise(RuntimeError) {
598
+ mail_store.transaction do
599
+ raise 'abort'
600
+ end
601
+ }
602
+ assert_equal(true, mail_store.abort_transaction?)
603
+ mail_store.close
604
+
605
+ mail_store = make_mail_store
606
+ assert_equal(true, mail_store.abort_transaction?)
607
+ mail_store.recovery_data(logger: @logger)
608
+ assert_equal(false, mail_store.abort_transaction?)
609
+ mail_store.close
610
+ end
611
+ end
612
+
613
+ class MailStorePoolRefCountTest < Test::Unit::TestCase
614
+ def setup
615
+ @kvs = Hash.new{|h, k| h[k] = {} }
616
+ @kvs_open = proc{|mbox_version, unique_user_id, db_name|
617
+ RIMS::Hash_KeyValueStore.new(@kvs["#{mbox_version}/#{unique_user_id[0, 7]}/#{db_name}"])
618
+ }
619
+ @mail_store_pool = RIMS::MailStore.build_pool(@kvs_open, @kvs_open)
620
+ end
621
+
622
+ def teardown
623
+ pp @kvs if $DEBUG
624
+ end
625
+
626
+ def assert_call_hook
627
+ call_count = 0
628
+ yield(proc{ call_count += 1 })
629
+ assert_equal(1, call_count, 'a hook should be called once.')
630
+ end
631
+ private :assert_call_hook
632
+
633
+ def test_holder_object_key
634
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
635
+ holder = @mail_store_pool.get(unique_user_id)
636
+ assert_equal(unique_user_id, holder.object_key)
637
+ assert_equal(unique_user_id, holder.unique_user_id)
638
+ end
639
+
640
+ def test_get
641
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
642
+ assert_call_hook{|hook|
643
+ @mail_store_pool.get(unique_user_id) { hook.call }
644
+ }
645
+ end
646
+
647
+ def test_get2
648
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
649
+ @mail_store_pool.get(unique_user_id)
650
+ @mail_store_pool.get(unique_user_id) { flunk }
651
+ end
652
+
653
+ def test_get_multiuser
654
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
655
+ unique_user_id2 = RIMS::Authentication.unique_user_id('bar')
656
+
657
+ assert_call_hook{|hook|
658
+ @mail_store_pool.get(unique_user_id) { hook.call }
659
+ }
660
+ assert_call_hook{|hook|
661
+ @mail_store_pool.get(unique_user_id2) { hook.call }
662
+ }
663
+
664
+ @mail_store_pool.get(unique_user_id) { flunk }
665
+ @mail_store_pool.get(unique_user_id2) { flunk }
666
+ end
667
+
668
+ def test_return_pool
669
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
670
+
671
+ holder = @mail_store_pool.get(unique_user_id)
672
+ assert_call_hook{|hook|
673
+ holder.return_pool{ hook.call }
674
+ }
675
+ end
676
+
677
+ def test_return_pool2
678
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
679
+
680
+ holders = []
681
+ holders << @mail_store_pool.get(unique_user_id)
682
+ holders << @mail_store_pool.get(unique_user_id)
683
+ holders << @mail_store_pool.get(unique_user_id)
684
+
685
+ holders.pop.return_pool{ flunk }
686
+ holders.shift.return_pool{ flunk }
687
+ assert_call_hook{|hook|
688
+ holders.pop.return_pool{ hook.call }
689
+ }
690
+ end
691
+
692
+ def test_return_pool_multiuser
693
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
694
+ unique_user_id2 = RIMS::Authentication.unique_user_id('bar')
695
+
696
+ holders = []
697
+ holders << @mail_store_pool.get(unique_user_id)
698
+ holders << @mail_store_pool.get(unique_user_id)
699
+ holders << @mail_store_pool.get(unique_user_id)
700
+
701
+ holders2 = []
702
+ holders2 << @mail_store_pool.get(unique_user_id2)
703
+ holders2 << @mail_store_pool.get(unique_user_id2)
704
+ holders2 << @mail_store_pool.get(unique_user_id2)
705
+
706
+ holders.pop.return_pool{ flunk }
707
+ holders2.shift.return_pool{ flunk }
708
+ holders.pop.return_pool{ flunk }
709
+ holders2.shift.return_pool{ flunk }
710
+ assert_call_hook{|hook|
711
+ holders2.shift.return_pool{ hook.call }
712
+ }
713
+ assert_call_hook{|hook|
714
+ holders.pop.return_pool{ hook.call }
715
+ }
716
+ end
717
+
718
+ def test_cycle
719
+ unique_user_id = RIMS::Authentication.unique_user_id('foo')
720
+
721
+ holders = []
722
+ assert_call_hook{|hook|
723
+ holders << @mail_store_pool.get(unique_user_id) { hook.call }
724
+ }
725
+ holders << @mail_store_pool.get(unique_user_id) { flunk }
726
+ holders << @mail_store_pool.get(unique_user_id) { flunk }
727
+
728
+ holders.pop.return_pool{ flunk }
729
+ holders.pop.return_pool{ flunk }
730
+ assert_call_hook{|hook|
731
+ holders.pop.return_pool{ hook.call }
732
+ }
733
+
734
+ assert_call_hook{|hook|
735
+ holders << @mail_store_pool.get(unique_user_id) { hook.call }
736
+ }
737
+ holders << @mail_store_pool.get(unique_user_id) { flunk }
738
+
739
+ holders.shift.return_pool{ flunk }
740
+ assert_call_hook{|hook|
741
+ holders.shift.return_pool{ hook.call }
742
+ }
743
+ end
744
+ end
745
+ end
746
+
747
+ # Local Variables:
748
+ # mode: Ruby
749
+ # indent-tabs-mode: nil
750
+ # End: