Fix string-wchar-fixed-array-03 test (when libndr is available).
[kai/samba.git] / pidl / tests / ndr_string.pl
index 2f2d941665403ec084ad8d0a7ccf5b6217193ac4..7b76c7b29508fae1db12aab32939ade7b1e92d15 100755 (executable)
@@ -4,7 +4,7 @@
 # Published under the GNU General Public License
 use strict;
 
-use Test::More tests => 3 * 8;
+use Test::More tests => 6 * 8;
 use FindBin qw($RealBin);
 use lib "$RealBin";
 use Util qw(test_samba4_ndr);
@@ -55,6 +55,114 @@ test_samba4_ndr("string-ascii-pull",
                return 4;
 ');
 
+test_samba4_ndr("string-wchar-fixed-array-01",
+'
+       typedef struct {
+               uint32 l1;
+               [string,charset(UTF16)] uint16 str[6];
+               uint32 l2;
+       } TestStringStruct;
+
+       [public] void TestString([in,ref] TestStringStruct *str);
+',
+'
+       uint8_t data[] = { 0x01,  0x00, 0x00,  0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x04,  0x00, 0x00,  0x00,
+                          \'f\', 0x00, \'o\', 0x00,
+                          \'o\', 0x00, 0x00,  0x00,
+                          0x02,  0x00, 0x00,  0x00
+       };
+       DATA_BLOB b = { data, sizeof(data) };
+       struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL,
+               smb_iconv_convenience_init(NULL, "ASCII", "UTF8", true));
+       struct TestString r;
+       struct TestStringStruct str;
+       r.in.str = &str;
+
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestString(ndr, NDR_IN, &r)))
+               return 1;
+
+       if (r.in.str == NULL)
+               return 2;
+
+       if (r.in.str->l1 != 0x00000001)
+               return 3;
+
+       if (strncmp(str.str, "foo", 3) != 0)
+               return 4;
+
+       if (r.in.str->str[4] != 0)
+               return 5;
+
+       if (r.in.str->l2 != 0x00000002)
+               return 6;
+');
+
+test_samba4_ndr("string-wchar-fixed-array-02",
+'
+       typedef struct {
+               uint32 l1;
+               [string,charset(UTF16)] uint16 str[6];
+               uint32 l2;
+       } TestStringStruct;
+
+       [public] void TestString([in,ref] TestStringStruct *str);
+',
+'
+       uint8_t data[] = { 0x01,  0x00, 0x00,  0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x06,  0x00, 0x00,  0x00,
+                          \'f\', 0x00, \'o\', 0x00,
+                          \'o\', 0x00, \'b\', 0x00,
+                          \'a\', 0x00, \'r\', 0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x02,  0x00, 0x00,  0x00
+       };
+       DATA_BLOB b = { data, sizeof(data) };
+       struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL,
+               smb_iconv_convenience_init(NULL, "ASCII", "UTF8", true));
+       struct TestString r;
+       struct TestStringStruct str;
+       r.in.str = &str;
+
+       /* the string terminator is wrong */
+       if (NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestString(ndr, NDR_IN, &r)))
+               return 1;
+');
+
+test_samba4_ndr("string-wchar-fixed-array-03",
+'
+       typedef struct {
+               uint32 l1;
+               [string,charset(UTF16)] uint16 str[6];
+               uint32 l2;
+       } TestStringStruct;
+
+       [public] void TestString([in,ref] TestStringStruct *str);
+',
+'
+       uint8_t data[] = { 0x01,  0x00, 0x00,  0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x07,  0x00, 0x00,  0x00,
+                          \'f\', 0x00, \'o\', 0x00,
+                          \'o\', 0x00, \'b\', 0x00,
+                          \'a\', 0x00, \'r\', 0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x02,  0x00, 0x00,  0x00
+       };
+       DATA_BLOB b = { data, sizeof(data) };
+       struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL,
+               smb_iconv_convenience_init(NULL, "ASCII", "UTF8", true));
+       struct TestString r;
+       struct TestStringStruct str;
+       r.in.str = &str;
+
+       /* the length 0x07 is to large */
+       if (NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestString(ndr, NDR_IN, &r)))
+               return 1;
+');
+
 SKIP: {
        skip "doesn't seem to work yet", 8;