ibm_db 3.0.4-x86-mingw32 → 3.0.5-x86-mingw32

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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/README +225 -225
  6. data/ext/Makefile.nt32 +181 -181
  7. data/ext/Makefile.nt32.191 +212 -212
  8. data/ext/extconf.rb +291 -291
  9. data/ext/ibm_db.c +11887 -11884
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/ext/ruby_ibm_db_cli.c +866 -866
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +122 -122
  19. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  21. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +276 -261
  26. data/test/cases/aggregations_test.rb +158 -158
  27. data/test/cases/ar_schema_test.rb +161 -161
  28. data/test/cases/associations/association_scope_test.rb +21 -21
  29. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  30. data/test/cases/associations/callbacks_test.rb +192 -192
  31. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  32. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  33. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  34. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  35. data/test/cases/associations/eager_singularization_test.rb +148 -148
  36. data/test/cases/associations/eager_test.rb +1429 -1411
  37. data/test/cases/associations/extension_test.rb +82 -82
  38. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  39. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  40. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  41. data/test/cases/associations/has_one_associations_test.rb +610 -610
  42. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  43. data/test/cases/associations/inner_join_association_test.rb +139 -139
  44. data/test/cases/associations/inverse_associations_test.rb +706 -693
  45. data/test/cases/associations/join_model_test.rb +754 -754
  46. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  47. data/test/cases/associations/required_test.rb +82 -82
  48. data/test/cases/associations_test.rb +380 -380
  49. data/test/cases/attribute_decorators_test.rb +125 -125
  50. data/test/cases/attribute_methods/read_test.rb +60 -60
  51. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  52. data/test/cases/attribute_methods_test.rb +952 -952
  53. data/test/cases/attribute_set_test.rb +210 -200
  54. data/test/cases/attribute_test.rb +180 -180
  55. data/test/cases/attributes_test.rb +136 -136
  56. data/test/cases/autosave_association_test.rb +1595 -1595
  57. data/test/cases/base_test.rb +1664 -1638
  58. data/test/cases/batches_test.rb +212 -212
  59. data/test/cases/binary_test.rb +52 -52
  60. data/test/cases/bind_parameter_test.rb +100 -100
  61. data/test/cases/calculations_test.rb +646 -646
  62. data/test/cases/callbacks_test.rb +543 -543
  63. data/test/cases/clone_test.rb +40 -40
  64. data/test/cases/coders/yaml_column_test.rb +63 -63
  65. data/test/cases/column_alias_test.rb +17 -17
  66. data/test/cases/column_definition_test.rb +123 -123
  67. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  68. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  69. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  70. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  71. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  72. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  73. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  74. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  75. data/test/cases/connection_management_test.rb +122 -122
  76. data/test/cases/connection_pool_test.rb +346 -346
  77. data/test/cases/connection_specification/resolver_test.rb +116 -116
  78. data/test/cases/core_test.rb +112 -112
  79. data/test/cases/counter_cache_test.rb +209 -209
  80. data/test/cases/custom_locking_test.rb +17 -17
  81. data/test/cases/database_statements_test.rb +19 -19
  82. data/test/cases/date_time_test.rb +61 -61
  83. data/test/cases/defaults_test.rb +223 -223
  84. data/test/cases/dirty_test.rb +785 -775
  85. data/test/cases/disconnected_test.rb +28 -28
  86. data/test/cases/dup_test.rb +157 -157
  87. data/test/cases/enum_test.rb +290 -290
  88. data/test/cases/explain_subscriber_test.rb +64 -64
  89. data/test/cases/explain_test.rb +76 -76
  90. data/test/cases/finder_respond_to_test.rb +60 -60
  91. data/test/cases/finder_test.rb +1169 -1166
  92. data/test/cases/fixture_set/file_test.rb +138 -138
  93. data/test/cases/fixtures_test.rb +908 -897
  94. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  95. data/test/cases/habtm_destroy_order_test.rb +61 -61
  96. data/test/cases/helper.rb +210 -210
  97. data/test/cases/hot_compatibility_test.rb +54 -54
  98. data/test/cases/i18n_test.rb +45 -45
  99. data/test/cases/inheritance_test.rb +375 -375
  100. data/test/cases/integration_test.rb +139 -139
  101. data/test/cases/invalid_connection_test.rb +22 -22
  102. data/test/cases/invalid_date_test.rb +32 -32
  103. data/test/cases/invertible_migration_test.rb +295 -295
  104. data/test/cases/json_serialization_test.rb +302 -302
  105. data/test/cases/locking_test.rb +477 -477
  106. data/test/cases/log_subscriber_test.rb +136 -136
  107. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  108. data/test/cases/migration/change_schema_test.rb +512 -472
  109. data/test/cases/migration/change_table_test.rb +224 -224
  110. data/test/cases/migration/column_attributes_test.rb +192 -192
  111. data/test/cases/migration/column_positioning_test.rb +56 -56
  112. data/test/cases/migration/columns_test.rb +304 -304
  113. data/test/cases/migration/command_recorder_test.rb +305 -305
  114. data/test/cases/migration/create_join_table_test.rb +148 -148
  115. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  116. data/test/cases/migration/foreign_key_test.rb +328 -360
  117. data/test/cases/migration/helper.rb +39 -39
  118. data/test/cases/migration/index_test.rb +216 -216
  119. data/test/cases/migration/logger_test.rb +36 -36
  120. data/test/cases/migration/pending_migrations_test.rb +53 -53
  121. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  122. data/test/cases/migration/references_index_test.rb +101 -101
  123. data/test/cases/migration/references_statements_test.rb +116 -116
  124. data/test/cases/migration/rename_table_test.rb +93 -93
  125. data/test/cases/migration/table_and_index_test.rb +24 -24
  126. data/test/cases/migration_test.rb +959 -959
  127. data/test/cases/migrator_test.rb +388 -388
  128. data/test/cases/mixin_test.rb +70 -70
  129. data/test/cases/modules_test.rb +173 -173
  130. data/test/cases/multiparameter_attributes_test.rb +350 -350
  131. data/test/cases/multiple_db_test.rb +115 -115
  132. data/test/cases/nested_attributes_test.rb +1070 -1057
  133. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  134. data/test/cases/persistence_test.rb +909 -909
  135. data/test/cases/pooled_connections_test.rb +81 -81
  136. data/test/cases/primary_keys_test.rb +237 -237
  137. data/test/cases/query_cache_test.rb +326 -326
  138. data/test/cases/quoting_test.rb +156 -156
  139. data/test/cases/readonly_test.rb +118 -118
  140. data/test/cases/reaper_test.rb +85 -85
  141. data/test/cases/reflection_test.rb +463 -454
  142. data/test/cases/relation/delegation_test.rb +68 -68
  143. data/test/cases/relation/merging_test.rb +161 -161
  144. data/test/cases/relation/mutation_test.rb +165 -165
  145. data/test/cases/relation/predicate_builder_test.rb +14 -14
  146. data/test/cases/relation/where_chain_test.rb +181 -181
  147. data/test/cases/relation/where_test.rb +300 -300
  148. data/test/cases/relation/where_test2.rb +36 -36
  149. data/test/cases/relation_test.rb +319 -297
  150. data/test/cases/relations_test.rb +1815 -1815
  151. data/test/cases/reload_models_test.rb +22 -22
  152. data/test/cases/result_test.rb +80 -80
  153. data/test/cases/sanitize_test.rb +83 -83
  154. data/test/cases/schema_dumper_test.rb +463 -463
  155. data/test/cases/scoping/default_scoping_test.rb +454 -454
  156. data/test/cases/scoping/named_scoping_test.rb +524 -524
  157. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  158. data/test/cases/serialization_test.rb +104 -104
  159. data/test/cases/serialized_attribute_test.rb +277 -277
  160. data/test/cases/statement_cache_test.rb +98 -98
  161. data/test/cases/store_test.rb +194 -194
  162. data/test/cases/tasks/database_tasks_test.rb +398 -396
  163. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  164. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  165. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  166. data/test/cases/test_case.rb +123 -123
  167. data/test/cases/timestamp_test.rb +467 -468
  168. data/test/cases/transaction_callbacks_test.rb +452 -452
  169. data/test/cases/transaction_isolation_test.rb +106 -106
  170. data/test/cases/transactions_test.rb +817 -817
  171. data/test/cases/type/decimal_test.rb +56 -51
  172. data/test/cases/type/integer_test.rb +121 -121
  173. data/test/cases/type/string_test.rb +36 -36
  174. data/test/cases/type/type_map_test.rb +177 -177
  175. data/test/cases/type/unsigned_integer_test.rb +18 -18
  176. data/test/cases/types_test.rb +141 -141
  177. data/test/cases/unconnected_test.rb +33 -33
  178. data/test/cases/validations/association_validation_test.rb +86 -86
  179. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  180. data/test/cases/validations/i18n_validation_test.rb +90 -90
  181. data/test/cases/validations/length_validation_test.rb +47 -47
  182. data/test/cases/validations/presence_validation_test.rb +68 -68
  183. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  184. data/test/cases/validations_repair_helper.rb +23 -23
  185. data/test/cases/validations_test.rb +165 -165
  186. data/test/cases/view_test.rb +119 -113
  187. data/test/cases/xml_serialization_test.rb +457 -457
  188. data/test/cases/yaml_serialization_test.rb +126 -86
  189. data/test/config.rb +5 -5
  190. data/test/config.yml +154 -154
  191. data/test/connections/native_ibm_db/connection.rb +43 -43
  192. data/test/fixtures/accounts.yml +29 -29
  193. data/test/fixtures/admin/accounts.yml +2 -2
  194. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  195. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  196. data/test/fixtures/admin/users.yml +10 -10
  197. data/test/fixtures/author_addresses.yml +17 -17
  198. data/test/fixtures/author_favorites.yml +3 -3
  199. data/test/fixtures/authors.yml +23 -23
  200. data/test/fixtures/binaries.yml +133 -133
  201. data/test/fixtures/books.yml +11 -11
  202. data/test/fixtures/bulbs.yml +5 -5
  203. data/test/fixtures/cars.yml +9 -9
  204. data/test/fixtures/categories.yml +19 -19
  205. data/test/fixtures/categories/special_categories.yml +9 -9
  206. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  207. data/test/fixtures/categories_ordered.yml +7 -7
  208. data/test/fixtures/categories_posts.yml +31 -31
  209. data/test/fixtures/categorizations.yml +23 -23
  210. data/test/fixtures/clubs.yml +8 -8
  211. data/test/fixtures/collections.yml +3 -3
  212. data/test/fixtures/colleges.yml +3 -3
  213. data/test/fixtures/comments.yml +65 -65
  214. data/test/fixtures/companies.yml +67 -67
  215. data/test/fixtures/computers.yml +10 -10
  216. data/test/fixtures/courses.yml +8 -8
  217. data/test/fixtures/customers.yml +25 -25
  218. data/test/fixtures/dashboards.yml +6 -6
  219. data/test/fixtures/developers.yml +21 -21
  220. data/test/fixtures/developers_projects.yml +16 -16
  221. data/test/fixtures/dog_lovers.yml +7 -7
  222. data/test/fixtures/dogs.yml +4 -4
  223. data/test/fixtures/doubloons.yml +3 -3
  224. data/test/fixtures/edges.yml +5 -5
  225. data/test/fixtures/entrants.yml +14 -14
  226. data/test/fixtures/essays.yml +6 -6
  227. data/test/fixtures/faces.yml +11 -11
  228. data/test/fixtures/fk_test_has_fk.yml +3 -3
  229. data/test/fixtures/fk_test_has_pk.yml +1 -1
  230. data/test/fixtures/friendships.yml +4 -4
  231. data/test/fixtures/funny_jokes.yml +10 -10
  232. data/test/fixtures/interests.yml +33 -33
  233. data/test/fixtures/items.yml +3 -3
  234. data/test/fixtures/jobs.yml +7 -7
  235. data/test/fixtures/legacy_things.yml +3 -3
  236. data/test/fixtures/mateys.yml +4 -4
  237. data/test/fixtures/member_details.yml +8 -8
  238. data/test/fixtures/member_types.yml +6 -6
  239. data/test/fixtures/members.yml +11 -11
  240. data/test/fixtures/memberships.yml +34 -34
  241. data/test/fixtures/men.yml +5 -5
  242. data/test/fixtures/minimalistics.yml +2 -2
  243. data/test/fixtures/minivans.yml +5 -5
  244. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  245. data/test/fixtures/mixins.yml +29 -29
  246. data/test/fixtures/movies.yml +7 -7
  247. data/test/fixtures/naked/csv/accounts.csv +1 -1
  248. data/test/fixtures/naked/yml/accounts.yml +1 -1
  249. data/test/fixtures/naked/yml/companies.yml +1 -1
  250. data/test/fixtures/naked/yml/courses.yml +1 -1
  251. data/test/fixtures/organizations.yml +5 -5
  252. data/test/fixtures/other_topics.yml +42 -42
  253. data/test/fixtures/owners.yml +9 -9
  254. data/test/fixtures/parrots.yml +27 -27
  255. data/test/fixtures/parrots_pirates.yml +7 -7
  256. data/test/fixtures/people.yml +24 -24
  257. data/test/fixtures/peoples_treasures.yml +3 -3
  258. data/test/fixtures/pets.yml +19 -19
  259. data/test/fixtures/pirates.yml +12 -12
  260. data/test/fixtures/posts.yml +80 -80
  261. data/test/fixtures/price_estimates.yml +7 -7
  262. data/test/fixtures/products.yml +4 -4
  263. data/test/fixtures/projects.yml +7 -7
  264. data/test/fixtures/randomly_named_a9.yml +7 -7
  265. data/test/fixtures/ratings.yml +14 -14
  266. data/test/fixtures/readers.yml +11 -11
  267. data/test/fixtures/references.yml +17 -17
  268. data/test/fixtures/reserved_words/distinct.yml +5 -5
  269. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  270. data/test/fixtures/reserved_words/group.yml +14 -14
  271. data/test/fixtures/reserved_words/select.yml +8 -8
  272. data/test/fixtures/reserved_words/values.yml +7 -7
  273. data/test/fixtures/ships.yml +6 -6
  274. data/test/fixtures/speedometers.yml +8 -8
  275. data/test/fixtures/sponsors.yml +12 -12
  276. data/test/fixtures/string_key_objects.yml +7 -7
  277. data/test/fixtures/subscribers.yml +10 -10
  278. data/test/fixtures/subscriptions.yml +12 -12
  279. data/test/fixtures/taggings.yml +78 -78
  280. data/test/fixtures/tags.yml +11 -11
  281. data/test/fixtures/tasks.yml +7 -7
  282. data/test/fixtures/teapots.yml +3 -3
  283. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  284. data/test/fixtures/to_be_linked/users.yml +10 -10
  285. data/test/fixtures/topics.yml +49 -49
  286. data/test/fixtures/toys.yml +14 -14
  287. data/test/fixtures/traffic_lights.yml +9 -9
  288. data/test/fixtures/treasures.yml +10 -10
  289. data/test/fixtures/uuid_children.yml +3 -3
  290. data/test/fixtures/uuid_parents.yml +2 -2
  291. data/test/fixtures/variants.yml +4 -4
  292. data/test/fixtures/vegetables.yml +19 -19
  293. data/test/fixtures/vertices.yml +3 -3
  294. data/test/fixtures/warehouse_things.yml +2 -2
  295. data/test/fixtures/zines.yml +5 -5
  296. data/test/ibm_db_test.rb +24 -24
  297. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  298. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  299. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  300. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  301. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  302. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  303. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  304. data/test/migrations/rename/1_we_need_things.rb +10 -10
  305. data/test/migrations/rename/2_rename_things.rb +8 -8
  306. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  308. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  309. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  310. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  311. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  312. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  313. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  314. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  315. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  316. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  317. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  318. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  319. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  320. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  321. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  322. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  323. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  324. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  325. data/test/models/admin.rb +4 -4
  326. data/test/models/admin/account.rb +2 -2
  327. data/test/models/admin/randomly_named_c1.rb +3 -3
  328. data/test/models/admin/user.rb +40 -40
  329. data/test/models/aircraft.rb +4 -4
  330. data/test/models/arunit2_model.rb +3 -3
  331. data/test/models/author.rb +212 -212
  332. data/test/models/auto_id.rb +4 -4
  333. data/test/models/autoloadable/extra_firm.rb +2 -2
  334. data/test/models/binary.rb +1 -1
  335. data/test/models/bird.rb +12 -12
  336. data/test/models/book.rb +18 -18
  337. data/test/models/boolean.rb +2 -2
  338. data/test/models/bulb.rb +51 -51
  339. data/test/models/cake_designer.rb +3 -3
  340. data/test/models/car.rb +26 -26
  341. data/test/models/carrier.rb +2 -2
  342. data/test/models/categorization.rb +19 -19
  343. data/test/models/category.rb +35 -35
  344. data/test/models/chef.rb +7 -3
  345. data/test/models/citation.rb +3 -3
  346. data/test/models/club.rb +23 -23
  347. data/test/models/college.rb +10 -10
  348. data/test/models/column.rb +3 -3
  349. data/test/models/column_name.rb +3 -3
  350. data/test/models/comment.rb +64 -64
  351. data/test/models/company.rb +228 -225
  352. data/test/models/company_in_module.rb +98 -98
  353. data/test/models/computer.rb +3 -3
  354. data/test/models/contact.rb +41 -41
  355. data/test/models/contract.rb +20 -20
  356. data/test/models/country.rb +7 -7
  357. data/test/models/course.rb +6 -6
  358. data/test/models/customer.rb +77 -77
  359. data/test/models/customer_carrier.rb +14 -14
  360. data/test/models/dashboard.rb +3 -3
  361. data/test/models/default.rb +2 -2
  362. data/test/models/department.rb +4 -4
  363. data/test/models/developer.rb +255 -252
  364. data/test/models/dog.rb +5 -5
  365. data/test/models/dog_lover.rb +5 -5
  366. data/test/models/doubloon.rb +12 -12
  367. data/test/models/drink_designer.rb +3 -3
  368. data/test/models/edge.rb +5 -5
  369. data/test/models/electron.rb +5 -5
  370. data/test/models/engine.rb +4 -4
  371. data/test/models/entrant.rb +3 -3
  372. data/test/models/essay.rb +5 -5
  373. data/test/models/event.rb +2 -2
  374. data/test/models/eye.rb +37 -37
  375. data/test/models/face.rb +9 -9
  376. data/test/models/friendship.rb +6 -6
  377. data/test/models/guid.rb +1 -1
  378. data/test/models/hotel.rb +9 -6
  379. data/test/models/image.rb +3 -3
  380. data/test/models/interest.rb +5 -5
  381. data/test/models/invoice.rb +4 -4
  382. data/test/models/item.rb +7 -7
  383. data/test/models/job.rb +7 -7
  384. data/test/models/joke.rb +7 -7
  385. data/test/models/keyboard.rb +3 -3
  386. data/test/models/legacy_thing.rb +3 -3
  387. data/test/models/lesson.rb +11 -11
  388. data/test/models/line_item.rb +3 -3
  389. data/test/models/liquid.rb +4 -4
  390. data/test/models/man.rb +11 -11
  391. data/test/models/matey.rb +4 -4
  392. data/test/models/member.rb +41 -41
  393. data/test/models/member_detail.rb +7 -7
  394. data/test/models/member_type.rb +3 -3
  395. data/test/models/membership.rb +35 -35
  396. data/test/models/minimalistic.rb +2 -2
  397. data/test/models/minivan.rb +9 -9
  398. data/test/models/mixed_case_monkey.rb +3 -3
  399. data/test/models/molecule.rb +6 -6
  400. data/test/models/movie.rb +5 -5
  401. data/test/models/order.rb +4 -4
  402. data/test/models/organization.rb +14 -14
  403. data/test/models/owner.rb +34 -34
  404. data/test/models/parrot.rb +29 -29
  405. data/test/models/person.rb +143 -143
  406. data/test/models/personal_legacy_thing.rb +4 -4
  407. data/test/models/pet.rb +15 -15
  408. data/test/models/pirate.rb +92 -92
  409. data/test/models/possession.rb +3 -3
  410. data/test/models/post.rb +264 -264
  411. data/test/models/price_estimate.rb +4 -4
  412. data/test/models/professor.rb +5 -5
  413. data/test/models/project.rb +31 -29
  414. data/test/models/publisher.rb +2 -2
  415. data/test/models/publisher/article.rb +4 -4
  416. data/test/models/publisher/magazine.rb +3 -3
  417. data/test/models/randomly_named_c1.rb +3 -3
  418. data/test/models/rating.rb +4 -4
  419. data/test/models/reader.rb +23 -23
  420. data/test/models/record.rb +2 -2
  421. data/test/models/reference.rb +22 -22
  422. data/test/models/reply.rb +61 -61
  423. data/test/models/ship.rb +33 -33
  424. data/test/models/ship_part.rb +7 -7
  425. data/test/models/shop.rb +17 -17
  426. data/test/models/shop_account.rb +6 -6
  427. data/test/models/speedometer.rb +6 -6
  428. data/test/models/sponsor.rb +7 -7
  429. data/test/models/string_key_object.rb +3 -3
  430. data/test/models/student.rb +4 -4
  431. data/test/models/subject.rb +16 -16
  432. data/test/models/subscriber.rb +8 -8
  433. data/test/models/subscription.rb +4 -4
  434. data/test/models/tag.rb +7 -7
  435. data/test/models/tagging.rb +13 -13
  436. data/test/models/task.rb +5 -5
  437. data/test/models/topic.rb +124 -124
  438. data/test/models/toy.rb +6 -6
  439. data/test/models/traffic_light.rb +4 -4
  440. data/test/models/treasure.rb +14 -14
  441. data/test/models/treaty.rb +7 -7
  442. data/test/models/tyre.rb +11 -11
  443. data/test/models/uuid_child.rb +3 -3
  444. data/test/models/uuid_parent.rb +3 -3
  445. data/test/models/vegetables.rb +24 -24
  446. data/test/models/vehicle.rb +6 -6
  447. data/test/models/vertex.rb +9 -9
  448. data/test/models/warehouse_thing.rb +5 -5
  449. data/test/models/wheel.rb +3 -3
  450. data/test/models/without_table.rb +3 -3
  451. data/test/models/zine.rb +3 -3
  452. data/test/schema/mysql2_specific_schema.rb +58 -58
  453. data/test/schema/mysql_specific_schema.rb +70 -70
  454. data/test/schema/oracle_specific_schema.rb +43 -43
  455. data/test/schema/postgresql_specific_schema.rb +202 -202
  456. data/test/schema/schema.rb +952 -938
  457. data/test/schema/sqlite_specific_schema.rb +21 -21
  458. data/test/support/config.rb +43 -43
  459. data/test/support/connection.rb +22 -22
  460. data/test/support/connection_helper.rb +14 -14
  461. data/test/support/ddl_helper.rb +8 -8
  462. data/test/support/schema_dumping_helper.rb +20 -20
  463. metadata +2 -2
@@ -1,122 +1,122 @@
1
- require "cases/helper"
2
- require "rack"
3
-
4
- module ActiveRecord
5
- module ConnectionAdapters
6
- class ConnectionManagementTest < ActiveRecord::TestCase
7
- class App
8
- attr_reader :calls
9
- def initialize
10
- @calls = []
11
- end
12
-
13
- def call(env)
14
- @calls << env
15
- [200, {}, ['hi mom']]
16
- end
17
- end
18
-
19
- def setup
20
- @env = {}
21
- @app = App.new
22
- @management = ConnectionManagement.new(@app)
23
-
24
- # make sure we have an active connection
25
- assert ActiveRecord::Base.connection
26
- assert ActiveRecord::Base.connection_handler.active_connections?
27
- end
28
-
29
- if Process.respond_to?(:fork)
30
- def test_connection_pool_per_pid
31
- object_id = ActiveRecord::Base.connection.object_id
32
-
33
- rd, wr = IO.pipe
34
- rd.binmode
35
- wr.binmode
36
-
37
- pid = fork {
38
- rd.close
39
- wr.write Marshal.dump ActiveRecord::Base.connection.object_id
40
- wr.close
41
- exit!
42
- }
43
-
44
- wr.close
45
-
46
- Process.waitpid pid
47
- assert_not_equal object_id, Marshal.load(rd.read)
48
- rd.close
49
- end
50
- end
51
-
52
- def test_app_delegation
53
- manager = ConnectionManagement.new(@app)
54
-
55
- manager.call @env
56
- assert_equal [@env], @app.calls
57
- end
58
-
59
- def test_connections_are_active_after_call
60
- @management.call(@env)
61
- assert ActiveRecord::Base.connection_handler.active_connections?
62
- end
63
-
64
- def test_body_responds_to_each
65
- _, _, body = @management.call(@env)
66
- bits = []
67
- body.each { |bit| bits << bit }
68
- assert_equal ['hi mom'], bits
69
- end
70
-
71
- def test_connections_are_cleared_after_body_close
72
- _, _, body = @management.call(@env)
73
- body.close
74
- assert !ActiveRecord::Base.connection_handler.active_connections?
75
- end
76
-
77
- def test_active_connections_are_not_cleared_on_body_close_during_test
78
- @env['rack.test'] = true
79
- _, _, body = @management.call(@env)
80
- body.close
81
- assert ActiveRecord::Base.connection_handler.active_connections?
82
- end
83
-
84
- def test_connections_closed_if_exception
85
- app = Class.new(App) { def call(env); raise NotImplementedError; end }.new
86
- explosive = ConnectionManagement.new(app)
87
- assert_raises(NotImplementedError) { explosive.call(@env) }
88
- assert !ActiveRecord::Base.connection_handler.active_connections?
89
- end
90
-
91
- def test_connections_not_closed_if_exception_and_test
92
- @env['rack.test'] = true
93
- app = Class.new(App) { def call(env); raise; end }.new
94
- explosive = ConnectionManagement.new(app)
95
- assert_raises(RuntimeError) { explosive.call(@env) }
96
- assert ActiveRecord::Base.connection_handler.active_connections?
97
- end
98
-
99
- def test_connections_closed_if_exception_and_explicitly_not_test
100
- @env['rack.test'] = false
101
- app = Class.new(App) { def call(env); raise NotImplementedError; end }.new
102
- explosive = ConnectionManagement.new(app)
103
- assert_raises(NotImplementedError) { explosive.call(@env) }
104
- assert !ActiveRecord::Base.connection_handler.active_connections?
105
- end
106
-
107
- test "doesn't clear active connections when running in a test case" do
108
- @env['rack.test'] = true
109
- @management.call(@env)
110
- assert ActiveRecord::Base.connection_handler.active_connections?
111
- end
112
-
113
- test "proxy is polite to it's body and responds to it" do
114
- body = Class.new(String) { def to_path; "/path"; end }.new
115
- app = lambda { |_| [200, {}, body] }
116
- response_body = ConnectionManagement.new(app).call(@env)[2]
117
- assert response_body.respond_to?(:to_path)
118
- assert_equal response_body.to_path, "/path"
119
- end
120
- end
121
- end
122
- end
1
+ require "cases/helper"
2
+ require "rack"
3
+
4
+ module ActiveRecord
5
+ module ConnectionAdapters
6
+ class ConnectionManagementTest < ActiveRecord::TestCase
7
+ class App
8
+ attr_reader :calls
9
+ def initialize
10
+ @calls = []
11
+ end
12
+
13
+ def call(env)
14
+ @calls << env
15
+ [200, {}, ['hi mom']]
16
+ end
17
+ end
18
+
19
+ def setup
20
+ @env = {}
21
+ @app = App.new
22
+ @management = ConnectionManagement.new(@app)
23
+
24
+ # make sure we have an active connection
25
+ assert ActiveRecord::Base.connection
26
+ assert ActiveRecord::Base.connection_handler.active_connections?
27
+ end
28
+
29
+ if Process.respond_to?(:fork)
30
+ def test_connection_pool_per_pid
31
+ object_id = ActiveRecord::Base.connection.object_id
32
+
33
+ rd, wr = IO.pipe
34
+ rd.binmode
35
+ wr.binmode
36
+
37
+ pid = fork {
38
+ rd.close
39
+ wr.write Marshal.dump ActiveRecord::Base.connection.object_id
40
+ wr.close
41
+ exit!
42
+ }
43
+
44
+ wr.close
45
+
46
+ Process.waitpid pid
47
+ assert_not_equal object_id, Marshal.load(rd.read)
48
+ rd.close
49
+ end
50
+ end
51
+
52
+ def test_app_delegation
53
+ manager = ConnectionManagement.new(@app)
54
+
55
+ manager.call @env
56
+ assert_equal [@env], @app.calls
57
+ end
58
+
59
+ def test_connections_are_active_after_call
60
+ @management.call(@env)
61
+ assert ActiveRecord::Base.connection_handler.active_connections?
62
+ end
63
+
64
+ def test_body_responds_to_each
65
+ _, _, body = @management.call(@env)
66
+ bits = []
67
+ body.each { |bit| bits << bit }
68
+ assert_equal ['hi mom'], bits
69
+ end
70
+
71
+ def test_connections_are_cleared_after_body_close
72
+ _, _, body = @management.call(@env)
73
+ body.close
74
+ assert !ActiveRecord::Base.connection_handler.active_connections?
75
+ end
76
+
77
+ def test_active_connections_are_not_cleared_on_body_close_during_test
78
+ @env['rack.test'] = true
79
+ _, _, body = @management.call(@env)
80
+ body.close
81
+ assert ActiveRecord::Base.connection_handler.active_connections?
82
+ end
83
+
84
+ def test_connections_closed_if_exception
85
+ app = Class.new(App) { def call(env); raise NotImplementedError; end }.new
86
+ explosive = ConnectionManagement.new(app)
87
+ assert_raises(NotImplementedError) { explosive.call(@env) }
88
+ assert !ActiveRecord::Base.connection_handler.active_connections?
89
+ end
90
+
91
+ def test_connections_not_closed_if_exception_and_test
92
+ @env['rack.test'] = true
93
+ app = Class.new(App) { def call(env); raise; end }.new
94
+ explosive = ConnectionManagement.new(app)
95
+ assert_raises(RuntimeError) { explosive.call(@env) }
96
+ assert ActiveRecord::Base.connection_handler.active_connections?
97
+ end
98
+
99
+ def test_connections_closed_if_exception_and_explicitly_not_test
100
+ @env['rack.test'] = false
101
+ app = Class.new(App) { def call(env); raise NotImplementedError; end }.new
102
+ explosive = ConnectionManagement.new(app)
103
+ assert_raises(NotImplementedError) { explosive.call(@env) }
104
+ assert !ActiveRecord::Base.connection_handler.active_connections?
105
+ end
106
+
107
+ test "doesn't clear active connections when running in a test case" do
108
+ @env['rack.test'] = true
109
+ @management.call(@env)
110
+ assert ActiveRecord::Base.connection_handler.active_connections?
111
+ end
112
+
113
+ test "proxy is polite to it's body and responds to it" do
114
+ body = Class.new(String) { def to_path; "/path"; end }.new
115
+ app = lambda { |_| [200, {}, body] }
116
+ response_body = ConnectionManagement.new(app).call(@env)[2]
117
+ assert response_body.respond_to?(:to_path)
118
+ assert_equal response_body.to_path, "/path"
119
+ end
120
+ end
121
+ end
122
+ end
@@ -1,346 +1,346 @@
1
- require "cases/helper"
2
- require 'active_support/concurrency/latch'
3
-
4
- module ActiveRecord
5
- module ConnectionAdapters
6
- class ConnectionPoolTest < ActiveRecord::TestCase
7
- attr_reader :pool
8
-
9
- def setup
10
- super
11
-
12
- # Keep a duplicate pool so we do not bother others
13
- @pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
14
-
15
- if in_memory_db?
16
- # Separate connections to an in-memory database create an entirely new database,
17
- # with an empty schema etc, so we just stub out this schema on the fly.
18
- @pool.with_connection do |connection|
19
- connection.create_table :posts do |t|
20
- t.integer :cololumn
21
- end
22
- end
23
- end
24
- end
25
-
26
- teardown do
27
- @pool.disconnect!
28
- end
29
-
30
- def active_connections(pool)
31
- pool.connections.find_all(&:in_use?)
32
- end
33
-
34
- def test_checkout_after_close
35
- connection = pool.connection
36
- assert connection.in_use?
37
-
38
- connection.close
39
- assert !connection.in_use?
40
-
41
- assert pool.connection.in_use?
42
- end
43
-
44
- def test_released_connection_moves_between_threads
45
- thread_conn = nil
46
-
47
- Thread.new {
48
- pool.with_connection do |conn|
49
- thread_conn = conn
50
- end
51
- }.join
52
-
53
- assert thread_conn
54
-
55
- Thread.new {
56
- pool.with_connection do |conn|
57
- assert_equal thread_conn, conn
58
- end
59
- }.join
60
- end
61
-
62
- def test_with_connection
63
- assert_equal 0, active_connections(pool).size
64
-
65
- main_thread = pool.connection
66
- assert_equal 1, active_connections(pool).size
67
-
68
- Thread.new {
69
- pool.with_connection do |conn|
70
- assert conn
71
- assert_equal 2, active_connections(pool).size
72
- end
73
- assert_equal 1, active_connections(pool).size
74
- }.join
75
-
76
- main_thread.close
77
- assert_equal 0, active_connections(pool).size
78
- end
79
-
80
- def test_active_connection_in_use
81
- assert !pool.active_connection?
82
- main_thread = pool.connection
83
-
84
- assert pool.active_connection?
85
-
86
- main_thread.close
87
-
88
- assert !pool.active_connection?
89
- end
90
-
91
- def test_full_pool_exception
92
- @pool.size.times { @pool.checkout }
93
- assert_raises(ConnectionTimeoutError) do
94
- @pool.checkout
95
- end
96
- end
97
-
98
- def test_full_pool_blocks
99
- cs = @pool.size.times.map { @pool.checkout }
100
- t = Thread.new { @pool.checkout }
101
-
102
- # make sure our thread is in the timeout section
103
- Thread.pass until t.status == "sleep"
104
-
105
- connection = cs.first
106
- connection.close
107
- assert_equal connection, t.join.value
108
- end
109
-
110
- def test_removing_releases_latch
111
- cs = @pool.size.times.map { @pool.checkout }
112
- t = Thread.new { @pool.checkout }
113
-
114
- # make sure our thread is in the timeout section
115
- Thread.pass until t.status == "sleep"
116
-
117
- connection = cs.first
118
- @pool.remove connection
119
- assert_respond_to t.join.value, :execute
120
- connection.close
121
- end
122
-
123
- def test_reap_and_active
124
- @pool.checkout
125
- @pool.checkout
126
- @pool.checkout
127
-
128
- connections = @pool.connections.dup
129
-
130
- @pool.reap
131
-
132
- assert_equal connections.length, @pool.connections.length
133
- end
134
-
135
- def test_reap_inactive
136
- ready = ActiveSupport::Concurrency::Latch.new
137
- @pool.checkout
138
- child = Thread.new do
139
- @pool.checkout
140
- @pool.checkout
141
- ready.release
142
- Thread.stop
143
- end
144
- ready.await
145
-
146
- assert_equal 3, active_connections(@pool).size
147
-
148
- child.terminate
149
- child.join
150
- @pool.reap
151
-
152
- assert_equal 1, active_connections(@pool).size
153
- ensure
154
- @pool.connections.each(&:close)
155
- end
156
-
157
- def test_remove_connection
158
- conn = @pool.checkout
159
- assert conn.in_use?
160
-
161
- length = @pool.connections.length
162
- @pool.remove conn
163
- assert conn.in_use?
164
- assert_equal(length - 1, @pool.connections.length)
165
- ensure
166
- conn.close
167
- end
168
-
169
- def test_remove_connection_for_thread
170
- conn = @pool.connection
171
- @pool.remove conn
172
- assert_not_equal(conn, @pool.connection)
173
- ensure
174
- conn.close if conn
175
- end
176
-
177
- def test_active_connection?
178
- assert !@pool.active_connection?
179
- assert @pool.connection
180
- assert @pool.active_connection?
181
- @pool.release_connection
182
- assert !@pool.active_connection?
183
- end
184
-
185
- def test_checkout_behaviour
186
- pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
187
- connection = pool.connection
188
- assert_not_nil connection
189
- threads = []
190
- 4.times do |i|
191
- threads << Thread.new(i) do
192
- connection = pool.connection
193
- assert_not_nil connection
194
- connection.close
195
- end
196
- end
197
-
198
- threads.each(&:join)
199
-
200
- Thread.new do
201
- assert pool.connection
202
- pool.connection.close
203
- end.join
204
- end
205
-
206
- # The connection pool is "fair" if threads waiting for
207
- # connections receive them the order in which they began
208
- # waiting. This ensures that we don't timeout one HTTP request
209
- # even while well under capacity in a multi-threaded environment
210
- # such as a Java servlet container.
211
- #
212
- # We don't need strict fairness: if two connections become
213
- # available at the same time, it's fine of two threads that were
214
- # waiting acquire the connections out of order.
215
- #
216
- # Thus this test prepares waiting threads and then trickles in
217
- # available connections slowly, ensuring the wakeup order is
218
- # correct in this case.
219
- def test_checkout_fairness
220
- @pool.instance_variable_set(:@size, 10)
221
- expected = (1..@pool.size).to_a.freeze
222
- # check out all connections so our threads start out waiting
223
- conns = expected.map { @pool.checkout }
224
- mutex = Mutex.new
225
- order = []
226
- errors = []
227
-
228
- threads = expected.map do |i|
229
- t = Thread.new {
230
- begin
231
- @pool.checkout # never checked back in
232
- mutex.synchronize { order << i }
233
- rescue => e
234
- mutex.synchronize { errors << e }
235
- end
236
- }
237
- Thread.pass until t.status == "sleep"
238
- t
239
- end
240
-
241
- # this should wake up the waiting threads one by one in order
242
- conns.each { |conn| @pool.checkin(conn); sleep 0.1 }
243
-
244
- threads.each(&:join)
245
-
246
- raise errors.first if errors.any?
247
-
248
- assert_equal(expected, order)
249
- end
250
-
251
- # As mentioned in #test_checkout_fairness, we don't care about
252
- # strict fairness. This test creates two groups of threads:
253
- # group1 whose members all start waiting before any thread in
254
- # group2. Enough connections are checked in to wakeup all
255
- # group1 threads, and the fact that only group1 and no group2
256
- # threads acquired a connection is enforced.
257
- def test_checkout_fairness_by_group
258
- @pool.instance_variable_set(:@size, 10)
259
- # take all the connections
260
- conns = (1..10).map { @pool.checkout }
261
- mutex = Mutex.new
262
- successes = [] # threads that successfully got a connection
263
- errors = []
264
-
265
- make_thread = proc do |i|
266
- t = Thread.new {
267
- begin
268
- @pool.checkout # never checked back in
269
- mutex.synchronize { successes << i }
270
- rescue => e
271
- mutex.synchronize { errors << e }
272
- end
273
- }
274
- Thread.pass until t.status == "sleep"
275
- t
276
- end
277
-
278
- # all group1 threads start waiting before any in group2
279
- group1 = (1..5).map(&make_thread)
280
- group2 = (6..10).map(&make_thread)
281
-
282
- # checkin n connections back to the pool
283
- checkin = proc do |n|
284
- n.times do
285
- c = conns.pop
286
- @pool.checkin(c)
287
- end
288
- end
289
-
290
- checkin.call(group1.size) # should wake up all group1
291
-
292
- loop do
293
- sleep 0.1
294
- break if mutex.synchronize { (successes.size + errors.size) == group1.size }
295
- end
296
-
297
- winners = mutex.synchronize { successes.dup }
298
- checkin.call(group2.size) # should wake up everyone remaining
299
-
300
- group1.each(&:join)
301
- group2.each(&:join)
302
-
303
- assert_equal((1..group1.size).to_a, winners.sort)
304
-
305
- if errors.any?
306
- raise errors.first
307
- end
308
- end
309
-
310
- def test_automatic_reconnect=
311
- pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
312
- assert pool.automatic_reconnect
313
- assert pool.connection
314
-
315
- pool.disconnect!
316
- assert pool.connection
317
-
318
- pool.disconnect!
319
- pool.automatic_reconnect = false
320
-
321
- assert_raises(ConnectionNotEstablished) do
322
- pool.connection
323
- end
324
-
325
- assert_raises(ConnectionNotEstablished) do
326
- pool.with_connection
327
- end
328
- end
329
-
330
- def test_pool_sets_connection_visitor
331
- assert @pool.connection.visitor.is_a?(Arel::Visitors::ToSql)
332
- end
333
-
334
- # make sure exceptions are thrown when establish_connection
335
- # is called with an anonymous class
336
- def test_anonymous_class_exception
337
- anonymous = Class.new(ActiveRecord::Base)
338
- handler = ActiveRecord::Base.connection_handler
339
-
340
- assert_raises(RuntimeError) {
341
- handler.establish_connection anonymous, nil
342
- }
343
- end
344
- end
345
- end
346
- end
1
+ require "cases/helper"
2
+ require 'active_support/concurrency/latch'
3
+
4
+ module ActiveRecord
5
+ module ConnectionAdapters
6
+ class ConnectionPoolTest < ActiveRecord::TestCase
7
+ attr_reader :pool
8
+
9
+ def setup
10
+ super
11
+
12
+ # Keep a duplicate pool so we do not bother others
13
+ @pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
14
+
15
+ if in_memory_db?
16
+ # Separate connections to an in-memory database create an entirely new database,
17
+ # with an empty schema etc, so we just stub out this schema on the fly.
18
+ @pool.with_connection do |connection|
19
+ connection.create_table :posts do |t|
20
+ t.integer :cololumn
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ teardown do
27
+ @pool.disconnect!
28
+ end
29
+
30
+ def active_connections(pool)
31
+ pool.connections.find_all(&:in_use?)
32
+ end
33
+
34
+ def test_checkout_after_close
35
+ connection = pool.connection
36
+ assert connection.in_use?
37
+
38
+ connection.close
39
+ assert !connection.in_use?
40
+
41
+ assert pool.connection.in_use?
42
+ end
43
+
44
+ def test_released_connection_moves_between_threads
45
+ thread_conn = nil
46
+
47
+ Thread.new {
48
+ pool.with_connection do |conn|
49
+ thread_conn = conn
50
+ end
51
+ }.join
52
+
53
+ assert thread_conn
54
+
55
+ Thread.new {
56
+ pool.with_connection do |conn|
57
+ assert_equal thread_conn, conn
58
+ end
59
+ }.join
60
+ end
61
+
62
+ def test_with_connection
63
+ assert_equal 0, active_connections(pool).size
64
+
65
+ main_thread = pool.connection
66
+ assert_equal 1, active_connections(pool).size
67
+
68
+ Thread.new {
69
+ pool.with_connection do |conn|
70
+ assert conn
71
+ assert_equal 2, active_connections(pool).size
72
+ end
73
+ assert_equal 1, active_connections(pool).size
74
+ }.join
75
+
76
+ main_thread.close
77
+ assert_equal 0, active_connections(pool).size
78
+ end
79
+
80
+ def test_active_connection_in_use
81
+ assert !pool.active_connection?
82
+ main_thread = pool.connection
83
+
84
+ assert pool.active_connection?
85
+
86
+ main_thread.close
87
+
88
+ assert !pool.active_connection?
89
+ end
90
+
91
+ def test_full_pool_exception
92
+ @pool.size.times { @pool.checkout }
93
+ assert_raises(ConnectionTimeoutError) do
94
+ @pool.checkout
95
+ end
96
+ end
97
+
98
+ def test_full_pool_blocks
99
+ cs = @pool.size.times.map { @pool.checkout }
100
+ t = Thread.new { @pool.checkout }
101
+
102
+ # make sure our thread is in the timeout section
103
+ Thread.pass until t.status == "sleep"
104
+
105
+ connection = cs.first
106
+ connection.close
107
+ assert_equal connection, t.join.value
108
+ end
109
+
110
+ def test_removing_releases_latch
111
+ cs = @pool.size.times.map { @pool.checkout }
112
+ t = Thread.new { @pool.checkout }
113
+
114
+ # make sure our thread is in the timeout section
115
+ Thread.pass until t.status == "sleep"
116
+
117
+ connection = cs.first
118
+ @pool.remove connection
119
+ assert_respond_to t.join.value, :execute
120
+ connection.close
121
+ end
122
+
123
+ def test_reap_and_active
124
+ @pool.checkout
125
+ @pool.checkout
126
+ @pool.checkout
127
+
128
+ connections = @pool.connections.dup
129
+
130
+ @pool.reap
131
+
132
+ assert_equal connections.length, @pool.connections.length
133
+ end
134
+
135
+ def test_reap_inactive
136
+ ready = ActiveSupport::Concurrency::Latch.new
137
+ @pool.checkout
138
+ child = Thread.new do
139
+ @pool.checkout
140
+ @pool.checkout
141
+ ready.release
142
+ Thread.stop
143
+ end
144
+ ready.await
145
+
146
+ assert_equal 3, active_connections(@pool).size
147
+
148
+ child.terminate
149
+ child.join
150
+ @pool.reap
151
+
152
+ assert_equal 1, active_connections(@pool).size
153
+ ensure
154
+ @pool.connections.each(&:close)
155
+ end
156
+
157
+ def test_remove_connection
158
+ conn = @pool.checkout
159
+ assert conn.in_use?
160
+
161
+ length = @pool.connections.length
162
+ @pool.remove conn
163
+ assert conn.in_use?
164
+ assert_equal(length - 1, @pool.connections.length)
165
+ ensure
166
+ conn.close
167
+ end
168
+
169
+ def test_remove_connection_for_thread
170
+ conn = @pool.connection
171
+ @pool.remove conn
172
+ assert_not_equal(conn, @pool.connection)
173
+ ensure
174
+ conn.close if conn
175
+ end
176
+
177
+ def test_active_connection?
178
+ assert !@pool.active_connection?
179
+ assert @pool.connection
180
+ assert @pool.active_connection?
181
+ @pool.release_connection
182
+ assert !@pool.active_connection?
183
+ end
184
+
185
+ def test_checkout_behaviour
186
+ pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
187
+ connection = pool.connection
188
+ assert_not_nil connection
189
+ threads = []
190
+ 4.times do |i|
191
+ threads << Thread.new(i) do
192
+ connection = pool.connection
193
+ assert_not_nil connection
194
+ connection.close
195
+ end
196
+ end
197
+
198
+ threads.each(&:join)
199
+
200
+ Thread.new do
201
+ assert pool.connection
202
+ pool.connection.close
203
+ end.join
204
+ end
205
+
206
+ # The connection pool is "fair" if threads waiting for
207
+ # connections receive them the order in which they began
208
+ # waiting. This ensures that we don't timeout one HTTP request
209
+ # even while well under capacity in a multi-threaded environment
210
+ # such as a Java servlet container.
211
+ #
212
+ # We don't need strict fairness: if two connections become
213
+ # available at the same time, it's fine of two threads that were
214
+ # waiting acquire the connections out of order.
215
+ #
216
+ # Thus this test prepares waiting threads and then trickles in
217
+ # available connections slowly, ensuring the wakeup order is
218
+ # correct in this case.
219
+ def test_checkout_fairness
220
+ @pool.instance_variable_set(:@size, 10)
221
+ expected = (1..@pool.size).to_a.freeze
222
+ # check out all connections so our threads start out waiting
223
+ conns = expected.map { @pool.checkout }
224
+ mutex = Mutex.new
225
+ order = []
226
+ errors = []
227
+
228
+ threads = expected.map do |i|
229
+ t = Thread.new {
230
+ begin
231
+ @pool.checkout # never checked back in
232
+ mutex.synchronize { order << i }
233
+ rescue => e
234
+ mutex.synchronize { errors << e }
235
+ end
236
+ }
237
+ Thread.pass until t.status == "sleep"
238
+ t
239
+ end
240
+
241
+ # this should wake up the waiting threads one by one in order
242
+ conns.each { |conn| @pool.checkin(conn); sleep 0.1 }
243
+
244
+ threads.each(&:join)
245
+
246
+ raise errors.first if errors.any?
247
+
248
+ assert_equal(expected, order)
249
+ end
250
+
251
+ # As mentioned in #test_checkout_fairness, we don't care about
252
+ # strict fairness. This test creates two groups of threads:
253
+ # group1 whose members all start waiting before any thread in
254
+ # group2. Enough connections are checked in to wakeup all
255
+ # group1 threads, and the fact that only group1 and no group2
256
+ # threads acquired a connection is enforced.
257
+ def test_checkout_fairness_by_group
258
+ @pool.instance_variable_set(:@size, 10)
259
+ # take all the connections
260
+ conns = (1..10).map { @pool.checkout }
261
+ mutex = Mutex.new
262
+ successes = [] # threads that successfully got a connection
263
+ errors = []
264
+
265
+ make_thread = proc do |i|
266
+ t = Thread.new {
267
+ begin
268
+ @pool.checkout # never checked back in
269
+ mutex.synchronize { successes << i }
270
+ rescue => e
271
+ mutex.synchronize { errors << e }
272
+ end
273
+ }
274
+ Thread.pass until t.status == "sleep"
275
+ t
276
+ end
277
+
278
+ # all group1 threads start waiting before any in group2
279
+ group1 = (1..5).map(&make_thread)
280
+ group2 = (6..10).map(&make_thread)
281
+
282
+ # checkin n connections back to the pool
283
+ checkin = proc do |n|
284
+ n.times do
285
+ c = conns.pop
286
+ @pool.checkin(c)
287
+ end
288
+ end
289
+
290
+ checkin.call(group1.size) # should wake up all group1
291
+
292
+ loop do
293
+ sleep 0.1
294
+ break if mutex.synchronize { (successes.size + errors.size) == group1.size }
295
+ end
296
+
297
+ winners = mutex.synchronize { successes.dup }
298
+ checkin.call(group2.size) # should wake up everyone remaining
299
+
300
+ group1.each(&:join)
301
+ group2.each(&:join)
302
+
303
+ assert_equal((1..group1.size).to_a, winners.sort)
304
+
305
+ if errors.any?
306
+ raise errors.first
307
+ end
308
+ end
309
+
310
+ def test_automatic_reconnect=
311
+ pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
312
+ assert pool.automatic_reconnect
313
+ assert pool.connection
314
+
315
+ pool.disconnect!
316
+ assert pool.connection
317
+
318
+ pool.disconnect!
319
+ pool.automatic_reconnect = false
320
+
321
+ assert_raises(ConnectionNotEstablished) do
322
+ pool.connection
323
+ end
324
+
325
+ assert_raises(ConnectionNotEstablished) do
326
+ pool.with_connection
327
+ end
328
+ end
329
+
330
+ def test_pool_sets_connection_visitor
331
+ assert @pool.connection.visitor.is_a?(Arel::Visitors::ToSql)
332
+ end
333
+
334
+ # make sure exceptions are thrown when establish_connection
335
+ # is called with an anonymous class
336
+ def test_anonymous_class_exception
337
+ anonymous = Class.new(ActiveRecord::Base)
338
+ handler = ActiveRecord::Base.connection_handler
339
+
340
+ assert_raises(RuntimeError) {
341
+ handler.establish_connection anonymous, nil
342
+ }
343
+ end
344
+ end
345
+ end
346
+ end