Compare commits

...

No commits in common. "c8" and "c9s" have entirely different histories.
c8 ... c9s

61 changed files with 5721 additions and 152 deletions

12
.gitignore vendored
View File

@ -1 +1,11 @@
SOURCES/exempi-2.4.5.tar.bz2
exempi-2.1.1.tar.gz
/exempi-2.2.0.tar.bz2
/exempi-2.2.1.tar.bz2
/exempi-2.3.0.tar.bz2
/exempi-2.4.0.tar.bz2
/exempi-2.4.1.tar.bz2
/exempi-2.4.2.tar.bz2
/exempi-2.4.4.tar.bz2
/exempi-2.4.5.tar.bz2
/exempi-2.5.1.tar.bz2
/exempi-e23c21380f467f1f1c9dc397e0a08405fb4afa7a.tar.bz2

View File

@ -1,41 +0,0 @@
From 4f583ff12989f7cea1f81bd2751c321030f1bdbf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= <hub@figuiere.net>
Date: Sun, 28 Jul 2019 10:15:19 -0400
Subject: [PATCH] (CVE-2020-18651) Issue #13 - Fix a buffer a overflow in ID3
support
https://gitlab.freedesktop.org/libopenraw/exempi/issues/13
(cherry picked from commit fdd4765a699f9700850098b43b9798b933acb32f)
---
XMPFiles/source/FormatSupport/ID3_Support.cpp | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/XMPFiles/source/FormatSupport/ID3_Support.cpp b/XMPFiles/source/FormatSupport/ID3_Support.cpp
index dd19c16..4619079 100644
--- a/XMPFiles/source/FormatSupport/ID3_Support.cpp
+++ b/XMPFiles/source/FormatSupport/ID3_Support.cpp
@@ -669,6 +669,10 @@ bool ID3v2Frame::getFrameValue ( XMP_Uns8 majorVersion, XMP_Uns32 logicalID, std
std::string tmp ( this->content, this->contentSize );
bool bigEndian = true; // assume for now (if no BOM follows)
+ if (pos + 2 > this->contentSize) {
+ // No enough for the string
+ break;
+ }
if ( GetUns16BE ( &this->content[pos] ) == 0xFEFF ) {
pos += 2;
bigEndian = true;
@@ -686,6 +690,10 @@ bool ID3v2Frame::getFrameValue ( XMP_Uns8 majorVersion, XMP_Uns32 logicalID, std
{
if ( commMode && (! advancePastCOMMDescriptor ( pos )) ) return false; // not a frame of interest!
+ if (pos + 4 > this->contentSize) {
+ // No enough for the string
+ break;
+ }
if ( (GetUns32BE ( &this->content[pos]) & 0xFFFFFF00 ) == 0xEFBBBF00 ) {
pos += 3; // swallow any BOM, just in case
}
--
2.41.0

View File

@ -1,38 +0,0 @@
From a3b1e52e5a5836fe1fd07013a2a098518b1801de Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= <hub@figuiere.net>
Date: Sat, 27 Jul 2019 20:42:51 -0400
Subject: [PATCH] (CVE-20220-18652) Bug #12 - Invalid WebP cause memory
overflow.
https://gitlab.freedesktop.org/libopenraw/exempi/issues/12
(cherry picked from commit acee2894ceb91616543927c2a6e45050c60f98f7)
---
XMPFiles/source/FormatSupport/WEBP_Support.cpp | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/XMPFiles/source/FormatSupport/WEBP_Support.cpp b/XMPFiles/source/FormatSupport/WEBP_Support.cpp
index ffaf220..0d4b81d 100644
--- a/XMPFiles/source/FormatSupport/WEBP_Support.cpp
+++ b/XMPFiles/source/FormatSupport/WEBP_Support.cpp
@@ -120,10 +120,16 @@ VP8XChunk::VP8XChunk(Container* parent)
this->data.assign(this->size, 0);
XMP_Uns8* bitstream =
(XMP_Uns8*)parent->chunks[WEBP_CHUNK_IMAGE][0]->data.data();
+ XMP_Uns32 width = 0;
+ XMP_Uns32 height = 0;
// See bug https://bugs.freedesktop.org/show_bug.cgi?id=105247
// bitstream could be NULL.
- XMP_Uns32 width = bitstream ? ((bitstream[7] << 8) | bitstream[6]) & 0x3fff : 0;
- XMP_Uns32 height = bitstream ? ((bitstream[9] << 8) | bitstream[8]) & 0x3fff : 0;
+ // See bug https://gitlab.freedesktop.org/libopenraw/exempi/issues/12
+ // image chunk data could be too short (must be 10)
+ if (parent->chunks[WEBP_CHUNK_IMAGE][0]->data.size() >= 10 && bitstream) {
+ width = ((bitstream[7] << 8) | bitstream[6]) & 0x3fff;
+ height = ((bitstream[9] << 8) | bitstream[8]) & 0x3fff;
+ }
this->width(width);
this->height(height);
parent->vp8x = this;
--
2.41.0

View File

@ -1,43 +0,0 @@
From 487f4136013d9fa3351b863e5f861463a1cbddcf Mon Sep 17 00:00:00 2001
From: Victor Rodriguez <victor.rodriguez.bahena@intel.com>
Date: Sat, 18 Aug 2018 13:54:55 +0000
Subject: [PATCH] Issue #9 - Fix null-pointer-dereference (CVE-2018-12648)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The WEBP::GetLE32 function in
XMPFiles/source/FormatSupport/WEBP_Support.hpp in Exempi 2.4.5 has a
NULL pointer dereference.
https://bugs.freedesktop.org/show_bug.cgi?id=106981
https://gitlab.freedesktop.org/libopenraw/exempi/issues/9
Signed-off-by: Victor Rodriguez <victor.rodriguez.bahena@intel.com>
Signed-off-by: Hubert Figuière <hub@figuiere.net>
---
XMPFiles/source/FormatSupport/WEBP_Support.cpp | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/XMPFiles/source/FormatSupport/WEBP_Support.cpp b/XMPFiles/source/FormatSupport/WEBP_Support.cpp
index ffaf220..4fe705b 100644
--- a/XMPFiles/source/FormatSupport/WEBP_Support.cpp
+++ b/XMPFiles/source/FormatSupport/WEBP_Support.cpp
@@ -160,9 +160,11 @@ bool VP8XChunk::xmp()
}
void VP8XChunk::xmp(bool hasXMP)
{
- XMP_Uns32 flags = GetLE32(&this->data[0]);
- flags ^= (-hasXMP ^ flags) & (1 << XMP_FLAG_BIT);
- PutLE32(&this->data[0], flags);
+ if (&this->data[0] != NULL) {
+ XMP_Uns32 flags = GetLE32(&this->data[0]);
+ flags ^= (-hasXMP ^ flags) & (1 << XMP_FLAG_BIT);
+ PutLE32(&this->data[0], flags);
+ }
}
Container::Container(WEBP_MetaHandler* handler) : Chunk(NULL, handler)
--
2.17.1

View File

@ -0,0 +1,27 @@
From d45c06270576493e1537080fa43c1af667c4337a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nikola=20Forr=C3=B3?= <nforro@redhat.com>
Date: Tue, 12 Oct 2021 14:15:17 +0200
Subject: [PATCH] Avoid multiple definitions of typeinfos
---
XMPFiles/source/XMPFiles_Impl.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/XMPFiles/source/XMPFiles_Impl.cpp b/XMPFiles/source/XMPFiles_Impl.cpp
index 2f918ac..ff45040 100644
--- a/XMPFiles/source/XMPFiles_Impl.cpp
+++ b/XMPFiles/source/XMPFiles_Impl.cpp
@@ -47,7 +47,9 @@ using namespace std;
/// This file ...
///
// =================================================================================================
-#include "public/include/XMP.incl_cpp"
+#if ! XMP_StaticBuild
+ #include "public/include/XMP.incl_cpp"
+#endif
#if XMP_WinBuild
#pragma warning ( disable : 4290 ) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
--
2.33.0

View File

@ -1,18 +1,20 @@
%global commit e23c21380f467f1f1c9dc397e0a08405fb4afa7a
%global shortcommit %%(c=%{commit}; echo ${c:0:7})
%global date 20211007
Summary: Library for easy parsing of XMP metadata
Name: exempi
Version: 2.4.5
Release: 4%{?dist}
Version: 2.6.0
Release: 0.2.%{date}git%{shortcommit}%{?dist}
License: BSD
Group: System Environment/Libraries
URL: http://libopenraw.freedesktop.org/wiki/Exempi
Source0: http://libopenraw.freedesktop.org/download/%{name}-%{version}.tar.bz2
Patch0: CVE-2018-12648.patch
Patch0001: 0001-CVE-2020-18651-Issue-13-Fix-a-buffer-a-overflow-in-I.patch
Patch0002: 0002-CVE-20220-18652-Bug-12-Invalid-WebP-cause-memory-ove.patch
Source0: https://gitlab.freedesktop.org/libopenraw/%{name}/-/archive/%{commit}/%{name}-%{commit}.tar.bz2
Patch0: exempi-e23c213-typeinfos.patch
BuildRequires: gcc-c++
BuildRequires: boost-devel expat-devel zlib-devel pkgconfig
# Work around for aarch64 support (https://bugzilla.redhat.com/show_bug.cgi?id=925327)
BuildRequires: autoconf automake libtool
BuildRequires: make
Provides: bundled(md5-polstra)
%description
@ -22,7 +24,6 @@ It includes XMPCore and XMPFiles.
%package devel
Summary: Headers for developing programs that will use %{name}
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: pkgconfig
@ -31,14 +32,11 @@ This package contains the libraries and header files needed for
developing with exempi.
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%autosetup -p1 -n %{name}-%{commit}
%build
libtoolize -vi
./autogen.sh
NOCONFIGURE=1 ./autogen.sh
# BanEntityUsage needed for #888765
%configure CPPFLAGS="-I%{_includedir} -fno-strict-aliasing -DBanAllEntityUsage=1"
@ -46,44 +44,88 @@ libtoolize -vi
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
make %{?_smp_mflags} V=1
%make_build
%check
%ifarch s390x
# testcore test fails on big endian arches since exempi 2.5.2:
# https://gitlab.freedesktop.org/libopenraw/exempi/-/issues/23
make check || [ "$(grep '^FAIL:' exempi/test-suite.log)" = "FAIL: tests/testcore" ]
%else
make check
%endif
%install
make DESTDIR=%{buildroot} install
%make_install
rm -rf %{buildroot}%{_libdir}/*.la
rm -rf %{buildroot}%{_libdir}/*.a
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files
%doc AUTHORS ChangeLog COPYING README
%{_bindir}/exempi
%{_libdir}/*.so.*
%{_libdir}/libexempi.so.8*
%{_mandir}/man1/exempi.1*
%files devel
%{_includedir}/exempi-2.0/
%{_libdir}/*.so
%{_libdir}/libexempi.so
%{_libdir}/pkgconfig/*.pc
%changelog
* Mon Jan 08 2024 Matej Mužila <mmuzila@redhat.com> - 2.4.5-4
- Fix CVE-2020-18652
- Resolves: RHEL-5416
* Wed Nov 03 2021 Nikola Forró <nforro@redhat.com> - 2.6.0-0.2.20211007gite23c213
- Add modified upstream test suite as a gating test
Related #1989405
* Mon Jan 08 2024 Matej Mužila <mmuzila@redhat.com> - 2.4.5-3
- Fix CVE-2020-18651
- Resolves: RHEL-5415
* Wed Oct 20 2021 Nikola Forró <nforro@redhat.com> - 2.6.0-0.1.20211007gite23c213
- Update to (unreleased) version 2.6.0 to resolve licensing issues
Resolves #1989405
* Wed Sep 26 2018 Nikola Forró <nforro@redhat.com> - 2.4.5-2
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 2.5.1-8
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 2.5.1-7
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 2.5.1-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Jul 28 2020 Jeff Law <law@redhat.com> - 2.5.1-5
- Force C++14 as this code is not C++17 ready
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.5.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue Jul 14 2020 Tom Stellard <tstellar@redhat.com> - 2.5.1-3
- Use make macros
- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.5.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Fri Aug 30 2019 Nikola Forró <nforro@redhat.com> - 2.5.1-1
- Update to version 2.5.1
Resolves #1747391
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 2.4.5-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 2.4.5-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Tue Oct 9 2018 Owen Taylor <otaylor@redhat.com> - 2.4.5-5
- Set NOCONFIGURE when running autogen.sh to avoid running configure twice
* Wed Sep 26 2018 Nikola Forró <nforro@redhat.com> - 2.4.5-4
- Fix CVE-2018-12648
Resolves #1594644
Resolves #1594643
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 2.4.5-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Thu Jun 28 2018 Nikola Forró <nforro@redhat.com> - 2.4.5-2
- Remove ldconfig from scriptlets
* Tue Mar 13 2018 Nikola Forró <nforro@redhat.com> - 2.4.5-1
- Update to version 2.4.5

6
gating.yaml Normal file
View File

@ -0,0 +1,6 @@
--- !Policy
product_versions:
- rhel-9
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (exempi-e23c21380f467f1f1c9dc397e0a08405fb4afa7a.tar.bz2) = ad7142712c99bec02e1f119293e095b68db99d303f5c21d47b8658cf43b84f2aa48b78dd49565eb80dc1888e8c1bcfb376686ef690f2a052c415180fa1af13d4

4
tests/exempi/Makefile.am Normal file
View File

@ -0,0 +1,4 @@
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = exempi
DIST_SUBDIRS = exempi

7
tests/exempi/README Normal file
View File

@ -0,0 +1,7 @@
exempi test suite modified to run against installed exempi
All files except the following are taken unmodified from upstream tarball:
configure.ac
Makefile.am
exempi/Makefile.am

41
tests/exempi/configure.ac Normal file
View File

@ -0,0 +1,41 @@
AC_PREREQ(2.50)
AC_INIT(exempi-tests,0.1)
AM_INIT_AUTOMAKE([foreign dist-bzip2 subdir-objects])
AM_MAINTAINER_MODE
m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
AM_SILENT_RULES([yes])
EXEMPI_MAJOR_VERSION=2.0
AC_SUBST(EXEMPI_MAJOR_VERSION)
EXEMPI_INCLUDE_BASE=exempi-$EXEMPI_MAJOR_VERSION
AC_SUBST(EXEMPI_INCLUDE_BASE)
AC_CONFIG_MACRO_DIR([m4])
AC_PROG_CC
AC_PROG_CXX
AC_PROG_LIBTOOL
AX_CXX_COMPILE_STDCXX_11(noext,mandatory)
AC_C_BIGENDIAN
AC_DEFINE(CHECKED_ENDIANNESS)
ENABLE_UNITTEST=yes
BOOST_REQUIRE([1.48.0])
BOOST_TEST([mt-s])
AC_DEFINE(UNIX_ENV, [1])
AM_CONDITIONAL(WITH_UNIT_TEST, test x$ENABLE_UNITTEST = xyes)
VALGRIND=
AC_SUBST(VALGRIND)
AC_LANG_CPLUSPLUS
AC_LANG_COMPILER_REQUIRE
AC_OUTPUT([
Makefile
exempi/Makefile
])

View File

@ -0,0 +1,99 @@
AUTOMAKE_OPTIONS = parallel-tests
TEST_EXTENSIONS = .sh
if WITH_UNIT_TEST
check_PROGRAMS = testexempicore testserialise \
testwritenewprop \
testtiffleak testxmpfiles testxmpfileswrite \
testparse testiterator testinit testfdo18635\
testfdo83313 testcpp testwebp \
testxmpformat \
$(NULL)
TESTS = testinit testexempicore testserialise \
testwritenewprop \
testtiffleak testxmpfiles testxmpfileswrite \
testparse testiterator testfdo18635 testfdo83313 testcpp testwebp \
testxmpformat \
$(NULL)
TESTS_ENVIRONMENT = TEST_DIR=$(srcdir)/tests BOOST_TEST_CATCH_SYSTEM_ERRORS=no VALGRIND="$(VALGRIND)"
LOG_COMPILER = $(VALGRIND)
endif
check_DATA = tests/test1.xmp tests/fdo18635.jpg tests/fdo83313.jpg
noinst_HEADERS = tests/utils.h
EXTRA_DIST = $(check_DATA) $(check_SCRIPTS)
CLEANFILES = test.jpg test.webp
AM_CXXFLAGS = @BOOST_CPPFLAGS@
testinit_SOURCES = tests/testinit.cpp tests/utils.cpp
testinit_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testinit_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testinit_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testexempicore_SOURCES = tests/test-exempi-core.cpp tests/utils.cpp
testexempicore_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testexempicore_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testexempicore_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testserialise_SOURCES = tests/test-serialise.cpp tests/utils.cpp
testserialise_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testserialise_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testserialise_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testwritenewprop_SOURCES = tests/test-write-new-prop.cpp tests/utils.cpp
testwritenewprop_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testwritenewprop_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testwritenewprop_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testtiffleak_SOURCES = tests/test-tiff-leak.cpp tests/utils.cpp
testtiffleak_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testtiffleak_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testtiffleak_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testxmpfiles_SOURCES = tests/test-xmpfiles.cpp tests/utils.cpp
testxmpfiles_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testxmpfiles_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testxmpfiles_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testxmpfileswrite_SOURCES = tests/test-xmpfiles-write.cpp tests/utils.cpp
testxmpfileswrite_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testxmpfileswrite_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testxmpfileswrite_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testparse_SOURCES = tests/testparse.cpp tests/utils.cpp
testparse_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testparse_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testparse_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testiterator_SOURCES = tests/test-iterator.cpp tests/utils.cpp
testiterator_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testiterator_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testiterator_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testfdo18635_SOURCES = tests/test-bgo.cpp tests/utils.cpp
testfdo18635_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testfdo18635_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testfdo18635_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testfdo83313_SOURCES = tests/test-fdo83313.cpp tests/utils.cpp
testfdo83313_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testfdo83313_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testfdo83313_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testcpp_SOURCES = tests/testcpp.cpp tests/utils.cpp
testcpp_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testcpp_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testcpp_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testwebp_SOURCES = tests/test-webp.cpp tests/utils.cpp
testwebp_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testwebp_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testwebp_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi
testxmpformat_SOURCES = tests/test-xmpformat.cpp
testxmpformat_LDADD = -lexempi @BOOST_UNIT_TEST_FRAMEWORK_LIBS@
testxmpformat_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@
testxmpformat_CPPFLAGS = -I$(includedir)/@EXEMPI_INCLUDE_BASE@ -I$(includedir)/@EXEMPI_INCLUDE_BASE@/exempi

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,74 @@
/*
* exempi - test-bgo.cpp
*
* Copyright (C) 2007-2008 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmpconsts.h"
#include "xmp.h"
int test_main(int argc, char* argv[])
{
prepare_test(argc, argv, "fdo18635.jpg");
BOOST_CHECK(xmp_init());
XmpFilePtr xf = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ);
BOOST_CHECK(xf != NULL);
if (xf == NULL) {
return 1;
}
XmpPtr xmp = xmp_files_get_new_xmp(xf);
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_free(xf));
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,235 @@
/*
* exempi - test-exempi-core.cpp
*
* Copyright (C) 2007-2013 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmpconsts.h"
#include "xmp.h"
using boost::unit_test::test_suite;
// void test_exempi()
int test_main(int argc, char *argv[])
{
prepare_test(argc, argv, "test1.xmp");
size_t len;
char *buffer;
FILE *f = fopen(g_testfile.c_str(), "rb");
BOOST_CHECK(f != NULL);
if (f == NULL) {
exit(128);
}
fseek(f, 0, SEEK_END);
len = ftell(f);
fseek(f, 0, SEEK_SET);
buffer = (char *)malloc(len + 1);
size_t rlen = fread(buffer, 1, len, f);
BOOST_CHECK(rlen == len);
BOOST_CHECK(len != 0);
BOOST_CHECK(xmp_init());
// See https://bugs.freedesktop.org/show_bug.cgi?id=53983
// It is recognized as unknown.
BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_UNKNOWN);
XmpPtr xmp = xmp_new_empty();
BOOST_CHECK(xmp_parse(xmp, buffer, len));
BOOST_CHECK(xmp != NULL);
XmpStringPtr the_prop = xmp_string_new();
BOOST_CHECK(xmp_string_len(the_prop) == 0);
BOOST_CHECK(xmp_has_property(xmp, NS_TIFF, "Make"));
BOOST_CHECK(!xmp_has_property(xmp, NS_TIFF, "Foo"));
BOOST_CHECK(xmp_get_property(xmp, NS_TIFF, "Make", the_prop, NULL));
BOOST_CHECK(strcmp("Canon", xmp_string_cstr(the_prop)) == 0);
BOOST_CHECK(xmp_string_len(the_prop) == 5);
BOOST_CHECK(xmp_set_property(xmp, NS_TIFF, "Make", "Leica", 0));
BOOST_CHECK(xmp_get_property(xmp, NS_TIFF, "Make", the_prop, NULL));
BOOST_CHECK(strcmp("Leica", xmp_string_cstr(the_prop)) == 0);
BOOST_CHECK(xmp_string_len(the_prop) == 5);
uint32_t bits;
BOOST_CHECK(
xmp_get_property(xmp, NS_DC, "rights[1]/?xml:lang", the_prop, &bits));
BOOST_CHECK(bits == 0x20);
BOOST_CHECK(XMP_IS_PROP_QUALIFIER(bits));
BOOST_CHECK(xmp_get_property(xmp, NS_DC, "rights[1]", the_prop, &bits));
BOOST_CHECK(bits == 0x50);
BOOST_CHECK(XMP_HAS_PROP_QUALIFIERS(bits));
XmpStringPtr the_lang = xmp_string_new();
BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", NULL, "x-default",
the_lang, the_prop, &bits));
BOOST_CHECK(strcmp("x-default", xmp_string_cstr(the_lang)) == 0);
BOOST_CHECK(strcmp("2006, Hubert Figuiere", xmp_string_cstr(the_prop)) == 0);
// This will modify the default property.
BOOST_CHECK(
xmp_set_localized_text(xmp, NS_DC, "rights", "en", "en-CA", "Foo Bar", 0));
// Ask for the en_US alternative.
BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", "en", "en-US",
the_lang, the_prop, &bits));
// And we only got the "en-CA" as the only "en"
BOOST_CHECK(strcmp("en-US", xmp_string_cstr(the_lang)) != 0);
BOOST_CHECK(strcmp("en-CA", xmp_string_cstr(the_lang)) == 0);
// Check its value
BOOST_CHECK(strcmp("Foo Bar", xmp_string_cstr(the_prop)) == 0);
// The default property is supposed to have been changed too.
BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", NULL, "x-default",
the_lang, the_prop, &bits));
BOOST_CHECK(strcmp("Foo Bar", xmp_string_cstr(the_prop)) == 0);
// This should also remove the property x-default. (SDK 5.2.2)
BOOST_CHECK(xmp_delete_localized_text(xmp, NS_DC, "rights", "en", "en-CA"));
BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "rights[1]"));
BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "rights[2]"));
xmp_string_free(the_lang);
BOOST_CHECK(xmp_set_array_item(xmp, NS_DC, "creator", 2, "foo", 0));
BOOST_CHECK(xmp_get_array_item(xmp, NS_DC, "creator", 2, the_prop, &bits));
BOOST_CHECK(XMP_IS_PROP_SIMPLE(bits));
BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0);
BOOST_CHECK(xmp_append_array_item(xmp, NS_DC, "creator", 0, "bar", 0));
BOOST_CHECK(xmp_get_array_item(xmp, NS_DC, "creator", 3, the_prop, &bits));
BOOST_CHECK(XMP_IS_PROP_SIMPLE(bits));
BOOST_CHECK(strcmp("bar", xmp_string_cstr(the_prop)) == 0);
BOOST_CHECK(xmp_delete_property(xmp, NS_DC, "creator[3]"));
BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "creator[3]"));
BOOST_CHECK(
xmp_get_property(xmp, NS_EXIF, "DateTimeOriginal", the_prop, NULL));
BOOST_CHECK(strcmp("2006-12-07T23:20:43-05:00", xmp_string_cstr(the_prop)) ==
0);
BOOST_CHECK(xmp_get_property(xmp, NS_XAP, "Rating", the_prop, NULL));
BOOST_CHECK(strcmp("3", xmp_string_cstr(the_prop)) == 0);
xmp_string_free(the_prop);
// testing date time get
XmpDateTime the_dt;
bool ret;
BOOST_CHECK(ret = xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal",
&the_dt, NULL));
BOOST_CHECK(the_dt.year == 2006);
BOOST_CHECK(the_dt.minute == 20);
BOOST_CHECK(the_dt.tzSign == XMP_TZ_WEST);
// testing compare
XmpDateTime the_other_dt;
BOOST_CHECK(ret = xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal",
&the_other_dt, NULL));
BOOST_CHECK(xmp_datetime_compare(&the_dt, &the_other_dt) == 0);
the_other_dt.year++;
BOOST_CHECK(xmp_datetime_compare(&the_dt, &the_other_dt) < 0);
BOOST_CHECK(xmp_datetime_compare(&the_other_dt, &the_dt) > 0);
// NULL checks - this is Exempi API
BOOST_CHECK(xmp_datetime_compare(NULL, NULL) == 0);
BOOST_CHECK(xmp_datetime_compare(NULL, &the_other_dt) < 0);
BOOST_CHECK(xmp_datetime_compare(&the_other_dt, NULL) > 0);
// testing float get set
double float_value = 0.0;
BOOST_CHECK(xmp_get_property_float(xmp, NS_CAMERA_RAW_SETTINGS,
"SharpenRadius", &float_value, NULL));
BOOST_CHECK(float_value == 1.0);
BOOST_CHECK(xmp_set_property_float(xmp, NS_CAMERA_RAW_SETTINGS,
"SharpenRadius", 2.5, 0));
BOOST_CHECK(xmp_get_property_float(xmp, NS_CAMERA_RAW_SETTINGS,
"SharpenRadius", &float_value, NULL));
BOOST_CHECK(float_value == 2.5);
// testing bool get set
bool bool_value = true;
BOOST_CHECK(xmp_get_property_bool(xmp, NS_CAMERA_RAW_SETTINGS,
"AlreadyApplied", &bool_value, NULL));
BOOST_CHECK(!bool_value);
BOOST_CHECK(xmp_set_property_bool(xmp, NS_CAMERA_RAW_SETTINGS,
"AlreadyApplied", true, 0));
BOOST_CHECK(xmp_get_property_bool(xmp, NS_CAMERA_RAW_SETTINGS,
"AlreadyApplied", &bool_value, NULL));
BOOST_CHECK(bool_value);
// testing int get set
int32_t value = 0;
BOOST_CHECK(
xmp_get_property_int32(xmp, NS_EXIF, "MeteringMode", &value, NULL));
BOOST_CHECK(value == 5);
BOOST_CHECK(xmp_set_property_int32(xmp, NS_EXIF, "MeteringMode", 10, 0));
int64_t valuelarge = 0;
BOOST_CHECK(
xmp_get_property_int64(xmp, NS_EXIF, "MeteringMode", &valuelarge, NULL));
BOOST_CHECK(valuelarge == 10);
BOOST_CHECK(xmp_set_property_int64(xmp, NS_EXIF, "MeteringMode", 32, 0));
BOOST_CHECK(
xmp_get_property_int32(xmp, NS_EXIF, "MeteringMode", &value, NULL));
BOOST_CHECK(value == 32);
BOOST_CHECK(xmp_free(xmp));
free(buffer);
fclose(f);
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,74 @@
/*
* exempi - test-bgo.cpp
*
* Copyright (C) 2007-2008 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmpconsts.h"
#include "xmp.h"
int test_main(int argc, char* argv[])
{
prepare_test(argc, argv, "fdo83313.jpg");
BOOST_CHECK(xmp_init());
XmpFilePtr xf = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ);
BOOST_CHECK(xf != NULL);
if (xf == NULL) {
return 1;
}
XmpPtr xmp = xmp_files_get_new_xmp(xf);
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_free(xf));
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,174 @@
/*
* exempi - test3.cpp
*
* Copyright (C) 2007-2017 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <array>
#include <iostream>
#include <string>
#include <vector>
#include <boost/test/minimal.hpp>
#include <boost/format.hpp>
#include "utils.h"
#include "xmp.h"
#include "xmpconsts.h"
using boost::unit_test::test_suite;
// void test_exempi_iterate()
int test_main(int argc, char *argv[])
{
prepare_test(argc, argv, "test1.xmp");
size_t len;
char *buffer;
FILE *f = fopen(g_testfile.c_str(), "rb");
BOOST_CHECK(f != NULL);
if (f == NULL) {
exit(128);
}
fseek(f, 0, SEEK_END);
len = ftell(f);
fseek(f, 0, SEEK_SET);
buffer = (char *)malloc(len + 1);
size_t rlen = fread(buffer, 1, len, f);
BOOST_CHECK(rlen == len);
BOOST_CHECK(len != 0);
BOOST_CHECK(xmp_init());
XmpPtr xmp = xmp_new_empty();
BOOST_CHECK(xmp_parse(xmp, buffer, len));
BOOST_CHECK(xmp != NULL);
XmpStringPtr the_schema = xmp_string_new();
XmpStringPtr the_path = xmp_string_new();
XmpStringPtr the_prop = xmp_string_new();
uint32_t options;
typedef std::array<std::string, 3> tuple3;
{
// leafnodes iteration
XmpIteratorPtr iter =
xmp_iterator_new(xmp, NS_DC, NULL, XMP_ITER_JUSTLEAFNODES);
BOOST_CHECK(iter);
std::vector<tuple3> props;
while (xmp_iterator_next(iter, the_schema, the_path, the_prop, &options)) {
props.push_back(tuple3 {{
xmp_string_cstr(the_schema),
xmp_string_cstr(the_path),
xmp_string_cstr(the_prop)
}});
}
BOOST_CHECK(props.size() == 7);
for (auto prop_tuple : props) {
BOOST_CHECK(prop_tuple[0] == NS_DC);
}
BOOST_CHECK(props[0][2] == "unknown");
BOOST_CHECK(props[3][1] == "dc:subject[1]");
BOOST_CHECK(xmp_iterator_free(iter));
}
{
// leafname iteration
XmpIteratorPtr iter =
xmp_iterator_new(xmp, NS_DC, "rights", XMP_ITER_JUSTLEAFNAME);
BOOST_CHECK(iter);
std::vector<tuple3> props;
while (xmp_iterator_next(iter, the_schema, the_path, the_prop, &options)) {
props.push_back(tuple3 {{
xmp_string_cstr(the_schema),
xmp_string_cstr(the_path),
xmp_string_cstr(the_prop)
}});
}
BOOST_CHECK(props.size() == 3);
BOOST_CHECK(props[0] == (tuple3{{NS_DC, "dc:rights", ""}}));
BOOST_CHECK(props[1] == (tuple3{{"", "[1]", "2006, Hubert Figuiere"}}));
BOOST_CHECK(props[2] == (tuple3{{NS_XML, "xml:lang", "x-default"}}));
BOOST_CHECK(xmp_iterator_free(iter));
}
{
// Iterator with property but no NS is invalid.
XmpIteratorPtr iter =
xmp_iterator_new(xmp, NULL, "rights", XMP_ITER_JUSTLEAFNODES);
// Invalid iterator
BOOST_CHECK(!iter);
}
{
// Iterating namespaces is invalid.
XmpIteratorPtr iter =
xmp_iterator_new(xmp, NULL, NULL, XMP_ITER_NAMESPACES);
// Invalid iterator
BOOST_CHECK(!iter);
}
xmp_string_free(the_prop);
xmp_string_free(the_path);
xmp_string_free(the_schema);
BOOST_CHECK(xmp_free(xmp));
free(buffer);
fclose(f);
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,102 @@
/*
* exempi - test-serialise.cpp
*
* Copyright (C) 2007-2008 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmpconsts.h"
#include "xmp.h"
using boost::unit_test::test_suite;
// void test_serialize()
int test_main(int argc, char *argv[])
{
prepare_test(argc, argv, "test1.xmp");
size_t len;
char *buffer;
FILE *f = fopen(g_testfile.c_str(), "rb");
fseek(f, 0, SEEK_END);
len = ftell(f);
fseek(f, 0, SEEK_SET);
buffer = (char *)malloc(len + 1);
size_t rlen = fread(buffer, 1, len, f);
BOOST_CHECK(rlen == len);
BOOST_CHECK(len != 0);
buffer[rlen] = 0;
BOOST_CHECK(xmp_init());
BOOST_CHECK(xmp_get_error() == 0);
XmpPtr xmp = xmp_new_empty();
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(xmp_parse(xmp, buffer, len));
BOOST_CHECK(xmp_get_error() == 0);
std::string b1(buffer);
std::string b2;
XmpStringPtr output = xmp_string_new();
BOOST_CHECK(xmp_serialize_and_format(
xmp, output, XMP_SERIAL_OMITPACKETWRAPPER, 0, "\n", " ", 0));
BOOST_CHECK(xmp_get_error() == 0);
b2 = xmp_string_cstr(output);
// find a way to compare that.
// BOOST_CHECK_EQUAL(b1, b2);
xmp_string_free(output);
BOOST_CHECK(xmp_free(xmp));
free(buffer);
fclose(f);
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,86 @@
/*
* exempi - test-tiff-leak.cpp
*
* Copyright (C) 2007-2008,2010 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmp.h"
#include "xmpconsts.h"
/** See http://www.adobeforums.com/webx/.3bc42b73 for the orignal
* test case */
// void test_tiff_leak()
int test_main(int argc, char *argv[])
{
prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg");
std::string orig_tiff_file =
g_src_testdir + "../../samples/testfiles/BlueSquare.tif";
BOOST_CHECK(copy_file(orig_tiff_file, "test.tif"));
BOOST_CHECK(chmod("test.tif", S_IRUSR | S_IWUSR) == 0);
BOOST_CHECK(xmp_init());
XmpFilePtr f = xmp_files_open_new("test.tif", XMP_OPEN_FORUPDATE);
BOOST_CHECK(f != NULL);
if (f == NULL) {
return 1;
}
XmpPtr xmp;
BOOST_CHECK(xmp = xmp_files_get_new_xmp(f));
BOOST_CHECK(xmp != NULL);
xmp_set_localized_text(xmp, NS_DC, "description", "en", "en-US", "foo", 0);
BOOST_CHECK(xmp_files_put_xmp(f, xmp));
BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION));
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_free(f));
xmp_terminate();
BOOST_CHECK(unlink("test.tif") == 0);
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,119 @@
/*
* exempi - test-webp.cpp
*
* Copyright (C) 2007-2016 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmp.h"
#include "xmpconsts.h"
using boost::unit_test::test_suite;
int test_main(int argc, char *argv[])
{
prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.webp");
BOOST_CHECK(xmp_init());
BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_WEBP);
XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ);
BOOST_CHECK(f != NULL);
if (f == NULL) {
return 1;
}
XmpPtr xmp = xmp_files_get_new_xmp(f);
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_files_free(f));
BOOST_CHECK(copy_file(g_testfile, "test.webp"));
BOOST_CHECK(chmod("test.webp", S_IRUSR | S_IWUSR) == 0);
BOOST_CHECK(xmp_files_check_file_format("test.webp") == XMP_FT_WEBP);
f = xmp_files_open_new("test.webp", XMP_OPEN_FORUPDATE);
BOOST_CHECK(f != NULL);
if (f == NULL) {
return 2;
}
BOOST_CHECK(xmp_set_property(xmp, NS_PHOTOSHOP, "ICCProfile", "foo", 0));
BOOST_CHECK(xmp_files_can_put_xmp(f, xmp));
BOOST_CHECK(xmp_files_put_xmp(f, xmp));
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_SAFEUPDATE));
BOOST_CHECK(xmp_files_free(f));
f = xmp_files_open_new("test.webp", XMP_OPEN_READ);
BOOST_CHECK(f != NULL);
if (f == NULL) {
return 3;
}
xmp = xmp_files_get_new_xmp(f);
BOOST_CHECK(xmp != NULL);
XmpStringPtr the_prop = xmp_string_new();
BOOST_CHECK(
xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL));
BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0);
xmp_string_free(the_prop);
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION));
BOOST_CHECK(xmp_files_free(f));
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,150 @@
/*
* exempi - test1.cpp
*
* Copyright (C) 2007-2008 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmpconsts.h"
#include "xmp.h"
using boost::unit_test::test_suite;
// void test_write_new_property()
int test_main(int argc, char *argv[])
{
prepare_test(argc, argv, "test1.xmp");
size_t len;
char *buffer;
FILE *f = fopen(g_testfile.c_str(), "rb");
BOOST_CHECK(f != NULL);
if (f == NULL) {
exit(128);
}
fseek(f, 0, SEEK_END);
len = ftell(f);
fseek(f, 0, SEEK_SET);
buffer = (char *)malloc(len + 1);
size_t rlen = fread(buffer, 1, len, f);
BOOST_CHECK(rlen == len);
BOOST_CHECK(len != 0);
BOOST_CHECK(xmp_init());
BOOST_CHECK(xmp_get_error() == 0);
XmpPtr xmp = xmp_new_empty();
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(xmp_parse(xmp, buffer, len));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(xmp != NULL);
XmpStringPtr reg_prefix = xmp_string_new();
BOOST_CHECK(xmp_register_namespace(NS_CC, "cc", reg_prefix));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(strcmp("cc:", xmp_string_cstr(reg_prefix)) == 0);
BOOST_CHECK(xmp_prefix_namespace_uri("cc", reg_prefix));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(strcmp(NS_CC, xmp_string_cstr(reg_prefix)) == 0);
BOOST_CHECK(xmp_namespace_prefix(NS_CC, reg_prefix));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(strcmp("cc:", xmp_string_cstr(reg_prefix)) == 0);
xmp_string_free(reg_prefix);
BOOST_CHECK(xmp_set_property(xmp, NS_CC, "License", "Foo", 0));
BOOST_CHECK(xmp_get_error() == 0);
XmpStringPtr the_prop = xmp_string_new();
BOOST_CHECK(xmp_get_property(xmp, NS_CC, "License", the_prop, NULL));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(strcmp("Foo", xmp_string_cstr(the_prop)) == 0);
XmpDateTime the_dt;
the_dt.year = 2005;
the_dt.month = 12;
the_dt.day = 25;
the_dt.hour = 12;
the_dt.minute = 42;
the_dt.second = 42;
the_dt.tzSign = XMP_TZ_UTC;
the_dt.tzHour = 0;
the_dt.tzMinute = 0;
the_dt.nanoSecond = 0;
BOOST_CHECK(
xmp_set_property_date(xmp, NS_EXIF, "DateTimeOriginal", &the_dt, 0));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(
xmp_get_property(xmp, NS_EXIF, "DateTimeOriginal", the_prop, NULL));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(strcmp("2005-12-25T12:42:42", xmp_string_cstr(the_prop)) == 0);
XmpDateTime the_dt2;
BOOST_CHECK(
xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal", &the_dt2, NULL));
BOOST_CHECK(xmp_get_error() == 0);
BOOST_CHECK(the_dt2.year == 2005);
BOOST_CHECK(the_dt2.minute == 42);
BOOST_CHECK(the_dt2.tzSign == XMP_TZ_UTC);
xmp_string_free(the_prop);
BOOST_CHECK(xmp_free(xmp));
free(buffer);
fclose(f);
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,120 @@
/*
* exempi - test-xmpfile-write.cpp
*
* Copyright (C) 2007-2008,2010 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmp.h"
#include "xmpconsts.h"
using boost::unit_test::test_suite;
// void test_xmpfiles_write()
int test_main(int argc, char *argv[])
{
prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg");
BOOST_CHECK(xmp_init());
BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_JPEG);
XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ);
BOOST_CHECK(f != NULL);
if (f == NULL) {
return 1;
}
XmpPtr xmp = xmp_files_get_new_xmp(f);
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_files_free(f));
BOOST_CHECK(copy_file(g_testfile, "test.jpg"));
BOOST_CHECK(chmod("test.jpg", S_IRUSR | S_IWUSR) == 0);
BOOST_CHECK(xmp_files_check_file_format("test.jpg") == XMP_FT_JPEG);
f = xmp_files_open_new("test.jpg", XMP_OPEN_FORUPDATE);
BOOST_CHECK(f != NULL);
if (f == NULL) {
return 2;
}
BOOST_CHECK(xmp_set_property(xmp, NS_PHOTOSHOP, "ICCProfile", "foo", 0));
BOOST_CHECK(xmp_files_can_put_xmp(f, xmp));
BOOST_CHECK(xmp_files_put_xmp(f, xmp));
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_SAFEUPDATE));
BOOST_CHECK(xmp_files_free(f));
f = xmp_files_open_new("test.jpg", XMP_OPEN_READ);
BOOST_CHECK(f != NULL);
if (f == NULL) {
return 3;
}
xmp = xmp_files_get_new_xmp(f);
BOOST_CHECK(xmp != NULL);
XmpStringPtr the_prop = xmp_string_new();
BOOST_CHECK(
xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL));
BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0);
xmp_string_free(the_prop);
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION));
BOOST_CHECK(xmp_files_free(f));
// unlink("test.jpg");
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,129 @@
/*
* exempi - test-xmpfiles.cpp
*
* Copyright (C) 2007-2016 Hubert Figuière
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmp.h"
#include "xmpconsts.h"
using boost::unit_test::test_suite;
// void test_xmpfiles()
int test_main(int argc, char* argv[])
{
prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg");
BOOST_CHECK(xmp_init());
XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ);
BOOST_CHECK(f != NULL);
if (f == NULL) {
exit(128);
}
BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_JPEG);
XmpStringPtr file_path = xmp_string_new();
XmpOpenFileOptions options;
XmpFileType file_format;
XmpFileFormatOptions handler_flags;
BOOST_CHECK(xmp_files_get_file_info(f, file_path, &options, &file_format,
&handler_flags));
BOOST_CHECK(options == XMP_OPEN_READ);
BOOST_CHECK(file_format == XMP_FT_JPEG);
// the value check might break at each SDK update. You have been warned.
BOOST_CHECK(handler_flags == 0x27f);
BOOST_CHECK(g_testfile == xmp_string_cstr(file_path));
xmp_string_free(file_path);
XmpPtr xmp = xmp_new_empty();
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_files_get_xmp(f, xmp));
{
XmpStringPtr thestring = xmp_string_new();
XmpPacketInfo packet_info;
BOOST_CHECK(xmp_files_get_xmp_xmpstring(f, thestring, &packet_info));
BOOST_CHECK(packet_info.offset == 2189);
BOOST_CHECK(packet_info.length == 4782);
BOOST_CHECK(packet_info.padSize == 2049);
BOOST_CHECK(packet_info.hasWrapper);
const char *xmp_str = xmp_string_cstr(thestring);
BOOST_CHECK(xmp_str);
xmp_string_free(thestring);
}
XmpStringPtr the_prop = xmp_string_new();
BOOST_CHECK(
xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL));
BOOST_CHECK(strcmp("sRGB IEC61966-2.1", xmp_string_cstr(the_prop)) == 0);
xmp_string_free(the_prop);
BOOST_CHECK(xmp_free(xmp));
BOOST_CHECK(xmp_files_free(f));
XmpFileFormatOptions formatOptions;
// the value check might break at each SDK update. You have been warned.
BOOST_CHECK(xmp_files_get_format_info(XMP_FT_JPEG, &formatOptions));
BOOST_CHECK(formatOptions == 0x27f);
BOOST_CHECK(xmp_files_get_format_info(XMP_FT_GIF, &formatOptions));
BOOST_CHECK(formatOptions == 0x46b);
BOOST_CHECK(xmp_files_get_format_info(XMP_FT_PNG, &formatOptions));
BOOST_CHECK(formatOptions == 0x46b);
// PDF doesn't have a smart handler.
BOOST_CHECK(!xmp_files_get_format_info(XMP_FT_PDF, &formatOptions));
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,98 @@
/*
* exempi - test-xmpformat.cpp
*
* Copyright (C) 2020 Hubert Figuière
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <map>
#include <string>
#include <boost/test/minimal.hpp>
#include "xmp.h"
const std::map<const char*, XmpFileType> TEST_CASES = {
{ "avi", XMP_FT_AVI },
{ "eps", XMP_FT_EPS },
{ "gif", XMP_FT_GIF },
{ "indd", XMP_FT_INDESIGN },
{ "jpg", XMP_FT_JPEG },
{ "mov", XMP_FT_MOV },
{ "mp3", XMP_FT_MP3 },
{ "png", XMP_FT_PNG },
{ "psd", XMP_FT_PHOTOSHOP },
{ "tif", XMP_FT_TIFF },
{ "webp", XMP_FT_WEBP },
{ "wav", XMP_FT_WAV }
};
const std::map<const char*, XmpFileType> FAILING_CASES = {
// This is a GIF87a. Not supported.
{ "gif", XMP_FT_UNKNOWN }
};
// Test that the sample files match the file type.
//
// This test would have caught:
// https://gitlab.freedesktop.org/libopenraw/exempi/-/issues/20
//
int test_main(int , char *[])
{
const char* srcdir = getenv("srcdir");
if (!srcdir) {
srcdir = ".";
}
BOOST_CHECK(xmp_init());
for (auto testcase : TEST_CASES) {
std::string imagepath(srcdir);
imagepath += "/../samples/testfiles/BlueSquare.";
imagepath += testcase.first;
printf("%s\n", imagepath.c_str());
auto xft = xmp_files_check_file_format(imagepath.c_str());
BOOST_CHECK(xft == testcase.second);
}
for (auto testcase : FAILING_CASES) {
std::string imagepath(srcdir);
imagepath += "/../samples/testfiles/BlueSquare-FAIL.";
imagepath += testcase.first;
printf("%s\n", imagepath.c_str());
auto xft = xmp_files_check_file_format(imagepath.c_str());
BOOST_CHECK(xft == testcase.second);
}
return 0;
}

View File

@ -0,0 +1,255 @@
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Public XMP Toolkit Core 3.5">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:tiff="http://ns.adobe.com/tiff/1.0/">
<tiff:Make>Canon</tiff:Make>
<tiff:Model>Canon EOS 20D</tiff:Model>
<tiff:Orientation>1</tiff:Orientation>
<tiff:ImageWidth>3504</tiff:ImageWidth>
<tiff:ImageLength>2336</tiff:ImageLength>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:exif="http://ns.adobe.com/exif/1.0/">
<exif:ExifVersion>0221</exif:ExifVersion>
<exif:ExposureTime>15/1</exif:ExposureTime>
<exif:ShutterSpeedValue>-3906891/1000000</exif:ShutterSpeedValue>
<exif:FNumber>8/1</exif:FNumber>
<exif:ApertureValue>6/1</exif:ApertureValue>
<exif:ExposureProgram>1</exif:ExposureProgram>
<exif:DateTimeOriginal>2006-12-07T23:20:43-05:00</exif:DateTimeOriginal>
<exif:DateTimeDigitized>2006-12-07T23:20:43-05:00</exif:DateTimeDigitized>
<exif:ExposureBiasValue>0/2</exif:ExposureBiasValue>
<exif:MaxApertureValue>3625/1000</exif:MaxApertureValue>
<exif:MeteringMode>5</exif:MeteringMode>
<exif:FocalLength>32/1</exif:FocalLength>
<exif:CustomRendered>0</exif:CustomRendered>
<exif:ExposureMode>1</exif:ExposureMode>
<exif:WhiteBalance>0</exif:WhiteBalance>
<exif:SceneCaptureType>0</exif:SceneCaptureType>
<exif:FocalPlaneXResolution>3504000/885</exif:FocalPlaneXResolution>
<exif:FocalPlaneYResolution>2336000/590</exif:FocalPlaneYResolution>
<exif:FocalPlaneResolutionUnit>2</exif:FocalPlaneResolutionUnit>
<exif:ISOSpeedRatings>
<rdf:Seq>
<rdf:li>100</rdf:li>
</rdf:Seq>
</exif:ISOSpeedRatings>
<exif:Flash rdf:parseType="Resource">
<exif:Fired>False</exif:Fired>
<exif:Return>0</exif:Return>
<exif:Mode>2</exif:Mode>
<exif:Function>False</exif:Function>
<exif:RedEyeMode>False</exif:RedEyeMode>
</exif:Flash>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:xap="http://ns.adobe.com/xap/1.0/">
<xap:ModifyDate>2006-12-07T23:20:43-05:00</xap:ModifyDate>
<xap:Rating>3</xap:Rating>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:creator>
<rdf:Seq>
<rdf:li>unknown</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:rights>
<rdf:Alt>
<rdf:li xml:lang="x-default">2006, Hubert Figuiere</rdf:li>
</rdf:Alt>
</dc:rights>
<dc:subject>
<rdf:Bag>
<rdf:li>night</rdf:li>
<rdf:li>ontario</rdf:li>
<rdf:li>ottawa</rdf:li>
<rdf:li>parliament of canada</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:aux="http://ns.adobe.com/exif/1.0/aux/">
<aux:SerialNumber>420103070</aux:SerialNumber>
<aux:LensInfo>24/1 85/1 0/0 0/0</aux:LensInfo>
<aux:Lens>24.0-85.0 mm</aux:Lens>
<aux:ImageNumber>176</aux:ImageNumber>
<aux:FlashCompensation>-2/1</aux:FlashCompensation>
<aux:OwnerName>unknown</aux:OwnerName>
<aux:Firmware>1.1.0</aux:Firmware>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:crs="http://ns.adobe.com/camera-raw-settings/1.0/">
<crs:AlreadyApplied>False</crs:AlreadyApplied>
<crs:WhiteBalance>As Shot</crs:WhiteBalance>
<crs:Exposure>0.00</crs:Exposure>
<crs:Shadows>5</crs:Shadows>
<crs:Brightness>+50</crs:Brightness>
<crs:Contrast>+25</crs:Contrast>
<crs:Saturation>0</crs:Saturation>
<crs:Sharpness>25</crs:Sharpness>
<crs:LuminanceSmoothing>0</crs:LuminanceSmoothing>
<crs:ColorNoiseReduction>25</crs:ColorNoiseReduction>
<crs:ChromaticAberrationR>0</crs:ChromaticAberrationR>
<crs:ChromaticAberrationB>0</crs:ChromaticAberrationB>
<crs:VignetteAmount>0</crs:VignetteAmount>
<crs:ShadowTint>0</crs:ShadowTint>
<crs:RedHue>0</crs:RedHue>
<crs:RedSaturation>0</crs:RedSaturation>
<crs:GreenHue>0</crs:GreenHue>
<crs:GreenSaturation>0</crs:GreenSaturation>
<crs:BlueHue>0</crs:BlueHue>
<crs:BlueSaturation>0</crs:BlueSaturation>
<crs:FillLight>0</crs:FillLight>
<crs:Vibrance>0</crs:Vibrance>
<crs:HighlightRecovery>0</crs:HighlightRecovery>
<crs:Clarity>0</crs:Clarity>
<crs:Defringe>0</crs:Defringe>
<crs:HueAdjustmentRed>0</crs:HueAdjustmentRed>
<crs:HueAdjustmentOrange>0</crs:HueAdjustmentOrange>
<crs:HueAdjustmentYellow>0</crs:HueAdjustmentYellow>
<crs:HueAdjustmentGreen>0</crs:HueAdjustmentGreen>
<crs:HueAdjustmentAqua>0</crs:HueAdjustmentAqua>
<crs:HueAdjustmentBlue>0</crs:HueAdjustmentBlue>
<crs:HueAdjustmentPurple>0</crs:HueAdjustmentPurple>
<crs:HueAdjustmentMagenta>0</crs:HueAdjustmentMagenta>
<crs:SaturationAdjustmentRed>0</crs:SaturationAdjustmentRed>
<crs:SaturationAdjustmentOrange>0</crs:SaturationAdjustmentOrange>
<crs:SaturationAdjustmentYellow>0</crs:SaturationAdjustmentYellow>
<crs:SaturationAdjustmentGreen>0</crs:SaturationAdjustmentGreen>
<crs:SaturationAdjustmentAqua>0</crs:SaturationAdjustmentAqua>
<crs:SaturationAdjustmentBlue>0</crs:SaturationAdjustmentBlue>
<crs:SaturationAdjustmentPurple>0</crs:SaturationAdjustmentPurple>
<crs:SaturationAdjustmentMagenta>0</crs:SaturationAdjustmentMagenta>
<crs:LuminanceAdjustmentRed>0</crs:LuminanceAdjustmentRed>
<crs:LuminanceAdjustmentOrange>0</crs:LuminanceAdjustmentOrange>
<crs:LuminanceAdjustmentYellow>0</crs:LuminanceAdjustmentYellow>
<crs:LuminanceAdjustmentGreen>0</crs:LuminanceAdjustmentGreen>
<crs:LuminanceAdjustmentAqua>0</crs:LuminanceAdjustmentAqua>
<crs:LuminanceAdjustmentBlue>0</crs:LuminanceAdjustmentBlue>
<crs:LuminanceAdjustmentPurple>0</crs:LuminanceAdjustmentPurple>
<crs:LuminanceAdjustmentMagenta>0</crs:LuminanceAdjustmentMagenta>
<crs:SplitToningShadowHue>0</crs:SplitToningShadowHue>
<crs:SplitToningShadowSaturation>0</crs:SplitToningShadowSaturation>
<crs:SplitToningHighlightHue>0</crs:SplitToningHighlightHue>
<crs:SplitToningHighlightSaturation>0</crs:SplitToningHighlightSaturation>
<crs:SplitToningBalance>0</crs:SplitToningBalance>
<crs:ParametricShadows>0</crs:ParametricShadows>
<crs:ParametricDarks>0</crs:ParametricDarks>
<crs:ParametricLights>0</crs:ParametricLights>
<crs:ParametricHighlights>0</crs:ParametricHighlights>
<crs:ParametricShadowSplit>25</crs:ParametricShadowSplit>
<crs:ParametricMidtoneSplit>50</crs:ParametricMidtoneSplit>
<crs:ParametricHighlightSplit>75</crs:ParametricHighlightSplit>
<crs:SharpenRadius>+1.0</crs:SharpenRadius>
<crs:SharpenDetail>25</crs:SharpenDetail>
<crs:SharpenEdgeMasking>0</crs:SharpenEdgeMasking>
<crs:ConvertToGrayscale>False</crs:ConvertToGrayscale>
<crs:ToneCurveName>Medium Contrast</crs:ToneCurveName>
<crs:ToneCurve>
<rdf:Seq>
<rdf:li>0, 0</rdf:li>
<rdf:li>32, 22</rdf:li>
<rdf:li>64, 56</rdf:li>
<rdf:li>128, 128</rdf:li>
<rdf:li>192, 196</rdf:li>
<rdf:li>255, 255</rdf:li>
</rdf:Seq>
</crs:ToneCurve>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:crx="http://ns.adobe.com/lightroom-settings-experimental/1.0/">
<crx:ConvertToGrayscale>false</crx:ConvertToGrayscale>
<crx:SplitToningHighlightHue>0</crx:SplitToningHighlightHue>
<crx:Sharpness>25</crx:Sharpness>
<crx:CropBottom>1</crx:CropBottom>
<crx:GreenSaturation>0</crx:GreenSaturation>
<crx:Exposure>0</crx:Exposure>
<crx:LuminanceAdjustmentGreens>0</crx:LuminanceAdjustmentGreens>
<crx:SplitToningShadowHue>0</crx:SplitToningShadowHue>
<crx:BlueHue>0</crx:BlueHue>
<crx:GreenHue>0</crx:GreenHue>
<crx:FillLight>0</crx:FillLight>
<crx:HueAdjustmentCyans>0</crx:HueAdjustmentCyans>
<crx:SaturationAdjustmentGreens>0</crx:SaturationAdjustmentGreens>
<crx:Saturation>0</crx:Saturation>
<crx:SaturationAdjustmentBlues>0</crx:SaturationAdjustmentBlues>
<crx:VignetteMidpoint>50</crx:VignetteMidpoint>
<crx:ToneHighlightSplit>75</crx:ToneHighlightSplit>
<crx:ToneShadowSplit>25</crx:ToneShadowSplit>
<crx:Contrast>25</crx:Contrast>
<crx:WhiteBalance>As Shot</crx:WhiteBalance>
<crx:HueAdjustmentMagentas>0</crx:HueAdjustmentMagentas>
<crx:HighlightRecovery>0</crx:HighlightRecovery>
<crx:SaturationAdjustmentCyans>0</crx:SaturationAdjustmentCyans>
<crx:GrayMixerYellows>100</crx:GrayMixerYellows>
<crx:HueAdjustmentGreens>0</crx:HueAdjustmentGreens>
<crx:ToneShadows>0</crx:ToneShadows>
<crx:GrayMixerGreens>71</crx:GrayMixerGreens>
<crx:GrayMixerBlues>0</crx:GrayMixerBlues>
<crx:ColorNoiseReduction>25</crx:ColorNoiseReduction>
<crx:ShadowTint>0</crx:ShadowTint>
<crx:Shadows>5</crx:Shadows>
<crx:RedHue>0</crx:RedHue>
<crx:Brightness>50</crx:Brightness>
<crx:BlueSaturation>0</crx:BlueSaturation>
<crx:CropTop>0</crx:CropTop>
<crx:SaturationAdjustmentMagentas>0</crx:SaturationAdjustmentMagentas>
<crx:GrayMixerReds>29</crx:GrayMixerReds>
<crx:AutoBrightness>false</crx:AutoBrightness>
<crx:AutoTonality>false</crx:AutoTonality>
<crx:AutoExposure>false</crx:AutoExposure>
<crx:RedSaturation>0</crx:RedSaturation>
<crx:LuminanceAdjustmentMagentas>0</crx:LuminanceAdjustmentMagentas>
<crx:LuminanceAdjustmentBlues>0</crx:LuminanceAdjustmentBlues>
<crx:HueAdjustmentBlues>0</crx:HueAdjustmentBlues>
<crx:SaturationAdjustmentReds>0</crx:SaturationAdjustmentReds>
<crx:LuminanceAdjustmentYellows>0</crx:LuminanceAdjustmentYellows>
<crx:SplitToningShadowSaturation>0</crx:SplitToningShadowSaturation>
<crx:ChromaticAberrationR>0</crx:ChromaticAberrationR>
<crx:LuminanceAdjustmentCyans>0</crx:LuminanceAdjustmentCyans>
<crx:CropAngle>0</crx:CropAngle>
<crx:ChromaticAberrationB>0</crx:ChromaticAberrationB>
<crx:AutoShadows>false</crx:AutoShadows>
<crx:CropRight>1</crx:CropRight>
<crx:ToneLights>0</crx:ToneLights>
<crx:HueAdjustmentReds>0</crx:HueAdjustmentReds>
<crx:Vibrance>0</crx:Vibrance>
<crx:ToneDarks>0</crx:ToneDarks>
<crx:GrayMixerMagentas>29</crx:GrayMixerMagentas>
<crx:LuminanceSmoothing>0</crx:LuminanceSmoothing>
<crx:SplitToningHighlightSaturation>0</crx:SplitToningHighlightSaturation>
<crx:HueAdjustmentYellows>0</crx:HueAdjustmentYellows>
<crx:GrayMixerCyans>71</crx:GrayMixerCyans>
<crx:ToneMidtoneSplit>50</crx:ToneMidtoneSplit>
<crx:VignetteAmount>0</crx:VignetteAmount>
<crx:AutoContrast>false</crx:AutoContrast>
<crx:CropLeft>0</crx:CropLeft>
<crx:ToneHighlights>0</crx:ToneHighlights>
<crx:AutoGrayscaleWeights>true</crx:AutoGrayscaleWeights>
<crx:SaturationAdjustmentYellows>0</crx:SaturationAdjustmentYellows>
<crx:LuminanceAdjustmentReds>0</crx:LuminanceAdjustmentReds>
<crx:Tint>1</crx:Tint>
<crx:Temperature>4350</crx:Temperature>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:lr="http://ns.adobe.com/lightroom/1.0/">
<lr:hierarchicalKeywords>aGllcmFyY2hpY2FsS2V5d29yZHMgPSB7Cgl7CgkJZmxhdCA9IHsKCQkJIm5pZ2h0IiwKCQl9LAoJCXBhdGggPSB7CgkJCSJuaWdodCIsCgkJfSwKCQlwcmltYXJ5ID0gIm5pZ2h0IiwKCQl1dWlkID0gIkU1RDEwQTFELTU3QUYtMTFEQi04RTMzLTAwMEQ5MzVDODY5QSIsCgl9LAoJewoJCWZsYXQgPSB7CgkJCSJvbnRhcmlvIiwKCQkJIm90dGF3YSIsCgkJfSwKCQlwYXRoID0gewoJCQkib250YXJpbyIsCgkJCSJvdHRhd2EiLAoJCX0sCgkJcHJpbWFyeSA9ICJvdHRhd2EiLAoJCXV1aWQgPSAiQjgzMTc4RkItNTdBRi0xMURCLThFMzMtMDAwRDkzNUM4NjlBIiwKCX0sCgl7CgkJZmxhdCA9IHsKCQkJInBhcmxpYW1lbnQgb2YgY2FuYWRhIiwKCQkJIm9udGFyaW8iLAoJCQkib3R0YXdhIiwKCQl9LAoJCXBhdGggPSB7CgkJCSJvbnRhcmlvIiwKCQkJIm90dGF3YSIsCgkJCSJwYXJsaWFtZW50IG9mIGNhbmFkYSIsCgkJfSwKCQlwcmltYXJ5ID0gInBhcmxpYW1lbnQgb2YgY2FuYWRhIiwKCQl1dWlkID0gIkU1RDMzMEZDLTU3QUYtMTFEQi04RTMzLTAwMEQ5MzVDODY5QSIsCgl9LAp9Cg==</lr:hierarchicalKeywords>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/">
<xmpTPg:MaxPageSize>
<rdf:Description
xmlns:stDim="http:ns.adobe.com/xap/1.0/sType/Dimensions#">
<stDim:w>4</stDim:w>
<stDim:h>3</stDim:h>
<stDim:unit>inches</stDim:unit>
</rdf:Description>
</xmpTPg:MaxPageSize>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
<Iptc4xmpCore:Location>Parliament Hill, Ottawa, Ontario, Canada</Iptc4xmpCore:Location>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>

View File

@ -0,0 +1,69 @@
/*
* exempi - testcpp.cpp
*
* Copyright (C) 2011 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmp.h"
#include "xmpconsts.h"
#include "xmp++.hpp"
using boost::unit_test::test_suite;
int test_main(int /*argc*/, char* /*argv*/ [])
{
// this test is totally useless without leak checking.
// but for compiling.
{
xmp::ScopedPtr<XmpStringPtr> ptr(xmp_string_new());
}
{
xmp::ScopedPtr<XmpFilePtr> ptr(xmp_files_new());
}
{
xmp::ScopedPtr<XmpPtr> ptr(xmp_new_empty());
{
xmp::ScopedPtr<XmpIteratorPtr> iterptr(
xmp_iterator_new(ptr, NS_EXIF, NULL, XMP_ITER_JUSTLEAFNODES));
}
}
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,96 @@
/*
* exempi - testinit.cpp
*
* Copyright (C) 2007 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <boost/test/minimal.hpp>
#include "utils.h"
#include "xmpconsts.h"
#include "xmp.h"
// void test_exempi_init()
int test_main(int argc, char* argv[])
{
prepare_test(argc, argv, "test1.xmp");
size_t len;
char* buffer;
FILE* f = fopen(g_testfile.c_str(), "rb");
BOOST_CHECK(f != NULL);
if (f == NULL) {
exit(128);
}
fseek(f, 0, SEEK_END);
len = ftell(f);
fseek(f, 0, SEEK_SET);
buffer = (char*)malloc(len + 1);
size_t rlen = fread(buffer, 1, len, f);
fclose(f);
BOOST_CHECK(rlen == len);
BOOST_CHECK(len != 0);
BOOST_CHECK(xmp_init());
BOOST_CHECK(xmp_init());
XmpPtr xmp = xmp_new_empty();
BOOST_CHECK(xmp_parse(xmp, buffer, len));
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_free(xmp));
xmp_terminate();
xmp = xmp_new_empty();
BOOST_CHECK(xmp_parse(xmp, buffer, len));
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_free(xmp));
xmp_terminate();
free(buffer);
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,77 @@
/*
* exempi - test3.cpp
*
* Copyright (C) 2007-2017 Hubert Figuiere
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <boost/test/minimal.hpp>
#include <boost/format.hpp>
#include "utils.h"
#include "xmp.h"
#include "xmpconsts.h"
using boost::unit_test::test_suite;
// void test_exempi_iterate()
int test_main(int, char *[])
{
char *buffer;
buffer = strdup("This is not even XML");
size_t len = strlen(buffer);
BOOST_CHECK(len != 0);
BOOST_CHECK(xmp_init());
XmpPtr xmp = xmp_new_empty();
BOOST_CHECK(!xmp_parse(xmp, buffer, len));
BOOST_CHECK(xmp != NULL);
BOOST_CHECK(xmp_free(xmp));
free(buffer);
xmp_terminate();
BOOST_CHECK(!g_lt->check_leaks());
BOOST_CHECK(!g_lt->check_errors());
return 0;
}

View File

@ -0,0 +1,119 @@
/*
* exempi - utils.cpp
*
* Copyright (C) 2007-2016 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <cstdio>
#include <cstdlib>
#include <memory>
#include <boost/test/unit_test.hpp>
#include "utils.h"
std::string g_testfile;
std::string g_src_testdir;
std::unique_ptr<LeakTracker> g_lt(new LeakTracker) ;
void prepare_test(int argc, char *argv[], const char *filename)
{
if (argc == 1) {
// no argument, lets run like we are in "check"
const char *srcdir = getenv("TEST_DIR");
BOOST_ASSERT(srcdir != NULL);
g_src_testdir = std::string(srcdir) + "/";
g_testfile = g_src_testdir + filename;
} else {
g_src_testdir = "./";
g_testfile = argv[1];
}
}
bool copy_file(const std::string &source, const std::string &dest)
{
std::string command = "cp ";
command += source + " " + dest;
return (system(command.c_str()) >= 0);
}
#ifdef HAVE_VALGRIND_MEMCHECK_H
#include <valgrind/memcheck.h>
#include <valgrind/valgrind.h>
#define CC_EXTENSION __extension__
#else
#define VALGRIND_COUNT_ERRORS 0
#define VALGRIND_DO_LEAK_CHECK
#define VALGRIND_COUNT_LEAKS(a, b, c, d) (a = b = c = d = 0)
#define CC_EXTENSION
#endif
LeakTracker::LeakTracker()
: m_leaks(0), m_dubious(0), m_reachable(0), m_suppressed(0), m_errors(0)
{
}
LeakTracker::~LeakTracker()
{
printf("LeakTracker: leaked = %d, errors = %d\n", m_leaks, m_errors);
}
int LeakTracker::check_leaks()
{
int leaked = 0;
int dubious = 0;
int reachable = 0;
int suppressed = 0;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
printf("memleaks: sure:%d dubious:%d reachable:%d suppress:%d\n", leaked,
dubious, reachable, suppressed);
bool has_leaks = (m_leaks != leaked);
m_leaks = leaked;
m_dubious = dubious;
m_reachable = reachable;
m_suppressed = suppressed;
return has_leaks;
}
int LeakTracker::check_errors()
{
int errors = (int)(CC_EXTENSION VALGRIND_COUNT_ERRORS);
bool has_new_errors = (m_errors != errors);
m_errors = errors;
return has_new_errors;
}

View File

@ -0,0 +1,69 @@
/*
* exempi - utils.h
*
* Copyright (C) 2007,2010 Hubert Figuiere
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1 Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2 Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* 3 Neither the name of the Authors, nor the names of its
* contributors may be used to endorse or promote products derived
* from this software wit hout specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __TEST_UTILS_H__
#define __TEST_UTILS_H__
#include <string>
#include <memory>
extern std::string g_testfile;
extern std::string g_src_testdir;
void prepare_test(int argc, char* argv[], const char* filename);
bool copy_file(const std::string& source, const std::string& dest);
class LeakTracker {
public:
LeakTracker();
~LeakTracker();
/** return false if there is NO leak. Will print on stdout */
int check_leaks();
int check_errors();
private:
int m_leaks;
int m_dubious;
int m_reachable;
int m_suppressed;
int m_errors;
};
extern std::unique_ptr<LeakTracker> g_lt;
#endif

View File

@ -0,0 +1,67 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# For every FLAG1, FLAG2 it is checked whether the compiler works with the
# flag. If it does, the flag is added FLAGS-VARIABLE
#
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
# CFLAGS) is used. During the check the flag is always added to the
# current language's flags.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: This macro depends on the AX_APPEND_FLAG and
# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
# AX_APPEND_LINK_FLAGS.
#
# LICENSE
#
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 5
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
for flag in $1; do
AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4])
done
])dnl AX_APPEND_COMPILE_FLAGS

View File

@ -0,0 +1,71 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
#
# DESCRIPTION
#
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
# added in between.
#
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly
# FLAG.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 6
AC_DEFUN([AX_APPEND_FLAG],
[dnl
AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
AS_VAR_SET_IF(FLAGS,[
AS_CASE([" AS_VAR_GET(FLAGS) "],
[*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
[
AS_VAR_APPEND(FLAGS,[" $1"])
AC_RUN_LOG([: FLAGS="$FLAGS"])
])
],
[
AS_VAR_SET(FLAGS,[$1])
AC_RUN_LOG([: FLAGS="$FLAGS"])
])
AS_VAR_POPDEF([FLAGS])dnl
])dnl AX_APPEND_FLAG

View File

@ -0,0 +1,230 @@
##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html
#
# SYNOPSIS
#
# AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]])
#
# DESCRIPTION
#
# AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like
# "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the
# optionflag to CFLAGS if it is understood. You can override the
# shellvar-default of CFLAGS of course. The order of arguments stems
# from the explicit macros like AX_CFLAGS_WARN_ALL.
#
# The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add
# to CXXFLAGS - and it uses the autoconf setup for C++ instead of C
# (since it is possible to use different compilers for C and C++).
#
# The macro is a lot simpler than any special AX_CFLAGS_* macro (or
# ac_cxx_rtti.m4 macro) but allows to check for arbitrary options.
# However, if you use this macro in a few places, it would be great
# if you would make up a new function-macro and submit it to the
# ac-archive.
#
# - $1 option-to-check-for : required ("-option" as non-value)
# - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case)
# - $3 action-if-found : add value to shellvariable
# - $4 action-if-not-found : nothing
#
# note: in earlier versions, $1-$2 were swapped. We try to detect the
# situation and accept a $2=~/-/ as being the old
# option-to-check-for.
#
# also: there are other variants that emerged from the original macro
# variant which did just test an option to be possibly added.
# However, some compilers accept an option silently, or possibly for
# just another option that was not intended. Therefore, we have to do
# a generic test for a compiler family. For gcc we check "-pedantic"
# being accepted which is also understood by compilers who just want
# to be compatible with gcc even when not being made from gcc
# sources.
#
# see also:
#
# AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION
# AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION
#
# LAST MODIFICATION
#
# 2006-12-12
#
# COPYLEFT
#
# Copyright (c) 2006 Guido U. Draheim <guidod@gmx.de>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
# As a special exception, the respective Autoconf Macro's copyright
# owner gives unlimited permission to copy, distribute and modify the
# configure scripts that are the output of Autoconf when processing
# the Macro. You need not follow the terms of the GNU General Public
# License when using or distributing such scripts, even though
# portions of the text of the Macro appear in them. The GNU General
# Public License (GPL) does govern all other use of the material that
# constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the
# Autoconf Macro released by the Autoconf Macro Archive. When you
# make and distribute a modified version of the Autoconf Macro, you
# may extend this special exception to the GPL to apply to your
# modified version as well.
AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$2])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl the only difference - the LANG selection... and the default FLAGS
AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl -------------------------------------------------------------------------
AC_DEFUN([AX_CFLAGS_GCC_OPTION_NEW], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$1])dnl
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"])
m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
dnl the only difference - the LANG selection... and the default FLAGS
AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_NEW], [dnl
AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
done
FLAGS="$ac_save_[]FLAGS"
AC_LANG_RESTORE
])
case ".$VAR" in
.ok|.ok,*) m4_ifvaln($3,$3) ;;
.|.no|.no,*) m4_ifvaln($4,$4) ;;
*) m4_ifvaln($3,$3,[
if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR])
else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"])
m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"
fi ]) ;;
esac
AS_VAR_POPDEF([VAR])dnl
AS_VAR_POPDEF([FLAGS])dnl
])
AC_DEFUN([AX_CFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1,
[AX_CFLAGS_GCC_OPTION_NEW($@)],[AX_CFLAGS_GCC_OPTION_OLD($@)])])
AC_DEFUN([AX_CXXFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1,
[AX_CXXFLAGS_GCC_OPTION_NEW($@)],[AX_CXXFLAGS_GCC_OPTION_OLD($@)])])

View File

@ -0,0 +1,74 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the current language's compiler
# or gives an error. (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 4
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
AS_VAR_IF(CACHEVAR,yes,
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_COMPILE_FLAGS

View File

@ -0,0 +1,982 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the specified
# version of the C++ standard. If necessary, add switches to CXX and
# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
# or '14' (for the C++14 standard).
#
# The second argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The third argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline support for the specified C++ standard is
# required and that the macro should error out if no mode with that
# support is found. If specified 'optional', then configuration proceeds
# regardless, after defining HAVE_CXX${VERSION} if and only if a
# supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
# Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 6
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
dnl (serial version number 13).
AX_REQUIRE_DEFINED([AC_MSG_WARN])
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
[$1], [14], [ax_cxx_compile_alternatives="14 1y"],
[$1], [17], [ax_cxx_compile_alternatives="17 1z"],
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$2], [], [],
[$2], [ext], [],
[$2], [noext], [],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
AC_LANG_PUSH([C++])dnl
ac_success=no
AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
ax_cv_cxx_compile_cxx$1,
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[ax_cv_cxx_compile_cxx$1=yes],
[ax_cv_cxx_compile_cxx$1=no])])
if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
ac_success=yes
fi
m4_if([$2], [noext], [], [dnl
if test x$ac_success = xno; then
for alternative in ${ax_cxx_compile_alternatives}; do
switch="-std=gnu++${alternative}"
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
fi])
m4_if([$2], [ext], [], [dnl
if test x$ac_success = xno; then
dnl HP's aCC needs +std=c++11 according to:
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
dnl Cray's crayCC needs "-h std=c++11"
for alternative in ${ax_cxx_compile_alternatives}; do
for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
if test x$ac_success = xyes; then
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
fi
fi
if test x$ac_success = xno; then
HAVE_CXX$1=0
AC_MSG_NOTICE([No compiler with C++$1 support was found])
else
HAVE_CXX$1=1
AC_DEFINE(HAVE_CXX$1,1,
[define if the compiler supports basic C++$1 syntax])
fi
AC_SUBST(HAVE_CXX$1)
m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])])
])
dnl Test body for checking C++11 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
)
dnl Test body for checking C++14 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
)
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
_AX_CXX_COMPILE_STDCXX_testbody_new_in_17
)
dnl Tests for new features in C++11
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
// If the compiler admits that it is not ready for C++11, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201103L
#error "This is not a C++11 compiler"
#else
namespace cxx11
{
namespace test_static_assert
{
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
}
namespace test_final_override
{
struct Base
{
virtual void f() {}
};
struct Derived : public Base
{
virtual void f() override {}
};
}
namespace test_double_right_angle_brackets
{
template < typename T >
struct check {};
typedef check<void> single_type;
typedef check<check<void>> double_type;
typedef check<check<check<void>>> triple_type;
typedef check<check<check<check<void>>>> quadruple_type;
}
namespace test_decltype
{
int
f()
{
int a = 1;
decltype(a) b = 2;
return a + b;
}
}
namespace test_type_deduction
{
template < typename T1, typename T2 >
struct is_same
{
static const bool value = false;
};
template < typename T >
struct is_same<T, T>
{
static const bool value = true;
};
template < typename T1, typename T2 >
auto
add(T1 a1, T2 a2) -> decltype(a1 + a2)
{
return a1 + a2;
}
int
test(const int c, volatile int v)
{
static_assert(is_same<int, decltype(0)>::value == true, "");
static_assert(is_same<int, decltype(c)>::value == false, "");
static_assert(is_same<int, decltype(v)>::value == false, "");
auto ac = c;
auto av = v;
auto sumi = ac + av + 'x';
auto sumf = ac + av + 1.0;
static_assert(is_same<int, decltype(ac)>::value == true, "");
static_assert(is_same<int, decltype(av)>::value == true, "");
static_assert(is_same<int, decltype(sumi)>::value == true, "");
static_assert(is_same<int, decltype(sumf)>::value == false, "");
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
return (sumf > 0.0) ? sumi : add(c, v);
}
}
namespace test_noexcept
{
int f() { return 0; }
int g() noexcept { return 0; }
static_assert(noexcept(f()) == false, "");
static_assert(noexcept(g()) == true, "");
}
namespace test_constexpr
{
template < typename CharT >
unsigned long constexpr
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
{
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
}
template < typename CharT >
unsigned long constexpr
strlen_c(const CharT *const s) noexcept
{
return strlen_c_r(s, 0UL);
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("1") == 1UL, "");
static_assert(strlen_c("example") == 7UL, "");
static_assert(strlen_c("another\0example") == 7UL, "");
}
namespace test_rvalue_references
{
template < int N >
struct answer
{
static constexpr int value = N;
};
answer<1> f(int&) { return answer<1>(); }
answer<2> f(const int&) { return answer<2>(); }
answer<3> f(int&&) { return answer<3>(); }
void
test()
{
int i = 0;
const int c = 0;
static_assert(decltype(f(i))::value == 1, "");
static_assert(decltype(f(c))::value == 2, "");
static_assert(decltype(f(0))::value == 3, "");
}
}
namespace test_uniform_initialization
{
struct test
{
static const int zero {};
static const int one {1};
};
static_assert(test::zero == 0, "");
static_assert(test::one == 1, "");
}
namespace test_lambdas
{
void
test1()
{
auto lambda1 = [](){};
auto lambda2 = lambda1;
lambda1();
lambda2();
}
int
test2()
{
auto a = [](int i, int j){ return i + j; }(1, 2);
auto b = []() -> int { return '0'; }();
auto c = [=](){ return a + b; }();
auto d = [&](){ return c; }();
auto e = [a, &b](int x) mutable {
const auto identity = [](int y){ return y; };
for (auto i = 0; i < a; ++i)
a += b--;
return x + identity(a + b);
}(0);
return a + b + c + d + e;
}
int
test3()
{
const auto nullary = [](){ return 0; };
const auto unary = [](int x){ return x; };
using nullary_t = decltype(nullary);
using unary_t = decltype(unary);
const auto higher1st = [](nullary_t f){ return f(); };
const auto higher2nd = [unary](nullary_t f1){
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
};
return higher1st(nullary) + higher2nd(nullary)(unary);
}
}
namespace test_variadic_templates
{
template <int...>
struct sum;
template <int N0, int... N1toN>
struct sum<N0, N1toN...>
{
static constexpr auto value = N0 + sum<N1toN...>::value;
};
template <>
struct sum<>
{
static constexpr auto value = 0;
};
static_assert(sum<>::value == 0, "");
static_assert(sum<1>::value == 1, "");
static_assert(sum<23>::value == 23, "");
static_assert(sum<1, 2>::value == 3, "");
static_assert(sum<5, 5, 11>::value == 21, "");
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
}
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
// because of this.
namespace test_template_alias_sfinae
{
struct foo {};
template<typename T>
using member = typename T::member_type;
template<typename T>
void func(...) {}
template<typename T>
void func(member<T>*) {}
void test();
void test() { func<foo>(0); }
}
} // namespace cxx11
#endif // __cplusplus >= 201103L
]])
dnl Tests for new features in C++14
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
// If the compiler admits that it is not ready for C++14, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201402L
#error "This is not a C++14 compiler"
#else
namespace cxx14
{
namespace test_polymorphic_lambdas
{
int
test()
{
const auto lambda = [](auto&&... args){
const auto istiny = [](auto x){
return (sizeof(x) == 1UL) ? 1 : 0;
};
const int aretiny[] = { istiny(args)... };
return aretiny[0];
};
return lambda(1, 1L, 1.0f, '1');
}
}
namespace test_binary_literals
{
constexpr auto ivii = 0b0000000000101010;
static_assert(ivii == 42, "wrong value");
}
namespace test_generalized_constexpr
{
template < typename CharT >
constexpr unsigned long
strlen_c(const CharT *const s) noexcept
{
auto length = 0UL;
for (auto p = s; *p; ++p)
++length;
return length;
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("x") == 1UL, "");
static_assert(strlen_c("test") == 4UL, "");
static_assert(strlen_c("another\0test") == 7UL, "");
}
namespace test_lambda_init_capture
{
int
test()
{
auto x = 0;
const auto lambda1 = [a = x](int b){ return a + b; };
const auto lambda2 = [a = lambda1(x)](){ return a; };
return lambda2();
}
}
namespace test_digit_separators
{
constexpr auto ten_million = 100'000'000;
static_assert(ten_million == 100000000, "");
}
namespace test_return_type_deduction
{
auto f(int& x) { return x; }
decltype(auto) g(int& x) { return x; }
template < typename T1, typename T2 >
struct is_same
{
static constexpr auto value = false;
};
template < typename T >
struct is_same<T, T>
{
static constexpr auto value = true;
};
int
test()
{
auto x = 0;
static_assert(is_same<int, decltype(f(x))>::value, "");
static_assert(is_same<int&, decltype(g(x))>::value, "");
return x;
}
}
} // namespace cxx14
#endif // __cplusplus >= 201402L
]])
dnl Tests for new features in C++17
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
// If the compiler admits that it is not ready for C++17, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus <= 201402L
#error "This is not a C++17 compiler"
#else
#if defined(__clang__)
#define REALLY_CLANG
#else
#if defined(__GNUC__)
#define REALLY_GCC
#endif
#endif
#include <initializer_list>
#include <utility>
#include <type_traits>
namespace cxx17
{
#if !defined(REALLY_CLANG)
namespace test_constexpr_lambdas
{
// TODO: test it with clang++ from git
constexpr int foo = [](){return 42;}();
}
#endif // !defined(REALLY_CLANG)
namespace test::nested_namespace::definitions
{
}
namespace test_fold_expression
{
template<typename... Args>
int multiply(Args... args)
{
return (args * ... * 1);
}
template<typename... Args>
bool all(Args... args)
{
return (args && ...);
}
}
namespace test_extended_static_assert
{
static_assert (true);
}
namespace test_auto_brace_init_list
{
auto foo = {5};
auto bar {5};
static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
static_assert(std::is_same<int, decltype(bar)>::value);
}
namespace test_typename_in_template_template_parameter
{
template<template<typename> typename X> struct D;
}
namespace test_fallthrough_nodiscard_maybe_unused_attributes
{
int f1()
{
return 42;
}
[[nodiscard]] int f2()
{
[[maybe_unused]] auto unused = f1();
switch (f1())
{
case 17:
f1();
[[fallthrough]];
case 42:
f1();
}
return f1();
}
}
namespace test_extended_aggregate_initialization
{
struct base1
{
int b1, b2 = 42;
};
struct base2
{
base2() {
b3 = 42;
}
int b3;
};
struct derived : base1, base2
{
int d;
};
derived d1 {{1, 2}, {}, 4}; // full initialization
derived d2 {{}, {}, 4}; // value-initialized bases
}
namespace test_general_range_based_for_loop
{
struct iter
{
int i;
int& operator* ()
{
return i;
}
const int& operator* () const
{
return i;
}
iter& operator++()
{
++i;
return *this;
}
};
struct sentinel
{
int i;
};
bool operator== (const iter& i, const sentinel& s)
{
return i.i == s.i;
}
bool operator!= (const iter& i, const sentinel& s)
{
return !(i == s);
}
struct range
{
iter begin() const
{
return {0};
}
sentinel end() const
{
return {5};
}
};
void f()
{
range r {};
for (auto i : r)
{
[[maybe_unused]] auto v = i;
}
}
}
namespace test_lambda_capture_asterisk_this_by_value
{
struct t
{
int i;
int foo()
{
return [*this]()
{
return i;
}();
}
};
}
namespace test_enum_class_construction
{
enum class byte : unsigned char
{};
byte foo {42};
}
namespace test_constexpr_if
{
template <bool cond>
int f ()
{
if constexpr(cond)
{
return 13;
}
else
{
return 42;
}
}
}
namespace test_selection_statement_with_initializer
{
int f()
{
return 13;
}
int f2()
{
if (auto i = f(); i > 0)
{
return 3;
}
switch (auto i = f(); i + 4)
{
case 17:
return 2;
default:
return 1;
}
}
}
#if !defined(REALLY_CLANG)
namespace test_template_argument_deduction_for_class_templates
{
// TODO: test it with clang++ from git
template <typename T1, typename T2>
struct pair
{
pair (T1 p1, T2 p2)
: m1 {p1},
m2 {p2}
{}
T1 m1;
T2 m2;
};
void f()
{
[[maybe_unused]] auto p = pair{13, 42u};
}
}
#endif // !defined(REALLY_CLANG)
namespace test_non_type_auto_template_parameters
{
template <auto n>
struct B
{};
B<5> b1;
B<'a'> b2;
}
#if !defined(REALLY_CLANG)
namespace test_structured_bindings
{
// TODO: test it with clang++ from git
int arr[2] = { 1, 2 };
std::pair<int, int> pr = { 1, 2 };
auto f1() -> int(&)[2]
{
return arr;
}
auto f2() -> std::pair<int, int>&
{
return pr;
}
struct S
{
int x1 : 2;
volatile double y1;
};
S f3()
{
return {};
}
auto [ x1, y1 ] = f1();
auto& [ xr1, yr1 ] = f1();
auto [ x2, y2 ] = f2();
auto& [ xr2, yr2 ] = f2();
const auto [ x3, y3 ] = f3();
}
#endif // !defined(REALLY_CLANG)
#if !defined(REALLY_CLANG)
namespace test_exception_spec_type_system
{
// TODO: test it with clang++ from git
struct Good {};
struct Bad {};
void g1() noexcept;
void g2();
template<typename T>
Bad
f(T*, T*);
template<typename T1, typename T2>
Good
f(T1*, T2*);
static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
}
#endif // !defined(REALLY_CLANG)
namespace test_inline_variables
{
template<class T> void f(T)
{}
template<class T> inline T g(T)
{
return T{};
}
template<> inline void f<>(int)
{}
template<> int g<>(int)
{
return 5;
}
}
} // namespace cxx17
#endif // __cplusplus <= 201402L
]])

View File

@ -0,0 +1,39 @@
# ============================================================================
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
# ============================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the C++11
# standard; if necessary, add switches to CXX and CXXCPP to enable
# support.
#
# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
# macro with the version set to C++11. The two optional arguments are
# forwarded literally as the second and third argument respectively.
# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
# more information. If you want to use this macro, you also need to
# download the ax_cxx_compile_stdcxx.m4 file.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 17
AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX])
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])])

View File

@ -0,0 +1,96 @@
# ===========================================================================
# http://autoconf-archive.cryp.to/ax_ld_check_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_LD_CHECK_FLAG(FLAG-TO-CHECK,[PROLOGUE],[BODY],[ACTION-IF-SUCCESS],[ACTION-IF-FAILURE])
#
# DESCRIPTION
#
# This macro tests if the C++ compiler supports the flag FLAG-TO-CHECK. If
# successfull execute ACTION-IF-SUCCESS otherwise ACTION-IF-FAILURE.
# PROLOGUE and BODY are optional and should be used as in AC_LANG_PROGRAM
# macro.
#
# Example:
#
# AX_LD_CHECK_FLAG([-Wl,-L/usr/lib],[],[],[
# ...
# ],[
# ...
# ])
#
# This code is inspired from KDE_CHECK_COMPILER_FLAG macro. Thanks to
# Bogdan Drozdowski <bogdandr@op.pl> for testing and bug fixes.
#
# LAST MODIFICATION
#
# 2008-04-12
#
# COPYLEFT
#
# Copyright (c) 2008 Francesco Salvestrini <salvestrini@users.sourceforge.net>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Macro Archive. When you make and
# distribute a modified version of the Autoconf Macro, you may extend this
# special exception to the GPL to apply to your modified version as well.
AC_DEFUN([AX_LD_CHECK_FLAG],[
AC_PREREQ([2.61])
AC_REQUIRE([AC_PROG_CXX])
AC_REQUIRE([AC_PROG_SED])
flag=`echo "$1" | $SED 'y% .=/+-(){}<>:*,%_______________%'`
AC_CACHE_CHECK([whether the linker accepts the $1 flag],
[ax_cv_ld_check_flag_$flag],[
#AC_LANG_PUSH([C])
save_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS $1"
AC_LINK_IFELSE([
AC_LANG_PROGRAM([$2],[$3])
],[
eval "ax_cv_ld_check_flag_$flag=yes"
],[
eval "ax_cv_ld_check_flag_$flag=no"
])
LDFLAGS="$save_LDFLAGS"
#AC_LANG_POP
])
AS_IF([eval "test \"`echo '$ax_cv_ld_check_flag_'$flag`\" = yes"],[
:
$4
],[
:
$5
])
])

View File

@ -0,0 +1,37 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_REQUIRE_DEFINED(MACRO)
#
# DESCRIPTION
#
# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
# been defined and thus are available for use. This avoids random issues
# where a macro isn't expanded. Instead the configure script emits a
# non-fatal:
#
# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
#
# It's like AC_REQUIRE except it doesn't expand the required macro.
#
# Here's an example:
#
# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
#
# LICENSE
#
# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 1
AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
])dnl AX_REQUIRE_DEFINED

78
tests/exempi/m4/ax_tls.m4 Normal file
View File

@ -0,0 +1,78 @@
# ===========================================================================
# http://autoconf-archive.cryp.to/ax_tls.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_TLS
#
# DESCRIPTION
#
# Provides a test for the compiler support of thread local storage (TLS)
# extensions. Defines TLS if it is found. Currently only knows about GCC
# and MSVC. I think SunPro uses the same as GCC, and Borland apparently
# supports either.
#
# LAST MODIFICATION
#
# 2008-04-12
#
# COPYLEFT
#
# Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Macro Archive. When you make and
# distribute a modified version of the Autoconf Macro, you may extend this
# special exception to the GPL to apply to your modified version as well.
AC_DEFUN([AX_TLS], [
AC_MSG_CHECKING(for thread local storage (TLS) class)
AC_CACHE_VAL(ac_cv_tls, [
ax_tls_keywords="__thread __declspec(thread) none"
for ax_tls_keyword in $ax_tls_keywords; do
case $ax_tls_keyword in
none) ac_cv_tls=none ; break ;;
*)
AC_TRY_COMPILE(
[#include <stdlib.h>
static void
foo(void) {
static ] $ax_tls_keyword [ int bar;
exit(1);
}],
[],
[ac_cv_tls=$ax_tls_keyword ; break],
ac_cv_tls=none
)
esac
done
])
if test "$ac_cv_tls" != "none"; then
dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here])
AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here])
fi
AC_MSG_RESULT($ac_cv_tls)
])

1560
tests/exempi/m4/boost.m4 Normal file

File diff suppressed because it is too large Load Diff

40
tests/exempi/m4/shave.m4 Normal file
View File

@ -0,0 +1,40 @@
dnl Make automake/libtool output more friendly to humans
dnl
dnl SHAVE_INIT([shavedir])
dnl
dnl shavedir: the directory where the shave script is, it defaults to
dnl $(top_builddir)
dnl
dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just
dnl before AC_CONFIG_FILE/AC_OUTPUT is perfect. This macro rewrite CC and
dnl LIBTOOL, you don't want the configure tests to have these variables
dnl re-defined.
dnl * This macro requires GNU make's -s option.
AC_DEFUN([SHAVE_INIT], [
dnl where can we find the shave scripts?
m4_if([$1],,
[shavedir='$(top_builddir)'],
[shavedir='$(top_builddir)'/$1])
AC_SUBST(shavedir)
dnl make is now quiet
AC_SUBST([MAKEFLAGS], [-s])
AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`'])
dnl we need sed
AC_CHECK_PROG(SED,sed,sed,false)
dnl substitute libtool
SHAVE_SAVED_LIBTOOL=$LIBTOOL
AC_SUBST(SHAVE_SAVED_LIBTOOL)
LIBTOOL="\$(SHELL) \$(shavedir)/shave-libtool '\$(SHAVE_SAVED_LIBTOOL)'"
AC_SUBST(LIBTOOL)
dnl substitute cc
SHAVE_SAVED_CC=$CC
SHAVE_SAVED_CXX=$CXX
AC_SUBST(SHAVE_SAVED_CC)
AC_SUBST(SHAVE_SAVED_CXX)
CC="\$(SHELL) \$(shavedir)/shave cc '\$(SHAVE_SAVED_CC)'"
CXX="\$(SHELL) \$(shavedir)/shave cxx '\$(SHAVE_SAVED_CXX)'"
AC_SUBST(CC)
AC_SUBST(CXX)
])

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

19
tests/tests.yml Normal file
View File

@ -0,0 +1,19 @@
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- atomic
- classic
- container
tests:
- upstream-test-suite
required_packages:
- exempi
- exempi-devel
- gcc
- gcc-c++
- make
- autoconf
- automake
- libtool
- boost-devel

28
tests/upstream-test-suite Executable file
View File

@ -0,0 +1,28 @@
#!/bin/bash
. /usr/share/beakerlib/beakerlib.sh
TEST="/AppStream/exempi/Sanity/upstream-test-suite"
PACKAGES=${PACKAGES:-"exempi"}
REQUIRES=${REQUIRES:-"exempi-devel gcc gcc-c++ make autoconf automake libtool boost-devel"}
rlJournalStart
rlPhaseStartSetup
rlAssertRpm --all
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
rlRun "cp -r exempi/* $TmpDir/." 0 "Copying test suite"
rlRun "pushd $TmpDir"
rlPhaseEnd
rlPhaseStartTest
rlRun "autoreconf -f -i && ./configure --prefix=/usr" 0 "Configuring test suite"
rlRun "make check" 0 "Running tests"
rlPhaseEnd
rlPhaseStartCleanup
rlRun "popd"
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
rlPhaseEnd
rlJournalPrintText
rlJournalEnd