rims 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: