/*
 * 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.
 */
assert new File( basedir, 'target/site' ).exists();
assert new File( basedir, 'target/site' ).isDirectory();

assert new File( basedir, 'target/site/changelog.html' ).exists();
assert new File( basedir, 'target/site/changelog.html' ).isFile();
assert new File( basedir, 'target/site/dev-activity.html' ).exists();
assert new File( basedir, 'target/site/dev-activity.html' ).isFile();
assert new File( basedir, 'target/site/file-activity.html' ).exists();
assert new File( basedir, 'target/site/file-activity.html' ).isFile();

content = new File( basedir, 'build.log' ).text;

assert content.contains( 'Change the default \'svn\' provider implementation to \'javasvn\'.' );

return true;