jetty-9 merge with jetty-8 except jetty-osgi
This commit is contained in:
commit
fbcb14f297
|
@ -0,0 +1,145 @@
|
|||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA1
|
||||
|
||||
Jetty Project
|
||||
Contributor License Agreement V1.0
|
||||
based on http://www.apache.org/licenses/
|
||||
|
||||
Thank you for your interest in the Jetty project by Mort Bay
|
||||
Consulting Pty. Ltd. Australia ("MortBay").
|
||||
In order to clarify the intellectual property license
|
||||
granted with Contributions from any person or entity, MortBay
|
||||
must have a Contributor License Agreement ("CLA") that has
|
||||
been signed by each Contributor, indicating agreement to the license
|
||||
terms below. This license is for your protection as a Contributor as
|
||||
well as the protection of MortBay and its users; it does not
|
||||
change your rights to use your own Contributions for any other
|
||||
purpose.
|
||||
|
||||
If you have not already done so, please complete this agreement
|
||||
and commit it to the Jetty repository at
|
||||
svn+ssh://svn.jetty.codehaus.org/home/projects/jetty/scm/jetty
|
||||
at legal/cla-USERNAME.txt using your authenticated codehaus ssh
|
||||
login. If you do not have commit privilege to the repository, please
|
||||
email the file to eclipse@eclipse.com. If possible, digitally sign
|
||||
the committed file, otherwise also send a signed Agreement to MortBay.
|
||||
|
||||
Please read this document carefully before signing and keep a copy for
|
||||
your records.
|
||||
|
||||
Full name: Thomas Becker
|
||||
E-Mail: thomas.becker00@googlemail.com
|
||||
Mailing Address:
|
||||
|
||||
You accept and agree to the following terms and conditions for Your
|
||||
present and future Contributions submitted to MortBay. In return,
|
||||
MortBay shall not use Your Contributions in a way that is contrary
|
||||
to the software license in effect at the time of the Contribution.
|
||||
Except for the license granted herein to MortBay and recipients of
|
||||
software distributed by MortBay, You reserve all right, title, and
|
||||
interest in and to Your Contributions.
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"You" (or "Your") shall mean the copyright owner or legal entity
|
||||
authorized by the copyright owner that is making this Agreement
|
||||
with MortBay. For legal entities, the entity making a
|
||||
Contribution and all other entities that control, are controlled
|
||||
by, or are under common control with that entity are considered to
|
||||
be a single Contributor. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"Contribution" shall mean any original work of authorship,
|
||||
including any modifications or additions to an existing work, that
|
||||
is intentionally submitted by You to MortBay for inclusion
|
||||
in, or documentation of, any of the products owned or managed by
|
||||
MortBay (the "Work"). For the purposes of this definition,
|
||||
"submitted" means any form of electronic, verbal, or written
|
||||
communication sent to MortBay or its representatives,
|
||||
including but not limited to communication on electronic mailing
|
||||
lists, source code control systems, and issue tracking systems that
|
||||
are managed by, or on behalf of, MortBay for the purpose of
|
||||
discussing and improving the Work, but excluding communication that
|
||||
is conspicuously marked or otherwise designated in writing by You
|
||||
as "Not a Contribution."
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this Agreement, You hereby grant to MortBay and to
|
||||
recipients of software distributed by MortBay a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare derivative works of,
|
||||
publicly display, publicly perform, sublicense, and distribute Your
|
||||
Contributions and such derivative works.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this Agreement, You hereby grant to MortBay and to
|
||||
recipients of software distributed by MortBay a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have
|
||||
made, use, offer to sell, sell, import, and otherwise transfer the
|
||||
Work, where such license applies only to those patent claims
|
||||
licensable by You that are necessarily infringed by Your
|
||||
Contribution(s) alone or by combination of Your Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If any
|
||||
entity institutes patent litigation against You or any other entity
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging
|
||||
that your Contribution, or the Work to which you have contributed,
|
||||
constitutes direct or contributory patent infringement, then any
|
||||
patent licenses granted to that entity under this Agreement for
|
||||
that Contribution or Work shall terminate as of the date such
|
||||
litigation is filed.
|
||||
|
||||
4. You represent that you are legally entitled to grant the above
|
||||
license. If your employer(s) has rights to intellectual property
|
||||
that you create that includes your Contributions, you represent
|
||||
that you have received permission to make Contributions on behalf
|
||||
of that employer, that your employer has waived such rights for
|
||||
your Contributions to MortBay, or that your employer has
|
||||
executed a separate Corporate CLA with MortBay.
|
||||
|
||||
5. You represent that each of Your Contributions is Your original
|
||||
creation (see section 7 for submissions on behalf of others). You
|
||||
represent that Your Contribution submissions include complete
|
||||
details of any third-party license or other restriction (including,
|
||||
but not limited to, related patents and trademarks) of which you
|
||||
are personally aware and which are associated with any part of Your
|
||||
Contributions.
|
||||
|
||||
6. You are not expected to provide support for Your Contributions,
|
||||
except to the extent You desire to provide support. You may provide
|
||||
support for free, for a fee, or not at all. Unless required by
|
||||
applicable law or agreed to in writing, You provide Your
|
||||
Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
|
||||
OF ANY KIND, either express or implied, including, without
|
||||
limitation, any warranties or conditions of TITLE, NON-
|
||||
INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
7. Should You wish to submit work that is not Your original creation,
|
||||
You may submit it to MortBay separately from any
|
||||
Contribution, identifying the complete details of its source and of
|
||||
any license or other restriction (including, but not limited to,
|
||||
related patents, trademarks, and license agreements) of which you
|
||||
are personally aware, and conspicuously marking the work as
|
||||
"Submitted on behalf of a third-party: [named here]".
|
||||
|
||||
8. You agree to notify MortBay of any facts or circumstances of
|
||||
which you become aware that would make these representations
|
||||
inaccurate in any respect.
|
||||
|
||||
Date: 2012-07-17
|
||||
Please sign:
|
||||
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
Version: GnuPG v1.4.10 (GNU/Linux)
|
||||
|
||||
iQEcBAEBAgAGBQJQBb4tAAoJEMHhjBmtgF91HDcH/2nQDPuPztWFrBifnEoLF6Jl
|
||||
RUkfJzAPZaLDtDMfiDz7ucdRL1RDodmz4VIF2+fbKeBYQquZXfXIeEghz+tKriK3
|
||||
0M12guFkNLDteQp9h2p3Zu9JU3K0y4m84IDWq72HRmh1nRyD6lzZFhDGZ/D+69fF
|
||||
tgYG0FwEit00MAq/lRbsXHLpBOY+Jyh/Xy+QRnQTcAQ+tAgOlxds3w+JSs2sGdes
|
||||
YLAJQQacLeGh7EzD3F+CKuiwT4c5ub64LdXSlAVj1u2OjZBfqLaJ3FA60Ti+I3kn
|
||||
FNWKpzaeX+SQgMak6hsuatXi6EsVk6sIaskwEgl6+Xk+HYWy23ZQ8BKQRLKOZTw=
|
||||
=gAqN
|
||||
-----END PGP SIGNATURE-----
|
|
@ -1,6 +1,8 @@
|
|||
jetty-8.1.6-SNAPSHOT
|
||||
+ 385925: make SslContextFactory.setProtocols and
|
||||
SslContextFactory.setCipherSuites preserve the order of the given parameters
|
||||
|
||||
jetty-8.1.5.v20120716 - 16 July 2012
|
||||
jetty-7.6.6-SNAPSHOT
|
||||
+ 376717 Balancer Servlet with round robin support, contribution, added
|
||||
missing license
|
||||
+ 379250 Server is added to shutdown hook twice
|
||||
|
|
|
@ -32,10 +32,11 @@ import org.eclipse.jetty.util.log.Log;
|
|||
import org.eclipse.jetty.util.log.Logger;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.Ignore;
|
||||
|
||||
public class ExpirationWithLimitedConnectionsTest
|
||||
{
|
||||
@Test
|
||||
@Ignore
|
||||
public void testExpirationWithMaxConnectionPerAddressReached() throws Exception
|
||||
{
|
||||
final Logger logger = Log.getLogger("org.eclipse.jetty.client");
|
||||
|
|
|
@ -66,6 +66,9 @@ import org.eclipse.jetty.util.log.Logger;
|
|||
* <li><b>exposeHeaders</b>, a comma separated list of HTTP headers that
|
||||
* are allowed to be exposed on the client. Default value is the
|
||||
* <b>empty list</b></li>
|
||||
* <li><b>chainPreflight</b>, if true preflight requests are chained to their
|
||||
* target resource for normal handling (as an OPTION request). Otherwise the
|
||||
* filter will response to the preflight. Default is true.</li>
|
||||
* </ul></p>
|
||||
* <p>A typical configuration could be:
|
||||
* <pre>
|
||||
|
@ -105,7 +108,8 @@ public class CrossOriginFilter implements Filter
|
|||
public static final String PREFLIGHT_MAX_AGE_PARAM = "preflightMaxAge";
|
||||
public static final String ALLOW_CREDENTIALS_PARAM = "allowCredentials";
|
||||
public static final String EXPOSED_HEADERS_PARAM = "exposedHeaders";
|
||||
public static final String FORWARD_PREFLIGHT_PARAM = "forwardPreflight";
|
||||
public static final String OLD_CHAIN_PREFLIGHT_PARAM = "forwardPreflight";
|
||||
public static final String CHAIN_PREFLIGHT_PARAM = "chainPreflight";
|
||||
private static final String ANY_ORIGIN = "*";
|
||||
private static final List<String> SIMPLE_HTTP_METHODS = Arrays.asList("GET", "POST", "HEAD");
|
||||
|
||||
|
@ -116,7 +120,7 @@ public class CrossOriginFilter implements Filter
|
|||
private List<String> exposedHeaders = new ArrayList<String>();
|
||||
private int preflightMaxAge;
|
||||
private boolean allowCredentials;
|
||||
private boolean forwardPreflight;
|
||||
private boolean chainPreflight;
|
||||
|
||||
public void init(FilterConfig config) throws ServletException
|
||||
{
|
||||
|
@ -174,10 +178,14 @@ public class CrossOriginFilter implements Filter
|
|||
exposedHeadersConfig = "";
|
||||
exposedHeaders.addAll(Arrays.asList(exposedHeadersConfig.split(",")));
|
||||
|
||||
String forwardPreflightConfig = config.getInitParameter(FORWARD_PREFLIGHT_PARAM);
|
||||
if (forwardPreflightConfig == null)
|
||||
forwardPreflightConfig = "true";
|
||||
forwardPreflight = Boolean.parseBoolean(forwardPreflightConfig);
|
||||
String chainPreflightConfig = config.getInitParameter(OLD_CHAIN_PREFLIGHT_PARAM);
|
||||
if (chainPreflightConfig!=null) // TODO remove this
|
||||
LOG.warn("DEPRECATED CONFIGURATION: Use "+CHAIN_PREFLIGHT_PARAM+ " instead of "+OLD_CHAIN_PREFLIGHT_PARAM);
|
||||
else
|
||||
chainPreflightConfig = config.getInitParameter(CHAIN_PREFLIGHT_PARAM);
|
||||
if (chainPreflightConfig == null)
|
||||
chainPreflightConfig = "true";
|
||||
chainPreflight = Boolean.parseBoolean(chainPreflightConfig);
|
||||
|
||||
if (LOG.isDebugEnabled())
|
||||
{
|
||||
|
@ -188,7 +196,7 @@ public class CrossOriginFilter implements Filter
|
|||
PREFLIGHT_MAX_AGE_PARAM + " = " + preflightMaxAgeConfig + ", " +
|
||||
ALLOW_CREDENTIALS_PARAM + " = " + allowedCredentialsConfig + "," +
|
||||
EXPOSED_HEADERS_PARAM + " = " + exposedHeadersConfig + "," +
|
||||
FORWARD_PREFLIGHT_PARAM + " = " + forwardPreflightConfig
|
||||
CHAIN_PREFLIGHT_PARAM + " = " + chainPreflightConfig
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -215,7 +223,7 @@ public class CrossOriginFilter implements Filter
|
|||
{
|
||||
LOG.debug("Cross-origin request to {} is a preflight cross-origin request", request.getRequestURI());
|
||||
handlePreflightResponse(request, response, origin);
|
||||
if (forwardPreflight)
|
||||
if (chainPreflight)
|
||||
LOG.debug("Preflight cross-origin request to {} forwarded to application", request.getRequestURI());
|
||||
else
|
||||
return;
|
||||
|
|
|
@ -408,11 +408,11 @@ public class CrossOriginFilterTest
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testForwardPreflightRequest() throws Exception
|
||||
public void testChainPreflightRequest() throws Exception
|
||||
{
|
||||
FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
|
||||
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "PUT");
|
||||
filterHolder.setInitParameter(CrossOriginFilter.FORWARD_PREFLIGHT_PARAM, "false");
|
||||
filterHolder.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, "false");
|
||||
tester.getContext().addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
|
|
|
@ -62,7 +62,7 @@ public class Monitor extends Thread
|
|||
catch(Exception e)
|
||||
{
|
||||
Config.debug(e);
|
||||
System.err.println(e.toString());
|
||||
System.err.println("Error binding monitor port "+port+": "+e.toString());
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
|
|
@ -1216,8 +1216,8 @@ public class SslContextFactory extends AbstractLifeCycle
|
|||
if (_includeProtocols!=null)
|
||||
{
|
||||
// Use only the supported included protocols
|
||||
for (String protocol : supportedProtocols)
|
||||
if (_includeProtocols.contains(protocol))
|
||||
for (String protocol : _includeProtocols)
|
||||
if(Arrays.asList(supportedProtocols).contains(protocol))
|
||||
selected_protocols.add(protocol);
|
||||
}
|
||||
else
|
||||
|
@ -1248,8 +1248,8 @@ public class SslContextFactory extends AbstractLifeCycle
|
|||
if (_includeCipherSuites!=null)
|
||||
{
|
||||
// Use only the supported included ciphers
|
||||
for (String cipherSuite : supportedCipherSuites)
|
||||
if (_includeCipherSuites.contains(cipherSuite))
|
||||
for (String cipherSuite : _includeCipherSuites)
|
||||
if(Arrays.asList(supportedCipherSuites).contains(cipherSuite))
|
||||
selected_ciphers.add(cipherSuite);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -12,10 +12,8 @@ package org.eclipse.jetty.util.ssl;
|
|||
//You may elect to redistribute this code under either of these licenses.
|
||||
//========================================================================
|
||||
|
||||
import static junit.framework.Assert.assertTrue;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.security.KeyStore;
|
||||
|
||||
import org.eclipse.jetty.util.component.AbstractLifeCycle;
|
||||
|
@ -23,16 +21,30 @@ import org.eclipse.jetty.util.log.Log;
|
|||
import org.eclipse.jetty.util.log.StdErrLog;
|
||||
import org.eclipse.jetty.util.resource.Resource;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static junit.framework.Assert.assertTrue;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
|
||||
public class SslContextFactoryTest
|
||||
{
|
||||
|
||||
private SslContextFactory cf;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception
|
||||
{
|
||||
cf = new SslContextFactory();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoTsFileKs() throws Exception
|
||||
{
|
||||
String keystorePath = System.getProperty("basedir",".") + "/src/test/resources/keystore";
|
||||
SslContextFactory cf = new SslContextFactory(keystorePath);
|
||||
cf.setKeyStorePassword("storepwd");
|
||||
cf.setKeyManagerPassword("keypwd");
|
||||
|
||||
|
@ -44,11 +56,9 @@ public class SslContextFactoryTest
|
|||
@Test
|
||||
public void testNoTsStreamKs() throws Exception
|
||||
{
|
||||
String keystorePath = System.getProperty("basedir",".") + "/src/test/resources/keystore";
|
||||
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
|
||||
cf.setKeyStoreInputStream(new FileInputStream(keystorePath));
|
||||
InputStream keystoreInputStream = this.getClass().getResourceAsStream("keystore");
|
||||
|
||||
cf.setKeyStoreInputStream(keystoreInputStream);
|
||||
cf.setKeyStorePassword("storepwd");
|
||||
cf.setKeyManagerPassword("keypwd");
|
||||
|
||||
|
@ -60,12 +70,11 @@ public class SslContextFactoryTest
|
|||
@Test
|
||||
public void testNoTsSetKs() throws Exception
|
||||
{
|
||||
String keystorePath = System.getProperty("basedir",".") + "/src/test/resources/keystore";
|
||||
|
||||
InputStream keystoreInputStream = this.getClass().getResourceAsStream("keystore");
|
||||
|
||||
KeyStore ks = KeyStore.getInstance("JKS");
|
||||
ks.load(new FileInputStream(keystorePath),"storepwd".toCharArray());
|
||||
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
ks.load(keystoreInputStream, "storepwd".toCharArray());
|
||||
|
||||
cf.setKeyStore(ks);
|
||||
cf.setKeyManagerPassword("keypwd");
|
||||
|
||||
|
@ -77,7 +86,6 @@ public class SslContextFactoryTest
|
|||
@Test
|
||||
public void testNoTsNoKs() throws Exception
|
||||
{
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
cf.start();
|
||||
assertTrue(cf.getSslContext()!=null);
|
||||
}
|
||||
|
@ -85,7 +93,6 @@ public class SslContextFactoryTest
|
|||
@Test
|
||||
public void testTrustAll() throws Exception
|
||||
{
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
cf.start();
|
||||
assertTrue(cf.getSslContext()!=null);
|
||||
}
|
||||
|
@ -95,7 +102,6 @@ public class SslContextFactoryTest
|
|||
{
|
||||
Resource keystoreResource = Resource.newSystemResource("keystore");
|
||||
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
cf.setKeyStoreResource(keystoreResource);
|
||||
cf.setKeyStorePassword("storepwd");
|
||||
cf.setKeyManagerPassword("keypwd");
|
||||
|
@ -103,7 +109,6 @@ public class SslContextFactoryTest
|
|||
cf.start();
|
||||
|
||||
assertTrue(cf.getSslContext()!=null);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -112,7 +117,6 @@ public class SslContextFactoryTest
|
|||
Resource keystoreResource = Resource.newSystemResource("keystore");
|
||||
Resource truststoreResource = Resource.newSystemResource("keystore");
|
||||
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
cf.setKeyStoreResource(keystoreResource);
|
||||
cf.setTrustStoreResource(truststoreResource);
|
||||
cf.setKeyStorePassword("storepwd");
|
||||
|
@ -131,7 +135,6 @@ public class SslContextFactoryTest
|
|||
Resource keystoreResource = Resource.newSystemResource("keystore");
|
||||
Resource truststoreResource = Resource.newSystemResource("keystore");
|
||||
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
cf.setKeyStoreResource(keystoreResource);
|
||||
cf.setTrustStoreResource(truststoreResource);
|
||||
cf.setKeyStorePassword("storepwd");
|
||||
|
@ -156,7 +159,6 @@ public class SslContextFactoryTest
|
|||
Resource keystoreResource = Resource.newSystemResource("keystore");
|
||||
Resource truststoreResource = Resource.newSystemResource("keystore");
|
||||
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
cf.setKeyStoreResource(keystoreResource);
|
||||
cf.setTrustStoreResource(truststoreResource);
|
||||
cf.setKeyStorePassword("storepwd");
|
||||
|
@ -177,7 +179,6 @@ public class SslContextFactoryTest
|
|||
@Test
|
||||
public void testNoKeyConfig() throws Exception
|
||||
{
|
||||
SslContextFactory cf = new SslContextFactory();
|
||||
try
|
||||
{
|
||||
SslContextFactory.LOG.info("EXPECT SslContextFactory@????????(null,/foo): java.lang.IllegalStateException: SSL doesn't have a valid keystore...");
|
||||
|
@ -195,4 +196,36 @@ public class SslContextFactoryTest
|
|||
Assert.fail("Unexpected exception");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetIncludeCipherSuitesPreservesOrder()
|
||||
{
|
||||
String[] supportedCipherSuites = new String[]{"cipher4", "cipher2", "cipher1", "cipher3"};
|
||||
String[] includeCipherSuites = {"cipher1", "cipher3", "cipher4"};
|
||||
|
||||
cf.setIncludeCipherSuites(includeCipherSuites);
|
||||
String[] selectedCipherSuites = cf.selectCipherSuites(null, supportedCipherSuites);
|
||||
|
||||
assertSelectedMatchesIncluded(includeCipherSuites, selectedCipherSuites);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetIncludeProtocolsPreservesOrder()
|
||||
{
|
||||
String[] supportedProtocol = new String[]{"cipher4", "cipher2", "cipher1", "cipher3"};
|
||||
String[] includeProtocol = {"cipher1", "cipher3", "cipher4"};
|
||||
|
||||
cf.setIncludeProtocols(includeProtocol);
|
||||
String[] selectedProtocol = cf.selectProtocols(null, supportedProtocol);
|
||||
|
||||
assertSelectedMatchesIncluded(includeProtocol, selectedProtocol);
|
||||
}
|
||||
|
||||
private void assertSelectedMatchesIncluded(String[] includeStrings, String[] selectedStrings)
|
||||
{
|
||||
assertThat(includeStrings.length + " strings are selected", selectedStrings.length, is(includeStrings.length));
|
||||
assertThat("order from includeStrings is preserved", selectedStrings[0], equalTo(includeStrings[0]));
|
||||
assertThat("order from includeStrings is preserved", selectedStrings[1], equalTo(includeStrings[1]));
|
||||
assertThat("order from includeStrings is preserved", selectedStrings[2], equalTo(includeStrings[2]));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue