app/test: create files from resources
authorJan Viktorin <viktorin@rehivetech.com>
Mon, 13 Jun 2016 15:07:39 +0000 (17:07 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 13 Jun 2016 18:56:53 +0000 (20:56 +0200)
A resource can be written into the target filesystem by calling
resource_fwrite or resource_fwrite_file. Such file can be created
before a test is started and removed after the test finishes.

Signed-off-by: Jan Viktorin <viktorin@rehivetech.com>
app/test/resource.c
app/test/resource.h
app/test/test_resource.c

index 30513db..acb63c1 100644 (file)
@@ -31,6 +31,7 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <stdio.h>
 #include <string.h>
 #include <errno.h>
 #include <sys/queue.h>
@@ -60,6 +61,40 @@ const struct resource *resource_find(const char *name)
        return NULL;
 }
 
+int resource_fwrite(const struct resource *r, FILE *f)
+{
+       const size_t goal = resource_size(r);
+       size_t total = 0;
+
+       while (total < goal) {
+               size_t wlen = fwrite(r->begin + total, 1, goal - total, f);
+               if (wlen == 0) {
+                       perror(__func__);
+                       return -1;
+               }
+
+               total += wlen;
+       }
+
+       return 0;
+}
+
+int resource_fwrite_file(const struct resource *r, const char *fname)
+{
+       FILE *f;
+       int ret;
+
+       f = fopen(fname, "w");
+       if (f == NULL) {
+               perror(__func__);
+               return -1;
+       }
+
+       ret = resource_fwrite(r, f);
+       fclose(f);
+       return ret;
+}
+
 void resource_register(struct resource *r)
 {
        TAILQ_INSERT_TAIL(&resource_list, r, next);
index 966fc24..ac9cae6 100644 (file)
@@ -45,6 +45,7 @@
  */
 
 #include <sys/queue.h>
+#include <stdio.h>
 #include <stddef.h>
 
 #include <rte_eal.h>
@@ -74,6 +75,19 @@ size_t resource_size(const struct resource *r);
  */
 const struct resource *resource_find(const char *name);
 
+/**
+ * Write the raw data of the resource to the given file.
+ * @return 0 on success
+ */
+int resource_fwrite(const struct resource *r, FILE *f);
+
+/**
+ * Write the raw data of the resource to the given file given by name.
+ * The name is relative to the current working directory.
+ * @return 0 on success
+ */
+int resource_fwrite_file(const struct resource *r, const char *fname);
+
 /**
  * Register a resource in the global list of resources.
  * Not intended for direct use, please check the REGISTER_RESOURCE
index b397fa8..3d1bf00 100644 (file)
@@ -65,6 +65,7 @@ REGISTER_LINKED_RESOURCE(test_resource_c);
 static int test_resource_c(void)
 {
        const struct resource *r;
+       FILE *f;
 
        r = resource_find("test_resource_c");
        TEST_ASSERT_NOT_NULL(r, "No test_resource_c found");
@@ -72,6 +73,15 @@ static int test_resource_c(void)
                        "Found resource %s, expected test_resource_c",
                        r->name);
 
+       TEST_ASSERT_SUCCESS(resource_fwrite_file(r, "test_resource.c"),
+                       "Failed to to write file %s", r->name);
+
+       f = fopen("test_resource.c", "r");
+       TEST_ASSERT_NOT_NULL(f,
+                       "Missing extracted file resource.c");
+       fclose(f);
+       remove("test_resource.c");
+
        return 0;
 }