From 2ead2fa2c199858cf82e72b8b1caaf73cd6b156d Mon Sep 17 00:00:00 2001 From: Aditya Prakash Date: Wed, 9 May 2018 21:20:29 +0530 Subject: [PATCH] Test parallel push doesn't lead mismatched sha transactional_test is set to false because general test flow doesn't clear records created in Thread.new which use different db connection. --- test/gems/hola-0.0.0.gem | Bin 0 -> 4096 bytes test/gems/hola/hola-0.0.0.gem | Bin 0 -> 4096 bytes test/unit/parallel_pusher_test.rb | 46 ++++++++++++++++++++++++++++++ test/unit/pusher_test.rb | 18 ++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 test/gems/hola-0.0.0.gem create mode 100644 test/gems/hola/hola-0.0.0.gem create mode 100644 test/unit/parallel_pusher_test.rb diff --git a/test/gems/hola-0.0.0.gem b/test/gems/hola-0.0.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..b4d6a47ef9f5b3c7a17a89d889c08917cf4ee674 GIT binary patch literal 4096 zcmc~zElEsCEJ@T$uVSDTFaQD*6B7my4Fu@4ftk4hgQ2mJxrwQ%nVF#(gMp#3iJ1X| zf&r}@glukUaY8f@({lvJcp)zuyWRtwOb zpRU+E+1g)xY2F`i#pi$4n1sbIjmtSR*{bMhlfIt7zvVkt#$Q{mukh+(rg@op$@vXG zzIR(DoLA7hcIv={@;ld*J&vrkK665zKgiI$o|$^737q$VIbb03zmbU%dj2;yHyq9X z)Qe@@CL!|wn@fRQ%?3OS7iy}z&M@yN+4_|$Zt*#f)(w4OAAgm-Ip6;_n|UF>Q^w?e z7NySxUmatF*?))zxm?@kkbm6gN@l>XYg>;+tj>9N{Z@oSlYPYHM@e$2pU-?+_&)mY zjys-rjxKGf-PgcX_=HpV^pzi$`vvB|p0wdzq{;)aMLpB4{(nwh6UXQpC~~y&Ezq(5 z|1&cjxU4XPfdjY8M`frH0?8Sv$=SuFxy5>wiMctnDFr}PBfk3I#LxsS|C^W@8I9(D zYQ!%gGZ6Vdwcm1+hyf4lXUn582^zZ7QvUb!%n{B|Ra&U_=*tXwr(a%c*VXNf>wkZL z-=pJ?fBw0duV4Rry8M3od0QlQ-eo>0erBdz=)s&TMxv1~RysZ}nt$eYeQgnYEk^?P z(^npB#$C2$-@jeVYdf3%IDWOl-{-Br|E`(K!aa5GI*z7@qR1y7j7%TQ4Va^yJCiXm z%kl1K)1IY`%9XqLx4kS8+nyDCkmayXh3>4o`wk1c9{Z&gy8Y&xp89HwCTsr2A9^b% z@2T;3OUPd{bIJ?poYvUiSysxb?1JadDBcNeT6LV|kJ?6Q|9O|6#;n!U5oxmVEkA#4 l=f~#}Y>`%K_Wu~xt)3pVh>=i8jmnRPz-S1JhQRO&0RSMj_IJR>zV2U!A*O-LT%H-zWVv=3IUd^ZQffxDlgn3#_Sd*@#<5ZHHq z{fuvyg5_ehT66-Z3V#Vuk$dFOs&ss&ug_nPT=po%f7Z#%cXKa#wY6-?nH%@d)O;=o z4XqHF_HWkY1X7!wQ=>$ zj%sc>w=QqXI=||yc20EQzFl{9|8Oy%eZp4c6&!O`W7UG^AuIMCT=6!CL*3}uV}JQG z4a$)U+FJ!*%(!(lcVU>Z`7Y(HDmQ1d$Cpe$@l@q|)`VDzJ+HP^wMVM@U4F6eP-mUz}lUtcs7mKn-yj`zn-@H`CGGFt<_52yNK6A?qJ(I1x z4aM369{ry5;M9YKv+n9#-jck@T4tBb&gw-A<--@KPT#Te;ew6YN4ma${P{XrZ1blp zHcz(p7hjt9$6N9FpEV|7@k`@!&P=u{I@+YKC-86ij+OD(mg_6Lx|nHRW?piB!;kOX zmI>z-^sb#cFroa;HD!+@Ypu_mkmnCFG_Pl-UTOm8eP9k4$oy|)Vu+sqjm<{$KlLIR zk4cF9|K?I4*I@-7hJgLmU2E81JX%xL8h7}d2zMf1?#r*~H{@*k hxfA3=MW)NI*}uSY5hH<+8kHUmfzc2c4T0em0svK8>dycG literal 0 HcmV?d00001 diff --git a/test/unit/parallel_pusher_test.rb b/test/unit/parallel_pusher_test.rb new file mode 100644 index 00000000000..ada34bee38a --- /dev/null +++ b/test/unit/parallel_pusher_test.rb @@ -0,0 +1,46 @@ +require 'test_helper' +require 'concurrent/atomics' + +class ParallelPusherTest < ActiveSupport::TestCase + self.use_transactional_tests = false + + context "when pushing gems in parallel" do + setup do + @fs = RubygemFs.mock! + @user = create(:user, email: "user@example.com") + end + + teardown do + @user.destroy + @rubygem = Rubygem.find_by(name: 'hola') + @rubygem.versions.destroy_all + @rubygem.destroy + Delayed::Job.delete_all + GemDownload.delete_all + end + + should "not lead to sha mismatch between gem file and db" do + @gem1 = gem_file("hola-0.0.0.gem") + @gem2 = gem_file("hola/hola-0.0.0.gem") + @cutter1 = Pusher.new(@user, @gem1) + @cutter2 = Pusher.new(@user, @gem2) + latch = Concurrent::CountDownLatch.new(2) + + Thread.new do + @cutter1.process + ActiveRecord::Base.connection.close + latch.count_down + end + + Thread.new do + @cutter2.process + ActiveRecord::Base.connection.close + latch.count_down + end + + latch.wait + expected_sha = Digest::SHA2.base64digest(@fs.get('gems/hola-0.0.0.gem')) + assert_equal expected_sha, Version.last.sha256 + end + end +end diff --git a/test/unit/pusher_test.rb b/test/unit/pusher_test.rb index c7395227b9b..d48d266cd1e 100644 --- a/test/unit/pusher_test.rb +++ b/test/unit/pusher_test.rb @@ -338,4 +338,22 @@ class PusherTest < ActiveSupport::TestCase assert_equal 'new summary', response['_source']['summary'] end end + + context "pushing to s3 fails" do + setup do + @gem = gem_file("test-1.0.0.gem") + @cutter = Pusher.new(@user, @gem) + @fs = RubygemFs.s3!('https://some.host') + s3_exception = Aws::S3::Errors::ServiceError.new("stub raises", "something went wrong") + Aws::S3::Client.any_instance.stubs(:put_object).with(any_parameters).raises(s3_exception) + @cutter.process + end + + should "not create version" do + rubygem = Rubygem.find_by(name: 'test') + expected_message = "There was a problem saving your gem. Please try again." + assert_equal expected_message, @cutter.message + assert_equal 0, rubygem.versions.count + end + end end