Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
roginluo
Jenkins
提交
0512d517
J
Jenkins
项目概览
roginluo
/
Jenkins
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
Jenkins
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0512d517
编写于
8月 06, 2011
作者:
C
Christoph Kutzinski
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
SurefireArchiver was supposed to be thread-safe, but, as the unit tests has shown, it wasn't.
上级
54d568d2
变更
13
展开全部
隐藏空白更改
内联
并排
Showing
13 changed file
with
17189 addition
and
49 deletion
+17189
-49
maven-plugin/src/main/java/hudson/maven/reporters/SurefireArchiver.java
...rc/main/java/hudson/maven/reporters/SurefireArchiver.java
+39
-49
maven-plugin/src/test/java/hudson/maven/reporters/SurefireArchiverUnitTest.java
...java/hudson/maven/reporters/SurefireArchiverUnitTest.java
+343
-0
maven-plugin/src/test/resources/surefire-archiver-test1/testng-failed.xml
.../test/resources/surefire-archiver-test1/testng-failed.xml
+1
-0
maven-plugin/src/test/resources/surefire-archiver-test1/testng-results.xml
...test/resources/surefire-archiver-test1/testng-results.xml
+1
-0
maven-plugin/src/test/resources/surefire-archiver-test2/junit-report-1233.xml
...t/resources/surefire-archiver-test2/junit-report-1233.xml
+36
-0
maven-plugin/src/test/resources/surefire-archiver-test2/junit-report-1472.xml
...t/resources/surefire-archiver-test2/junit-report-1472.xml
+16466
-0
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-1463.xml
...t/resources/surefire-archiver-test3/junit-report-1463.xml
+90
-0
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-2874.xml
...t/resources/surefire-archiver-test3/junit-report-2874.xml
+30
-0
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-6700.xml
...t/resources/surefire-archiver-test3/junit-report-6700.xml
+20
-0
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-errror-details.xml
...s/surefire-archiver-test3/junit-report-errror-details.xml
+33
-0
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-nested-testsuites.xml
...urefire-archiver-test3/junit-report-nested-testsuites.xml
+16
-0
maven-plugin/src/test/resources/surefire-archiver-test3/junitResult.xml
...rc/test/resources/surefire-archiver-test3/junitResult.xml
+113
-0
war/.gitignore
war/.gitignore
+1
-0
未找到文件。
maven-plugin/src/main/java/hudson/maven/reporters/SurefireArchiver.java
浏览文件 @
0512d517
...
...
@@ -47,11 +47,8 @@ import java.util.Collection;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.ListIterator
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.locks.Lock
;
import
java.util.concurrent.locks.ReadWriteLock
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
import
java.util.concurrent.ConcurrentMap
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.maven.artifact.versioning.ComparableVersion
;
...
...
@@ -75,11 +72,7 @@ public class SurefireArchiver extends MavenReporter {
* Note: Because this class can be run with different mojo goals with different path settings,
* we track multiple {@link FileSet}s for each encountered <tt>reportsDir</tt>
*/
private
transient
Map
<
File
,
FileSet
>
fileSets
=
new
ConcurrentHashMap
<
File
,
FileSet
>();
// Collections.synchronizedMap(new HashMap<File, FileSet>());
private
final
ReadWriteLock
fileSetsReadWriteLock
=
new
ReentrantReadWriteLock
();
private
final
Lock
fileSetsReadLock
=
fileSetsReadWriteLock
.
readLock
();
private
Lock
fileSetsWriteLock
=
fileSetsReadWriteLock
.
writeLock
();
private
transient
ConcurrentMap
<
File
,
FileSet
>
fileSets
=
new
ConcurrentHashMap
<
File
,
FileSet
>();
public
boolean
preExecute
(
MavenBuildProxy
build
,
MavenProject
pom
,
MojoInfo
mojo
,
BuildListener
listener
)
throws
InterruptedException
,
IOException
{
if
(
isSurefireTest
(
mojo
))
{
...
...
@@ -132,7 +125,11 @@ public class SurefireArchiver extends MavenReporter {
// surefire:test just skips itself when the current project is not a java project
FileSet
fileSet
=
getFileSet
(
reportsDir
);
DirectoryScanner
ds
=
fileSet
.
getDirectoryScanner
();
DirectoryScanner
ds
;
synchronized
(
fileSet
)
{
ds
=
fileSet
.
getDirectoryScanner
();
}
if
(
ds
.
getIncludedFilesCount
()==
0
)
// no test in this module
...
...
@@ -144,20 +141,23 @@ public class SurefireArchiver extends MavenReporter {
if
(
result
==
null
)
result
=
new
TestResult
();
result
.
parse
(
System
.
currentTimeMillis
()
-
build
.
getMilliSecsSinceBuildStart
(),
reportsDir
,
reportFiles
);
int
failCount
=
build
.
execute
(
new
BuildCallable
<
Integer
,
IOException
>()
{
public
Integer
call
(
MavenBuild
build
)
throws
IOException
,
InterruptedException
{
SurefireReport
sr
=
build
.
getAction
(
SurefireReport
.
class
);
if
(
sr
==
null
)
build
.
getActions
().
add
(
new
SurefireReport
(
build
,
result
,
listener
));
else
sr
.
setResult
(
result
,
listener
);
if
(
result
.
getFailCount
()>
0
)
build
.
setResult
(
Result
.
UNSTABLE
);
build
.
registerAsProjectAction
(
new
FactoryImpl
());
return
result
.
getFailCount
();
}
});
int
failCount
;
synchronized
(
build
)
{
failCount
=
build
.
execute
(
new
BuildCallable
<
Integer
,
IOException
>()
{
public
Integer
call
(
MavenBuild
build
)
throws
IOException
,
InterruptedException
{
SurefireReport
sr
=
build
.
getAction
(
SurefireReport
.
class
);
if
(
sr
==
null
)
build
.
getActions
().
add
(
new
SurefireReport
(
build
,
result
,
listener
));
else
sr
.
setResult
(
result
,
listener
);
if
(
result
.
getFailCount
()>
0
)
build
.
setResult
(
Result
.
UNSTABLE
);
build
.
registerAsProjectAction
(
new
FactoryImpl
());
return
result
.
getFailCount
();
}
});
}
// if surefire plugin is going to kill maven because of a test failure,
// intercept that (or otherwise build will be marked as failure)
if
(
failCount
>
0
&&
error
instanceof
MojoFailureException
)
{
...
...
@@ -177,31 +177,14 @@ public class SurefireArchiver extends MavenReporter {
* @param baseDir
* @return
*/
private
FileSet
getFileSet
(
File
baseDir
)
{
FileSet
fs
=
null
;
if
(
fileSets
==
null
)
{
fileSetsWriteLock
.
lock
();
try
{
fileSets
=
new
ConcurrentHashMap
<
File
,
FileSet
>();
}
finally
{
fileSetsWriteLock
.
unlock
();
}
}
fileSetsReadLock
.
lock
();
try
{
fs
=
fileSets
.
get
(
baseDir
);
}
finally
{
fileSetsReadLock
.
unlock
();
}
FileSet
getFileSet
(
File
baseDir
)
{
FileSet
fs
=
fileSets
.
get
(
baseDir
);
if
(
fs
==
null
)
{
fs
=
Util
.
createFileSet
(
baseDir
,
"*.xml"
,
"testng-results.xml,testng-failed.xml"
);
fileSetsWriteLock
.
lock
();
try
{
fileSets
.
put
(
baseDir
,
fs
);
}
finally
{
fileSetsWriteLock
.
unlock
();
}
FileSet
previous
=
fileSets
.
putIfAbsent
(
baseDir
,
fs
);
if
(
previous
!=
null
)
{
return
previous
;
}
}
return
fs
;
...
...
@@ -214,7 +197,7 @@ public class SurefireArchiver extends MavenReporter {
FileSet
fileSet
=
getFileSet
(
baseDir
);
for
(
String
file
:
reportFiles
)
{
fileSet
.
setExcludes
(
file
);
fileSet
.
createExclude
().
setName
(
file
);
}
}
...
...
@@ -313,7 +296,14 @@ public class SurefireArchiver extends MavenReporter {
return
false
;
}
return
new
ComparableVersion
(
mavenVersion
).
compareTo
(
new
ComparableVersion
(
"3.0"
)
)
>=
0
;
}
}
// I'm not sure if SurefireArchiver is actually ever (de-)serialized,
// but just to be sure, set fileSets here
protected
Object
readResolve
()
{
fileSets
=
new
ConcurrentHashMap
<
File
,
FileSet
>();
return
this
;
}
@Extension
public
static
final
class
DescriptorImpl
extends
MavenReporterDescriptor
{
...
...
maven-plugin/src/test/java/hudson/maven/reporters/SurefireArchiverUnitTest.java
0 → 100644
浏览文件 @
0512d517
package
hudson.maven.reporters
;
import
static
org
.
mockito
.
Mockito
.
doReturn
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
spy
;
import
static
org
.
mockito
.
Mockito
.
when
;
import
hudson.FilePath
;
import
hudson.console.ConsoleNote
;
import
hudson.maven.ExecutedMojo
;
import
hudson.maven.MavenBuild
;
import
hudson.maven.MavenBuildInformation
;
import
hudson.maven.MavenBuildProxy
;
import
hudson.maven.MavenProjectActionBuilder
;
import
hudson.maven.MavenReporter
;
import
hudson.maven.MojoInfo
;
import
hudson.model.BuildListener
;
import
hudson.model.Cause
;
import
hudson.model.Result
;
import
hudson.tasks.junit.TestResult
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.PrintStream
;
import
java.io.PrintWriter
;
import
java.net.URISyntaxException
;
import
java.net.URL
;
import
java.util.Calendar
;
import
java.util.List
;
import
org.apache.commons.io.output.NullOutputStream
;
import
org.apache.maven.plugin.MojoExecution
;
import
org.apache.maven.plugin.descriptor.MojoDescriptor
;
import
org.apache.maven.plugin.descriptor.PluginDescriptor
;
import
org.apache.tools.ant.types.FileSet
;
import
org.codehaus.plexus.component.configurator.ComponentConfigurationException
;
import
org.junit.Assert
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.mockito.Matchers
;
public
class
SurefireArchiverUnitTest
{
private
SurefireArchiver
archiver
;
private
MavenBuild
build
;
private
TestBuildProxy
buildProxy
;
private
MojoInfo
mojoInfo
;
@Before
@SuppressWarnings
(
"unchecked"
)
public
void
before
()
throws
ComponentConfigurationException
,
URISyntaxException
{
//suppress(constructor(MavenBuild.class, new Class[0]));
this
.
archiver
=
new
SurefireArchiver
();
this
.
build
=
mock
(
MavenBuild
.
class
);
when
(
build
.
getAction
(
Matchers
.
any
(
Class
.
class
))).
thenCallRealMethod
();
when
(
build
.
getActions
()).
thenCallRealMethod
();
when
(
build
.
getRootDir
()).
thenReturn
(
new
File
(
"target"
));
this
.
buildProxy
=
new
TestBuildProxy
(
build
);
MojoInfo
spy
=
createMojoInfo
();
this
.
mojoInfo
=
spy
;
}
private
MojoInfo
createMojoInfo
()
throws
ComponentConfigurationException
{
PluginDescriptor
pluginDescriptor
=
new
PluginDescriptor
();
pluginDescriptor
.
setGroupId
(
"org.apache.maven.plugins"
);
pluginDescriptor
.
setArtifactId
(
"maven-surefire-plugin"
);
pluginDescriptor
.
setVersion
(
"2.9"
);
MojoDescriptor
mojoDescriptor
=
new
MojoDescriptor
();
mojoDescriptor
.
setPluginDescriptor
(
pluginDescriptor
);
mojoDescriptor
.
setGoal
(
"test"
);
MojoExecution
mojoExecution
=
new
MojoExecution
(
mojoDescriptor
);
MojoInfo
info
=
new
MojoInfo
(
mojoExecution
,
null
,
null
,
null
);
MojoInfo
spy
=
spy
(
info
);
doReturn
(
Boolean
.
FALSE
).
when
(
spy
).
getConfigurationValue
(
Matchers
.
anyString
(),
Matchers
.
eq
(
Boolean
.
class
));
return
spy
;
}
@Test
public
void
testNotArchivingEmptyResults
()
throws
InterruptedException
,
IOException
,
URISyntaxException
,
ComponentConfigurationException
{
URL
resource
=
SurefireArchiverUnitTest
.
class
.
getResource
(
"/surefire-archiver-test1"
);
File
reportsDir
=
new
File
(
resource
.
toURI
().
getPath
());
doReturn
(
reportsDir
).
when
(
this
.
mojoInfo
).
getConfigurationValue
(
"reportsDirectory"
,
File
.
class
);
System
.
out
.
println
(
"Using reports directory: "
+
reportsDir
.
getAbsolutePath
());
this
.
archiver
.
postExecute
(
buildProxy
,
null
,
this
.
mojoInfo
,
new
NullBuildListener
(),
null
);
SurefireReport
action
=
this
.
build
.
getAction
(
SurefireReport
.
class
);
Assert
.
assertNull
(
action
);
}
@Test
public
void
testArchiveResults
()
throws
InterruptedException
,
IOException
,
URISyntaxException
,
ComponentConfigurationException
{
URL
resource
=
SurefireArchiverUnitTest
.
class
.
getResource
(
"/surefire-archiver-test2"
);
File
reportsDir
=
new
File
(
resource
.
toURI
().
getPath
());
doReturn
(
reportsDir
).
when
(
this
.
mojoInfo
).
getConfigurationValue
(
"reportsDirectory"
,
File
.
class
);
System
.
out
.
println
(
"Using reports directory: "
+
reportsDir
.
getAbsolutePath
());
touchReportFiles
(
reportsDir
);
this
.
archiver
.
postExecute
(
buildProxy
,
null
,
this
.
mojoInfo
,
new
NullBuildListener
(),
null
);
SurefireReport
action
=
this
.
build
.
getAction
(
SurefireReport
.
class
);
Assert
.
assertNotNull
(
action
);
TestResult
result
=
action
.
getResult
();
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
2658
,
result
.
getTotalCount
());
resource
=
SurefireArchiverUnitTest
.
class
.
getResource
(
"/surefire-archiver-test3"
);
reportsDir
=
new
File
(
resource
.
toURI
().
getPath
());
doReturn
(
reportsDir
).
when
(
this
.
mojoInfo
).
getConfigurationValue
(
"reportsDirectory"
,
File
.
class
);
System
.
out
.
println
(
"Using reports directory: "
+
reportsDir
.
getAbsolutePath
());
touchReportFiles
(
reportsDir
);
this
.
archiver
.
postExecute
(
buildProxy
,
null
,
this
.
mojoInfo
,
new
NullBuildListener
(),
null
);
action
=
this
.
build
.
getAction
(
SurefireReport
.
class
);
Assert
.
assertNotNull
(
action
);
result
=
action
.
getResult
();
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
2670
,
result
.
getTotalCount
());
}
@Test
public
void
testAlreadyCheckedFilesAreNotParsedAgain
()
throws
InterruptedException
,
IOException
,
URISyntaxException
,
ComponentConfigurationException
{
URL
resource
=
SurefireArchiverUnitTest
.
class
.
getResource
(
"/surefire-archiver-test2"
);
File
reportsDir
=
new
File
(
resource
.
toURI
().
getPath
());
doReturn
(
reportsDir
).
when
(
this
.
mojoInfo
).
getConfigurationValue
(
"reportsDirectory"
,
File
.
class
);
System
.
out
.
println
(
"Using reports directory: "
+
reportsDir
.
getAbsolutePath
());
touchReportFiles
(
reportsDir
);
FileSet
fileSet
=
this
.
archiver
.
getFileSet
(
reportsDir
);
Assert
.
assertEquals
(
2
,
fileSet
.
getDirectoryScanner
().
getIncludedFilesCount
());
this
.
archiver
.
postExecute
(
buildProxy
,
null
,
this
.
mojoInfo
,
new
NullBuildListener
(),
null
);
fileSet
=
this
.
archiver
.
getFileSet
(
reportsDir
);
Assert
.
assertEquals
(
0
,
fileSet
.
getDirectoryScanner
().
getIncludedFilesCount
());
}
@Test
public
void
testMultiThreaded
()
throws
InterruptedException
,
IOException
,
URISyntaxException
,
ComponentConfigurationException
{
File
reportsDir2
=
new
File
(
SurefireArchiverUnitTest
.
class
.
getResource
(
"/surefire-archiver-test2"
).
toURI
().
getPath
());
doReturn
(
reportsDir2
).
when
(
this
.
mojoInfo
).
getConfigurationValue
(
"reportsDirectory"
,
File
.
class
);
touchReportFiles
(
reportsDir2
);
final
MojoInfo
mojoInfo2
=
createMojoInfo
();
doReturn
(
reportsDir2
).
when
(
mojoInfo2
).
getConfigurationValue
(
"reportsDirectory"
,
File
.
class
);
int
count
=
20
;
ArchiverThread
t1
=
new
ArchiverThread
(
this
.
mojoInfo
,
count
);
ArchiverThread
t2
=
new
ArchiverThread
(
mojoInfo2
,
count
);
t1
.
start
();
t2
.
start
();
t1
.
join
();
t2
.
join
();
if
(
t1
.
exception
!=
null
)
{
t1
.
exception
.
printStackTrace
(
System
.
out
);
Assert
.
fail
(
t1
.
exception
.
toString
());
}
if
(
t2
.
exception
!=
null
)
{
t2
.
exception
.
printStackTrace
(
System
.
out
);
Assert
.
fail
(
t2
.
exception
.
toString
());
}
SurefireReport
action
=
this
.
build
.
getAction
(
SurefireReport
.
class
);
Assert
.
assertNotNull
(
action
);
TestResult
result
=
action
.
getResult
();
Assert
.
assertNotNull
(
result
);
Assert
.
assertEquals
(
2658
,
result
.
getTotalCount
());
}
private
class
ArchiverThread
extends
Thread
{
private
MojoInfo
info
;
private
Throwable
exception
;
private
int
count
;
public
ArchiverThread
(
MojoInfo
info
,
int
count
)
{
this
.
info
=
info
;
this
.
count
=
count
;
}
public
void
run
()
{
try
{
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
archiver
.
postExecute
(
buildProxy
,
null
,
this
.
info
,
new
NullBuildListener
(),
null
);
}
}
catch
(
Throwable
e
)
{
this
.
exception
=
e
;
}
}
}
private
void
touchReportFiles
(
File
reportsDir
)
{
File
[]
files
=
reportsDir
.
listFiles
();
for
(
File
f
:
files
)
{
f
.
setLastModified
(
System
.
currentTimeMillis
());
}
}
private
static
class
TestBuildProxy
implements
MavenBuildProxy
{
private
final
MavenBuild
build
;
public
TestBuildProxy
(
MavenBuild
build
)
{
this
.
build
=
build
;
}
@Override
public
<
V
,
T
extends
Throwable
>
V
execute
(
BuildCallable
<
V
,
T
>
program
)
throws
T
,
IOException
,
InterruptedException
{
return
program
.
call
(
build
);
}
@Override
public
void
executeAsync
(
BuildCallable
<?,
?>
program
)
throws
IOException
{
try
{
program
.
call
(
this
.
build
);
}
catch
(
Throwable
e
)
{
throw
new
IOException
(
e
);
}
}
@Override
public
FilePath
getRootDir
()
{
return
null
;
}
@Override
public
FilePath
getProjectRootDir
()
{
return
null
;
}
@Override
public
FilePath
getModuleSetRootDir
()
{
return
null
;
}
@Override
public
FilePath
getArtifactsDir
()
{
return
null
;
}
@Override
public
void
setResult
(
Result
result
)
{
}
@Override
public
Calendar
getTimestamp
()
{
return
null
;
}
@Override
public
long
getMilliSecsSinceBuildStart
()
{
return
0
;
}
@Override
public
boolean
isArchivingDisabled
()
{
return
false
;
}
@Override
public
void
registerAsProjectAction
(
MavenReporter
reporter
)
{
}
@Override
public
void
registerAsProjectAction
(
MavenProjectActionBuilder
builder
)
{
}
@Override
public
void
registerAsAggregatedProjectAction
(
MavenReporter
reporter
)
{
}
@Override
public
void
setExecutedMojos
(
List
<
ExecutedMojo
>
executedMojos
)
{
}
@Override
public
MavenBuildInformation
getMavenBuildInformation
()
{
return
null
;
}
}
private
static
class
NullBuildListener
implements
BuildListener
{
private
static
final
long
serialVersionUID
=
1L
;
@Override
public
PrintStream
getLogger
()
{
return
new
PrintStream
(
new
NullOutputStream
());
}
@SuppressWarnings
(
"rawtypes"
)
@Override
public
void
annotate
(
ConsoleNote
ann
)
throws
IOException
{
}
@Override
public
void
hyperlink
(
String
url
,
String
text
)
throws
IOException
{
}
@Override
public
PrintWriter
error
(
String
msg
)
{
return
null
;
}
@Override
public
PrintWriter
error
(
String
format
,
Object
...
args
)
{
return
null
;
}
@Override
public
PrintWriter
fatalError
(
String
msg
)
{
return
null
;
}
@Override
public
PrintWriter
fatalError
(
String
format
,
Object
...
args
)
{
return
null
;
}
@Override
public
void
started
(
List
<
Cause
>
causes
)
{
}
@Override
public
void
finished
(
Result
result
)
{
}
}
}
maven-plugin/src/test/resources/surefire-archiver-test1/testng-failed.xml
0 → 100644
浏览文件 @
0512d517
SurefirArchiver must ignore this file
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test1/testng-results.xml
0 → 100644
浏览文件 @
0512d517
SurefirArchiver must ignore this file
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test2/junit-report-1233.xml
0 → 100644
浏览文件 @
0512d517
<?xml version="1.0" encoding="UTF-8" ?>
<!--
The MIT License
Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Erik Ramfelt
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<testsuites>
<testsuite
errors=
"0"
failures=
"0"
hostname=
"archbuild"
id=
"0"
name=
"StudioAllTests"
package=
"test.infor.clearux.studio.integration"
tests=
"456"
time=
"107.824"
timestamp=
"2008-01-23T10:49:26"
>
<testcase
classname=
"test.foo.bar.DefaultIntegrationTest"
name=
"experimentsWithJavaElements"
time=
"0.0"
/>
<testcase
classname=
"test.foo.bar.BundleResolverIntegrationTest"
name=
"testGetBundle"
time=
"0.0"
/>
<testcase
classname=
"test.foo.bar.BundleResolverIntegrationTest"
name=
"testGetBundleLocation"
time=
"0.656"
/>
<testcase
classname=
"test.foo.bar.ProjectSettingsTest"
name=
"testNatureAddition"
time=
"0.125"
/>
<testcase
classname=
"test.foo.bar.ProjectSettingsTest"
name=
"testNatureRemoval"
time=
"0.11"
/>
</testsuite>
</testsuites>
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test2/junit-report-1472.xml
0 → 100644
浏览文件 @
0512d517
此差异已折叠。
点击以展开。
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-1463.xml
0 → 100644
浏览文件 @
0512d517
<?xml version="1.0" encoding="utf-8"?>
<!--
The MIT License
Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Erik Ramfelt
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<testsuites>
<testsuite
name=
"WLI-FI-Tests-Fake"
tests=
"6"
failures=
"0"
errors=
"0"
time=
"1426"
package=
"IT-Interface-WLI-FI"
id=
"1"
>
<properties>
<property
name=
"java.runtime.name"
value=
"Java(TM) SE Runtime Environment"
/>
<property
name=
"sun.boot.library.path"
value=
"C:\Program Files\Java\jdk1.6.0_02\jre\bin"
/>
<property
name=
"java.vm.version"
value=
"1.6.0_02-b06"
/>
<property
name=
"java.vm.vendor"
value=
"Sun Microsystems Inc."
/>
<property
name=
"java.vendor.url"
value=
"http://java.sun.com/"
/>
<property
name=
"path.separator"
value=
";"
/>
<property
name=
"java.vm.name"
value=
"Java HotSpot(TM) Client VM"
/>
<property
name=
"file.encoding.pkg"
value=
"sun.io"
/>
<property
name=
"sun.java.launcher"
value=
"SUN_STANDARD"
/>
<property
name=
"user.country"
value=
"NO"
/>
<property
name=
"sun.os.patch.level"
value=
"Service Pack 2"
/>
<property
name=
"java.vm.specification.name"
value=
"Java Virtual Machine Specification"
/>
<property
name=
"user.dir"
value=
"C:\CI\hudson\jobs\Interface_WLI-FI-Fake\workspace"
/>
<property
name=
"java.runtime.version"
value=
"1.6.0_02-b06"
/>
<property
name=
"java.awt.graphicsenv"
value=
"sun.awt.Win32GraphicsEnvironment"
/>
<property
name=
"java.endorsed.dirs"
value=
"C:\Program Files\Java\jdk1.6.0_02\jre\lib\endorsed"
/>
<property
name=
"os.arch"
value=
"x86"
/>
<property
name=
"java.io.tmpdir"
value=
"C:\Documents and Settings\e5274\Local Settings\Temp\"
/>
<property
name=
"line.separator"
value=
"
"
/>
<property
name=
"java.vm.specification.vendor"
value=
"Sun Microsystems Inc."
/>
<property
name=
"user.variant"
value=
""
/>
<property
name=
"os.name"
value=
"Windows XP"
/>
<property
name=
"sun.jnu.encoding"
value=
"Cp1252"
/>
<property
name=
"java.library.path"
value=
"C:\Program Files\Java\jdk1.6.0_02\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Java\jdk1.6.0_02\bin;C:\PROGRA~1\COMPUW~1\FILE-A~1\Dme;C:\PROGRA~1\COMPUW~1\FILE-A~1;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\oracle\ora92\jre\1.4.2\bin\client\;C:\oracle\ora92\jre\1.4.2\bin;c:\oracle\ora92\bin;C:\Program Files\Oracle\jre\1.1.8\bin;C:\Program Files\IBM\Personal Communications\;C:\Program Files\IBM\Trace Facility\;C:\Groovy\groovy-1.1-RC1\bin;C:\Program Files\Subversion\bin;C:\Program Files\GnuWin32\bin;C:\Program Files\putty;C:\Program Files\Common Files\Compuware"
/>
<property
name=
"java.specification.name"
value=
"Java Platform API Specification"
/>
<property
name=
"java.class.version"
value=
"50.0"
/>
<property
name=
"sun.management.compiler"
value=
"HotSpot Client Compiler"
/>
<property
name=
"os.version"
value=
"5.1"
/>
<property
name=
"user.home"
value=
"C:\Documents and Settings\e5274"
/>
<property
name=
"user.timezone"
value=
"Europe/Berlin"
/>
<property
name=
"java.awt.printerjob"
value=
"sun.awt.windows.WPrinterJob"
/>
<property
name=
"file.encoding"
value=
"Cp1252"
/>
<property
name=
"java.specification.version"
value=
"1.6"
/>
<property
name=
"java.class.path"
value=
"C:\eviware\soapUI-Pro-1.7.6\bin\soapui-pro-1.7.6.jar;C:\eviware\soapUI-Pro-1.7.6\lib\activation-1.1.jar;C:\eviware\soapUI-Pro-1.7.6\lib\javamail-1.4.jar;C:\eviware\soapUI-Pro-1.7.6\lib\wsdl4j-1.6.2-fixed.jar;C:\eviware\soapUI-Pro-1.7.6\lib\junit-3.8.1.jar;C:\eviware\soapUI-Pro-1.7.6\lib\log4j-1.2.14.jar;C:\eviware\soapUI-Pro-1.7.6\lib\looks-2.1.2.jar;C:\eviware\soapUI-Pro-1.7.6\lib\forms-1.0.7.jar;C:\eviware\soapUI-Pro-1.7.6\lib\jcalendar-1.3.2.jar;C:\eviware\soapUI-Pro-1.7.6\lib\commons-logging-1.1.jar;C:\eviware\soapUI-Pro-1.7.6\lib\not-yet-commons-ssl-0.3.8.jar;C:\eviware\soapUI-Pro-1.7.6\lib\commons-cli-1.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\commons-beanutils-1.7.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\commons-httpclient-3.0.1-soapui.jar;C:\eviware\soapUI-Pro-1.7.6\lib\swingx-SNAPSHOT.jar;C:\eviware\soapUI-Pro-1.7.6\lib\l2fprod-common-fontchooser-0.2-dev.jar;C:\eviware\soapUI-Pro-1.7.6\lib\commons-codec-1.3.jar;C:\eviware\soapUI-Pro-1.7.6\lib\groovy-all-1.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\jetty-6.1.5.jar;C:\eviware\soapUI-Pro-1.7.6\lib\jetty-util-6.1.5.jar;C:\eviware\soapUI-Pro-1.7.6\lib\servlet-api-2.5-6.1.5.jar;C:\eviware\soapUI-Pro-1.7.6\lib\jxl-2.6.5.jar;C:\eviware\soapUI-Pro-1.7.6\lib\idw-1.5.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\ant-1.6.1.jar;C:\eviware\soapUI-Pro-1.7.6\lib\xbean-2.3.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\xbean_xpath-2.3.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\xmlpublic-2.3.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\jsr173_1.0_api-xmlbeans-2.3.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\soapui-xmlbeans-1.7.6.jar;C:\eviware\soapUI-Pro-1.7.6\lib\license4j-1.3.jar;C:\eviware\soapUI-Pro-1.7.6\lib\soapui-1.7.6.jar;C:\eviware\soapUI-Pro-1.7.6\lib\soap-xmlbeans-1.2.jar;C:\eviware\soapUI-Pro-1.7.6\lib\j2ee-xmlbeans-1.4.jar;C:\eviware\soapUI-Pro-1.7.6\lib\ext-xmlbeans-1.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\saxon-8.8.jar;C:\eviware\soapUI-Pro-1.7.6\lib\saxon-dom-8.8.jar;C:\eviware\soapUI-Pro-1.7.6\lib\xmlunit-1.1.jar;C:\eviware\soapUI-Pro-1.7.6\lib\xmlsec-1.2.1.jar;C:\eviware\soapUI-Pro-1.7.6\lib\xalan-2.6.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\dtd-xercesImpl-2.9.1.jar;C:\eviware\soapUI-Pro-1.7.6\lib\wss4j-1.5.0.jar;C:\eviware\soapUI-Pro-1.7.6\lib\bcprov-jdk15-133.jar"
/>
<property
name=
"user.name"
value=
"e5274"
/>
<property
name=
"java.vm.specification.version"
value=
"1.0"
/>
<property
name=
"java.home"
value=
"C:\Program Files\Java\jdk1.6.0_02\jre"
/>
<property
name=
"sun.arch.data.model"
value=
"32"
/>
<property
name=
"user.language"
value=
"no"
/>
<property
name=
"java.specification.vendor"
value=
"Sun Microsystems Inc."
/>
<property
name=
"awt.toolkit"
value=
"sun.awt.windows.WToolkit"
/>
<property
name=
"java.vm.info"
value=
"mixed mode"
/>
<property
name=
"java.version"
value=
"1.6.0_02"
/>
<property
name=
"java.ext.dirs"
value=
"C:\Program Files\Java\jdk1.6.0_02\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext"
/>
<property
name=
"sun.boot.class.path"
value=
"C:\Program Files\Java\jdk1.6.0_02\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_02\jre\lib\rt.jar;C:\Program Files\Java\jdk1.6.0_02\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.6.0_02\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_02\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_02\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_02\jre\classes"
/>
<property
name=
"java.vendor"
value=
"Sun Microsystems Inc."
/>
<property
name=
"file.separator"
value=
"\"
/>
<property
name=
"java.vendor.url.bug"
value=
"http://java.sun.com/cgi-bin/bugreport.cgi"
/>
<property
name=
"sun.io.unicode.encoding"
value=
"UnicodeLittle"
/>
<property
name=
"sun.cpu.endian"
value=
"little"
/>
<property
name=
"sun.desktop"
value=
"windows"
/>
<property
name=
"sun.cpu.isalist"
value=
""
/>
</properties>
<testcase
name=
"IF_importTradeConfirmationToDwh"
time=
"198.0"
/>
<testcase
name=
"IF_getAmartaDisbursements"
time=
"119.0"
/>
<testcase
name=
"IF_importGLReconDataToDwh"
time=
"423.0"
/>
<testcase
name=
"IF_importTradeInstructionsToDwh"
time=
"278.0"
/>
<testcase
name=
"IF_getDeviationTradeInstructions"
time=
"408.0"
/>
<testcase
name=
"IF_getDwhGLData"
time=
"0.0"
/>
</testsuite>
</testsuites>
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-2874.xml
0 → 100644
浏览文件 @
0512d517
<?xml version="1.0" encoding="UTF-8" ?>
<!--
The MIT License
Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Xavier Le Vourch
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<testsuites>
<testsuite
errors=
"0"
failures=
"0"
hostname=
"molene"
id=
"0"
name=
"DummyTest"
package=
""
tests=
"1"
time=
"4.158"
timestamp=
"2009-01-16T22:57:13"
>
<testcase
classname=
"DummyTest"
name=
"testDummyMethod"
time=
"3.521"
/>
</testsuite>
</testsuites>
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-6700.xml
0 → 100644
浏览文件 @
0512d517
<?xml version="1.0" encoding="UTF-8" ?>
<testsuite
errors=
"1"
failures=
"0"
hostname=
"whatever"
name=
"gda.device.detector.XHDetectorTest"
tests=
"1"
time=
"0.0"
timestamp=
"2011-07-22T13:12:19"
>
<properties>
<property
name=
"sun.arch.data.model"
value=
"32"
/>
Etc etc
</properties>
<error
message=
"gda/device/detector/DAServer"
type=
"java.lang.NoClassDefFoundError"
>
java.lang.NoClassDefFoundError: gda/device/detector/DAServer
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
Caused by: java.lang.ClassNotFoundException: gda.device.detector.DAServer
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
</error>
<system-out>
<![CDATA[]]>
</system-out>
<system-err>
<![CDATA[]]>
</system-err>
</testsuite>
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-errror-details.xml
0 → 100644
浏览文件 @
0512d517
<?xml version="1.0" encoding="UTF-8" ?>
<!--
The MIT License
Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<testsuite
errors=
"1"
failures=
"0"
hostname=
"whocares"
name=
"vodafone.nip.services.types.TestStringMapType"
tests=
"2"
time=
"0.016"
timestamp=
"2008-07-03T15:42:30"
>
<testcase
classname=
"some.package.somewhere.WhooHoo"
name=
"testHudsonReporting"
time=
"0.016"
>
<error
message=
"this normally has the string like, expected mullet, but got bream"
type=
"org.junit.ComparisonFailure"
>
at some.package.somewhere.WhooHoo.testHudsonReporting(WhooHoo.java:48)
</error>
</testcase>
<system-out>
<![CDATA[]]>
</system-out>
<system-err>
<![CDATA[]]>
</system-err>
</testsuite>
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test3/junit-report-nested-testsuites.xml
0 → 100644
浏览文件 @
0512d517
<?xml version="1.0" encoding="UTF-8"?>
<testsuites
name=
"Automated Tests"
tests=
"186"
errors=
"0"
failures=
"0"
ignored=
"0"
>
<testsuite
name=
"test.AutomatedTests"
time=
"4.486"
>
<testsuite
name=
"test.fs.FileSystemTest"
time=
"0.014"
>
<testcase
name=
"testPrefix"
classname=
"test.fs.FileSystemTest"
time=
"0.003"
/>
</testsuite>
<testsuite
name=
"test.db.DatabaseTest"
time=
"0.014"
>
<testsuite
errors=
"1"
failures=
"0"
hostname=
"whatever"
name=
"test.3rdlevel"
tests=
"1"
time=
"0.0"
timestamp=
"2011-07-22T13:12:19"
>
<error
message=
"bla bla"
type=
"java.lang.IllegalStateException"
>
java.lang.IllegalStateException: bla bla
at test.Test(Test:35)
</error>
</testsuite>
<testcase
name=
"testTable"
classname=
"test.db.DatabaseTest"
time=
"0.003"
/>
</testsuite>
</testsuite>
</testsuites>
\ No newline at end of file
maven-plugin/src/test/resources/surefire-archiver-test3/junitResult.xml
0 → 100644
浏览文件 @
0512d517
<?xml version='1.0' encoding='UTF-8'?>
<result>
<suites>
<suite>
<file>
./TEST-TestSuite.xml
</file>
<name>
TestSuite
</name>
<duration>
0.128
</duration>
<cases>
<case>
<duration>
0.128
</duration>
<className>
service.EchoServletIT
</className>
<testName>
sayHello
</testName>
<skipped>
true
</skipped>
<failedSince>
0
</failedSince>
</case>
</cases>
</suite>
<suite>
<file>
./failsafe-summary.xml
</file>
<name>
(failsafe-summary.xml)
</name>
<duration>
0.0
</duration>
<cases/>
</suite>
<suite>
<file>
./testng-results.xml
</file>
<name>
(testng-results.xml)
</name>
<duration>
0.0
</duration>
<cases/>
</suite>
<suite>
<file>
./TEST-TestSuite.xml
</file>
<name>
TestSuite
</name>
<duration>
0.293
</duration>
<cases>
<case>
<duration>
0.293
</duration>
<className>
service.EchoServletTest
</className>
<testName>
sayHello
</testName>
<skipped>
false
</skipped>
<failedSince>
0
</failedSince>
</case>
</cases>
</suite>
<suite>
<file>
./testng-results.xml
</file>
<name>
(testng-results.xml)
</name>
<duration>
0.0
</duration>
<cases/>
</suite>
<suite>
<file>
./TEST-TestSuite.xml
</file>
<name>
broken
</name>
<duration>
0.155
</duration>
<cases>
<case>
<duration>
0.0020
</duration>
<className>
breakable.misc.StupidTest
</className>
<testName>
doSomething
</testName>
<skipped>
false
</skipped>
<failedSince>
0
</failedSince>
</case>
<case>
<duration>
0.0
</duration>
<className>
breakable.misc.StupidTest
</className>
<testName>
jumparound
</testName>
<skipped>
false
</skipped>
<failedSince>
0
</failedSince>
</case>
<case>
<duration>
0.0
</duration>
<className>
breakable.misc.UglyTest
</className>
<testName>
jumpAroundYouUglyPerson
</testName>
<skipped>
false
</skipped>
<failedSince>
0
</failedSince>
</case>
<case>
<duration>
0.0
</duration>
<className>
breakable.misc.UglyTest
</className>
<testName>
doSomethingUgly
</testName>
<skipped>
false
</skipped>
<failedSince>
0
</failedSince>
</case>
<case>
<duration>
0.0010
</duration>
<className>
breakable.misc.UglyTest
</className>
<testName>
becomeUglier
</testName>
<skipped>
false
</skipped>
<errorStackTrace>
java.lang.AssertionError: Yeah, ugly and broken.
at org.testng.Assert.fail(Assert.java:84)
at breakable.misc.UglyTest.becomeUglier(UglyTest.java:25)
</errorStackTrace>
<errorDetails>
Yeah, ugly and broken.
</errorDetails>
<failedSince>
5
</failedSince>
</case>
<case>
<duration>
0.15
</duration>
<className>
breakable.service.EchoServletTest
</className>
<testName>
sayHello
</testName>
<skipped>
false
</skipped>
<failedSince>
0
</failedSince>
</case>
<case>
<duration>
0.0020
</duration>
<className>
service.EchoServletTest
</className>
<testName>
sayHello
</testName>
<skipped>
false
</skipped>
<failedSince>
0
</failedSince>
</case>
</cases>
</suite>
</suites>
<duration>
0.576
</duration>
</result>
\ No newline at end of file
war/.gitignore
浏览文件 @
0512d517
work
/rebel.xml
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录