@@ -59,70 +59,60 @@ func testPullCleanUp(t *testing.T, session *TestSession, user, repo, pullnum str
59
59
return resp
60
60
}
61
61
62
+ func checkChannelWithTimeout (c <- chan interface {}, timeout time.Duration , callback func (interface {}) bool ) bool {
63
+ timer := time .NewTimer (500 * time .Millisecond )
64
+ for {
65
+ select {
66
+ case received := <- c :
67
+ if callback (received ) {
68
+ if ! timer .Stop () {
69
+ select {
70
+ case <- timer .C :
71
+ default :
72
+ }
73
+ }
74
+ return true
75
+ }
76
+ case <- timer .C :
77
+ return false
78
+ }
79
+ }
80
+ }
81
+
62
82
func TestPullMerge (t * testing.T ) {
63
83
onGiteaRun (t , func (t * testing.T , giteaURL * url.URL ) {
64
- createPullNotified , deferableCreate := notifierListener .RegisterChannel ("NotifyNewPullRequest" , 0 , & models.PullRequest {})
65
- defer deferableCreate ()
84
+ createPullNotified , unregisterNewPull := notifierListener .RegisterChannel ("NotifyNewPullRequest" , 0 , & models.PullRequest {})
85
+ defer unregisterNewPull ()
66
86
67
- mergePullNotified , deferableMerge := notifierListener .RegisterChannel ("NotifyMergePullRequest" , 0 , & models.PullRequest {})
68
- defer deferableMerge ()
87
+ mergePullNotified , unregisterMergePull := notifierListener .RegisterChannel ("NotifyMergePullRequest" , 0 , & models.PullRequest {})
88
+ defer unregisterMergePull ()
69
89
70
90
session := loginUser (t , "user1" )
71
91
testRepoFork (t , session , "user2" , "repo1" , "user1" , "repo1" )
72
92
testEditFile (t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n " )
73
93
74
- var prInterface interface {}
75
-
76
94
resp := testPullCreate (t , session , "user1" , "repo1" , "master" , "This is a pull title" )
77
- select {
78
- case prInterface = <- createPullNotified :
79
- case <- time .After (500 * time .Millisecond ):
80
- assert .Fail (t , "Took too long to notify!" )
95
+
96
+ isOurPR := func (received interface {}) bool {
97
+ pr := received .(* models.PullRequest )
98
+ pr .LoadBaseRepo ()
99
+ pr .LoadHeadRepo ()
100
+ return pr .BaseRepo .FullName () == "user2/repo1" &&
101
+ pr .BaseBranch == "master" &&
102
+ pr .HeadRepo .FullName () == "user1/repo1" &&
103
+ pr .HeadBranch == "master"
81
104
}
82
- pr := prInterface .(* models.PullRequest )
83
- pr .LoadBaseRepo ()
84
- pr .LoadHeadRepo ()
85
- pr .BaseRepo .MustOwner ()
86
- pr .HeadRepo .MustOwner ()
87
105
88
- assert .EqualValues (t , "user1" , pr .HeadRepo .Owner .Name )
89
- assert .EqualValues (t , "repo1" , pr .HeadRepo .Name )
90
- assert .EqualValues (t , "user2" , pr .BaseRepo .Owner .Name )
91
- assert .EqualValues (t , "repo1" , pr .BaseRepo .Name )
106
+ assert .True (t , checkChannelWithTimeout (createPullNotified , 500 * time .Millisecond , isOurPR ), "Failed to be notified pull created" )
92
107
93
108
elem := strings .Split (test .RedirectURL (resp ), "/" )
94
109
assert .EqualValues (t , "pulls" , elem [3 ])
95
110
96
111
testPullMerge (t , session , elem [1 ], elem [2 ], elem [4 ], models .MergeStyleMerge )
112
+ assert .True (t , checkChannelWithTimeout (mergePullNotified , 500 * time .Millisecond , isOurPR ), "Failed to be notified pull merged" )
97
113
98
- select {
99
- case prInterface = <- mergePullNotified :
100
- case <- time .After (500 * time .Millisecond ):
101
- assert .Fail (t , "Took too long to notify!" )
102
- }
103
-
104
- pr = prInterface .(* models.PullRequest )
105
- pr .LoadBaseRepo ()
106
- pr .LoadHeadRepo ()
107
- pr .BaseRepo .MustOwner ()
108
- pr .HeadRepo .MustOwner ()
109
-
110
- assert .EqualValues (t , "user1" , pr .HeadRepo .Owner .Name )
111
- assert .EqualValues (t , "repo1" , pr .HeadRepo .Name )
112
- assert .EqualValues (t , "user2" , pr .BaseRepo .Owner .Name )
113
- assert .EqualValues (t , "repo1" , pr .BaseRepo .Name )
114
-
115
- time .Sleep (100 * time .Millisecond )
116
- select {
117
- case prInterface = <- createPullNotified :
118
- assert .Fail (t , "Should only have one pull create notification: %v" , prInterface )
119
- default :
120
- }
121
- select {
122
- case prInterface = <- mergePullNotified :
123
- assert .Fail (t , "Should only have one pull merge notification: %v" , prInterface )
124
- default :
125
- }
114
+ assert .False (t , checkChannelWithTimeout (createPullNotified , 100 * time .Millisecond , isOurPR ), "Duplicate notified pull created" )
115
+ assert .False (t , checkChannelWithTimeout (mergePullNotified , 100 * time .Millisecond , isOurPR ), "Duplicate notified pull merged" )
126
116
})
127
117
}
128
118
0 commit comments