[libvirt] [PATCH RFC 8/8] fdstreamtest: test virStreamSendOffset

Michal Privoznik mprivozn at redhat.com
Fri Jan 29 13:26:59 UTC 2016


Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 tests/fdstreamtest.c | 39 +++++++++++++++++++++++++++++++++++----
 1 file changed, 35 insertions(+), 4 deletions(-)

diff --git a/tests/fdstreamtest.c b/tests/fdstreamtest.c
index 5036cec..4fc88a7 100644
--- a/tests/fdstreamtest.c
+++ b/tests/fdstreamtest.c
@@ -220,9 +220,12 @@ static int testFDStreamWriteCommon(const char *scratchdir, const unsigned int fl
     virStreamPtr st = NULL;
     size_t i;
     virConnectPtr conn = NULL;
+    unsigned long long streamOffset;
+    unsigned long long streamLength;
     bool blocking = !(flags & VIR_STREAM_NONBLOCK);
+    bool sparse = flags & VIR_STREAM_SPARSE;
 
-    virCheckFlags(VIR_STREAM_NONBLOCK, -1);
+    virCheckFlags(VIR_STREAM_NONBLOCK | VIR_STREAM_SPARSE, -1);
 
     if (!(conn = virConnectOpen("test:///default")))
         goto cleanup;
@@ -243,8 +246,11 @@ static int testFDStreamWriteCommon(const char *scratchdir, const unsigned int fl
     /* Start writing 1/2 way through first pattern
      * and end 1/2 way through last pattern
      */
+    streamOffset = PATTERN_LEN / 2;
+    streamLength = sparse ? PATTERN_LEN * 8192 : PATTERN_LEN * 9;
     if (virFDStreamCreateFile(st, file,
-                              PATTERN_LEN / 2, PATTERN_LEN * 9,
+                              streamOffset,
+                              streamLength,
                               O_WRONLY, 0600) < 0)
         goto cleanup;
 
@@ -258,8 +264,11 @@ static int testFDStreamWriteCommon(const char *scratchdir, const unsigned int fl
 
         while (want > 0) {
             int got;
-        rewrite:
-            got = st->driver->streamSend(st, pattern + offset, want);
+         rewrite:
+            if (sparse)
+                got = st->driver->streamSendOffset(st, streamOffset, pattern + offset, want);
+            else
+                got = st->driver->streamSend(st, pattern + offset, want);
             if (got < 0) {
                 if (got == -2 && !blocking) {
                     usleep(20 * 1000);
@@ -272,6 +281,10 @@ static int testFDStreamWriteCommon(const char *scratchdir, const unsigned int fl
                               virGetLastErrorMessage());
                 goto cleanup;
             }
+            if (i == 0)
+                streamOffset = 8192 + PATTERN_LEN;
+            else
+                streamOffset += 8192 + PATTERN_LEN;
             offset += got;
             want -= got;
         }
@@ -286,6 +299,7 @@ static int testFDStreamWriteCommon(const char *scratchdir, const unsigned int fl
     if ((fd = open(file, O_RDONLY)) < 0)
         goto cleanup;
 
+    streamOffset = 0;
     for (i = 0; i < 10; i++) {
         size_t want;
         if (i == 9)
@@ -293,6 +307,12 @@ static int testFDStreamWriteCommon(const char *scratchdir, const unsigned int fl
         else
             want = PATTERN_LEN;
 
+        if (sparse &&
+            lseek(fd, streamOffset, SEEK_SET) < 0) {
+            virFilePrintf(stderr, "unable to seek");
+            goto cleanup;
+        }
+
         if (saferead(fd, buf, want) != want) {
             virFilePrintf(stderr, "Short read from data\n");
             goto cleanup;
@@ -321,6 +341,11 @@ static int testFDStreamWriteCommon(const char *scratchdir, const unsigned int fl
                 goto cleanup;
             }
         }
+
+        if (i == 0)
+            streamOffset = 8192 + PATTERN_LEN;
+        else
+            streamOffset += 8192 + PATTERN_LEN;
     }
 
     if (VIR_CLOSE(fd) < 0)
@@ -350,6 +375,10 @@ static int testFDStreamWriteNonblock(const void *data)
 {
     return testFDStreamWriteCommon(data, false);
 }
+static int testFDStreamSparseWriteBlock(const void *data)
+{
+    return testFDStreamWriteCommon(data, VIR_STREAM_SPARSE);
+}
 
 #define SCRATCHDIRTEMPLATE abs_builddir "/fakesysfsdir-XXXXXX"
 
@@ -374,6 +403,8 @@ mymain(void)
         ret = -1;
     if (virtTestRun("Sparse stream read blocking ", testFDStreamSparseReadBlock, scratchdir) < 0)
         ret = -1;
+    if (virtTestRun("Sparse stream write blocking ", testFDStreamSparseWriteBlock, scratchdir) < 0)
+        ret = -1;
 
     if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
         virFileDeleteTree(scratchdir);
-- 
2.4.10




More information about the libvir-list mailing list