From 54f33b063642467adfe369fe1abd76c13af95734 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 10 Jul 2016 13:53:42 -0400 Subject: Test versioned plugin replacement --- test/lilv_test.c | 49 +++++++++++++++++ test/new_version.lv2/manifest.ttl.in | 7 +++ test/new_version.lv2/new_version.c | 93 +++++++++++++++++++++++++++++++++ test/new_version.lv2/new_version.ttl.in | 40 ++++++++++++++ test/old_version.lv2/manifest.ttl.in | 7 +++ test/old_version.lv2/old_version.c | 93 +++++++++++++++++++++++++++++++++ test/old_version.lv2/old_version.ttl.in | 40 ++++++++++++++ wscript | 24 ++++++--- 8 files changed, 345 insertions(+), 8 deletions(-) create mode 100644 test/new_version.lv2/manifest.ttl.in create mode 100644 test/new_version.lv2/new_version.c create mode 100644 test/new_version.lv2/new_version.ttl.in create mode 100644 test/old_version.lv2/manifest.ttl.in create mode 100644 test/old_version.lv2/old_version.c create mode 100644 test/old_version.lv2/old_version.ttl.in diff --git a/test/lilv_test.c b/test/lilv_test.c index cc3a012..f1ddbfd 100644 --- a/test/lilv_test.c +++ b/test/lilv_test.c @@ -2009,6 +2009,54 @@ test_reload_bundle(void) /*****************************************************************************/ +static int +test_replace_version(void) +{ + if (!init_world()) { + return 0; + } + + LilvNode* plug_uri = lilv_new_uri(world, "http://example.org/versioned"); + LilvNode* lv2_minorVersion = lilv_new_uri(world, LV2_CORE__minorVersion); + LilvNode* lv2_microVersion = lilv_new_uri(world, LV2_CORE__microVersion); + + char* old_bundle_path = malloc(strlen(LILV_TEST_DIR) + 32); + strcpy(old_bundle_path, LILV_TEST_DIR); + strcat(old_bundle_path, "old_version.lv2/"); + + // Load plugin from old bundle + LilvNode* old_bundle = lilv_new_file_uri(world, NULL, old_bundle_path); + lilv_world_load_bundle(world, old_bundle); + lilv_world_load_resource(world, plug_uri); + + // Check version + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* old_plug = lilv_plugins_get_by_uri(plugins, plug_uri); + TEST_ASSERT(old_plug); + TEST_ASSERT(!strcmp(lilv_node_as_string(lilv_world_get(world, plug_uri, lv2_minorVersion, 0)), "1")); + TEST_ASSERT(!strcmp(lilv_node_as_string(lilv_world_get(world, plug_uri, lv2_microVersion, 0)), "0")); + + char* new_bundle_path = malloc(strlen(LILV_TEST_DIR) + 32); + strcpy(new_bundle_path, LILV_TEST_DIR); + strcat(new_bundle_path, "new_version.lv2/"); + + // Load plugin from new bundle + LilvNode* new_bundle = lilv_new_file_uri(world, NULL, new_bundle_path); + lilv_world_load_bundle(world, new_bundle); + lilv_world_load_resource(world, plug_uri); + + // Check that version in the world model has changed + plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* new_plug = lilv_plugins_get_by_uri(plugins, plug_uri); + TEST_ASSERT(new_plug); + TEST_ASSERT(!strcmp(lilv_node_as_string(lilv_world_get(world, plug_uri, lv2_minorVersion, 0)), "2")); + TEST_ASSERT(!strcmp(lilv_node_as_string(lilv_world_get(world, plug_uri, lv2_microVersion, 0)), "1")); + + return 1; +} + +/*****************************************************************************/ + /* add tests here */ static struct TestCase tests[] = { TEST_CASE(util), @@ -2033,6 +2081,7 @@ static struct TestCase tests[] = { TEST_CASE(world), TEST_CASE(state), TEST_CASE(reload_bundle), + TEST_CASE(replace_version), { NULL, NULL } }; diff --git a/test/new_version.lv2/manifest.ttl.in b/test/new_version.lv2/manifest.ttl.in new file mode 100644 index 0000000..e76f7cf --- /dev/null +++ b/test/new_version.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/test/new_version.lv2/new_version.c b/test/new_version.lv2/new_version.c new file mode 100644 index 0000000..37d9fbf --- /dev/null +++ b/test/new_version.lv2/new_version.c @@ -0,0 +1,93 @@ +/* + Lilv Test Plugin - New version + Copyright 2011-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define PLUGIN_URI "http://example.org/versioned" + +enum { + TEST_INPUT = 0, + TEST_OUTPUT = 1 +}; + +typedef struct { + float* input; + float* output; +} Test; + +static void +cleanup(LV2_Handle instance) +{ + free((Test*)instance); +} + +static void +connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + Test* test = (Test*)instance; + switch (port) { + case TEST_INPUT: + test->input = (float*)data; + break; + case TEST_OUTPUT: + test->output = (float*)data; + break; + default: + break; + } +} + +static LV2_Handle +instantiate(const LV2_Descriptor* descriptor, + double rate, + const char* path, + const LV2_Feature* const* features) +{ + Test* test = (Test*)calloc(1, sizeof(Test)); + if (!test) { + return NULL; + } + + return (LV2_Handle)test; +} + +static void +run(LV2_Handle instance, uint32_t sample_count) +{ + Test* test = (Test*)instance; + + *test->output = *test->input; +} + +static const LV2_Descriptor descriptor = { + PLUGIN_URI, + instantiate, + connect_port, + NULL, // activate, + run, + NULL, // deactivate, + cleanup, + NULL // extension_data +}; + +LV2_SYMBOL_EXPORT +const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return (index == 0) ? &descriptor : NULL; +} diff --git a/test/new_version.lv2/new_version.ttl.in b/test/new_version.lv2/new_version.ttl.in new file mode 100644 index 0000000..7994666 --- /dev/null +++ b/test/new_version.lv2/new_version.ttl.in @@ -0,0 +1,40 @@ +# Lilv Test Plugin - New version +# Copyright 2011-2016 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . + + + a lv2:Plugin ; + doap:license ; + doap:name "New version" ; + lv2:optionalFeature lv2:hardRTCapable ; + lv2:minorVersion 2 ; + lv2:microVersion 1 ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + lv2:name "Input" + ] , [ + a lv2:OutputPort , + lv2:ControlPort ; + lv2:index 1 ; + lv2:symbol "output" ; + lv2:name "Output" + ] . diff --git a/test/old_version.lv2/manifest.ttl.in b/test/old_version.lv2/manifest.ttl.in new file mode 100644 index 0000000..3c96cb5 --- /dev/null +++ b/test/old_version.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/test/old_version.lv2/old_version.c b/test/old_version.lv2/old_version.c new file mode 100644 index 0000000..303f09c --- /dev/null +++ b/test/old_version.lv2/old_version.c @@ -0,0 +1,93 @@ +/* + Lilv Test Plugin - Old version + Copyright 2011-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define PLUGIN_URI "http://example.org/versioned" + +enum { + TEST_INPUT = 0, + TEST_OUTPUT = 1 +}; + +typedef struct { + float* input; + float* output; +} Test; + +static void +cleanup(LV2_Handle instance) +{ + free((Test*)instance); +} + +static void +connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + Test* test = (Test*)instance; + switch (port) { + case TEST_INPUT: + test->input = (float*)data; + break; + case TEST_OUTPUT: + test->output = (float*)data; + break; + default: + break; + } +} + +static LV2_Handle +instantiate(const LV2_Descriptor* descriptor, + double rate, + const char* path, + const LV2_Feature* const* features) +{ + Test* test = (Test*)calloc(1, sizeof(Test)); + if (!test) { + return NULL; + } + + return (LV2_Handle)test; +} + +static void +run(LV2_Handle instance, uint32_t sample_count) +{ + Test* test = (Test*)instance; + + *test->output = *test->input; +} + +static const LV2_Descriptor descriptor = { + PLUGIN_URI, + instantiate, + connect_port, + NULL, // activate, + run, + NULL, // deactivate, + cleanup, + NULL // extension_data +}; + +LV2_SYMBOL_EXPORT +const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return (index == 0) ? &descriptor : NULL; +} diff --git a/test/old_version.lv2/old_version.ttl.in b/test/old_version.lv2/old_version.ttl.in new file mode 100644 index 0000000..2b68f76 --- /dev/null +++ b/test/old_version.lv2/old_version.ttl.in @@ -0,0 +1,40 @@ +# Lilv Test Plugin - Old version +# Copyright 2011-2016 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . + + + a lv2:Plugin ; + doap:license ; + doap:name "Old version" ; + lv2:optionalFeature lv2:hardRTCapable ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + lv2:name "Input" + ] , [ + a lv2:OutputPort , + lv2:ControlPort ; + lv2:index 1 ; + lv2:symbol "output" ; + lv2:name "Output" + ] . diff --git a/wscript b/wscript index 4472a9c..b997074 100644 --- a/wscript +++ b/wscript @@ -26,7 +26,9 @@ test_plugins = ['missing_descriptor', 'missing_name', 'missing_port_name', 'lib_descriptor', - 'failed_lib_descriptor'] + 'failed_lib_descriptor', + 'old_version', + 'new_version'] def options(opt): opt.load('compiler_c') @@ -286,6 +288,9 @@ def build(bld): uselib = 'LV2') for p in test_plugins: + if not bld.path.find_node('test/%s.lv2/test_%s.c' % (p, p)): + continue + obj = bld(features = 'c cprogram', source = 'test/%s.lv2/test_%s.c' % (p, p), target = 'test/test_%s' % p, @@ -321,9 +326,10 @@ def build(bld): autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') # Unit test program - blddir = autowaf.build_dir(APPNAME, 'test') - bpath = os.path.abspath(os.path.join(blddir, 'test.lv2')) - bpath = bpath.replace('\\', '/') + testdir = os.path.abspath(autowaf.build_dir(APPNAME, 'test')) + bpath = os.path.join(testdir, 'test.lv2') + bpath = bpath.replace('\\', '/') + testdir = testdir.replace('\\', '/') obj = bld(features = 'c cprogram', source = 'test/lilv_test.c', includes = ['.', './src'], @@ -331,7 +337,8 @@ def build(bld): lib = test_libs, target = 'test/lilv_test', install_path = None, - defines = defines + ['LILV_TEST_BUNDLE=\"%s/\"' % bpath], + defines = (defines + ['LILV_TEST_BUNDLE=\"%s/\"' % bpath] + + ['LILV_TEST_DIR=\"%s/\"' % testdir]), cflags = test_cflags) autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') @@ -437,9 +444,10 @@ def test(ctx): autowaf.run_test(ctx, APPNAME, 'lilv_test', dirs=['./src','./test'], name='lilv_test') for p in test_plugins: - autowaf.run_test(ctx, APPNAME, - 'test_' + p + ' ' + ('test/%s.lv2/' % p), - 0, dirs=['./src','./test','./test/%s.lv2' % p]) + test_prog = 'test_' + p + ' ' + ('test/%s.lv2/' % p) + if os.path.exists('test/test_' + p): + autowaf.run_test(ctx, APPNAME, test_prog, 0, + dirs=['./src','./test','./test/%s.lv2' % p]) autowaf.post_test(ctx, APPNAME) try: -- cgit v1.2.1