blob: 84148478bf2687e1d7f7b0459da6794ee2ee8f19 [file] [log] [blame]
/*
* compat-test.c: tests svn_ver_compatible
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <apr_pools.h>
#include "svn_error.h"
#include "svn_pools.h"
#include "svn_version.h"
#include "../svn_test.h"
#include "svn_private_config.h"
#include "private/svn_subr_private.h"
#ifndef SVN_DISABLE_FULL_VERSION_MATCH
#define FALSE_IF_FULL FALSE
#else
#define FALSE_IF_FULL TRUE
#endif
static svn_error_t *
test_version_compatibility(apr_pool_t *pool)
{
unsigned int i;
struct version_pair {
svn_version_t my_version;
svn_version_t lib_version;
svn_boolean_t result;
} versions[] = {
{ {1, 0, 0, ""}, {1, 0, 0, ""}, TRUE },
{ {1, 0, 0, ""}, {2, 0, 0, ""}, FALSE },
{ {2, 0, 0, ""}, {1, 0, 0, ""}, FALSE },
{ {1, 0, 0, ""}, {1, 0, 1, ""}, TRUE },
{ {1, 0, 1, ""}, {1, 0, 0, ""}, TRUE },
{ {1, 0, 1, ""}, {1, 0, 1, ""}, TRUE },
{ {1, 0, 0, ""}, {1, 1, 0, ""}, TRUE },
{ {1, 0, 1, ""}, {1, 1, 0, ""}, TRUE },
{ {1, 0, 0, ""}, {1, 1, 1, ""}, TRUE },
{ {1, 1, 0, ""}, {1, 0, 0, ""}, FALSE },
{ {1, 0, 0, "dev"}, {1, 0, 0, "dev"}, TRUE },
{ {1, 0, 1, "dev"}, {1, 0, 1, "dev"}, TRUE },
{ {1, 1, 0, "dev"}, {1, 1, 0, "dev"}, TRUE },
{ {1, 1, 1, "dev"}, {1, 1, 1, "dev"}, TRUE },
{ {1, 0, 0, "dev"}, {1, 0, 1, "dev"}, FALSE_IF_FULL },
{ {1, 0, 0, "dev"}, {1, 1, 0, "dev"}, FALSE_IF_FULL },
{ {1, 0, 0, "cev"}, {1, 0, 0, "dev"}, FALSE_IF_FULL },
{ {1, 0, 0, "eev"}, {1, 0, 0, "dev"}, FALSE_IF_FULL },
{ {1, 0, 1, "dev"}, {1, 0, 0, "dev"}, FALSE_IF_FULL },
{ {1, 1, 0, "dev"}, {1, 0, 0, "dev"}, FALSE },
{ {1, 0, 0, ""}, {1, 0, 0, "dev"}, FALSE_IF_FULL },
{ {1, 0, 0, "dev"}, {1, 0, 0, ""}, FALSE_IF_FULL },
{ {1, 0, 1, "dev"}, {1, 0, 0, ""}, TRUE },
{ {1, 1, 0, "dev"}, {1, 0, 0, ""}, FALSE },
{ {1, 1, 1, "dev"}, {1, 1, 0, ""}, TRUE },
{ {1, 1, 1, "dev"}, {1, 0, 0, ""}, FALSE },
{ {2, 0, 0, "dev"}, {1, 0, 0, ""}, FALSE },
{ {1, 0, 0, "dev"}, {2, 0, 0, ""}, FALSE },
};
for (i = 0; i < sizeof(versions)/sizeof(versions[0]); ++i)
{
if (svn_ver_compatible(&versions[i].my_version,
&versions[i].lib_version) != versions[i].result)
return svn_error_createf
(SVN_ERR_TEST_FAILED, NULL,
"svn_ver_compatible (%d.%d.%d(%s), %d.%d.%d(%s)) failed",
versions[i].my_version.major,
versions[i].my_version.minor,
versions[i].my_version.patch,
versions[i].my_version.tag,
versions[i].lib_version.major,
versions[i].lib_version.minor,
versions[i].lib_version.patch,
versions[i].lib_version.tag);
}
return SVN_NO_ERROR;
}
static svn_error_t *
test_version_parsing(apr_pool_t *pool)
{
unsigned int i;
apr_pool_t *iterpool;
struct version_pair {
const char *str;
svn_boolean_t malformed;
svn_version_t version;
} versions[] = {
/* str malformed version */
{ "1.8", FALSE, { 1, 8, 0, ""} },
{ "1.8-dev", TRUE, { 0, 0, 0, ""} },
{ "1.1.0", FALSE, { 1, 1, 0, ""} },
{ "1.1.3", FALSE, { 1, 1, 3, ""} },
{ "2.10.0", FALSE, { 2, 10, 0, ""} },
{ "1.8.0-dev", FALSE, { 1, 8, 0, "dev"} },
{ "1.7.0-beta1", FALSE, { 1, 7, 0, "beta1"} },
{ "1a.8.0", TRUE, { 0, 0, 0, ""} },
{ "1a.8.0", TRUE, { 0, 0, 0, ""} },
{ "1.a8.0", TRUE, { 0, 0, 0, ""} },
{ "1.8.0a", TRUE, { 0, 0, 0, ""} },
{ "1.8.0.1", TRUE, { 0, 0, 0, ""} },
};
iterpool = svn_pool_create(pool);
for (i = 0; i < sizeof(versions)/sizeof(versions[0]); ++i)
{
svn_version_t *version;
svn_error_t *err;
svn_pool_clear(iterpool);
err = svn_version__parse_version_string(&version, versions[i].str,
iterpool);
if (err && (err->apr_err != SVN_ERR_MALFORMED_VERSION_STRING))
return svn_error_create(SVN_ERR_TEST_FAILED, err,
"Unexpected error code");
if (err)
{
if (! versions[i].malformed)
return svn_error_create(SVN_ERR_TEST_FAILED, err,
"Unexpected parsing error returned");
else
svn_error_clear(err);
}
else
{
if (versions[i].malformed)
return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
"Parsing error expected; none returned");
if (! svn_ver_equal(version, &(versions[i].version)))
return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
"Parsed version of '%s' doesn't match "
"expected", versions[i].str);
}
}
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
static svn_error_t *
test_version_at_least(apr_pool_t *pool)
{
unsigned int i;
struct version_pair {
svn_version_t version;
int major;
int minor;
int patch;
svn_boolean_t at_least;
} versions[] = {
/* maj min pat version at_least */
{ { 1, 3, 3, ""}, 1, 3, 3, TRUE },
{ { 1, 3, 3, ""}, 1, 3, 4, FALSE },
{ { 1, 3, 3, ""}, 1, 4, 3, FALSE },
{ { 1, 3, 3, ""}, 0, 4, 3, TRUE },
{ { 1, 3, 3, ""}, 2, 0, 0, FALSE },
{ { 1, 3, 3, ""}, 1, 3, 2, TRUE },
{ { 1, 3, 3, ""}, 1, 2, 4, TRUE },
{ { 1, 3, 3, "dev"}, 1, 3, 2, TRUE },
{ { 1, 3, 3, "dev"}, 1, 3, 3, FALSE },
{ { 1, 3, 3, ""}, 0, 4, 3, TRUE },
};
for (i = 0; i < sizeof(versions)/sizeof(versions[0]); ++i)
{
svn_boolean_t at_least = svn_version__at_least(&(versions[i].version),
versions[i].major,
versions[i].minor,
versions[i].patch);
if (at_least && (! versions[i].at_least))
return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
"Expected at-least to be FALSE; got TRUE");
if ((! at_least) && versions[i].at_least)
return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
"Expected at-least to be TRUE; got FALSE");
}
return SVN_NO_ERROR;
}
/* An array of all test functions */
static int max_threads = 1;
static struct svn_test_descriptor_t test_funcs[] =
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_version_compatibility,
"svn_ver_compatible"),
SVN_TEST_PASS2(test_version_parsing,
"svn_version__parse_version_string"),
SVN_TEST_PASS2(test_version_at_least,
"svn_version__at_least"),
SVN_TEST_NULL
};
SVN_TEST_MAIN