Modified: hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetworkTopologyWithNodeGroup.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetworkTopologyWithNodeGroup.java?rev=1602947&r1=1602946&r2=1602947&view=diff ============================================================================== --- hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetworkTopologyWithNodeGroup.java (original) +++ hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetworkTopologyWithNodeGroup.java Mon Jun 16 18:13:57 2014 @@ -96,7 +96,7 @@ public class TestNetworkTopologyWithNode } @Test - public void testPseudoSortByDistance() throws Exception { + public void testSortByDistance() throws Exception { NodeBase[] testNodes = new NodeBase[4]; // array contains both local node, local node group & local rack node @@ -104,7 +104,8 @@ public class TestNetworkTopologyWithNode testNodes[1] = dataNodes[2]; testNodes[2] = dataNodes[3]; testNodes[3] = dataNodes[0]; - cluster.pseudoSortByDistance(dataNodes[0], testNodes ); + cluster.sortByDistance(dataNodes[0], testNodes, + testNodes.length, 0xDEADBEEF); assertTrue(testNodes[0] == dataNodes[0]); assertTrue(testNodes[1] == dataNodes[1]); assertTrue(testNodes[2] == dataNodes[2]); @@ -115,7 +116,8 @@ public class TestNetworkTopologyWithNode testNodes[1] = dataNodes[4]; testNodes[2] = dataNodes[1]; testNodes[3] = dataNodes[0]; - cluster.pseudoSortByDistance(dataNodes[0], testNodes ); + cluster.sortByDistance(dataNodes[0], testNodes, + testNodes.length, 0xDEADBEEF); assertTrue(testNodes[0] == dataNodes[0]); assertTrue(testNodes[1] == dataNodes[1]); @@ -124,7 +126,8 @@ public class TestNetworkTopologyWithNode testNodes[1] = dataNodes[3]; testNodes[2] = dataNodes[2]; testNodes[3] = dataNodes[0]; - cluster.pseudoSortByDistance(dataNodes[0], testNodes ); + cluster.sortByDistance(dataNodes[0], testNodes, + testNodes.length, 0xDEADBEEF); assertTrue(testNodes[0] == dataNodes[0]); assertTrue(testNodes[1] == dataNodes[2]); @@ -133,7 +136,8 @@ public class TestNetworkTopologyWithNode testNodes[1] = dataNodes[7]; testNodes[2] = dataNodes[2]; testNodes[3] = dataNodes[0]; - cluster.pseudoSortByDistance(computeNode, testNodes ); + cluster.sortByDistance(computeNode, testNodes, + testNodes.length, 0xDEADBEEF); assertTrue(testNodes[0] == dataNodes[0]); assertTrue(testNodes[1] == dataNodes[2]); }
Modified: hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/KeyStoreTestUtil.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/KeyStoreTestUtil.java?rev=1602947&r1=1602946&r2=1602947&view=diff ============================================================================== --- hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/KeyStoreTestUtil.java (original) +++ hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/KeyStoreTestUtil.java Mon Jun 16 18:13:57 2014 @@ -76,8 +76,8 @@ public class KeyStoreTestUtil { * @throws GeneralSecurityException thrown if an Security error ocurred. */ public static X509Certificate generateCertificate(String dn, KeyPair pair, - int days, String algorithm) - throws GeneralSecurityException, IOException { + int days, String algorithm) + throws GeneralSecurityException, IOException { PrivateKey privkey = pair.getPrivate(); X509CertInfo info = new X509CertInfo(); Date from = new Date(); @@ -92,7 +92,7 @@ public class KeyStoreTestUtil { info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner)); info.set(X509CertInfo.KEY, new CertificateX509Key(pair.getPublic())); info - .set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3)); + .set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3)); AlgorithmId algo = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid); info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo)); @@ -103,30 +103,30 @@ public class KeyStoreTestUtil { // Update the algorith, and resign. algo = (AlgorithmId) cert.get(X509CertImpl.SIG_ALG); info - .set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, - algo); + .set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, + algo); cert = new X509CertImpl(info); cert.sign(privkey, algorithm); return cert; } public static KeyPair generateKeyPair(String algorithm) - throws NoSuchAlgorithmException { + throws NoSuchAlgorithmException { KeyPairGenerator keyGen = KeyPairGenerator.getInstance(algorithm); keyGen.initialize(1024); return keyGen.genKeyPair(); } private static KeyStore createEmptyKeyStore() - throws GeneralSecurityException, IOException { + throws GeneralSecurityException, IOException { KeyStore ks = KeyStore.getInstance("JKS"); ks.load(null, null); // initialize return ks; } private static void saveKeyStore(KeyStore ks, String filename, - String password) - throws GeneralSecurityException, IOException { + String password) + throws GeneralSecurityException, IOException { FileOutputStream out = new FileOutputStream(filename); try { ks.store(out, password.toCharArray()); @@ -136,18 +136,18 @@ public class KeyStoreTestUtil { } public static void createKeyStore(String filename, - String password, String alias, - Key privateKey, Certificate cert) - throws GeneralSecurityException, IOException { + String password, String alias, + Key privateKey, Certificate cert) + throws GeneralSecurityException, IOException { KeyStore ks = createEmptyKeyStore(); ks.setKeyEntry(alias, privateKey, password.toCharArray(), - new Certificate[]{cert}); + new Certificate[]{cert}); saveKeyStore(ks, filename, password); } /** * Creates a keystore with a single key and saves it to a file. - * + * * @param filename String file to save * @param password String store password to set on keystore * @param keyPassword String key password to set on key @@ -158,27 +158,27 @@ public class KeyStoreTestUtil { * @throws IOException if there is an I/O error saving the file */ public static void createKeyStore(String filename, - String password, String keyPassword, String alias, - Key privateKey, Certificate cert) - throws GeneralSecurityException, IOException { + String password, String keyPassword, String alias, + Key privateKey, Certificate cert) + throws GeneralSecurityException, IOException { KeyStore ks = createEmptyKeyStore(); ks.setKeyEntry(alias, privateKey, keyPassword.toCharArray(), - new Certificate[]{cert}); + new Certificate[]{cert}); saveKeyStore(ks, filename, password); } public static void createTrustStore(String filename, - String password, String alias, - Certificate cert) - throws GeneralSecurityException, IOException { + String password, String alias, + Certificate cert) + throws GeneralSecurityException, IOException { KeyStore ks = createEmptyKeyStore(); ks.setCertificateEntry(alias, cert); saveKeyStore(ks, filename, password); } public static <T extends Certificate> void createTrustStore( - String filename, String password, Map<String, T> certs) - throws GeneralSecurityException, IOException { + String filename, String password, Map<String, T> certs) + throws GeneralSecurityException, IOException { KeyStore ks = createEmptyKeyStore(); for (Map.Entry<String, T> cert : certs.entrySet()) { ks.setCertificateEntry(cert.getKey(), cert.getValue()); @@ -187,7 +187,7 @@ public class KeyStoreTestUtil { } public static void cleanupSSLConfig(String keystoresDir, String sslConfDir) - throws Exception { + throws Exception { File f = new File(keystoresDir + "/clientKS.jks"); f.delete(); f = new File(keystoresDir + "/serverKS.jks"); @@ -196,7 +196,7 @@ public class KeyStoreTestUtil { f.delete(); f = new File(sslConfDir + "/ssl-client.xml"); f.delete(); - f = new File(sslConfDir + "/ssl-server.xml"); + f = new File(sslConfDir + "/ssl-server.xml"); f.delete(); } @@ -205,22 +205,42 @@ public class KeyStoreTestUtil { * SSLFactory. This includes keys, certs, keystores, truststores, the server * SSL configuration file, the client SSL configuration file, and the master * configuration file read by the SSLFactory. - * + * * @param keystoresDir String directory to save keystores * @param sslConfDir String directory to save SSL configuration files * @param conf Configuration master configuration to be used by an SSLFactory, - * which will be mutated by this method + * which will be mutated by this method * @param useClientCert boolean true to make the client present a cert in the - * SSL handshake + * SSL handshake */ public static void setupSSLConfig(String keystoresDir, String sslConfDir, - Configuration conf, boolean useClientCert) + Configuration conf, boolean useClientCert) throws Exception { + setupSSLConfig(keystoresDir, sslConfDir, conf, useClientCert, true); + } + + /** + * Performs complete setup of SSL configuration in preparation for testing an + * SSLFactory. This includes keys, certs, keystores, truststores, the server + * SSL configuration file, the client SSL configuration file, and the master + * configuration file read by the SSLFactory. + * + * @param keystoresDir String directory to save keystores + * @param sslConfDir String directory to save SSL configuration files + * @param conf Configuration master configuration to be used by an SSLFactory, + * which will be mutated by this method + * @param useClientCert boolean true to make the client present a cert in the + * SSL handshake + * @param trustStore boolean true to create truststore, false not to create it + */ + public static void setupSSLConfig(String keystoresDir, String sslConfDir, + Configuration conf, boolean useClientCert, + boolean trustStore) throws Exception { String clientKS = keystoresDir + "/clientKS.jks"; String clientPassword = "clientP"; String serverKS = keystoresDir + "/serverKS.jks"; String serverPassword = "serverP"; - String trustKS = keystoresDir + "/trustKS.jks"; + String trustKS = null; String trustPassword = "trustP"; File sslClientConfFile = new File(sslConfDir + "/ssl-client.xml"); @@ -246,7 +266,10 @@ public class KeyStoreTestUtil { sKP.getPrivate(), sCert); certs.put("server", sCert); - KeyStoreTestUtil.createTrustStore(trustKS, trustPassword, certs); + if (trustStore) { + trustKS = keystoresDir + "/trustKS.jks"; + KeyStoreTestUtil.createTrustStore(trustKS, trustPassword, certs); + } Configuration clientSSLConf = createClientSSLConfig(clientKS, clientPassword, clientPassword, trustKS); Modified: hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/TestSSLFactory.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/TestSSLFactory.java?rev=1602947&r1=1602946&r2=1602947&view=diff ============================================================================== --- hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/TestSSLFactory.java (original) +++ hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/ssl/TestSSLFactory.java Mon Jun 16 18:13:57 2014 @@ -50,11 +50,12 @@ public class TestSSLFactory { base.mkdirs(); } - private Configuration createConfiguration(boolean clientCert) + private Configuration createConfiguration(boolean clientCert, + boolean trustStore) throws Exception { Configuration conf = new Configuration(); KeyStoreTestUtil.setupSSLConfig(KEYSTORES_DIR, sslConfsDir, conf, - clientCert); + clientCert, trustStore); return conf; } @@ -67,7 +68,7 @@ public class TestSSLFactory { @Test(expected = IllegalStateException.class) public void clientMode() throws Exception { - Configuration conf = createConfiguration(false); + Configuration conf = createConfiguration(false, true); SSLFactory sslFactory = new SSLFactory(SSLFactory.Mode.CLIENT, conf); try { sslFactory.init(); @@ -80,7 +81,7 @@ public class TestSSLFactory { } private void serverMode(boolean clientCert, boolean socket) throws Exception { - Configuration conf = createConfiguration(clientCert); + Configuration conf = createConfiguration(clientCert, true); SSLFactory sslFactory = new SSLFactory(SSLFactory.Mode.SERVER, conf); try { sslFactory.init(); @@ -119,7 +120,7 @@ public class TestSSLFactory { @Test public void validHostnameVerifier() throws Exception { - Configuration conf = createConfiguration(false); + Configuration conf = createConfiguration(false, true); conf.unset(SSLFactory.SSL_HOSTNAME_VERIFIER_KEY); SSLFactory sslFactory = new SSLFactory(SSLFactory.Mode.CLIENT, conf); @@ -157,7 +158,7 @@ public class TestSSLFactory { @Test(expected = GeneralSecurityException.class) public void invalidHostnameVerifier() throws Exception { - Configuration conf = createConfiguration(false); + Configuration conf = createConfiguration(false, true); conf.set(SSLFactory.SSL_HOSTNAME_VERIFIER_KEY, "foo"); SSLFactory sslFactory = new SSLFactory(SSLFactory.Mode.CLIENT, conf); try { @@ -169,7 +170,7 @@ public class TestSSLFactory { @Test public void testConnectionConfigurator() throws Exception { - Configuration conf = createConfiguration(false); + Configuration conf = createConfiguration(false, true); conf.set(SSLFactory.SSL_HOSTNAME_VERIFIER_KEY, "STRICT_IE6"); SSLFactory sslFactory = new SSLFactory(SSLFactory.Mode.CLIENT, conf); try { @@ -275,7 +276,7 @@ public class TestSSLFactory { @Test public void testNoClientCertsInitialization() throws Exception { - Configuration conf = createConfiguration(false); + Configuration conf = createConfiguration(false, true); conf.unset(SSLFactory.SSL_REQUIRE_CLIENT_CERT_KEY); SSLFactory sslFactory = new SSLFactory(SSLFactory.Mode.CLIENT, conf); try { @@ -285,4 +286,16 @@ public class TestSSLFactory { } } + @Test + public void testNoTrustStore() throws Exception { + Configuration conf = createConfiguration(false, false); + conf.unset(SSLFactory.SSL_REQUIRE_CLIENT_CERT_KEY); + SSLFactory sslFactory = new SSLFactory(SSLFactory.Mode.SERVER, conf); + try { + sslFactory.init(); + } finally { + sslFactory.destroy(); + } + } + } Modified: hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml URL: http://svn.apache.org/viewvc/hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml?rev=1602947&r1=1602946&r2=1602947&view=diff ============================================================================== --- hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml (original) +++ hadoop/common/branches/fs-encryption/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml Mon Jun 16 18:13:57 2014 @@ -54,47 +54,55 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-ls \[-d\] \[-h\] \[-R\] \[<path> \.\.\.\]:( |\t)*List the contents that match the specified file pattern. If( )*</expected-output> + <expected-output>^-ls \[-d\] \[-h\] \[-R\] \[<path> \.\.\.\] :( |\t)*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*path is not specified, the contents of /user/<currentUser>( )*</expected-output> + <expected-output>^\s*List the contents that match the specified file pattern. If path is not</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*path is not specified, the contents of /user/<currentUser>( )*</expected-output> + <expected-output>^\s*specified, the contents of /user/<currentUser> will be listed. Directory entries( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*will be listed. Directory entries are of the form( )*</expected-output> + <expected-output>^\s*are of the form:( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*permissions - userid groupid size_of_directory\(in bytes\) modification_date\(yyyy-MM-dd HH:mm\) directoryName( )*</expected-output> + <expected-output>^\s*permissions - userId groupId sizeOfDirectory\(in bytes\)( )*</expected-output> </comparator> - <comparator> + <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*and file entries are of the form( )*</expected-output> + <expected-output>^\s*modificationDate\(yyyy-MM-dd HH:mm\) directoryName( )*</expected-output> </comparator> - <comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*and file entries are of the form:( )*</expected-output> + </comparator> + <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*permissions number_of_replicas userid groupid size_of_file\(in bytes\) modification_date\(yyyy-MM-dd HH:mm\) fileName( )*</expected-output> + <expected-output>^\s*permissions numberOfReplicas userId groupId sizeOfFile\(in bytes\)( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-d\s+Directories are listed as plain files\.</expected-output> + <expected-output>^\s*modificationDate\(yyyy-MM-dd HH:mm\) fileName( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-h\s+Formats the sizes of files in a human-readable fashion( )*</expected-output> + <expected-output>^\s*-d\s+Directories are listed as plain files\.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*rather than a number of bytes\.( )*</expected-output> + <expected-output>^\s*-h\s+Formats the sizes of files in a human-readable fashion rather than a number( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-R\s+Recursively list the contents of directories\.</expected-output> + <expected-output>^\s*of bytes\.( )*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*-R\s+Recursively list the contents of directories\.( )*</expected-output> </comparator> </comparators> </test> @@ -109,7 +117,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-lsr:\s+\(DEPRECATED\) Same as 'ls -R'</expected-output> + <expected-output>^-lsr :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s+\(DEPRECATED\) Same as 'ls -R'</expected-output> </comparator> </comparators> </test> @@ -125,23 +137,19 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-get( )*\[-p\]( )*\[-ignoreCrc\]( )*\[-crc\]( )*<src> \.\.\. <localdst>:( |\t)*Copy files that match the file pattern <src>( )*</expected-output> + <expected-output>^-get( )*\[-p\]( )*\[-ignoreCrc\]( )*\[-crc\]( )*<src> \.\.\. <localdst> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*to the local name.( )*<src> is kept.( )*When copying multiple,( )*</expected-output> + <expected-output>\s*Copy files that match the file pattern <src> to the local name. <src> is kept.\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*files, the destination must be a directory.( )*Passing( )*</expected-output> + <expected-output>\s*When copying multiple files, the destination must be a directory. Passing -p\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-p preserves access and modification times,( )*</expected-output> - </comparator> - <comparator> - <type>RegexpComparator</type> - <expected-output>^( |\t)*ownership and the mode.( )*</expected-output> + <expected-output>^( |\t)*preserves access and modification times, ownership and the mode.*</expected-output> </comparator> </comparators> </test> @@ -156,35 +164,39 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-du \[-s\] \[-h\] <path> \.\.\.:\s+Show the amount of space, in bytes, used by the files that\s*</expected-output> + <expected-output>^-du \[-s\] \[-h\] <path> \.\.\. :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Show the amount of space, in bytes, used by the files that match the specified\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s*match the specified file pattern. The following flags are optional:</expected-output> + <expected-output>^\s*file pattern. The following flags are optional:\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s*-s\s*Rather than showing the size of each individual file that</expected-output> + <expected-output>^\s*-s\s*Rather than showing the size of each individual file that matches the\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s*matches the pattern, shows the total \(summary\) size.</expected-output> + <expected-output>^\s*pattern, shows the total \(summary\) size.\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s*-h\s*Formats the sizes of files in a human-readable fashion</expected-output> + <expected-output>^\s*-h\s*Formats the sizes of files in a human-readable fashion rather than a number\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>\s*rather than a number of bytes.</expected-output> + <expected-output>\s*of bytes.\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s*Note that, even without the -s option, this only shows size summaries</expected-output> + <expected-output>^\s*Note that, even without the -s option, this only shows size summaries one level\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s*one level deep into a directory.</expected-output> + <expected-output>^\s*deep into a directory.</expected-output> </comparator> <comparator> <type>RegexpComparator</type> @@ -207,7 +219,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-dus:\s+\(DEPRECATED\) Same as 'du -s'</expected-output> + <expected-output>^-dus :</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*\(DEPRECATED\) Same as 'du -s'</expected-output> </comparator> </comparators> </test> @@ -222,7 +238,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-count \[-q\] <path> \.\.\.:( |\t)*Count the number of directories, files and bytes under the paths( )*</expected-output> + <expected-output>^-count \[-q\] <path> \.\.\. :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Count the number of directories, files and bytes under the paths( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> @@ -253,15 +273,15 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-mv <src> \.\.\. <dst>:( |\t)*Move files that match the specified file pattern <src>( )*</expected-output> + <expected-output>^-mv <src> \.\.\. <dst> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*to a destination <dst>. When moving multiple files, the( )*</expected-output> + <expected-output>\s*Move files that match the specified file pattern <src> to a destination <dst>.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*destination must be a directory.( )*</expected-output> + <expected-output>^( |\t)*When moving multiple files, the destination must be a directory.( )*</expected-output> </comparator> </comparators> </test> @@ -276,23 +296,27 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-cp \[-f\] \[-p\] <src> \.\.\. <dst>:( |\t)*Copy files that match the file pattern <src> to a( )*</expected-output> + <expected-output>^-cp \[-f\] \[-p \| -p\[topx\]\] <src> \.\.\. <dst> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*destination. When copying multiple files, the destination( )*</expected-output> + <expected-output>^\s*Copy files that match the file pattern <src> to a destination. When copying( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*must be a directory.( )*Passing -p preserves access and( )*</expected-output> + <expected-output>^( |\t)*multiple files, the destination must be a directory.( )*Passing -p preserves status( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*modification times, ownership and the mode. Passing -f( )*</expected-output> + <expected-output>^( |\t)*\[topx\] \(timestamps, ownership, permission, XAttr\). If -p is specified with no( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*overwrites the destination if it already exists.( )*</expected-output> + <expected-output>^( |\t)*<arg>, then preserves timestamps, ownership, permission. Passing -f overwrites( )*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*the destination if it already exists.( )*</expected-output> </comparator> </comparators> </test> @@ -307,31 +331,31 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-rm \[-f\] \[-r\|-R\] \[-skipTrash\] <src> \.\.\.:( |\t)*Delete all files that match the specified file pattern.( )*</expected-output> + <expected-output>^-rm \[-f\] \[-r\|-R\] \[-skipTrash\] <src> \.\.\. :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*Equivalent to the Unix command "rm <src>"( )*</expected-output> + <expected-output>^\s*Delete all files that match the specified file pattern. Equivalent to the Unix( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-skipTrash option bypasses trash, if enabled, and immediately( )*</expected-output> + <expected-output>^\s*command "rm <src>"( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*deletes <src>( )*</expected-output> + <expected-output>^\s*-skipTrash\s+option bypasses trash, if enabled, and immediately deletes <src>( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s+-f\s+If the file does not exist, do not display a diagnostic</expected-output> + <expected-output>^\s+-f\s+If the file does not exist, do not display a diagnostic message or\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s+message or modify the exit status to reflect an error\.</expected-output> + <expected-output>^\s+modify the exit status to reflect an error\.\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^\s+-\[rR\]\s+Recursively deletes directories</expected-output> + <expected-output>^\s+-\[rR\]\s+Recursively deletes directories\s*</expected-output> </comparator> </comparators> </test> @@ -346,11 +370,15 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-rmdir \[--ignore-fail-on-non-empty\] <dir> \.\.\.:\s+Removes the directory entry specified by each directory argument,</expected-output> + <expected-output>^-rmdir \[--ignore-fail-on-non-empty\] <dir> \.\.\. :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>\s+Removes the directory entry specified by each directory argument, provided it is\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>\s+provided it is empty.</expected-output> + <expected-output>\s+empty\.\s*</expected-output> </comparator> </comparators> </test> @@ -365,7 +393,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-rmr:\s+\(DEPRECATED\) Same as 'rm -r'</expected-output> + <expected-output>^-rmr :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*\(DEPRECATED\) Same as 'rm -r'\s*</expected-output> </comparator> </comparators> </test> @@ -380,27 +412,23 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-put \[-f\] \[-p\] <localsrc> \.\.\. <dst>:\s+Copy files from the local file system</expected-output> - </comparator> - <comparator> - <type>RegexpComparator</type> - <expected-output>^( |\t)*into fs.( )*Copying fails if the file already( )*</expected-output> + <expected-output>^-put \[-f\] \[-p\] <localsrc> \.\.\. <dst> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*exists, unless the -f flag is given.( )*Passing( )*</expected-output> + <expected-output>^\s*Copy files from the local file system into fs.( )*Copying fails if the file already( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-p preserves access and modification times,( )*</expected-output> + <expected-output>^\s*exists, unless the -f flag is given.( )*Passing -p preserves access and( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*ownership and the mode. Passing -f overwrites( )*</expected-output> + <expected-output>^\s*modification times, ownership and the mode. Passing -f overwrites the( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*the destination if it already exists.( )*</expected-output> + <expected-output>^( |\t)*destination if it already exists.( )*</expected-output> </comparator> </comparators> </test> @@ -415,7 +443,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-copyFromLocal \[-f\] \[-p\] <localsrc> \.\.\. <dst>:\s+Identical to the -put command\.</expected-output> + <expected-output>^-copyFromLocal \[-f\] \[-p\] <localsrc> \.\.\. <dst> :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Identical to the -put command\.\s*</expected-output> </comparator> </comparators> </test> @@ -430,11 +462,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-moveFromLocal <localsrc> \.\.\. <dst>:\s+Same as -put, except that the source is</expected-output> + <expected-output>^-moveFromLocal <localsrc> \.\.\. <dst> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*deleted after it's copied.</expected-output> + <expected-output>^( |\t)*Same as -put, except that the source is deleted after it's copied.</expected-output> </comparator> </comparators> </test> @@ -450,23 +482,19 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-get( )*\[-p\]( )*\[-ignoreCrc\]( )*\[-crc\]( )*<src> \.\.\. <localdst>:( |\t)*Copy files that match the file pattern <src>( )*</expected-output> - </comparator> - <comparator> - <type>RegexpComparator</type> - <expected-output>^( |\t)*to the local name.( )*<src> is kept.( )*When copying multiple,( )*</expected-output> + <expected-output>^-get( )*\[-p\]( )*\[-ignoreCrc\]( )*\[-crc\]( )*<src> \.\.\. <localdst> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*files, the destination must be a directory.( )*Passing( )*</expected-output> + <expected-output>^( |\t)*Copy files that match the file pattern <src> to the local name.( )*<src> is kept.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-p preserves access and modification times,( )*</expected-output> + <expected-output>^( |\t)*When copying multiple files, the destination must be a directory. Passing -p( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*ownership and the mode.( )*</expected-output> + <expected-output>^( |\t)*preserves access and modification times, ownership and the mode.( )*</expected-output> </comparator> </comparators> </test> @@ -481,19 +509,19 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-getmerge \[-nl\] <src> <localdst>:( |\t)*Get all the files in the directories that( )*</expected-output> + <expected-output>^-getmerge \[-nl\] <src> <localdst> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*match the source file pattern and merge and sort them to only( )*</expected-output> + <expected-output>^( |\t)*Get all the files in the directories that match the source file pattern and( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*one file on local fs. <src> is kept.( )*</expected-output> + <expected-output>^( |\t)*merge and sort them to only one file on local fs. <src> is kept.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-nl Add a newline character at the end of each file.( )*</expected-output> + <expected-output>^( |\t)*-nl\s+Add a newline character at the end of each file.( )*</expected-output> </comparator> </comparators> </test> @@ -509,11 +537,15 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-cat \[-ignoreCrc\] <src> \.\.\.:( |\t)*Fetch all files that match the file pattern <src>( )*</expected-output> + <expected-output>^-cat \[-ignoreCrc\] <src> \.\.\. :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*and display their content on stdout.</expected-output> + <expected-output>^\s*Fetch all files that match the file pattern <src> and display their content on\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*stdout.</expected-output> </comparator> </comparators> </test> @@ -529,7 +561,27 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-checksum <src> \.\.\.:( |\t)*Dump checksum information for files.*</expected-output> + <expected-output>^-checksum <src> \.\.\. :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Dump checksum information for files that match the file pattern <src> to stdout\.\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Note that this requires a round-trip to a datanode storing each block of the\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*file, and thus is not efficient to run on a large number of files\. The checksum\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*of a file depends on its content, block size and the checksum algorithm and\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*parameters used for creating the file\.\s*</expected-output> </comparator> </comparators> </test> @@ -544,7 +596,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-copyToLocal \[-p\] \[-ignoreCrc\] \[-crc\] <src> \.\.\. <localdst>:\s+Identical to the -get command.</expected-output> + <expected-output>^-copyToLocal \[-p\] \[-ignoreCrc\] \[-crc\] <src> \.\.\. <localdst> :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Identical to the -get command.\s*</expected-output> </comparator> </comparators> </test> @@ -559,7 +615,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-moveToLocal <src> <localdst>:\s+Not implemented yet</expected-output> + <expected-output>^-moveToLocal <src> <localdst> :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Not implemented yet</expected-output> </comparator> </comparators> </test> @@ -574,7 +634,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-mkdir \[-p\] <path> \.\.\.:( |\t)*Create a directory in specified location.( )*</expected-output> + <expected-output>^-mkdir \[-p\] <path> \.\.\. :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Create a directory in specified location.( )*</expected-output> </comparator> <comparator> <type>TokenComparator</type> @@ -593,27 +657,31 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-setrep \[-R\] \[-w\] <rep> <path> \.\.\.:( |\t)*Set the replication level of a file. If <path> is a directory( )*</expected-output> + <expected-output>^-setrep \[-R\] \[-w\] <rep> <path> \.\.\. :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Set the replication level of a file. If <path> is a directory then the command( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*then the command recursively changes the replication factor of( )*</expected-output> + <expected-output>^\s*recursively changes the replication factor of all files under the directory tree( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*all files under the directory tree rooted at <path>\.( )*</expected-output> + <expected-output>^\s*rooted at <path>\.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*The -w flag requests that the command wait for the replication( )*</expected-output> + <expected-output>^\s*-w\s+It requests that the command waits for the replication to complete\. This( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*to complete. This can potentially take a very long time\.( )*</expected-output> + <expected-output>^( |\t)*can potentially take a very long time\.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*The -R flag is accepted for backwards compatibility\. It has no effect\.( )*</expected-output> + <expected-output>^( |\t)*-R\s+It is accepted for backwards compatibility\. It has no effect\.( )*</expected-output> </comparator> </comparators> </test> @@ -628,15 +696,15 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-touchz <path> \.\.\.:( |\t)*Creates a file of zero length( )*</expected-output> + <expected-output>^-touchz <path> \.\.\. :( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*at <path> with current time as the timestamp of that <path>.( )*</expected-output> + <expected-output>^( |\t)*Creates a file of zero length at <path> with current time as the timestamp of( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*An error is returned if the file exists with non-zero length( )*</expected-output> + <expected-output>^( |\t)* that <path>\. An error is returned if the file exists with non-zero length( )*</expected-output> </comparator> </comparators> </test> @@ -651,11 +719,15 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-test -\[defsz\] <path>:\sAnswer various questions about <path>, with result via exit status.</expected-output> + <expected-output>^-test -\[defsz\] <path> :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*else, return 1.( )*</expected-output> + <expected-output>^\s*Answer various questions about <path>, with result via exit status.</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*-[defsz]\s+return 0 if .*</expected-output> </comparator> </comparators> </test> @@ -670,15 +742,23 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-stat \[format\] <path> \.\.\.:( |\t)*Print statistics about the file/directory at <path>( )*</expected-output> + <expected-output>^-stat \[format\] <path> \.\.\. :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^( |\t)*Print statistics about the file/directory at <path> in the specified format.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*in the specified format. Format accepts filesize in blocks \(%b\), group name of owner\(%g\),( )*</expected-output> + <expected-output>^( |\t)*Format accepts filesize in blocks \(%b\), group name of owner\(%g\), filename \(%n\),( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*filename \(%n\), block size \(%o\), replication \(%r\), user name of owner\(%u\), modification date \(%y, %Y\)( )*</expected-output> + <expected-output>^( |\t)*block size \(%o\), replication \(%r\), user name of owner\(%u\), modification date( )*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^( |\t)*\(%y, %Y\)( )*</expected-output> </comparator> </comparators> </test> @@ -693,11 +773,15 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-tail \[-f\] <file>:( |\t)+Show the last 1KB of the file.( )*</expected-output> + <expected-output>^-tail \[-f\] <file> :\s*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^\s*Show the last 1KB of the file.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*The -f option shows appended data as the file grows.( )*</expected-output> + <expected-output>^( |\t)*-f\s+Shows appended data as the file grows.( )*</expected-output> </comparator> </comparators> </test> @@ -712,47 +796,55 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-chmod \[-R\] <MODE\[,MODE\]... \| OCTALMODE> PATH...:( |\t)*Changes permissions of a file.( )*</expected-output> + <expected-output>^-chmod \[-R\] <MODE\[,MODE\]... \| OCTALMODE> PATH... :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*This works similar to shell's chmod with a few exceptions.( )*</expected-output> + <expected-output>^( |\t)*Changes permissions of a file. This works similar to the shell's chmod command( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-R( |\t)*modifies the files recursively. This is the only option( )*</expected-output> + <expected-output>^( |\t)*with a few exceptions.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*currently supported.( )*</expected-output> + <expected-output>^( |\t)*-R\s*modifies the files recursively. This is the only option currently( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*MODE( |\t)*Mode is same as mode used for chmod shell command.( )*</expected-output> + <expected-output>^( |\t)*supported.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*Only letters recognized are 'rwxXt'. E.g. \+t,a\+r,g-w,\+rwx,o=r( )*</expected-output> + <expected-output>^( |\t)*<MODE>\s*Mode is the same as mode used for the shell's command. The only( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*OCTALMODE Mode specifed in 3 or 4 digits. If 4 digits, the first may( )*</expected-output> + <expected-output>^( |\t)*letters recognized are 'rwxXt', e\.g\. \+t,a\+r,g-w,\+rwx,o=r\.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*be 1 or 0 to turn the sticky bit on or off, respectively.( )*Unlike( |\t)*shell command, it is not possible to specify only part of the mode( )*</expected-output> + <expected-output>^( |\t)*<OCTALMODE>\s+Mode specifed in 3 or 4 digits. If 4 digits, the first may be 1 or( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*E.g. 754 is same as u=rwx,g=rx,o=r( )*</expected-output> + <expected-output>^( |\t)*0 to turn the sticky bit on or off, respectively.( )*Unlike( |\t)*the( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*If none of 'augo' is specified, 'a' is assumed and unlike( )*</expected-output> + <expected-output>^( |\t)*shell command, it is not possible to specify only part of the( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*shell command, no umask is applied.( )*</expected-output> + <expected-output>^( |\t)*mode, e\.g\. 754 is same as u=rwx,g=rx,o=r\.( )*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^( |\t)*If none of 'augo' is specified, 'a' is assumed and unlike the shell command, no( )*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^( |\t)*umask is applied.( )*</expected-output> </comparator> </comparators> </test> @@ -767,51 +859,47 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-chown \[-R\] \[OWNER\]\[:\[GROUP\]\] PATH...:( |\t)*Changes owner and group of a file.( )*</expected-output> + <expected-output>^-chown \[-R\] \[OWNER\]\[:\[GROUP\]\] PATH... :\s*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*This is similar to shell's chown with a few exceptions.( )*</expected-output> + <expected-output>^\s*Changes owner and group of a file\. This is similar to the shell's chown command( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*-R( |\t)*modifies the files recursively. This is the only option( )*</expected-output> + <expected-output>^( |\t)*with a few exceptions.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*currently supported.( )*</expected-output> + <expected-output>^( |\t)*-R( |\t)*modifies the files recursively. This is the only option currently( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*If only owner or group is specified then only owner or( )*</expected-output> + <expected-output>^( |\t)*supported.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*group is modified.( )*</expected-output> + <expected-output>^( |\t)*If only the owner or group is specified, then only the owner or group is( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*The owner and group names may only consist of digits, alphabet,( )*</expected-output> + <expected-output>^( |\t)*modified. The owner and group names may only consist of digits, alphabet, and( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*and any of .+?. The names are case sensitive.( )*</expected-output> + <expected-output>^( |\t)*any of .+?. The names are case sensitive.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*WARNING: Avoid using '.' to separate user name and group though( )*</expected-output> + <expected-output>^( |\t)*WARNING: Avoid using '.' to separate user name and group though Linux allows it.( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*Linux allows it. If user names have dots in them and you are( )*</expected-output> + <expected-output>^( |\t)*If user names have dots in them and you are using local file system, you might( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*using local file system, you might see surprising results since( )*</expected-output> - </comparator> - <comparator> - <type>RegexpComparator</type> - <expected-output>^( |\t)*shell command 'chown' is used for local files.( )*</expected-output> + <expected-output>^( |\t)*see surprising results since the shell command 'chown' is used for local files.( )*</expected-output> </comparator> </comparators> </test> @@ -826,7 +914,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-chgrp \[-R\] GROUP PATH...:( |\t)*This is equivalent to -chown ... :GROUP ...( )*</expected-output> + <expected-output>^-chgrp \[-R\] GROUP PATH... :( )*</expected-output> + </comparator> + <comparator> + <type>RegexpComparator</type> + <expected-output>^( |\t)*This is equivalent to -chown ... :GROUP ...( )*</expected-output> </comparator> </comparators> </test> @@ -841,11 +933,11 @@ <comparators> <comparator> <type>RegexpComparator</type> - <expected-output>^-help \[cmd ...\]:( |\t)*Displays help for given command or all commands if none( )*</expected-output> + <expected-output>^-help \[cmd ...\] :( )*</expected-output> </comparator> <comparator> <type>RegexpComparator</type> - <expected-output>^( |\t)*is specified.( )*</expected-output> + <expected-output>^( |\t)*Displays help for given command or all commands if none is specified.( )*</expected-output> </comparator> </comparators> </test>
