diff options
author | David Robillard <d@drobilla.net> | 2012-01-08 03:13:15 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-01-08 03:13:15 +0000 |
commit | a79fe5a88d0ef9f440fd6b8330a82fb67839fabd (patch) | |
tree | 239f3839a3ab40137b1a35e35abc06eb7d1b6aca /test/test_plugin.c | |
parent | 59b7cb60f0dcdd639ee4b130df9cbce3d7ebf04a (diff) | |
download | lilv-a79fe5a88d0ef9f440fd6b8330a82fb67839fabd.tar.gz lilv-a79fe5a88d0ef9f440fd6b8330a82fb67839fabd.tar.bz2 lilv-a79fe5a88d0ef9f440fd6b8330a82fb67839fabd.zip |
Add file support to state implementation.
Use cleaner and more consistent names for world URIs.
git-svn-id: http://svn.drobilla.net/lad/trunk/lilv@3918 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'test/test_plugin.c')
-rw-r--r-- | test/test_plugin.c | 115 |
1 files changed, 108 insertions, 7 deletions
diff --git a/test/test_plugin.c b/test/test_plugin.c index 0ef76f2..55df26c 100644 --- a/test/test_plugin.c +++ b/test/test_plugin.c @@ -15,6 +15,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#define _BSD_SOURCE /* for realpath */ + +#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -39,6 +42,10 @@ typedef struct { LV2_URID atom_Float; } uris; + char* tmp_file_path; + char* rec_file_path; + FILE* rec_file; + float* input; float* output; unsigned num_runs; @@ -47,6 +54,10 @@ typedef struct { static void cleanup(LV2_Handle instance) { + Test* test = (Test*)instance; + if (test->rec_file) { + fclose(test->rec_file); + } free(instance); } @@ -79,26 +90,43 @@ instantiate(const LV2_Descriptor* descriptor, return NULL; } - test->map = NULL; - test->input = NULL; - test->output = NULL; - test->num_runs = 0; + test->map = NULL; + test->input = NULL; + test->output = NULL; + test->num_runs = 0; + test->tmp_file_path = malloc(L_tmpnam); + test->rec_file_path = NULL; + test->rec_file = NULL; + + tmpnam(test->tmp_file_path); + + LV2_State_Make_Path* make_path = NULL; - /* Scan host features for URID map */ for (int i = 0; features[i]; ++i) { if (!strcmp(features[i]->URI, LV2_URID_URI "#map")) { test->map = (LV2_URID_Map*)features[i]->data; test->uris.atom_Float = test->map->map( test->map->handle, NS_ATOM "Float"); + } else if (!strcmp(features[i]->URI, LV2_STATE_MAKE_PATH_URI)) { + make_path = (LV2_State_Make_Path*)features[i]->data; } } if (!test->map) { - fprintf(stderr, "Host does not support urid:map.\n"); + fprintf(stderr, "Host does not support urid:map\n"); free(test); return NULL; } + if (make_path) { + test->rec_file_path = make_path->path(make_path->handle, "recfile"); + if (!(test->rec_file = fopen(test->rec_file_path, "w"))) { + fprintf(stderr, "ERROR: Failed to open rec file\n"); + } + fprintf(test->rec_file, "instantiate\n"); + + } + return (LV2_Handle)test; } @@ -108,7 +136,11 @@ run(LV2_Handle instance, { Test* test = (Test*)instance; *test->output = *test->input; - ++test->num_runs; + if (sample_count == 1) { + ++test->num_runs; + } else if (sample_count == 2 && test->rec_file) { + fprintf(test->rec_file, "run\n"); + } } static uint32_t @@ -126,6 +158,16 @@ save(LV2_Handle instance, { Test* plugin = (Test*)instance; + LV2_State_Map_Path* map_path = NULL; + //LV2_State_Make_Path* make_path = NULL; + for (int i = 0; features && features[i]; ++i) { + if (!strcmp(features[i]->URI, LV2_STATE_MAP_PATH_URI)) { + map_path = (LV2_State_Map_Path*)features[i]->data; + }/* else if (!strcmp(features[i]->URI, LV2_STATE_MAKE_PATH_URI)) { + make_path = (LV2_State_Make_Path*)features[i]->data; + }*/ + } + store(callback_data, map_uri(plugin, "http://example.org/greeting"), "hello", @@ -181,6 +223,44 @@ save(LV2_Handle instance, sizeof(blob), map_uri(plugin, "http://example.org/SomeUnknownType"), LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); + + if (map_path) { + FILE* file = fopen(plugin->tmp_file_path, "w"); + fprintf(file, "Hello\n"); + fclose(file); + char* apath = map_path->abstract_path(map_path->handle, + plugin->tmp_file_path); + char* apath2 = map_path->abstract_path(map_path->handle, + plugin->tmp_file_path); + if (strcmp(apath, apath2)) { + fprintf(stderr, "ERROR: Path %s != %s\n", apath, apath2); + } + + store(callback_data, + map_uri(plugin, "http://example.org/extfile"), + apath, + strlen(apath) + 1, + map_uri(plugin, LV2_STATE_PATH_URI), + LV2_STATE_IS_PORTABLE); + + free(apath); + free(apath2); + + if (plugin->rec_file) { + fflush(plugin->rec_file); + apath = map_path->abstract_path(map_path->handle, + plugin->rec_file_path); + + store(callback_data, + map_uri(plugin, "http://example.org/recfile"), + apath, + strlen(apath) + 1, + map_uri(plugin, LV2_STATE_PATH_URI), + LV2_STATE_IS_PORTABLE); + + free(apath); + } + } } static void @@ -192,6 +272,13 @@ restore(LV2_Handle instance, { Test* plugin = (Test*)instance; + LV2_State_Map_Path* map_path = NULL; + for (int i = 0; features && features[i]; ++i) { + if (!strcmp(features[i]->URI, LV2_STATE_MAP_PATH_URI)) { + map_path = (LV2_State_Map_Path*)features[i]->data; + } + } + size_t size; uint32_t type; uint32_t valflags; @@ -200,6 +287,20 @@ restore(LV2_Handle instance, callback_data, map_uri(plugin, "http://example.org/num-runs"), &size, &type, &valflags); + + char* apath = (char*)retrieve( + callback_data, + map_uri(plugin, "http://example.org/extfile"), + &size, &type, &valflags); + + if (map_path && apath) { + char* path = map_path->absolute_path(map_path->handle, apath); + char* real_path = realpath(path, NULL); + if (strcmp(real_path, plugin->tmp_file_path)) { + fprintf(stderr, "ERROR: Restored bad path `%s' != `%s'\n", + real_path, plugin->tmp_file_path); + } + } } const void* |