fate/async: test error code from underlying protocol
authorZhang Rui <bbcallen@gmail.com>
Sat, 10 Oct 2015 09:51:09 +0000 (17:51 +0800)
committerMichael Niedermayer <michael@niedermayer.cc>
Sat, 10 Oct 2015 15:58:45 +0000 (17:58 +0200)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavformat/async.c
tests/ref/fate/async

index 9172f5d..a8c8f54 100644 (file)
@@ -387,6 +387,9 @@ static const AVOption options[] = {
     {NULL},
 };
 
+#undef D
+#undef OFFSET
+
 static const AVClass async_context_class = {
     .class_name = "Async",
     .item_name  = av_default_item_name,
@@ -413,6 +416,9 @@ typedef struct TestContext {
     AVClass        *class;
     int64_t         logical_pos;
     int64_t         logical_size;
+
+    /* options */
+    int             opt_read_error;
 } TestContext;
 
 static int async_test_open(URLContext *h, const char *arg, int flags, AVDictionary **options)
@@ -434,6 +440,9 @@ static int async_test_read(URLContext *h, unsigned char *buf, int size)
     int          i;
     int          read_len = 0;
 
+    if (c->opt_read_error)
+        return c->opt_read_error;
+
     if (c->logical_pos >= c->logical_size)
         return AVERROR_EOF;
 
@@ -471,9 +480,22 @@ static int64_t async_test_seek(URLContext *h, int64_t pos, int whence)
     return new_logical_pos;
 }
 
+#define OFFSET(x) offsetof(TestContext, x)
+#define D AV_OPT_FLAG_DECODING_PARAM
+
+static const AVOption async_test_options[] = {
+    { "async-test-read-error",      "cause read fail",
+        OFFSET(opt_read_error),     AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, .flags = D },
+    {NULL},
+};
+
+#undef D
+#undef OFFSET
+
 static const AVClass async_test_context_class = {
     .class_name = "Async-Test",
     .item_name  = av_default_item_name,
+    .option     = async_test_options,
     .version    = LIBAVUTIL_VERSION_INT,
 };
 
@@ -496,10 +518,14 @@ int main(void)
     int64_t       pos;
     int64_t       read_len;
     unsigned char buf[4096];
+    AVDictionary *opts = NULL;
 
     ffurl_register_protocol(&ff_async_protocol);
     ffurl_register_protocol(&ff_async_test_protocol);
 
+    /*
+     * test normal read
+     */
     ret = ffurl_open(&h, "async:async-test:", AVIO_FLAG_READ, NULL, NULL);
     printf("open: %d\n", ret);
 
@@ -534,6 +560,9 @@ int main(void)
     }
     printf("read: %"PRId64"\n", read_len);
 
+    /*
+     * test normal seek
+     */
     ret = ffurl_read(h, buf, 1);
     printf("read: %d\n", ret);
 
@@ -568,7 +597,19 @@ int main(void)
     ret = ffurl_read(h, buf, 1);
     printf("read: %d\n", ret);
 
+    /*
+     * test read error
+     */
+    ffurl_close(h);
+    av_dict_set_int(&opts, "async-test-read-error", -10000, 0);
+    ret = ffurl_open(&h, "async:async-test:", AVIO_FLAG_READ, NULL, &opts);
+    printf("open: %d\n", ret);
+
+    ret = ffurl_read(h, buf, 1);
+    printf("read: %d\n", ret);
+
 fail:
+    av_dict_free(&opts);
     ffurl_close(h);
     return 0;
 }
index 3ab5e8c..c4c0b0b 100644 (file)
@@ -5,3 +5,5 @@ read: 0
 seek: 1536
 read: 512
 read: 0
+open: 0
+read: -10000