rubyrep 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +84 -0
- data/History.txt +6 -0
- data/README.txt +1 -1
- data/Rakefile +6 -27
- data/bin/rubyrep +1 -1
- data/config/mysql_config.rb +2 -2
- data/config/postgres_config.rb +5 -3
- data/lib/rubyrep/command_runner.rb +1 -1
- data/lib/rubyrep/connection_extenders/connection_extenders.rb +30 -44
- data/lib/rubyrep/connection_extenders/mysql_extender.rb +23 -1
- data/lib/rubyrep/connection_extenders/postgresql_extender.rb +31 -168
- data/lib/rubyrep/generate_runner.rb +1 -1
- data/lib/rubyrep/logged_change.rb +1 -1
- data/lib/rubyrep/proxy_connection.rb +22 -12
- data/lib/rubyrep/replication_difference.rb +1 -1
- data/lib/rubyrep/replication_extenders/mysql_replication.rb +1 -1
- data/lib/rubyrep/replication_helper.rb +1 -1
- data/lib/rubyrep/replication_runner.rb +10 -0
- data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +1 -1
- data/lib/rubyrep/table_spec_resolver.rb +1 -1
- data/lib/rubyrep/type_casting_cursor.rb +8 -4
- data/lib/rubyrep/version.rb +1 -7
- data/lib/rubyrep.rb +4 -3
- data/rubyrep +4 -0
- data/rubyrep.bat +5 -0
- data/rubyrep.gemspec +29 -0
- data/sims/performance/big_rep_spec.rb +34 -17
- data/sims/performance/performance.rake +11 -31
- data/tasks/database.rake +14 -14
- data/tasks/java.rake +18 -5
- data/tasks/rspec.rake +14 -34
- data/tasks/stats.rake +1 -16
- metadata +99 -162
- data/.gemtest +0 -0
- data/config/requirements.rb +0 -32
- data/lib/rubyrep/connection_extenders/jdbc_extender.rb +0 -65
- data/spec/base_runner_spec.rb +0 -218
- data/spec/buffered_committer_spec.rb +0 -274
- data/spec/command_runner_spec.rb +0 -145
- data/spec/committers_spec.rb +0 -178
- data/spec/configuration_spec.rb +0 -203
- data/spec/connection_extender_interface_spec.rb +0 -141
- data/spec/connection_extenders_registration_spec.rb +0 -164
- data/spec/database_proxy_spec.rb +0 -48
- data/spec/database_rake_spec.rb +0 -40
- data/spec/db_specific_connection_extenders_spec.rb +0 -34
- data/spec/db_specific_replication_extenders_spec.rb +0 -38
- data/spec/direct_table_scan_spec.rb +0 -61
- data/spec/dolphins.jpg +0 -0
- data/spec/generate_runner_spec.rb +0 -84
- data/spec/initializer_spec.rb +0 -46
- data/spec/log_helper_spec.rb +0 -39
- data/spec/logged_change_loader_spec.rb +0 -68
- data/spec/logged_change_spec.rb +0 -470
- data/spec/noisy_connection_spec.rb +0 -78
- data/spec/postgresql_replication_spec.rb +0 -48
- data/spec/postgresql_schema_support_spec.rb +0 -212
- data/spec/postgresql_support_spec.rb +0 -63
- data/spec/progress_bar_spec.rb +0 -77
- data/spec/proxied_table_scan_spec.rb +0 -151
- data/spec/proxy_block_cursor_spec.rb +0 -197
- data/spec/proxy_connection_spec.rb +0 -423
- data/spec/proxy_cursor_spec.rb +0 -56
- data/spec/proxy_row_cursor_spec.rb +0 -66
- data/spec/proxy_runner_spec.rb +0 -70
- data/spec/replication_difference_spec.rb +0 -161
- data/spec/replication_extender_interface_spec.rb +0 -367
- data/spec/replication_extenders_spec.rb +0 -32
- data/spec/replication_helper_spec.rb +0 -178
- data/spec/replication_initializer_spec.rb +0 -509
- data/spec/replication_run_spec.rb +0 -443
- data/spec/replication_runner_spec.rb +0 -254
- data/spec/replicators_spec.rb +0 -36
- data/spec/rubyrep_spec.rb +0 -8
- data/spec/scan_detail_reporter_spec.rb +0 -119
- data/spec/scan_progress_printers_spec.rb +0 -68
- data/spec/scan_report_printers_spec.rb +0 -67
- data/spec/scan_runner_spec.rb +0 -50
- data/spec/scan_summary_reporter_spec.rb +0 -61
- data/spec/session_spec.rb +0 -253
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -305
- data/spec/strange_name_support_spec.rb +0 -135
- data/spec/sync_helper_spec.rb +0 -169
- data/spec/sync_runner_spec.rb +0 -78
- data/spec/syncers_spec.rb +0 -171
- data/spec/table_scan_helper_spec.rb +0 -36
- data/spec/table_scan_spec.rb +0 -49
- data/spec/table_sorter_spec.rb +0 -30
- data/spec/table_spec_resolver_spec.rb +0 -111
- data/spec/table_sync_spec.rb +0 -140
- data/spec/task_sweeper_spec.rb +0 -47
- data/spec/trigger_mode_switcher_spec.rb +0 -83
- data/spec/two_way_replicator_spec.rb +0 -721
- data/spec/two_way_syncer_spec.rb +0 -256
- data/spec/type_casting_cursor_spec.rb +0 -50
- data/spec/uninstall_runner_spec.rb +0 -93
- data/tasks/rubyrep.tailor +0 -18
- data/tasks/website.rake +0 -19
data/spec/configuration_spec.rb
DELETED
@@ -1,203 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
|
3
|
-
include RR
|
4
|
-
|
5
|
-
describe Configuration do
|
6
|
-
before(:each) do
|
7
|
-
end
|
8
|
-
|
9
|
-
it "initialize should set #left and #right to empty hashes" do
|
10
|
-
config = Configuration.new
|
11
|
-
config.left.should == {}
|
12
|
-
config.right.should == {}
|
13
|
-
end
|
14
|
-
|
15
|
-
it "initialize should set #options to the default options" do
|
16
|
-
config = Configuration.new
|
17
|
-
config.options.should == Configuration::DEFAULT_OPTIONS
|
18
|
-
end
|
19
|
-
|
20
|
-
it "options= should merge the provided into the existing options" do
|
21
|
-
config = Configuration.new
|
22
|
-
config.options = {:bla => :bla}
|
23
|
-
config.options = {:bla => :blub}
|
24
|
-
config.options[:bla].should == :blub
|
25
|
-
end
|
26
|
-
|
27
|
-
it "each_matching_option should yield if general option matches" do
|
28
|
-
config = Configuration.new
|
29
|
-
config.options = {:bla => :blub}
|
30
|
-
yielded = []
|
31
|
-
config.each_matching_option(:bla) {|spec, value| yielded << [spec, value]}
|
32
|
-
yielded.should == [[nil, :blub]]
|
33
|
-
end
|
34
|
-
|
35
|
-
it "each_matching_option should yield if table specific options match" do
|
36
|
-
config = Configuration.new
|
37
|
-
config.options = {:a => 1}
|
38
|
-
config.add_table_options 't1', :a => 2
|
39
|
-
config.add_table_options 't2', :b => 3
|
40
|
-
config.add_table_options 't3', :a => 4
|
41
|
-
yielded = []
|
42
|
-
config.each_matching_option(:a) {|spec, value| yielded << [spec, value]}
|
43
|
-
yielded.should == [
|
44
|
-
[nil, 1],
|
45
|
-
['t1', 2],
|
46
|
-
['t3', 4]
|
47
|
-
]
|
48
|
-
end
|
49
|
-
|
50
|
-
it "each_matching_option should not yield unmatching options" do
|
51
|
-
config = Configuration.new
|
52
|
-
config.options = {:a => :blub}
|
53
|
-
config.add_table_options 'dummy_table', :b => :blub
|
54
|
-
yielded = []
|
55
|
-
config.each_matching_option(:c) {|spec, value| yielded << [spec, value]}
|
56
|
-
yielded.should == []
|
57
|
-
end
|
58
|
-
|
59
|
-
it "options_for_table should return the general options if there are no table specific options at all" do
|
60
|
-
config = Configuration.new
|
61
|
-
config.options_for_table('b').should == \
|
62
|
-
Syncers::TwoWaySyncer.default_options.clone.
|
63
|
-
merge(Replicators::TwoWayReplicator.default_options.clone).
|
64
|
-
merge(config.options)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "included_table_specs should return the list of included table specifications" do
|
68
|
-
config = Configuration.new
|
69
|
-
config.include_tables('a', {:bla => :blub})
|
70
|
-
config.include_tables('a, b')
|
71
|
-
config.include_tables(/a/)
|
72
|
-
config.included_table_specs.should == ['a', 'a, b', /a/]
|
73
|
-
end
|
74
|
-
|
75
|
-
it "included_table_specs should save the options if provided" do
|
76
|
-
config = Configuration.new
|
77
|
-
config.include_tables('a', {:bla => :blub})
|
78
|
-
config.options_for_table('a')[:bla].should == :blub
|
79
|
-
end
|
80
|
-
|
81
|
-
it "include_tables should include the specified table specs" do
|
82
|
-
config = Configuration.new
|
83
|
-
config.include_tables('a')
|
84
|
-
config.include_tables(/b/)
|
85
|
-
config.included_table_specs.include?('a').should be_true
|
86
|
-
config.included_table_specs.include?(/b/).should be_true
|
87
|
-
end
|
88
|
-
|
89
|
-
it "include_table should alias to include_tables" do
|
90
|
-
config = Configuration.new
|
91
|
-
config.include_table('a')
|
92
|
-
config.included_table_specs.include?('a').should be_true
|
93
|
-
end
|
94
|
-
|
95
|
-
it "exclude_tables should exclude the specified table specs" do
|
96
|
-
config = Configuration.new
|
97
|
-
config.exclude_tables('a')
|
98
|
-
config.exclude_tables(/b/)
|
99
|
-
config.excluded_table_specs.include?('a').should be_true
|
100
|
-
config.excluded_table_specs.include?(/b/).should be_true
|
101
|
-
end
|
102
|
-
|
103
|
-
it "exclude_table should alias to exclude_tables" do
|
104
|
-
config = Configuration.new
|
105
|
-
config.exclude_table('a')
|
106
|
-
config.excluded_table_specs.include?('a').should be_true
|
107
|
-
end
|
108
|
-
|
109
|
-
it "exclude_rubyrep_tables should exclude the rubyrep infrastructure tables" do
|
110
|
-
config = Configuration.new
|
111
|
-
config.exclude_rubyrep_tables
|
112
|
-
config.excluded_table_specs.include?(/^rr_.*/).should be_true
|
113
|
-
end
|
114
|
-
|
115
|
-
it "excluded_table_specs should return the list of excluded table specifications" do
|
116
|
-
config = Configuration.new
|
117
|
-
config.exclude_tables('a')
|
118
|
-
config.exclude_tables('a, b')
|
119
|
-
config.exclude_tables(/a/)
|
120
|
-
config.excluded_table_specs.should == ['a', 'a, b', /a/]
|
121
|
-
end
|
122
|
-
|
123
|
-
it "options_for_table should return the general options if there are no matching table specific options" do
|
124
|
-
config = Configuration.new
|
125
|
-
config.include_tables(/a/, {:bla => :blub})
|
126
|
-
config.options_for_table('b').should == \
|
127
|
-
Syncers::TwoWaySyncer.default_options.clone.
|
128
|
-
merge(Replicators::TwoWayReplicator.default_options.clone).
|
129
|
-
merge(config.options)
|
130
|
-
end
|
131
|
-
|
132
|
-
it "options_for_table should return table specific options mixed in with default options" do
|
133
|
-
config = Configuration.new
|
134
|
-
config.include_tables(/a/, {:bla => :blub})
|
135
|
-
config.options_for_table('a').should == \
|
136
|
-
Syncers::TwoWaySyncer.default_options.clone.
|
137
|
-
merge(Replicators::TwoWayReplicator.default_options.clone).
|
138
|
-
merge(config.options).
|
139
|
-
merge(:bla => :blub)
|
140
|
-
end
|
141
|
-
|
142
|
-
it "options_for_table should return last added version of added options for matching table spec" do
|
143
|
-
config = Configuration.new
|
144
|
-
config.include_tables(/a/, {:bla => :blub})
|
145
|
-
config.include_tables('a', {:bla => :blok})
|
146
|
-
config.include_tables(/x/, {:bla => :bar})
|
147
|
-
config.include_tables('y', {:bla => :foo})
|
148
|
-
config.options_for_table('a').should == \
|
149
|
-
Syncers::TwoWaySyncer.default_options.clone.
|
150
|
-
merge(Replicators::TwoWayReplicator.default_options.clone).
|
151
|
-
merge(config.options).
|
152
|
-
merge(:bla => :blok)
|
153
|
-
end
|
154
|
-
|
155
|
-
it "options_for_table should match against table pair specs" do
|
156
|
-
config = Configuration.new
|
157
|
-
config.add_table_options('a, b', {:bla => :blub})
|
158
|
-
config.options_for_table('a')[:bla].should == :blub
|
159
|
-
end
|
160
|
-
|
161
|
-
it "options_for_table should match against regular expression specs" do
|
162
|
-
config = Configuration.new
|
163
|
-
config.add_table_options(/a/, {:bla => :blub})
|
164
|
-
config.options_for_table('a')[:bla].should == :blub
|
165
|
-
end
|
166
|
-
|
167
|
-
it "options_for_table should match against pure table name specs" do
|
168
|
-
config = Configuration.new
|
169
|
-
config.add_table_options('a', {:bla => :blub})
|
170
|
-
config.options_for_table('a')[:bla].should == :blub
|
171
|
-
end
|
172
|
-
|
173
|
-
it "add_table_options should not create table_spec duplicates" do
|
174
|
-
config = Configuration.new
|
175
|
-
config.add_table_options(/a/, {:bla => :blub})
|
176
|
-
config.add_table_options(/a/, {:foo => :bar})
|
177
|
-
config.options_for_table('a').should == \
|
178
|
-
Syncers::TwoWaySyncer.default_options.clone.
|
179
|
-
merge(Replicators::TwoWayReplicator.default_options.clone).
|
180
|
-
merge(config.options).
|
181
|
-
merge(:bla => :blub, :foo => :bar)
|
182
|
-
end
|
183
|
-
|
184
|
-
it "add_table_option should alias to add_table_options" do
|
185
|
-
config = Configuration.new
|
186
|
-
config.add_table_option(/a/, {:bla => :blub})
|
187
|
-
config.options_for_table('a')[:bla].should == :blub
|
188
|
-
end
|
189
|
-
|
190
|
-
it "add_table_options should include default syncer options" do
|
191
|
-
config = Configuration.new
|
192
|
-
config.options = {:syncer => :one_way}
|
193
|
-
|
194
|
-
# overwrite one syncer option
|
195
|
-
config.add_table_options(/a/, {:delete => true})
|
196
|
-
|
197
|
-
options = config.options_for_table('a')
|
198
|
-
Syncers::OneWaySyncer.default_options.each do |key, value|
|
199
|
-
options[key].should == value unless key == :delete
|
200
|
-
end
|
201
|
-
options[:delete].should == true
|
202
|
-
end
|
203
|
-
end
|
@@ -1,141 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
require 'yaml'
|
3
|
-
require 'digest/md5'
|
4
|
-
|
5
|
-
include RR
|
6
|
-
|
7
|
-
# All ConnectionExtenders need to pass this spec
|
8
|
-
describe "ConnectionExtender", :shared => true do
|
9
|
-
before(:each) do
|
10
|
-
end
|
11
|
-
|
12
|
-
it "primary_key_names should return primary key names ordered as per primary key index" do
|
13
|
-
session = Session.new
|
14
|
-
session.left.primary_key_names('extender_combined_key').should == ['first_id', 'second_id']
|
15
|
-
|
16
|
-
session.left.primary_key_names('extender_inverted_combined_key') \
|
17
|
-
.should == ['second_id', 'first_id']
|
18
|
-
end
|
19
|
-
|
20
|
-
it "primary_key_names should return an empty array for tables without any primary key" do
|
21
|
-
session = Session.new
|
22
|
-
session.left.primary_key_names('extender_without_key') \
|
23
|
-
.should == []
|
24
|
-
end
|
25
|
-
|
26
|
-
it "primary_key_names called for a non-existing table should throw an exception" do
|
27
|
-
session = Session.new
|
28
|
-
lambda {session.left.primary_key_names('non_existing_table')} \
|
29
|
-
.should raise_error(RuntimeError, /.*non_existing_table.*not exist/)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "referenced_tables should identify the correct table dependencies" do
|
33
|
-
session = Session.new
|
34
|
-
referenced_tables = session.left.referenced_tables(['scanner_records', 'referencing_table'])
|
35
|
-
referenced_tables.size.should == 2
|
36
|
-
referenced_tables['scanner_records'].should == []
|
37
|
-
referenced_tables['referencing_table'].sort.
|
38
|
-
should == ["referenced_table", "referenced_table2"]
|
39
|
-
end
|
40
|
-
|
41
|
-
it "referenced_tables should return those tables without primary key" do
|
42
|
-
session = Session.new
|
43
|
-
referenced_tables = session.left.referenced_tables(['table_with_manual_key'])
|
44
|
-
referenced_tables.should == {'table_with_manual_key' => []}
|
45
|
-
end
|
46
|
-
|
47
|
-
it "select_cursor should handle zero result queries" do
|
48
|
-
session = Session.new
|
49
|
-
result = session.left.select_cursor :table => 'extender_no_record'
|
50
|
-
result.next?.should be_false
|
51
|
-
end
|
52
|
-
|
53
|
-
it "select_cursor should work if row_buffer_size is smaller than table size" do
|
54
|
-
session = Session.new
|
55
|
-
result = session.left.select_cursor(:table => 'scanner_records', :row_buffer_size => 2)
|
56
|
-
result.next_row
|
57
|
-
result.next_row
|
58
|
-
result.next_row['id'].should == 3
|
59
|
-
result.clear
|
60
|
-
end
|
61
|
-
|
62
|
-
it "select_cursor should allow iterating through records" do
|
63
|
-
session = Session.new
|
64
|
-
result = session.left.select_cursor :table => 'extender_one_record'
|
65
|
-
result.next?.should be_true
|
66
|
-
result.next_row.should == {'id' => 1, 'name' => 'Alice'}
|
67
|
-
end
|
68
|
-
|
69
|
-
it "select_cursor next_row should raise if there are no records" do
|
70
|
-
session = Session.new
|
71
|
-
result = session.left.select_cursor :table => 'extender_no_record'
|
72
|
-
lambda {result.next_row}.should raise_error(RuntimeError, 'no more rows available')
|
73
|
-
end
|
74
|
-
|
75
|
-
it "select_cursor next_row should handle multi byte characters correctly" do
|
76
|
-
session = Session.new
|
77
|
-
result = session.left.select_record(:table => "extender_type_check")['multi_byte'].
|
78
|
-
should == "よろしくお願(ねが)いします yoroshiku onegai shimasu: I humbly ask for your favor."
|
79
|
-
end
|
80
|
-
|
81
|
-
it "select_cursor should read null values correctly" do
|
82
|
-
session = Session.new
|
83
|
-
result = session.left.select_record(
|
84
|
-
:table => 'extender_combined_key',
|
85
|
-
:row_keys => ['first_id' => 3, 'second_id' => 1]
|
86
|
-
).should == {'first_id' => 3, 'second_id' => 1, 'name' => nil}
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should read and write binary data correctly" do
|
90
|
-
session = Session.new
|
91
|
-
|
92
|
-
org_data = File.new(File.dirname(__FILE__) + '/dolphins.jpg').read
|
93
|
-
result_data = nil
|
94
|
-
begin
|
95
|
-
session.left.begin_db_transaction
|
96
|
-
session.left.insert_record('extender_type_check', {'id' => 6, 'binary_test' => org_data})
|
97
|
-
|
98
|
-
row = session.left.select_one(
|
99
|
-
'select md5(binary_test) as md5 from extender_type_check where id = 6'
|
100
|
-
)
|
101
|
-
row['md5'].should == Digest::MD5.hexdigest(org_data)
|
102
|
-
|
103
|
-
result_data = session.left.select_record(
|
104
|
-
:table => "extender_type_check",
|
105
|
-
:row_keys => ["id" => 6]
|
106
|
-
)['binary_test']
|
107
|
-
Digest::MD5.hexdigest(result_data).should == Digest::MD5.hexdigest(org_data)
|
108
|
-
ensure
|
109
|
-
session.left.rollback_db_transaction
|
110
|
-
end
|
111
|
-
result_data.should == org_data
|
112
|
-
end
|
113
|
-
|
114
|
-
it "should read and write text data correctly" do
|
115
|
-
session = Session.new
|
116
|
-
|
117
|
-
org_data = "よろしくお願(ねが)いします yoroshiku onegai shimasu: I humbly ask for your favor."
|
118
|
-
result_data = nil
|
119
|
-
begin
|
120
|
-
session.left.begin_db_transaction
|
121
|
-
sql = "insert into extender_type_check(id, text_test) values(2, '#{org_data}')"
|
122
|
-
session.left.execute sql
|
123
|
-
|
124
|
-
result_data = session.left.select_record(
|
125
|
-
:table => "extender_type_check",
|
126
|
-
:row_keys => ["id" => 2]
|
127
|
-
)["text_test"]
|
128
|
-
ensure
|
129
|
-
session.left.rollback_db_transaction
|
130
|
-
end
|
131
|
-
result_data.should == org_data
|
132
|
-
end
|
133
|
-
|
134
|
-
it "cursors returned by select_cursor should support clear" do
|
135
|
-
session = Session.new
|
136
|
-
result = session.left.select_cursor :table => 'extender_one_record'
|
137
|
-
result.next?.should be_true
|
138
|
-
result.should respond_to(:clear)
|
139
|
-
result.clear
|
140
|
-
end
|
141
|
-
end
|
@@ -1,164 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
|
3
|
-
include RR
|
4
|
-
|
5
|
-
describe ConnectionExtenders do
|
6
|
-
before(:each) do
|
7
|
-
Initializer.configuration = standard_config
|
8
|
-
end
|
9
|
-
|
10
|
-
it "db_connect should install the already created logger" do
|
11
|
-
configuration = deep_copy(Initializer.configuration)
|
12
|
-
io = StringIO.new
|
13
|
-
logger = ActiveSupport::BufferedLogger.new(io)
|
14
|
-
configuration.left[:logger] = logger
|
15
|
-
session = Session.new configuration
|
16
|
-
|
17
|
-
session.left.connection.instance_eval {@logger}.should == logger
|
18
|
-
session.right.connection.instance_eval {@logger}.should_not == logger
|
19
|
-
|
20
|
-
session.left.select_one "select 'left_query'"
|
21
|
-
session.right.select_one "select 'right_query'"
|
22
|
-
|
23
|
-
io.string.should =~ /left_query/
|
24
|
-
io.string.should_not =~ /right_query/
|
25
|
-
end
|
26
|
-
|
27
|
-
it "db_connect should create and install the specified logger" do
|
28
|
-
configuration = deep_copy(Initializer.configuration)
|
29
|
-
io = StringIO.new
|
30
|
-
configuration.left[:logger] = io
|
31
|
-
session = Session.new configuration
|
32
|
-
session.left.select_one "select 'left_query'"
|
33
|
-
session.right.select_one "select 'right_query'"
|
34
|
-
|
35
|
-
io.string.should =~ /left_query/
|
36
|
-
io.string.should_not =~ /right_query/
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe ConnectionExtenders, "Registration" do
|
41
|
-
before(:each) do
|
42
|
-
Initializer.configuration = standard_config
|
43
|
-
@@old_cache_status = ConnectionExtenders.use_db_connection_cache(false)
|
44
|
-
end
|
45
|
-
|
46
|
-
after(:each) do
|
47
|
-
ConnectionExtenders.use_db_connection_cache(@@old_cache_status)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "extenders should return list of registered connection extenders" do
|
51
|
-
ConnectionExtenders.extenders.include?(:postgresql).should be_true
|
52
|
-
end
|
53
|
-
|
54
|
-
it "register should register a new connection extender" do
|
55
|
-
ConnectionExtenders.register(:bla => :blub)
|
56
|
-
|
57
|
-
ConnectionExtenders.extenders.include?(:bla).should be_true
|
58
|
-
end
|
59
|
-
|
60
|
-
it "register should replace already existing connection extenders" do
|
61
|
-
ConnectionExtenders.register(:bla => :blub)
|
62
|
-
ConnectionExtenders.register(:bla => :blub2)
|
63
|
-
|
64
|
-
ConnectionExtenders.extenders[:bla].should == :blub2
|
65
|
-
end
|
66
|
-
|
67
|
-
it "initialize should establish the database connections" do
|
68
|
-
mock_active_record :once
|
69
|
-
|
70
|
-
ConnectionExtenders.db_connect Initializer.configuration.left
|
71
|
-
end
|
72
|
-
|
73
|
-
it "db_connect should use jdbc configuration adapter and extender under jruby" do
|
74
|
-
fake_ruby_platform 'java' do
|
75
|
-
mock_active_record :once
|
76
|
-
used_extender = nil
|
77
|
-
ConnectionExtenders.extenders.should_receive('[]'.to_sym).once \
|
78
|
-
.and_return {|extender| used_extender = extender }
|
79
|
-
|
80
|
-
configuration = deep_copy(Initializer.configuration)
|
81
|
-
configuration.left[:adapter] = 'dummyadapter'
|
82
|
-
|
83
|
-
ConnectionExtenders.db_connect configuration.left
|
84
|
-
|
85
|
-
$used_config[:adapter].should == "jdbcdummyadapter"
|
86
|
-
used_extender.should == :jdbc
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
it "db_connect created connections should be alive" do
|
91
|
-
connection = ConnectionExtenders.db_connect Initializer.configuration.left
|
92
|
-
|
93
|
-
connection.should be_active
|
94
|
-
end
|
95
|
-
|
96
|
-
it "db_connect should include the connection extender into connection" do
|
97
|
-
connection = ConnectionExtenders.db_connect Initializer.configuration.left
|
98
|
-
|
99
|
-
connection.should respond_to(:primary_key_names)
|
100
|
-
end
|
101
|
-
|
102
|
-
it "db_connect should raise an Exception if no fitting connection extender is available" do
|
103
|
-
# If unknown connection adapters are encountered in jruby, then we
|
104
|
-
# automatically use JdbcExtender.
|
105
|
-
# Means that this test only makes sense if not running on jruby
|
106
|
-
if not RUBY_PLATFORM =~ /java/
|
107
|
-
mock_active_record :once
|
108
|
-
|
109
|
-
config = deep_copy(Initializer.configuration)
|
110
|
-
|
111
|
-
config.left[:adapter] = 'dummy'
|
112
|
-
|
113
|
-
lambda {ConnectionExtenders.db_connect config.left}.should raise_error(RuntimeError, /dummy/)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
it "use_db_connection_cache should set the new cache status and return the old one" do
|
118
|
-
ConnectionExtenders.use_db_connection_cache :first_status
|
119
|
-
first_status = ConnectionExtenders.use_db_connection_cache :second_status
|
120
|
-
second_status = ConnectionExtenders.use_db_connection_cache :whatever
|
121
|
-
first_status.should == :first_status
|
122
|
-
second_status.should == :second_status
|
123
|
-
end
|
124
|
-
|
125
|
-
it "clear_db_connection_cache should clear the connection cache" do
|
126
|
-
old_cache = ConnectionExtenders.connection_cache
|
127
|
-
begin
|
128
|
-
ConnectionExtenders.connection_cache = :dummy_cache
|
129
|
-
ConnectionExtenders.clear_db_connection_cache
|
130
|
-
ConnectionExtenders.connection_cache.should == {}
|
131
|
-
ensure
|
132
|
-
ConnectionExtenders.connection_cache = old_cache
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
it "db_connect should create the database connection if not yet cached" do
|
137
|
-
old_cache = ConnectionExtenders.connection_cache
|
138
|
-
begin
|
139
|
-
ConnectionExtenders.clear_db_connection_cache
|
140
|
-
mock_active_record :once
|
141
|
-
ConnectionExtenders.use_db_connection_cache true
|
142
|
-
ConnectionExtenders.db_connect Initializer.configuration.left
|
143
|
-
ConnectionExtenders.connection_cache.should_not be_empty
|
144
|
-
ensure
|
145
|
-
ConnectionExtenders.connection_cache = old_cache
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
it "db_connect should not create the database connection if already cached and alive" do
|
150
|
-
old_cache = ConnectionExtenders.connection_cache
|
151
|
-
begin
|
152
|
-
ConnectionExtenders.clear_db_connection_cache
|
153
|
-
mock_active_record :once # only mocked once even though db_connect is called twice
|
154
|
-
ConnectionExtenders.use_db_connection_cache true
|
155
|
-
connection = ConnectionExtenders.db_connect Initializer.configuration.left
|
156
|
-
connection.should_receive(:active?).and_return(:true)
|
157
|
-
ConnectionExtenders.db_connect Initializer.configuration.left
|
158
|
-
ensure
|
159
|
-
ConnectionExtenders.connection_cache = old_cache
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
end
|
164
|
-
|
data/spec/database_proxy_spec.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
|
3
|
-
include RR
|
4
|
-
|
5
|
-
describe DatabaseProxy do
|
6
|
-
before(:each) do
|
7
|
-
Initializer.configuration = standard_config
|
8
|
-
end
|
9
|
-
|
10
|
-
it "initialize should create an empty session regiser" do
|
11
|
-
proxy = DatabaseProxy.new
|
12
|
-
proxy.session_register.should == {}
|
13
|
-
end
|
14
|
-
|
15
|
-
def create_proxy_and_session
|
16
|
-
proxy = DatabaseProxy.new
|
17
|
-
session = proxy.create_session Initializer.configuration.left
|
18
|
-
return proxy, session
|
19
|
-
end
|
20
|
-
|
21
|
-
it "create_session should register the created session" do
|
22
|
-
proxy, session = create_proxy_and_session
|
23
|
-
|
24
|
-
session.should be_an_instance_of(ProxyConnection)
|
25
|
-
proxy.session_register.include?(session).should == true
|
26
|
-
end
|
27
|
-
|
28
|
-
it "destroy_session should destroy and unregister the session" do
|
29
|
-
proxy, session = create_proxy_and_session
|
30
|
-
session.should_receive(:destroy)
|
31
|
-
|
32
|
-
proxy.destroy_session session
|
33
|
-
|
34
|
-
proxy.session_register.include?(session).should == false
|
35
|
-
end
|
36
|
-
|
37
|
-
it "ping should respond with 'pong'" do
|
38
|
-
proxy = DatabaseProxy.new
|
39
|
-
proxy.ping.should == 'pong'
|
40
|
-
end
|
41
|
-
|
42
|
-
it "terminate should exit the proxy" do
|
43
|
-
proxy = DatabaseProxy.new
|
44
|
-
Thread.main.should_receive(:raise).with(SystemExit)
|
45
|
-
|
46
|
-
proxy.terminate!
|
47
|
-
end
|
48
|
-
end
|
data/spec/database_rake_spec.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
load File.dirname(__FILE__) + '/../tasks/database.rake'
|
3
|
-
|
4
|
-
describe "database.rake" do
|
5
|
-
before(:each) do
|
6
|
-
end
|
7
|
-
|
8
|
-
it "create_database should create a non-existing database" do
|
9
|
-
RR::ConnectionExtenders.should_receive(:db_connect).and_raise("something")
|
10
|
-
should_receive("`").with("createdb \"dummy\" -E utf8")
|
11
|
-
|
12
|
-
create_database :adapter => "postgresql", :database => "dummy"
|
13
|
-
end
|
14
|
-
|
15
|
-
it "create_database should not try to create existing databases" do
|
16
|
-
RR::ConnectionExtenders.should_receive(:db_connect)
|
17
|
-
should_receive(:puts).with("database existing_db already exists")
|
18
|
-
|
19
|
-
create_database :adapter => 'postgresql', :database => "existing_db"
|
20
|
-
end
|
21
|
-
|
22
|
-
it "create_database should complain about unsupported adapters" do
|
23
|
-
should_receive(:puts).with("adapter unsupported_adapter not supported")
|
24
|
-
|
25
|
-
create_database :adapter => "unsupported_adapter"
|
26
|
-
end
|
27
|
-
|
28
|
-
it "drop_database should drop a PostgreSQL database" do
|
29
|
-
should_receive("`").with("dropdb \"dummy\"")
|
30
|
-
|
31
|
-
drop_database :adapter => "postgresql", :database => "dummy"
|
32
|
-
end
|
33
|
-
|
34
|
-
it "drop_database should complain about unsupported adapters" do
|
35
|
-
should_receive(:puts).with("adapter unsupported_adapter not supported")
|
36
|
-
|
37
|
-
drop_database :adapter => "unsupported_adapter"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
include RR
|
5
|
-
|
6
|
-
extenders = [:mysql, :postgres]
|
7
|
-
|
8
|
-
extenders.each do |extender|
|
9
|
-
describe "#{extender.to_s.capitalize} Connection Extender" do
|
10
|
-
before(:each) do
|
11
|
-
@org_test_db = ENV['RR_TEST_DB']
|
12
|
-
ENV['RR_TEST_DB'] = extender.to_s
|
13
|
-
Initializer.configuration = standard_config
|
14
|
-
end
|
15
|
-
|
16
|
-
after(:each) do
|
17
|
-
ENV['RR_TEST_DB'] = @org_test_db
|
18
|
-
end
|
19
|
-
|
20
|
-
begin
|
21
|
-
if ENV['RR_TEST_DB'] != @org_test_db.to_s
|
22
|
-
# If the current adapter is *not* the adapter for the standard tests
|
23
|
-
# (meaning the adapter which is used to run all other tests)
|
24
|
-
# then only run the extender spec if the database connection is available
|
25
|
-
Session.new read_config(extender)
|
26
|
-
end
|
27
|
-
it_should_behave_like "ConnectionExtender"
|
28
|
-
rescue Exception => e
|
29
|
-
at_exit do
|
30
|
-
puts "#{__FILE__}:#{__LINE__}: DB Connection failed with '#{e}' ==> #{extender.to_s.capitalize} connection extender not tested"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
require 'replication_extender_interface_spec.rb'
|
5
|
-
require 'postgresql_replication_spec.rb'
|
6
|
-
|
7
|
-
include RR
|
8
|
-
|
9
|
-
extenders = [:postgres, :mysql]
|
10
|
-
|
11
|
-
extenders.each do |extender|
|
12
|
-
describe "#{extender.to_s.capitalize} Replication Extender" do
|
13
|
-
before(:each) do
|
14
|
-
@org_test_db = ENV['RR_TEST_DB']
|
15
|
-
ENV['RR_TEST_DB'] = extender.to_s
|
16
|
-
Initializer.configuration = standard_config
|
17
|
-
end
|
18
|
-
|
19
|
-
after(:each) do
|
20
|
-
ENV['RR_TEST_DB'] = @org_test_db
|
21
|
-
end
|
22
|
-
|
23
|
-
begin
|
24
|
-
if ENV['RR_TEST_DB'] != @org_test_db.to_s
|
25
|
-
# If the current adapter is *not* the adapter for the standard tests
|
26
|
-
# (meaning the adapter which is used to run all other tests)
|
27
|
-
# then only run the extender spec if the database connection is available
|
28
|
-
Session.new read_config(extender)
|
29
|
-
end
|
30
|
-
it_should_behave_like "ReplicationExtender"
|
31
|
-
it_should_behave_like "PostgreSQLReplication" if extender == :postgres
|
32
|
-
rescue Exception => e
|
33
|
-
at_exit do
|
34
|
-
puts "#{__FILE__}:#{__LINE__}: DB Connection failed with '#{e}' ==> #{extender.to_s.capitalize} replication extender not tested"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|