summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2016-07-10 13:53:42 -0400
committerDavid Robillard <d@drobilla.net>2016-07-10 13:53:42 -0400
commit54f33b063642467adfe369fe1abd76c13af95734 (patch)
treeda22cd822f9d8007e0c355d0a923a5d34fbe0b24
parentd985a2ee02311a81feb417677d24903c4b97398f (diff)
downloadlilv-54f33b063642467adfe369fe1abd76c13af95734.tar.gz
lilv-54f33b063642467adfe369fe1abd76c13af95734.tar.bz2
lilv-54f33b063642467adfe369fe1abd76c13af95734.zip
Test versioned plugin replacement
-rw-r--r--test/lilv_test.c49
-rw-r--r--test/new_version.lv2/manifest.ttl.in7
-rw-r--r--test/new_version.lv2/new_version.c93
-rw-r--r--test/new_version.lv2/new_version.ttl.in40
-rw-r--r--test/old_version.lv2/manifest.ttl.in7
-rw-r--r--test/old_version.lv2/old_version.c93
-rw-r--r--test/old_version.lv2/old_version.ttl.in40
-rw-r--r--wscript24
8 files changed, 345 insertions, 8 deletions
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: <http://lv2plug.in/ns/lv2core#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<http://example.org/versioned>
+ a lv2:Plugin ;
+ lv2:binary <new_version@SHLIB_EXT@> ;
+ rdfs:seeAlso <new_version.ttl> .
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 <d@drobilla.net>
+
+ 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 <stdlib.h>
+
+#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 <d@drobilla.net>
+#
+# 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: <http://usefulinc.com/ns/doap#> .
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix ui: <http://lv2plug.in/ns/extensions/ui#> .
+
+<http://example.org/versioned>
+ a lv2:Plugin ;
+ doap:license <http://opensource.org/licenses/isc> ;
+ 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: <http://lv2plug.in/ns/lv2core#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<http://example.org/versioned>
+ a lv2:Plugin ;
+ lv2:binary <old_version@SHLIB_EXT@> ;
+ rdfs:seeAlso <old_version.ttl> .
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 <d@drobilla.net>
+
+ 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 <stdlib.h>
+
+#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 <d@drobilla.net>
+#
+# 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: <http://usefulinc.com/ns/doap#> .
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix ui: <http://lv2plug.in/ns/extensions/ui#> .
+
+<http://example.org/versioned>
+ a lv2:Plugin ;
+ doap:license <http://opensource.org/licenses/isc> ;
+ 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: