write 7z archives

git-svn-id: https://svn.apache.org/repos/asf/ant/antlibs/compress/trunk@1527275 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/changes.xml b/changes.xml
index 8d14d51..56731ac 100644
--- a/changes.xml
+++ b/changes.xml
@@ -57,7 +57,9 @@
         added.
       </action>
       <action type="add">
-        Read-only support for file based 7z archives has been added.
+        Support for file based 7z archives has been added - most
+        compression algorithms used in 7z archives can be read but
+        only uncompressed archives can be written.
       </action>
     </release>
 
diff --git a/docs/archive.html b/docs/archive.html
index 0fe67de..e14e69c 100644
--- a/docs/archive.html
+++ b/docs/archive.html
@@ -273,6 +273,14 @@
     </tr>
   </table>
 
+  <h3><a name="sevenz">SevenZ</a></h3>
+
+  <p><em>Since Compress Antlib 1.3</em></p>
+
+  <p>An <a href="#archive">archiving task</a> creating archives of the
+    7z format.  As of Commons Compress 1.6 this task only supports
+    writing uncompressed archives.</p>
+
   <h3><a name="tar">Tar</a></h3>
 
   <p>An <a href="#archive">archiving task</a> creating archives of the
diff --git a/docs/index.html b/docs/index.html
index d5a7612..2cf3f0c 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -53,6 +53,7 @@
       <li><a href="pack.html#gzip">gzip</a></li>
       <li><a href="pack.html#pack200">pack200</a></li>
       <li><a href="pack200normalize.html">pack200normalize</a></li>
+      <li><a href="archive.html#sevenz">sevenz</a></li>
       <li><a href="archive.html#tar">tar</a></li>
       <li><a href="expand.html#un7z">un7z</a></li>
       <li><a href="expand.html#unar">unar</a></li>
diff --git a/src/main/org/apache/ant/compress/antlib.xml b/src/main/org/apache/ant/compress/antlib.xml
index 90e20c4..ff3f14f 100644
--- a/src/main/org/apache/ant/compress/antlib.xml
+++ b/src/main/org/apache/ant/compress/antlib.xml
@@ -97,6 +97,10 @@
      classname="org.apache.ant.compress.taskdefs.Pack200Normalize"
      />
   <taskdef
+     name="sevenz"
+     classname="org.apache.ant.compress.taskdefs.SevenZ"
+     />
+  <taskdef
      name="xz"
      classname="org.apache.ant.compress.taskdefs.XZ"
      />
diff --git a/src/main/org/apache/ant/compress/resources/SevenZResource.java b/src/main/org/apache/ant/compress/resources/SevenZResource.java
index c5b6f08..9bd1bdd 100644
--- a/src/main/org/apache/ant/compress/resources/SevenZResource.java
+++ b/src/main/org/apache/ant/compress/resources/SevenZResource.java
@@ -162,6 +162,7 @@
                 }
                 ze = z.getNextEntry();
             }
+            setEntry(null);
         } catch (IOException e) {
             log(e.getMessage(), Project.MSG_DEBUG);
             throw new BuildException(e);
diff --git a/src/main/org/apache/ant/compress/taskdefs/SevenZ.java b/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
new file mode 100644
index 0000000..1324b72
--- /dev/null
+++ b/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
@@ -0,0 +1,58 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.ant.compress.taskdefs;
+
+import java.util.Date;
+
+import org.apache.ant.compress.resources.SevenZFileSet;
+import org.apache.ant.compress.util.SevenZStreamFactory;
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
+import org.apache.tools.ant.types.ArchiveFileSet;
+import org.apache.tools.ant.types.Resource;
+
+/**
+ * Creates 7z archives.
+ */
+public class SevenZ extends ArchiveBase {
+
+    public SevenZ() {
+        setFactory(new SevenZStreamFactory());
+        setEntryBuilder(
+              new ArchiveBase.EntryBuilder() {
+                public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags r) {
+                    SevenZArchiveEntry entry = new SevenZArchiveEntry();
+                    entry.setName(r.getName());
+                    entry.setDirectory(r.getResource().isDirectory());
+                    entry.setLastModifiedDate(new Date(r.getResource()
+                                                       .getLastModified()));
+                    entry.setSize(r.getResource().getSize());
+                    return entry;
+                }
+            });
+        setFileSetBuilder(new ArchiveBase.FileSetBuilder() {
+                public ArchiveFileSet buildFileSet(Resource dest) {
+                    ArchiveFileSet afs = new SevenZFileSet();
+                    afs.setSrcResource(dest);
+                    return afs;
+                }
+            });
+    }
+
+}
diff --git a/src/main/org/apache/ant/compress/util/SevenZStreamFactory.java b/src/main/org/apache/ant/compress/util/SevenZStreamFactory.java
index 33af609..327f92c 100644
--- a/src/main/org/apache/ant/compress/util/SevenZStreamFactory.java
+++ b/src/main/org/apache/ant/compress/util/SevenZStreamFactory.java
@@ -26,6 +26,7 @@
 import org.apache.commons.compress.archivers.ArchiveEntry;
 import org.apache.commons.compress.archivers.ArchiveInputStream;
 import org.apache.commons.compress.archivers.ArchiveOutputStream;
+import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile;
 import org.apache.commons.compress.archivers.sevenz.SevenZFile;
 
 /**
@@ -70,7 +71,7 @@
     public ArchiveOutputStream getArchiveOutputStream(File file,
                                                       String encoding)
         throws IOException {
-        throw new UnsupportedOperationException();
+        return new SevenZArchiveOutputStream(file);
     }
 
     /**
@@ -98,4 +99,43 @@
         }
     }
 
+    /**
+     * Not really a stream but provides an ArchiveOutputStream
+     * compatible interface over SevenZOutputFile.
+     */
+    private static class SevenZArchiveOutputStream extends ArchiveOutputStream {
+
+        private final SevenZOutputFile zipFile;
+
+        public SevenZArchiveOutputStream(File file) throws IOException {
+            zipFile = new SevenZOutputFile(file);
+        }
+
+        public void close() {
+            zipFile.close();
+        }
+
+        public void putArchiveEntry(ArchiveEntry entry) throws IOException {
+            zipFile.putArchiveEntry(entry);
+        }
+
+        public void closeArchiveEntry() throws IOException {
+            zipFile.closeArchiveEntry();
+        }
+
+        public void finish() throws IOException {
+            zipFile.finish();
+        }
+
+        public ArchiveEntry createArchiveEntry(File inputFile, String entryName) 
+            throws IOException {
+            return zipFile.createArchiveEntry(inputFile, entryName);
+        }
+
+        public void write(byte[] b,int  off, int len) throws IOException {
+            zipFile.write(b, off, len);
+        }
+                
+    }
+
 }
diff --git a/src/tests/antunit/sevenz-test.xml b/src/tests/antunit/sevenz-test.xml
new file mode 100644
index 0000000..2195d49
--- /dev/null
+++ b/src/tests/antunit/sevenz-test.xml
@@ -0,0 +1,435 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project default="antunit"
+         xmlns:au="antlib:org.apache.ant.antunit"
+         xmlns:cond="antlib:org.apache.tools.ant.types.conditions"
+         xmlns:cmp="antlib:org.apache.ant.compress">
+
+  <import file="antunit-base.xml" />
+
+  <target name="setUp">
+    <mkdir dir="${output}"/>
+    <mkdir dir="${input}/subdir"/>
+    <copy todir="${input}/subdir" file="../resources/asf-logo.gif"/>
+    <property name="dest" location="${output}/test.7z"/>
+    <macrodef name="checkProperties">
+      <attribute name="pattern" default="yyyy-MM-dd-HH:mm:ss Z"/>
+      <attribute name="dateTime"/>
+      <sequential>
+        <au:assertTrue>
+          <cond:islastmodified datetime="@{dateTime}"
+                               pattern="@{pattern}">
+            <cmp:sevenzentry name="asf-logo.gif">
+              <file file="${dest}"/>
+            </cmp:sevenzentry>
+          </cond:islastmodified>
+        </au:assertTrue>
+      </sequential>
+    </macrodef>
+  </target>
+
+  <target name="testPlainFileSet" depends="setUp">
+    <mkdir dir="${input}"/>
+    <copy todir="${input}" file="../resources/asf-logo.gif"/>
+    <touch datetime="2009-08-19-05:49:21 +0200"
+           pattern="yyyy-MM-dd-HH:mm:ss Z"
+           file="${input}/asf-logo.gif"/>
+    <cmp:sevenz destfile="${dest}">
+      <fileset dir="${input}" includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <checkProperties dateTime="2009-08-19-05:49:21 +0200"/>
+  </target>
+
+  <target name="testCoreZipFileSet" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <zipfileset src="../resources/asf-logo.gif.zip"
+                  includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <checkProperties dateTime="2001-11-19-15:34:20"
+                     pattern="yyyy-MM-dd-HH:mm:ss"
+                     />
+  </target>
+
+  <target name="testAntlibZipFileSet" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <cmp:zipfileset src="../resources/asf-logo.gif.zip"
+                      includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <checkProperties dateTime="2001-11-19-15:34:20"
+                     pattern="yyyy-MM-dd-HH:mm:ss"
+                     />
+  </target>
+
+  <target name="testSevenzFileSet" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <cmp:sevenzfileset src="../resources/asf-logo.gif.7z"
+                         includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <checkProperties dateTime="2013-09-27-20:54:32 +0200"/>
+  </target>
+
+  <target name="testNoDirectoriesByDefault" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <fileset dir="${input}"/>
+      <dirset dir="${input}"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="subdir/asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="subdir/">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testWithDirectories" depends="setUp">
+    <cmp:sevenz destfile="${dest}" filesonly="false">
+      <dirset dir="${input}" excludes="."/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="subdir/">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+  </target>
+
+  <target name="testWithImplicitDirectories" depends="setUp">
+    <cmp:sevenz destfile="${dest}" filesonly="false">
+      <fileset dir="${input}"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="subdir/">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceExists>
+      <cmp:sevenzentry name="subdir/asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+  </target>
+
+  <target name="testFullpath" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"
+                     fullpath="logo.gif"
+                     includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testPrefixWithSlash" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"
+                     prefix="x/"
+                     includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="x/asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testPrefixWithBackslash" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"
+                     prefix="x\"
+                     includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="x/asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testPrefixWithoutSlash" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"
+                     prefix="x"
+                     includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="x/asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="asf-logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testRemoveLeadingSlashes" depends="setUp">
+    <cmp:sevenz destfile="${dest}">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"
+                     fullpath="/logo.gif"
+                     includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="/logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testPreserveLeadingSlashes" depends="setUp">
+    <cmp:sevenz destfile="${dest}" preserveleadingslashes="true">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"
+                     fullpath="/logo.gif"
+                     includes="asf-logo.gif"/>
+    </cmp:sevenz>
+    <assertResourceExists>
+      <cmp:sevenzentry name="/logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="logo.gif">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testAddDuplicates" depends="setUp">
+    <cmp:sevenz destfile="${dest}" duplicate="add">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"/>
+      <cmp:zipfileset src="../resources/asf-logo.gif.zip"/>
+    </cmp:sevenz>
+    <au:assertLogContains text="duplicate entry asf-logo.gif found, adding."
+                          level="verbose"/>
+  </target>
+
+  <target name="testPreserveDuplicates" depends="setUp">
+    <cmp:sevenz destfile="${dest}" duplicate="preserve">
+      <cmp:arfileset src="../resources/asf-logo.gif.ar"/>
+      <cmp:zipfileset src="../resources/asf-logo.gif.zip"/>
+    </cmp:sevenz>
+    <au:assertLogContains text="asf-logo.gif already added, skipping."
+                          level="verbose"/>
+  </target>
+
+  <target name="testFailDuplicates" depends="setUp">
+    <au:expectfailure
+       message="Duplicate entry asf-logo.gif was found and the duplicate attribute is 'fail'.">
+      <cmp:sevenz destfile="${dest}">
+        <cmp:arfileset src="../resources/asf-logo.gif.ar"/>
+        <cmp:zipfileset src="../resources/asf-logo.gif.zip"/>
+      </cmp:sevenz>
+    </au:expectfailure>
+  </target>
+
+  <target name="testFailEmpty" depends="setUp">
+    <au:expectfailure
+       message="No sources, nothing to do.">
+      <cmp:sevenz destfile="${dest}">
+        <fileset dir="." includes="not-there"/>
+      </cmp:sevenz>
+    </au:expectfailure>
+  </target>
+
+  <target name="testSkipEmpty" depends="setUp">
+    <cmp:sevenz destfile="${dest}" whenEmpty="skip">
+      <fileset dir="." includes="not-there"/>
+    </cmp:sevenz>
+    <au:assertLogContains text="No sources, nothing to do."
+                          level="warn"/>
+    <au:assertFileDoesntExist file="${dest}"/>
+  </target>
+
+  <target name="-prepareArchiveForModeTests" depends="setUp">
+    <mkdir dir="${input}"/>
+    <copy todir="${input}">
+      <fileset dir="." includes="*r-test.xml,zip-test.xml"/>
+    </copy>
+    <cmp:sevenz dest="${dest}">
+      <fileset dir="${input}"/>
+    </cmp:sevenz>
+    <copy tofile="${dest}.bak" file="${dest}"/>
+    <property name="timestamp" value="2000-01-01-00:00:00 +0000"/>
+    <touch datetime="${timestamp}" file="${input}/zip-test.xml"
+           pattern="yyyy-MM-dd-HH:mm:ss Z"/>
+    <sleep seconds="2"/>
+    <touch file="${dest}.bak"/>
+    <sleep seconds="2"/>
+  </target>
+
+  <target name="testCreateOfUpToDate" depends="-prepareArchiveForModeTests">
+    <cmp:sevenz dest="${dest}" mode="create">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogContains
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsUptodate
+       src="${dest}" dest="${dest}.bak"/>
+  </target>
+
+  <target name="testForceCreateOfUpToDate"
+          depends="-prepareArchiveForModeTests">
+    <cmp:sevenz dest="${dest}" mode="force-create">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogDoesntContain
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsOutofdate
+       src="${dest}" dest="${dest}.bak"/>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="tar-test.xml">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testCreateOfOutOfDate" depends="-prepareArchiveForModeTests">
+    <touch file="${input}/ar-test.xml"/>
+    <cmp:sevenz dest="${dest}" mode="create">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogDoesntContain
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsOutofdate
+       src="${dest}" dest="${dest}.bak"/>
+    <assertResourceDoesntExist>
+      <cmp:sevenzentry name="tar-test.xml">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceDoesntExist>
+  </target>
+
+  <target name="testReplaceOfUpToDate" depends="-prepareArchiveForModeTests">
+    <cmp:sevenz dest="${dest}" mode="replace">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogContains
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsUptodate
+       src="${dest}" dest="${dest}.bak"/>
+  </target>
+
+  <target name="testForceReplaceOfUpToDate"
+          depends="-prepareArchiveForModeTests">
+    <cmp:sevenz dest="${dest}" mode="force-replace">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogDoesntContain
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsOutofdate
+       src="${dest}" dest="${dest}.bak"/>
+    <assertResourceExists>
+      <cmp:sevenzentry name="tar-test.xml">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <au:assertTrue>
+      <cond:islastmodified datetime="${timestamp}"
+                           pattern="yyyy-MM-dd-HH:mm:ss Z">
+        <cmp:sevenzentry name="zip-test.xml">
+          <file file="${dest}"/>
+        </cmp:sevenzentry>
+      </cond:islastmodified>
+    </au:assertTrue>
+  </target>
+
+  <target name="testReplaceOfOutOfDate" depends="-prepareArchiveForModeTests">
+    <touch file="${input}/ar-test.xml"/>
+    <cmp:sevenz dest="${dest}" mode="replace">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogDoesntContain
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsOutofdate
+       src="${dest}" dest="${dest}.bak"/>
+    <assertResourceExists>
+      <cmp:sevenzentry name="tar-test.xml">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <au:assertTrue>
+      <cond:islastmodified datetime="${timestamp}"
+                           pattern="yyyy-MM-dd-HH:mm:ss Z">
+        <cmp:sevenzentry name="zip-test.xml">
+          <file file="${dest}"/>
+        </cmp:sevenzentry>
+      </cond:islastmodified>
+    </au:assertTrue>
+  </target>
+
+  <target name="testUpdateOfUpToDate" depends="-prepareArchiveForModeTests">
+    <cmp:sevenz dest="${dest}" mode="update">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogContains
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsUptodate
+       src="${dest}" dest="${dest}.bak"/>
+  </target>
+
+  <target name="testUpdateOfOutOfDate" depends="-prepareArchiveForModeTests">
+    <touch file="${input}/ar-test.xml"/>
+    <cmp:sevenz dest="${dest}" mode="update">
+      <fileset dir="${input}" includes="ar-test.xml,zip-test.xml"/>
+    </cmp:sevenz>
+    <au:assertLogDoesntContain
+       text="test.7z is up-to-date, nothing to do."/>
+    <au:assertDestIsOutofdate
+       src="${dest}" dest="${dest}.bak"/>
+    <assertResourceExists>
+      <cmp:sevenzentry name="tar-test.xml">
+        <file file="${dest}"/>
+      </cmp:sevenzentry>
+    </assertResourceExists>
+    <au:assertFalse>
+      <cond:islastmodified datetime="${timestamp}"
+                           pattern="yyyy-MM-dd-HH:mm:ss Z">
+        <cmp:sevenzentry name="zip-test.xml">
+          <file file="${dest}"/>
+        </cmp:sevenzentry>
+      </cond:islastmodified>
+    </au:assertFalse>
+  </target>
+
+</project>
diff --git a/src/tests/antunit/un7z-test.xml b/src/tests/antunit/un7z-test.xml
index 739d041..2ea0dea 100644
--- a/src/tests/antunit/un7z-test.xml
+++ b/src/tests/antunit/un7z-test.xml
@@ -26,11 +26,10 @@
     <mkdir dir="${input}"/>
   </target>
 
-  <!--
   <target name="testAgainstAntlib7zTask" depends="setUp">
-    <cmp:7z destfile="${input}/test.7z">
+    <cmp:sevenz destfile="${input}/test.7z">
       <fileset dir="." includes="un7z-test.xml"/>
-    </cmp:7z>
+    </cmp:sevenz>
     <cmp:un7z src="${input}/test.7z" dest="${output}"/>
     <au:assertFileExists file="${output}/un7z-test.xml"/>
     <au:assertFilesMatch
@@ -38,7 +37,6 @@
        expected="un7z-test.xml"
        />
   </target>
-  -->
 
   <target name="testAgainstNative7z" depends="setUp">
     <cmp:un7z src="../resources/asf-logo.gif.7z" dest="${output}" />