From bacc078f88b29dbdfc4fc8e31a86717a59c4e3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Sol=C3=B3rzano?= Date: Mon, 4 Jul 2022 11:46:37 +0200 Subject: [PATCH] Add Integration Test for reproducible builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jorge Solórzano --- .../projects/reproducible/invoker.properties | 17 +++++ src/it/projects/reproducible/pom.xml | 45 +++++++++++++ .../reproducible/src/main/java/foo/Bar.java | 35 ++++++++++ src/it/projects/reproducible/verify.groovy | 65 +++++++++++++++++++ 4 files changed, 162 insertions(+) create mode 100644 src/it/projects/reproducible/invoker.properties create mode 100644 src/it/projects/reproducible/pom.xml create mode 100644 src/it/projects/reproducible/src/main/java/foo/Bar.java create mode 100644 src/it/projects/reproducible/verify.groovy diff --git a/src/it/projects/reproducible/invoker.properties b/src/it/projects/reproducible/invoker.properties new file mode 100644 index 000000000..80190f7e9 --- /dev/null +++ b/src/it/projects/reproducible/invoker.properties @@ -0,0 +1,17 @@ +# 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. +invoker.goals = compile javadoc:jar diff --git a/src/it/projects/reproducible/pom.xml b/src/it/projects/reproducible/pom.xml new file mode 100644 index 000000000..32569ee6f --- /dev/null +++ b/src/it/projects/reproducible/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + foo + bar + 0.1.0-SNAPSHOT + + + UTF-8 + @maven.compiler.source@ + @maven.compiler.target@ + 2020-02-29T23:59:58Z + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + @project.version@ + + + + diff --git a/src/it/projects/reproducible/src/main/java/foo/Bar.java b/src/it/projects/reproducible/src/main/java/foo/Bar.java new file mode 100644 index 000000000..e83ea2278 --- /dev/null +++ b/src/it/projects/reproducible/src/main/java/foo/Bar.java @@ -0,0 +1,35 @@ +package foo; + +/* + * 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. + */ + +/** + * Bar. + */ +public class Bar +{ + /** + * Print "Bar". + */ + public void run() + { + System.out.println( "Bar" ); + } + +} diff --git a/src/it/projects/reproducible/verify.groovy b/src/it/projects/reproducible/verify.groovy new file mode 100644 index 000000000..83d30ed8f --- /dev/null +++ b/src/it/projects/reproducible/verify.groovy @@ -0,0 +1,65 @@ +/* + * 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. + */ + +import java.nio.file.attribute.FileTime; +import java.time.Instant; +import java.util.jar.*; + +def target = new File( basedir, 'target' ) +assert target.isDirectory() + +def apidocs = new File( target, 'apidocs' ) +assert apidocs.isDirectory() + +def options = new File( apidocs, 'options' ) +assert options.isFile() +assert options.text.contains( "'Copyright © 2020. All rights reserved.'" ) + +def artifact = new File( target, 'bar-0.1.0-SNAPSHOT-javadoc.jar' ) +assert artifact.isFile() + +// notimestamp in html files +apidocs.eachFileRecurse +{ + if ( it.name.endsWith( '.html' ) ) + { + assert it.text =~ // + } +} + +// Normalize to UTC +long normalizeUTC( String timestamp ) +{ + long millis = Instant.parse( timestamp ).toEpochMilli() + Calendar cal = Calendar.getInstance() + cal.setTimeInMillis( millis ) + return millis - ( cal.get( Calendar.ZONE_OFFSET ) + cal.get( Calendar.DST_OFFSET ) ) +} + +JarFile jar = new JarFile( artifact ) + +// All entries should have the same timestamp +FileTime expectedTimestamp = FileTime.fromMillis( normalizeUTC( "2020-02-29T23:59:58Z" ) ) +def testTimestamp = +{ + JarEntry entry -> assert expectedTimestamp.equals( entry.getLastModifiedTime() ) +} + +jar.stream().forEach( testTimestamp ) +jar.close()