andyjeffries-rubyrep 1.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.
- data/History.txt +83 -0
- data/License.txt +20 -0
- data/Manifest.txt +151 -0
- data/README.txt +37 -0
- data/bin/rubyrep +8 -0
- data/lib/rubyrep.rb +72 -0
- data/lib/rubyrep/base_runner.rb +195 -0
- data/lib/rubyrep/command_runner.rb +144 -0
- data/lib/rubyrep/committers/buffered_committer.rb +151 -0
- data/lib/rubyrep/committers/committers.rb +152 -0
- data/lib/rubyrep/configuration.rb +275 -0
- data/lib/rubyrep/connection_extenders/connection_extenders.rb +165 -0
- data/lib/rubyrep/connection_extenders/jdbc_extender.rb +65 -0
- data/lib/rubyrep/connection_extenders/mysql_extender.rb +59 -0
- data/lib/rubyrep/connection_extenders/postgresql_extender.rb +277 -0
- data/lib/rubyrep/database_proxy.rb +52 -0
- data/lib/rubyrep/direct_table_scan.rb +75 -0
- data/lib/rubyrep/generate_runner.rb +105 -0
- data/lib/rubyrep/initializer.rb +39 -0
- data/lib/rubyrep/log_helper.rb +30 -0
- data/lib/rubyrep/logged_change.rb +160 -0
- data/lib/rubyrep/logged_change_loader.rb +197 -0
- data/lib/rubyrep/noisy_connection.rb +80 -0
- data/lib/rubyrep/proxied_table_scan.rb +171 -0
- data/lib/rubyrep/proxy_block_cursor.rb +145 -0
- data/lib/rubyrep/proxy_connection.rb +431 -0
- data/lib/rubyrep/proxy_cursor.rb +44 -0
- data/lib/rubyrep/proxy_row_cursor.rb +43 -0
- data/lib/rubyrep/proxy_runner.rb +89 -0
- data/lib/rubyrep/replication_difference.rb +100 -0
- data/lib/rubyrep/replication_extenders/mysql_replication.rb +271 -0
- data/lib/rubyrep/replication_extenders/postgresql_replication.rb +236 -0
- data/lib/rubyrep/replication_extenders/replication_extenders.rb +26 -0
- data/lib/rubyrep/replication_helper.rb +142 -0
- data/lib/rubyrep/replication_initializer.rb +327 -0
- data/lib/rubyrep/replication_run.rb +142 -0
- data/lib/rubyrep/replication_runner.rb +166 -0
- data/lib/rubyrep/replicators/replicators.rb +42 -0
- data/lib/rubyrep/replicators/two_way_replicator.rb +361 -0
- data/lib/rubyrep/scan_progress_printers/progress_bar.rb +65 -0
- data/lib/rubyrep/scan_progress_printers/scan_progress_printers.rb +65 -0
- data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +111 -0
- data/lib/rubyrep/scan_report_printers/scan_report_printers.rb +67 -0
- data/lib/rubyrep/scan_report_printers/scan_summary_reporter.rb +75 -0
- data/lib/rubyrep/scan_runner.rb +25 -0
- data/lib/rubyrep/session.rb +230 -0
- data/lib/rubyrep/sync_helper.rb +121 -0
- data/lib/rubyrep/sync_runner.rb +31 -0
- data/lib/rubyrep/syncers/syncers.rb +112 -0
- data/lib/rubyrep/syncers/two_way_syncer.rb +174 -0
- data/lib/rubyrep/table_scan.rb +54 -0
- data/lib/rubyrep/table_scan_helper.rb +46 -0
- data/lib/rubyrep/table_sorter.rb +70 -0
- data/lib/rubyrep/table_spec_resolver.rb +142 -0
- data/lib/rubyrep/table_sync.rb +90 -0
- data/lib/rubyrep/task_sweeper.rb +77 -0
- data/lib/rubyrep/trigger_mode_switcher.rb +63 -0
- data/lib/rubyrep/type_casting_cursor.rb +31 -0
- data/lib/rubyrep/uninstall_runner.rb +93 -0
- data/lib/rubyrep/version.rb +9 -0
- data/rubyrep +8 -0
- data/rubyrep.bat +4 -0
- data/setup.rb +1585 -0
- data/spec/base_runner_spec.rb +218 -0
- data/spec/buffered_committer_spec.rb +274 -0
- data/spec/command_runner_spec.rb +145 -0
- data/spec/committers_spec.rb +178 -0
- data/spec/configuration_spec.rb +203 -0
- data/spec/connection_extender_interface_spec.rb +141 -0
- data/spec/connection_extenders_registration_spec.rb +164 -0
- data/spec/database_proxy_spec.rb +48 -0
- data/spec/database_rake_spec.rb +40 -0
- data/spec/db_specific_connection_extenders_spec.rb +34 -0
- data/spec/db_specific_replication_extenders_spec.rb +38 -0
- data/spec/direct_table_scan_spec.rb +61 -0
- data/spec/dolphins.jpg +0 -0
- data/spec/generate_runner_spec.rb +84 -0
- data/spec/initializer_spec.rb +46 -0
- data/spec/log_helper_spec.rb +39 -0
- data/spec/logged_change_loader_spec.rb +68 -0
- data/spec/logged_change_spec.rb +470 -0
- data/spec/noisy_connection_spec.rb +78 -0
- data/spec/postgresql_replication_spec.rb +48 -0
- data/spec/postgresql_schema_support_spec.rb +212 -0
- data/spec/postgresql_support_spec.rb +63 -0
- data/spec/progress_bar_spec.rb +77 -0
- data/spec/proxied_table_scan_spec.rb +151 -0
- data/spec/proxy_block_cursor_spec.rb +197 -0
- data/spec/proxy_connection_spec.rb +423 -0
- data/spec/proxy_cursor_spec.rb +56 -0
- data/spec/proxy_row_cursor_spec.rb +66 -0
- data/spec/proxy_runner_spec.rb +70 -0
- data/spec/replication_difference_spec.rb +161 -0
- data/spec/replication_extender_interface_spec.rb +367 -0
- data/spec/replication_extenders_spec.rb +32 -0
- data/spec/replication_helper_spec.rb +178 -0
- data/spec/replication_initializer_spec.rb +509 -0
- data/spec/replication_run_spec.rb +443 -0
- data/spec/replication_runner_spec.rb +254 -0
- data/spec/replicators_spec.rb +36 -0
- data/spec/rubyrep_spec.rb +8 -0
- data/spec/scan_detail_reporter_spec.rb +119 -0
- data/spec/scan_progress_printers_spec.rb +68 -0
- data/spec/scan_report_printers_spec.rb +67 -0
- data/spec/scan_runner_spec.rb +50 -0
- data/spec/scan_summary_reporter_spec.rb +61 -0
- data/spec/session_spec.rb +253 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +305 -0
- data/spec/strange_name_support_spec.rb +135 -0
- data/spec/sync_helper_spec.rb +169 -0
- data/spec/sync_runner_spec.rb +78 -0
- data/spec/syncers_spec.rb +171 -0
- data/spec/table_scan_helper_spec.rb +36 -0
- data/spec/table_scan_spec.rb +49 -0
- data/spec/table_sorter_spec.rb +30 -0
- data/spec/table_spec_resolver_spec.rb +111 -0
- data/spec/table_sync_spec.rb +140 -0
- data/spec/task_sweeper_spec.rb +47 -0
- data/spec/trigger_mode_switcher_spec.rb +83 -0
- data/spec/two_way_replicator_spec.rb +721 -0
- data/spec/two_way_syncer_spec.rb +256 -0
- data/spec/type_casting_cursor_spec.rb +50 -0
- data/spec/uninstall_runner_spec.rb +93 -0
- metadata +190 -0
|
@@ -0,0 +1,141 @@
|
|
|
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
|
|
@@ -0,0 +1,164 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
|
2
|
+
require 'yaml'
|
|
3
|
+
|
|
4
|
+
include RR
|
|
5
|
+
|
|
6
|
+
extenders = [:mysql2, :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
|
|
@@ -0,0 +1,38 @@
|
|
|
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, :mysql2]
|
|
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
|