Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
LinuxSuRen
jenkins
提交
6ab4cd64
J
jenkins
项目概览
LinuxSuRen
/
jenkins
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jenkins
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6ab4cd64
编写于
6月 25, 2013
作者:
K
Kohsuke Kawaguchi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Converted to Groovy for simplification
上级
bdfc3f71
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
98 addition
and
102 deletion
+98
-102
test/src/test/groovy/hudson/model/AbstractProjectTest.groovy
test/src/test/groovy/hudson/model/AbstractProjectTest.groovy
+98
-102
未找到文件。
test/src/test/
java/hudson/model/AbstractProjectTest.java
→
test/src/test/
groovy/hudson/model/AbstractProjectTest.groovy
浏览文件 @
6ab4cd64
...
...
@@ -46,6 +46,7 @@ import jenkins.model.Jenkins;
import
org.acegisecurity.context.SecurityContext
;
import
org.acegisecurity.context.SecurityContextHolder
;
import
org.jvnet.hudson.test.HudsonTestCase
;
import
org.jvnet.hudson.test.HudsonTestCase.WebClient
;
import
org.jvnet.hudson.test.Bug
;
import
org.jvnet.hudson.test.MemoryAssert
;
import
org.jvnet.hudson.test.recipes.PresetData
;
...
...
@@ -69,30 +70,28 @@ import org.jvnet.hudson.test.MockFolder;
*/
public
class
AbstractProjectTest
extends
HudsonTestCase
{
public
void
testConfigRoundtrip
()
throws
Exception
{
FreeStyleProject
project
=
createFreeStyleProject
();
Label
l
=
jenkins
.
getLabel
(
"foo && bar"
);
project
.
setAssignedLabel
(
l
)
;
configRoundtrip
((
Item
)
project
);
def
project
=
createFreeStyleProject
();
def
l
=
jenkins
.
getLabel
(
"foo && bar"
);
project
.
assignedLabel
=
l
;
configRoundtrip
((
Item
)
project
);
assert
Equals
(
l
,
project
.
getAssignedLabel
()
);
assert
l
==
project
.
getAssignedLabel
(
);
}
/**
* Tests the workspace deletion.
*/
public
void
testWipeWorkspace
()
throws
Exception
{
FreeStyleProject
project
=
createFreeStyleProject
();
project
.
getBuildersList
()
.
add
(
new
Shell
(
"echo hello"
));
def
project
=
createFreeStyleProject
();
project
.
buildersList
.
add
(
new
Shell
(
"echo hello"
));
FreeStyleBuild
b
=
project
.
scheduleBuild2
(
0
).
get
();
def
b
=
project
.
scheduleBuild2
(
0
).
get
();
assertTrue
(
"Workspace should exist by now"
,
b
.
getWorkspace
().
exists
());
assert
b
.
workspace
.
exists
():
"Workspace should exist by now"
;
project
.
doDoWipeOutWorkspace
();
assertFalse
(
"Workspace should be gone by now"
,
b
.
getWorkspace
().
exists
());
assert
!
b
.
workspace
.
exists
():
"Workspace should be gone by now"
;
}
/**
...
...
@@ -100,15 +99,15 @@ public class AbstractProjectTest extends HudsonTestCase {
*/
@PresetData
(
DataSet
.
NO_ANONYMOUS_READACCESS
)
public
void
testWipeWorkspaceProtected
()
throws
Exception
{
FreeStyleProject
project
=
createFreeStyleProject
();
def
project
=
createFreeStyleProject
();
project
.
getBuildersList
().
add
(
new
Shell
(
"echo hello"
));
FreeStyleBuild
b
=
project
.
scheduleBuild2
(
0
).
get
();
def
b
=
project
.
scheduleBuild2
(
0
).
get
();
assert
True
(
"Workspace should exist by now"
,
b
.
getWorkspace
().
exists
())
;
assert
b
.
getWorkspace
().
exists
():
"Workspace should exist by now"
;
// make sure that the action link is protected
new
WebClient
().
assertFails
(
project
.
getUrl
()
+
"doWipeOutWorkspace"
,
HttpURLConnection
.
HTTP_FORBIDDEN
);
create
WebClient
().
assertFails
(
project
.
getUrl
()
+
"doWipeOutWorkspace"
,
HttpURLConnection
.
HTTP_FORBIDDEN
);
}
/**
...
...
@@ -123,7 +122,7 @@ public class AbstractProjectTest extends HudsonTestCase {
testWipeWorkspaceProtected
();
// there shouldn't be any "wipe out workspace" link for anonymous user
WebClient
webClient
=
new
WebClient
();
def
webClient
=
create
WebClient
();
HtmlPage
page
=
webClient
.
getPage
(
jenkins
.
getItem
(
"test0"
));
page
=
(
HtmlPage
)
page
.
getFirstAnchorByText
(
"Workspace"
).
click
();
...
...
@@ -140,11 +139,11 @@ public class AbstractProjectTest extends HudsonTestCase {
* Tests the <optionalBlock @field> round trip behavior by using {@link AbstractProject#concurrentBuild}
*/
public
void
testOptionalBlockDataBindingRoundtrip
()
throws
Exception
{
FreeStyleProject
p
=
createFreeStyleProject
();
for
(
boolean
b
:
new
boolean
[]{
true
,
false
})
{
p
.
setConcurrentBuild
(
b
)
;
submit
(
new
WebClient
().
getPage
(
p
,
"configure"
).
getFormByName
(
"config"
));
assert
Equals
(
b
,
p
.
isConcurrentBuild
()
);
def
p
=
createFreeStyleProject
();
[
true
,
false
].
each
{
b
->
p
.
concurrentBuild
=
b
;
submit
(
create
WebClient
().
getPage
(
p
,
"configure"
).
getFormByName
(
"config"
));
assert
b
==
p
.
isConcurrentBuild
(
);
}
}
...
...
@@ -153,20 +152,20 @@ public class AbstractProjectTest extends HudsonTestCase {
*/
@Bug
(
4423
)
public
void
testConfiguringBlockBuildWhenUpstreamBuildingRoundtrip
()
throws
Exception
{
FreeStyleProject
p
=
createFreeStyleProject
();
def
p
=
createFreeStyleProject
();
p
.
blockBuildWhenUpstreamBuilding
=
false
;
HtmlForm
form
=
new
WebClient
().
getPage
(
p
,
"configure"
).
getFormByName
(
"config"
);
HtmlInput
input
=
form
.
getInputByName
(
"blockBuildWhenUpstreamBuilding"
);
assert
False
(
"blockBuildWhenUpstreamBuilding check box is checked."
,
input
.
isChecked
())
;
def
form
=
create
WebClient
().
getPage
(
p
,
"configure"
).
getFormByName
(
"config"
);
def
input
=
form
.
getInputByName
(
"blockBuildWhenUpstreamBuilding"
);
assert
!
input
.
isChecked
():
"blockBuildWhenUpstreamBuilding check box is checked."
;
input
.
setChecked
(
true
);
submit
(
form
);
assert
True
(
"blockBuildWhenUpstreamBuilding was not updated from configuration form"
,
p
.
blockBuildWhenUpstreamBuilding
)
;
form
=
new
WebClient
().
getPage
(
p
,
"configure"
).
getFormByName
(
"config"
);
submit
(
form
);
assert
p
.
blockBuildWhenUpstreamBuilding
:
"blockBuildWhenUpstreamBuilding was not updated from configuration form"
;
form
=
create
WebClient
().
getPage
(
p
,
"configure"
).
getFormByName
(
"config"
);
input
=
form
.
getInputByName
(
"blockBuildWhenUpstreamBuilding"
);
assert
True
(
"blockBuildWhenUpstreamBuilding check box is not checked."
,
input
.
isChecked
())
;
assert
input
.
isChecked
():
"blockBuildWhenUpstreamBuilding check box is not checked."
;
}
/**
...
...
@@ -178,9 +177,9 @@ public class AbstractProjectTest extends HudsonTestCase {
final
OneShotEvent
sync
=
new
OneShotEvent
();
final
FreeStyleProject
p
=
createFreeStyleProject
();
FreeStyleBuild
b1
=
buildAndAssertSuccess
(
p
);
def
b1
=
buildAndAssertSuccess
(
p
);
p
.
s
etScm
(
new
NullSCM
()
{
p
.
s
cm
=
new
NullSCM
()
{
@Override
public
boolean
pollChanges
(
AbstractProject
project
,
Launcher
launcher
,
FilePath
workspace
,
TaskListener
listener
)
{
try
{
...
...
@@ -195,11 +194,11 @@ public class AbstractProjectTest extends HudsonTestCase {
* Don't write 'this', so that subtypes can be implemented as anonymous class.
*/
private
Object
writeReplace
()
{
return
new
Object
();
}
@Override
public
boolean
requiresWorkspaceForPolling
()
{
return
true
;
}
}
)
;
};
Thread
t
=
new
Thread
()
{
@Override
public
void
run
()
{
p
.
pollSCMChanges
(
StreamTaskListener
.
fromStdout
());
...
...
@@ -207,7 +206,7 @@ public class AbstractProjectTest extends HudsonTestCase {
};
try
{
t
.
start
();
Future
<
FreeStyleBuild
>
f
=
p
.
scheduleBuild2
(
0
);
def
f
=
p
.
scheduleBuild2
(
0
);
// add a bit of delay to make sure that the blockage is happening
Thread
.
sleep
(
3000
);
...
...
@@ -215,10 +214,10 @@ public class AbstractProjectTest extends HudsonTestCase {
// release the polling
sync
.
signal
();
FreeStyleBuild
b2
=
assertBuildStatusSuccess
(
f
);
def
b2
=
assertBuildStatusSuccess
(
f
);
// they should have used the same workspace.
assert
Equals
(
b1
.
getWorkspace
(),
b2
.
getWorkspace
())
;
assert
b1
.
workspace
==
b2
.
workspace
;
}
finally
{
t
.
interrupt
();
}
...
...
@@ -230,11 +229,11 @@ public class AbstractProjectTest extends HudsonTestCase {
if
(
Functions
.
isWindows
())
return
;
FreeStyleProject
job
=
createFreeStyleProject
();
job
.
getBuildersList
().
add
(
new
Shell
(
"echo \"Build #
$BUILD_NUMBER\"\n"
));
FreeStyleBuild
build
=
job
.
scheduleBuild2
(
0
,
new
Cause
.
UserCause
()).
get
();
File
lastSuccessful
=
new
File
(
job
.
getRootDir
()
,
"lastSuccessful"
),
lastStable
=
new
File
(
job
.
getRootDir
()
,
"lastStable"
);
def
job
=
createFreeStyleProject
();
job
.
buildersList
.
add
(
new
Shell
(
"echo \"Build #\
$BUILD_NUMBER\"\n"
));
def
build
=
job
.
scheduleBuild2
(
0
,
new
Cause
.
UserCause
()).
get
();
File
lastSuccessful
=
new
File
(
job
.
rootDir
,
"lastSuccessful"
),
lastStable
=
new
File
(
job
.
rootDir
,
"lastStable"
);
// First build creates links
assertSymlinkForBuild
(
lastSuccessful
,
1
);
assertSymlinkForBuild
(
lastStable
,
1
);
...
...
@@ -248,18 +247,17 @@ public class AbstractProjectTest extends HudsonTestCase {
assertSymlinkForBuild
(
lastStable
,
1
);
// Delete all builds should remove links
build
.
delete
();
assert
False
(
"lastSuccessful link should be removed"
,
lastSuccessful
.
exists
())
;
assert
False
(
"lastStable link should be removed"
,
lastStable
.
exists
())
;
assert
!
lastSuccessful
.
exists
():
"lastSuccessful link should be removed"
;
assert
!
lastStable
.
exists
():
"lastStable link should be removed"
;
}
private
static
void
assertSymlinkForBuild
(
File
file
,
int
buildNumber
)
throws
IOException
,
InterruptedException
{
assert
True
(
"should exist and point to something that exists"
,
file
.
exists
())
;
assert
True
(
"should be symlink"
,
Util
.
isSymlink
(
file
))
;
assert
file
.
exists
():
"should exist and point to something that exists"
;
assert
Util
.
isSymlink
(
file
):
"should be symlink"
;
String
s
=
FileUtils
.
readFileToString
(
new
File
(
file
,
"log"
));
assertTrue
(
"link should point to build #"
+
buildNumber
+
", but link was: "
+
Util
.
resolveSymlink
(
file
,
TaskListener
.
NULL
)
+
"\nand log was:\n"
+
s
,
s
.
contains
(
"Build #"
+
buildNumber
+
"\n"
));
assert
s
.
contains
(
"Build #"
+
buildNumber
+
"\n"
)
:
"link should point to build #$buildNumber, but link was: ${Util.resolveSymlink(file, TaskListener.NULL)}\nand log was:\n$s"
;
}
@Bug
(
2543
)
...
...
@@ -269,19 +267,19 @@ public class AbstractProjectTest extends HudsonTestCase {
return
;
// Links should be updated after post-build actions when final build result is known
FreeStyleProject
job
=
createFreeStyleProject
();
job
.
getBuildersList
().
add
(
new
Shell
(
"echo \"Build #
$BUILD_NUMBER\"\n"
));
FreeStyleBuild
build
=
job
.
scheduleBuild2
(
0
,
new
Cause
.
UserCause
()).
get
();
assert
Equals
(
Result
.
SUCCESS
,
build
.
getResult
())
;
File
lastSuccessful
=
new
File
(
job
.
getRootDir
()
,
"lastSuccessful"
),
lastStable
=
new
File
(
job
.
getRootDir
()
,
"lastStable"
);
def
job
=
createFreeStyleProject
();
job
.
buildersList
.
add
(
new
Shell
(
"echo \"Build #\
$BUILD_NUMBER\"\n"
));
def
build
=
job
.
scheduleBuild2
(
0
,
new
Cause
.
UserCause
()).
get
();
assert
Result
.
SUCCESS
==
build
.
result
;
File
lastSuccessful
=
new
File
(
job
.
rootDir
,
"lastSuccessful"
),
lastStable
=
new
File
(
job
.
rootDir
,
"lastStable"
);
// First build creates links
assertSymlinkForBuild
(
lastSuccessful
,
1
);
assertSymlinkForBuild
(
lastStable
,
1
);
// Archive artifacts that don't exist to create failure in post-build action
job
.
getPublishersList
()
.
add
(
new
ArtifactArchiver
(
"*.foo"
,
""
,
false
,
false
));
job
.
publishersList
.
add
(
new
ArtifactArchiver
(
"*.foo"
,
""
,
false
,
false
));
build
=
job
.
scheduleBuild2
(
0
,
new
Cause
.
UserCause
()).
get
();
assert
Equals
(
Result
.
FAILURE
,
build
.
getResult
()
);
assert
Result
.
FAILURE
==
build
.
getResult
(
);
// Links should not be updated since build failed
assertSymlinkForBuild
(
lastSuccessful
,
1
);
assertSymlinkForBuild
(
lastStable
,
1
);
...
...
@@ -291,9 +289,9 @@ public class AbstractProjectTest extends HudsonTestCase {
public
void
testGetBuildAfterGC
()
throws
Exception
{
FreeStyleProject
job
=
createFreeStyleProject
();
job
.
scheduleBuild2
(
0
,
new
Cause
.
UserIdCause
()).
get
();
jenkins
.
getQueue
()
.
clearLeftItems
();
jenkins
.
queue
.
clearLeftItems
();
MemoryAssert
.
assertGC
(
new
WeakReference
(
job
.
getLastBuild
()));
assert
True
(
job
.
getLastBuild
()
!=
null
)
;
assert
job
.
lastBuild
!=
null
;
}
@Bug
(
13502
)
...
...
@@ -323,35 +321,35 @@ public class AbstractProjectTest extends HudsonTestCase {
User
user
=
User
.
get
(
"user"
);
SecurityContext
sc
=
ACL
.
impersonate
(
user
.
impersonate
());
try
{
e
.
convertUpstreamBuildTrigger
(
Collections
.<
AbstractProject
>
emptySet
());
e
.
convertUpstreamBuildTrigger
(
Collections
.<
AbstractProject
>
emptySet
());
}
finally
{
SecurityContextHolder
.
setContext
(
sc
);
}
assert
Equals
(
1
,
u
.
getPublishersList
().
size
()
);
assert
1
==
u
.
getPublishersList
().
size
(
);
}
@Bug
(
17137
)
public
void
testExternalBuildDirectorySymlinks
()
throws
Exception
{
// TODO when using JUnit 4 add: Assume.assumeFalse(Functions.isWindows()); // symlinks may not be available
HtmlForm
form
=
new
WebClient
().
goTo
(
"configure"
).
getFormByName
(
"config"
);
File
builds
=
createTmpDir
();
form
.
getInputByName
(
"_.rawBuildsDir"
).
setValueAttribute
(
builds
+
"/${ITEM_FULL_NAME}"
)
;
def
form
=
create
WebClient
().
goTo
(
"configure"
).
getFormByName
(
"config"
);
def
builds
=
createTmpDir
();
form
.
getInputByName
(
"_.rawBuildsDir"
).
valueAttribute
=
builds
.
toString
()
+
"/\${ITEM_FULL_NAME}"
;
submit
(
form
);
assert
Equals
(
builds
+
"/${ITEM_FULL_NAME}"
,
jenkins
.
getRawBuildsDir
()
);
FreeStyleProject
p
=
jenkins
.
createProject
(
MockFolder
.
class
,
"d"
).
createProject
(
FreeStyleProject
.
class
,
"p"
);
FreeStyleBuild
b1
=
p
.
scheduleBuild2
(
0
).
get
();
File
link
=
new
File
(
p
.
getRootDir
()
,
"lastStable"
);
assert
True
(
link
.
exists
()
);
assert
Equals
(
b1
.
getRootDir
().
getAbsolutePath
(),
resolveAll
(
link
).
getAbsolutePath
())
;
FreeStyleBuild
b2
=
p
.
scheduleBuild2
(
0
).
get
();
assert
True
(
link
.
exists
()
);
assert
Equals
(
b2
.
getRootDir
().
getAbsolutePath
(),
resolveAll
(
link
).
getAbsolutePath
())
;
assert
builds
.
toString
()
+
"/\${ITEM_FULL_NAME}"
==
jenkins
.
getRawBuildsDir
(
);
def
p
=
jenkins
.
createProject
(
MockFolder
.
class
,
"d"
).
createProject
(
FreeStyleProject
.
class
,
"p"
);
def
b1
=
p
.
scheduleBuild2
(
0
).
get
();
def
link
=
new
File
(
p
.
rootDir
,
"lastStable"
);
assert
link
.
exists
(
);
assert
b1
.
rootDir
.
absolutePath
==
resolveAll
(
link
).
absolutePath
;
def
b2
=
p
.
scheduleBuild2
(
0
).
get
();
assert
link
.
exists
(
);
assert
b2
.
rootDir
.
absolutePath
==
resolveAll
(
link
).
absolutePath
;
b2
.
delete
();
assert
True
(
link
.
exists
()
);
assert
Equals
(
b1
.
getRootDir
().
getAbsolutePath
(),
resolveAll
(
link
).
getAbsolutePath
())
;
assert
link
.
exists
(
);
assert
b1
.
rootDir
.
absolutePath
==
resolveAll
(
link
).
absolutePath
;
b1
.
delete
();
assert
False
(
link
.
exists
()
);
assert
!
link
.
exists
(
);
}
private
File
resolveAll
(
File
link
)
throws
InterruptedException
,
IOException
{
...
...
@@ -364,45 +362,43 @@ public class AbstractProjectTest extends HudsonTestCase {
@Bug
(
17138
)
public
void
testExternalBuildDirectoryRenameDelete
()
throws
Exception
{
HtmlForm
form
=
new
WebClient
().
goTo
(
"configure"
).
getFormByName
(
"config"
);
File
builds
=
createTmpDir
();
form
.
getInputByName
(
"_.rawBuildsDir"
).
setValueAttribute
(
builds
+
"/
${ITEM_FULL_NAME}"
);
def
form
=
create
WebClient
().
goTo
(
"configure"
).
getFormByName
(
"config"
);
def
builds
=
createTmpDir
();
form
.
getInputByName
(
"_.rawBuildsDir"
).
setValueAttribute
(
builds
.
toString
()
+
"/\
${ITEM_FULL_NAME}"
);
submit
(
form
);
assert
Equals
(
builds
+
"/${ITEM_FULL_NAME}"
,
jenkins
.
getRawBuildsDir
())
;
FreeStyleProject
p
=
jenkins
.
createProject
(
MockFolder
.
class
,
"d"
).
createProject
(
FreeStyleProject
.
class
,
"prj"
);
FreeStyleBuild
b
=
p
.
scheduleBuild2
(
0
).
get
();
File
oldBuildDir
=
new
File
(
builds
,
"d/prj"
);
assert
Equals
(
new
File
(
oldBuildDir
,
b
.
getId
()),
b
.
getRootDir
())
;
assert
True
(
b
.
getRootDir
().
isDirectory
()
);
assert
builds
.
toString
()
+
"/\${ITEM_FULL_NAME}"
==
jenkins
.
rawBuildsDir
;
def
p
=
jenkins
.
createProject
(
MockFolder
.
class
,
"d"
).
createProject
(
FreeStyleProject
.
class
,
"prj"
);
def
b
=
p
.
scheduleBuild2
(
0
).
get
();
def
oldBuildDir
=
new
File
(
builds
,
"d/prj"
);
assert
new
File
(
oldBuildDir
,
b
.
id
)
==
b
.
rootDir
;
assert
b
.
getRootDir
().
isDirectory
(
);
p
.
renameTo
(
"proj"
);
File
newBuildDir
=
new
File
(
builds
,
"d/proj"
);
assert
Equals
(
new
File
(
newBuildDir
,
b
.
getId
()),
b
.
getRootDir
())
;
assert
True
(
b
.
getRootDir
().
isDirectory
()
);
def
newBuildDir
=
new
File
(
builds
,
"d/proj"
);
assert
new
File
(
newBuildDir
,
b
.
id
)
==
b
.
rootDir
;
assert
b
.
rootDir
.
isDirectory
(
);
p
.
delete
();
assert
False
(
b
.
getRootDir
().
isDirectory
()
);
assert
!
b
.
rootDir
.
isDirectory
(
);
}
@Bug
(
17575
)
public
void
testDeleteRedirect
()
throws
Exception
{
createFreeStyleProject
(
"j1"
);
assert
Equals
(
""
,
deleteRedirectTarget
(
"job/j1"
)
);
assert
""
==
deleteRedirectTarget
(
"job/j1"
);
createFreeStyleProject
(
"j2"
);
Jenkins
.
getInstance
().
addView
(
new
AllView
(
"v1"
));
assert
Equals
(
"view/v1/"
,
deleteRedirectTarget
(
"view/v1/job/j2"
)
);
assert
"view/v1/"
==
deleteRedirectTarget
(
"view/v1/job/j2"
);
MockFolder
d
=
Jenkins
.
getInstance
().
createProject
(
MockFolder
.
class
,
"d"
);
d
.
addView
(
new
AllView
(
"v2"
));
d
.
createProject
(
FreeStyleProject
.
class
,
"j3"
);
d
.
createProject
(
FreeStyleProject
.
class
,
"j4"
);
d
.
createProject
(
FreeStyleProject
.
class
,
"j5"
);
assertEquals
(
"job/d/"
,
deleteRedirectTarget
(
"job/d/job/j3"
));
assertEquals
(
"job/d/view/v2/"
,
deleteRedirectTarget
(
"job/d/view/v2/job/j4"
));
assertEquals
(
"view/v1/job/d/"
,
deleteRedirectTarget
(
"view/v1/job/d/job/j5"
));
[
"j3"
,
"j4"
,
"j5"
].
each
{
n
->
d
.
createProject
(
FreeStyleProject
.
class
,
n
)
}
assert
"job/d/"
==
deleteRedirectTarget
(
"job/d/job/j3"
);
assert
"job/d/view/v2/"
==
deleteRedirectTarget
(
"job/d/view/v2/job/j4"
);
assert
"view/v1/job/d/"
==
deleteRedirectTarget
(
"view/v1/job/d/job/j5"
);
}
private
String
deleteRedirectTarget
(
String
job
)
throws
Exception
{
WebClient
wc
=
new
WebClient
();
WebClient
wc
=
create
WebClient
();
String
base
=
wc
.
getContextPath
();
String
loc
=
wc
.
getPage
(
wc
.
addCrumb
(
new
WebRequestSettings
(
new
URL
(
base
+
job
+
"/doDelete"
),
HttpMethod
.
POST
))).
getWebResponse
().
getUrl
().
toString
();
assert
True
(
loc
,
loc
.
startsWith
(
base
))
;
assert
loc
.
startsWith
(
base
):
loc
;
return
loc
.
substring
(
base
.
length
());
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录