예제 #1
0
파일: tests.c 프로젝트: eldstal/libsooshi
static void
test_parse_partial_str(StateWrapper *wrapper, gconstpointer user_data)
{
    guchar buffer[] = { 0x00, 0x0e, 0x00, 0x73, 0x6f, 0x6f, 0x73, 0x68, 0x69, 0x20 };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer, sizeof(buffer));

    SooshiNode *node = g_new0(SooshiNode, 1);
    node->type = VAL_STR;

    // First run should return NULL and not remove any bytes from the byte array
    gulong byte_array_size = wrapper->state->buffer->len;
    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);
    
    g_assert_null(node->value);
    g_assert_cmpuint(byte_array_size, ==, wrapper->state->buffer->len);

    guchar buffer2[] = { 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67 };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer2, sizeof(buffer2));
    
    // Second run should now be able to succesfully parse the string
    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);

    g_assert_nonnull(node->value);
    g_assert_true(g_variant_is_of_type(node->value, G_VARIANT_TYPE_STRING));
    g_assert_cmpstr(g_variant_get_string(node->value, NULL), ==, "sooshi testing");

    guchar buffer3[16];
    gint length = sooshi_node_value_to_bytes(node, buffer3);
    g_assert_cmpint(length, ==, sizeof(buffer3));
    g_assert_cmpmem(buffer3, sizeof(buffer) - 1, buffer + 1, sizeof(buffer) - 1); 
    g_assert_cmpmem(buffer3 + sizeof(buffer) - 1, sizeof(buffer3) - (sizeof(buffer) - 1), buffer2, sizeof(buffer2)); 

    g_free(node);
}
예제 #2
0
파일: tests.c 프로젝트: eldstal/libsooshi
static void
test_parse_flt(StateWrapper *wrapper, gconstpointer user_data)
{
    float real_value = 12.3456789;
    guchar buffer[] = { 0x00,
        ((guchar*)&real_value)[0],
        ((guchar*)&real_value)[1],
        ((guchar*)&real_value)[2],
        ((guchar*)&real_value)[3],
    };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer, sizeof(buffer));

    SooshiNode *node = g_new0(SooshiNode, 1);
    node->type = VAL_FLT;

    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);

    g_assert_nonnull(node->value);
    g_assert_true(g_variant_is_of_type(node->value, G_VARIANT_TYPE_DOUBLE));
    g_assert_cmpfloat(g_variant_get_double(node->value), ==, real_value);

    guchar buffer2[4];
    gint length = sooshi_node_value_to_bytes(node, buffer2);
    g_assert_cmpint(length, ==, sizeof(buffer2));
    g_assert_cmpmem(buffer2, length, buffer + 1, sizeof(buffer) - 1); 

    g_free(node);
}
예제 #3
0
static void test_set_rock_blocks(void) {
  const int shape[2] = {10, 20};
  double **z = (double**)malloc(sizeof(double*) * shape[0]);
  char **rock_type = (char**)malloc(sizeof(char*) * shape[0]);
  int i;
  char expected[20] = {
    'f', 'f', 's', 's', 's',
    'f', 'f', 's', 's', 's', 'f', 'f', 's', 's', 's',
    'f', 'f', 's', 's', 's'
  };

  z[0] = (double*)malloc(sizeof(double) * shape[0] * shape[1]);
  rock_type[0] = (char*)malloc(sizeof(char) * shape[0] * shape[1]);
  for (i=1; i < shape[0]; i++) {
    z[i] = z[i-1] + shape[1];
    rock_type[i] = rock_type[i-1] + shape[1];
  }

  set_rock_blocks(rock_type, z, shape[0], shape[1], 2);

  for (i=0; i < shape[0]; i++)
    g_assert_cmpmem(rock_type[i], shape[1], expected, shape[1]);

  free(rock_type[0]);
  free(rock_type);
  free(z[0]);
  free(z);
}
예제 #4
0
파일: virtio-9p-test.c 프로젝트: 8tab/qemu
static void fs_version(QVirtIO9P *v9p)
{
    const char *version = "9P2000.L";
    uint16_t server_len;
    char *server_version;
    P9Req *req;

    req = v9fs_tversion(v9p, P9_MAX_SIZE, version);
    v9fs_rversion(req, &server_len, &server_version);

    g_assert_cmpmem(server_version, server_len, version, strlen(version));

    g_free(server_version);
}
예제 #5
0
파일: virtio-9p-test.c 프로젝트: 8tab/qemu
static void pci_config(QVirtIO9P *v9p)
{
    size_t tag_len = qvirtio_config_readw(v9p->dev, 0);
    char *tag;
    int i;

    g_assert_cmpint(tag_len, ==, strlen(mount_tag));

    tag = g_malloc(tag_len);
    for (i = 0; i < tag_len; i++) {
        tag[i] = qvirtio_config_readb(v9p->dev, i + 2);
    }
    g_assert_cmpmem(tag, tag_len, mount_tag, tag_len);
    g_free(tag);
}
예제 #6
0
파일: virtio-9p-test.c 프로젝트: 8tab/qemu
static void fs_walk_dotdot(QVirtIO9P *v9p)
{
    char *const wnames[] = { g_strdup("..") };
    v9fs_qid root_qid, *wqid;
    P9Req *req;

    fs_version(v9p);
    req = v9fs_tattach(v9p, 0, getuid());
    v9fs_rattach(req, &root_qid);

    req = v9fs_twalk(v9p, 0, 1, 1, wnames);
    v9fs_rwalk(req, NULL, &wqid); /* We now we'll get one qid */

    g_assert_cmpmem(&root_qid, 13, wqid[0], 13);

    g_free(wqid);
    g_free(wnames[0]);
}
예제 #7
0
파일: tests.c 프로젝트: eldstal/libsooshi
static void
test_parse_bin(StateWrapper *wrapper, gconstpointer user_data)
{
    guchar buffer[] = { 0x00, 0x06, 0x00, 0x73, 0x6f, 0x6f, 0x73, 0x68, 0x69 };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer, sizeof(buffer));

    SooshiNode *node = g_new0(SooshiNode, 1);
    node->type = VAL_BIN;

    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);

    g_assert_nonnull(node->value);
    g_assert_true(g_variant_is_of_type(node->value, G_VARIANT_TYPE_BYTESTRING));
    const gchar *mem = g_variant_get_bytestring(node->value);
    g_assert_cmpmem(mem, strlen(mem), buffer + 3, sizeof(buffer) - 3);

    g_free(node);
}
예제 #8
0
파일: tests.c 프로젝트: eldstal/libsooshi
static void
test_parse_uint32(StateWrapper *wrapper, gconstpointer user_data)
{
    guchar buffer[] = { 0x00, 0x12, 0x34, 0x56, 0x78 };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer, sizeof(buffer));

    SooshiNode *node = g_new0(SooshiNode, 1);
    node->type = VAL_U32;

    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);

    g_assert_nonnull(node->value);
    g_assert_true(g_variant_is_of_type(node->value, G_VARIANT_TYPE_UINT32));
    g_assert_cmpuint(g_variant_get_uint32(node->value), ==, (guint32) 0x78563412);

    guchar buffer2[4];
    gint length = sooshi_node_value_to_bytes(node, buffer2);
    g_assert_cmpint(length, ==, sizeof(buffer2));
    g_assert_cmpmem(buffer2, length, buffer + 1, sizeof(buffer) - 1); 

    g_free(node);
}
예제 #9
0
파일: tests.c 프로젝트: eldstal/libsooshi
static void
test_parse_chooser(StateWrapper *wrapper, gconstpointer user_data)
{
    guchar buffer[] = { 0x00, 0x06 };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer, sizeof(buffer));

    SooshiNode *node = g_new0(SooshiNode, 1);
    node->type = CHOOSER;

    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);

    g_assert_nonnull(node->value);
    g_assert_true(g_variant_is_of_type(node->value, G_VARIANT_TYPE_BYTE));
    g_assert_cmpuint(g_variant_get_byte(node->value), ==, 0x06);

    guchar buffer2[1];
    gint length = sooshi_node_value_to_bytes(node, buffer2);
    g_assert_cmpint(length, ==, sizeof(buffer2));
    g_assert_cmpmem(buffer2, length, buffer + 1, sizeof(buffer) - 1); 

    g_free(node);
}
예제 #10
0
파일: tests.c 프로젝트: eldstal/libsooshi
static void
test_parse_str(StateWrapper *wrapper, gconstpointer user_data)
{
    guchar buffer[] = { 0x00, 0x06, 0x00, 0x73, 0x6f, 0x6f, 0x73, 0x68, 0x69 };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer, sizeof(buffer));

    SooshiNode *node = g_new0(SooshiNode, 1);
    node->type = VAL_STR;

    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);

    g_assert_nonnull(node->value);
    g_assert_true(g_variant_is_of_type(node->value, G_VARIANT_TYPE_STRING));
    g_assert_cmpstr(g_variant_get_string(node->value, NULL), ==, "sooshi");

    guchar buffer2[8];
    gint length = sooshi_node_value_to_bytes(node, buffer2);
    g_assert_cmpint(length, ==, sizeof(buffer2));
    g_assert_cmpmem(buffer2, length, buffer + 1, sizeof(buffer) - 1); 

    g_free(node);
}
예제 #11
0
파일: tests.c 프로젝트: eldstal/libsooshi
static void
test_parse_int16(StateWrapper *wrapper, gconstpointer user_data)
{
    guchar buffer[] = { 0x00, 0xAB, 0xCD };
    wrapper->state->buffer = g_byte_array_append(wrapper->state->buffer, buffer, sizeof(buffer));

    SooshiNode *node = g_new0(SooshiNode, 1);
    node->type = VAL_S16;

    sooshi_node_bytes_to_value(node, wrapper->state->buffer, &node->value);

    g_assert_nonnull(node->value);
    g_assert_true(g_variant_is_of_type(node->value, G_VARIANT_TYPE_INT16));
    g_assert_cmpint(g_variant_get_int16(node->value), ==, (gint16) 0xCDAB);

    guchar buffer2[2];
    gint length = sooshi_node_value_to_bytes(node, buffer2);
    g_assert_cmpint(length, ==, sizeof(buffer2));
    g_assert_cmpmem(buffer2, length, buffer + 1, sizeof(buffer) - 1); 

    g_free(node);
}
예제 #12
0
static void
test_jabber_scram_proofs(void) {
	JabberScramData *data = g_new0(JabberScramData, 1);
	gboolean ret;
	GString *salt;
	const char *client_proof;
/*	const char *server_signature; */

	data->hash = &sha1_mech;
	data->password = g_strdup("password");
	data->auth_message = g_string_new("[email protected],r=8jLxB5515dhFxBil5A0xSXMH,"
			"r=8jLxB5515dhFxBil5A0xSXMHabc,s=c2FsdA==,i=1,"
			"c=biws,r=8jLxB5515dhFxBil5A0xSXMHabc");
	client_proof = "\x48\x61\x30\xa5\x61\x0b\xae\xb9\xe4\x11\xa8\xfd\xa5\xcd\x34\x1d\x8a\x3c\x28\x17";

	salt = g_string_new("salt");
	ret = jabber_scram_calc_proofs(data, salt, 1);
	g_assert_true(ret);

	g_assert_cmpmem(client_proof, 20, data->client_proof->str, 20);
	g_string_free(salt, TRUE);

	jabber_scram_data_destroy(data);
}
예제 #13
0
static void pci_basic_config(void)
{
    QVirtIO9P *v9p;
    size_t tag_len;
    char *tag;
    int i;
    QOSState *qs;

    qs = qvirtio_9p_start();
    v9p = qvirtio_9p_pci_init(qs);

    tag_len = qvirtio_config_readw(v9p->dev, 0);
    g_assert_cmpint(tag_len, ==, strlen(mount_tag));

    tag = g_malloc(tag_len);
    for (i = 0; i < tag_len; i++) {
        tag[i] = qvirtio_config_readb(v9p->dev, i + 2);
    }
    g_assert_cmpmem(tag, tag_len, mount_tag, tag_len);
    g_free(tag);

    qvirtio_9p_pci_free(v9p);
    qvirtio_9p_stop(qs);
}
예제 #14
0
static void test_basic(QVirtioDevice *dev, QGuestAllocator *alloc,
                       QVirtQueue *vq)
{
    QVirtioBlkReq req;
    uint64_t req_addr;
    uint64_t capacity;
    uint32_t features;
    uint32_t free_head;
    uint8_t status;
    char *data;

    capacity = qvirtio_config_readq(dev, 0);

    g_assert_cmpint(capacity, ==, TEST_IMAGE_SIZE / 512);

    features = qvirtio_get_features(dev);
    features = features & ~(QVIRTIO_F_BAD_FEATURE |
                    (1u << VIRTIO_RING_F_INDIRECT_DESC) |
                    (1u << VIRTIO_RING_F_EVENT_IDX) |
                    (1u << VIRTIO_BLK_F_SCSI));
    qvirtio_set_features(dev, features);

    qvirtio_set_driver_ok(dev);

    /* Write and read with 3 descriptor layout */
    /* Write request */
    req.type = VIRTIO_BLK_T_OUT;
    req.ioprio = 1;
    req.sector = 0;
    req.data = g_malloc0(512);
    strcpy(req.data, "TEST");

    req_addr = virtio_blk_request(alloc, dev, &req, 512);

    g_free(req.data);

    free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
    qvirtqueue_add(vq, req_addr + 16, 512, false, true);
    qvirtqueue_add(vq, req_addr + 528, 1, true, false);

    qvirtqueue_kick(dev, vq, free_head);

    qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US);
    status = readb(req_addr + 528);
    g_assert_cmpint(status, ==, 0);

    guest_free(alloc, req_addr);

    /* Read request */
    req.type = VIRTIO_BLK_T_IN;
    req.ioprio = 1;
    req.sector = 0;
    req.data = g_malloc0(512);

    req_addr = virtio_blk_request(alloc, dev, &req, 512);

    g_free(req.data);

    free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
    qvirtqueue_add(vq, req_addr + 16, 512, true, true);
    qvirtqueue_add(vq, req_addr + 528, 1, true, false);

    qvirtqueue_kick(dev, vq, free_head);

    qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US);
    status = readb(req_addr + 528);
    g_assert_cmpint(status, ==, 0);

    data = g_malloc0(512);
    memread(req_addr + 16, data, 512);
    g_assert_cmpstr(data, ==, "TEST");
    g_free(data);

    guest_free(alloc, req_addr);

    if (features & (1u << VIRTIO_BLK_F_WRITE_ZEROES)) {
        struct virtio_blk_discard_write_zeroes dwz_hdr;
        void *expected;

        /*
         * WRITE_ZEROES request on the same sector of previous test where
         * we wrote "TEST".
         */
        req.type = VIRTIO_BLK_T_WRITE_ZEROES;
        req.data = (char *) &dwz_hdr;
        dwz_hdr.sector = 0;
        dwz_hdr.num_sectors = 1;
        dwz_hdr.flags = 0;

        virtio_blk_fix_dwz_hdr(dev, &dwz_hdr);

        req_addr = virtio_blk_request(alloc, dev, &req, sizeof(dwz_hdr));

        free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
        qvirtqueue_add(vq, req_addr + 16, sizeof(dwz_hdr), false, true);
        qvirtqueue_add(vq, req_addr + 16 + sizeof(dwz_hdr), 1, true, false);

        qvirtqueue_kick(dev, vq, free_head);

        qvirtio_wait_used_elem(dev, vq, free_head, NULL,
                               QVIRTIO_BLK_TIMEOUT_US);
        status = readb(req_addr + 16 + sizeof(dwz_hdr));
        g_assert_cmpint(status, ==, 0);

        guest_free(alloc, req_addr);

        /* Read request to check if the sector contains all zeroes */
        req.type = VIRTIO_BLK_T_IN;
        req.ioprio = 1;
        req.sector = 0;
        req.data = g_malloc0(512);

        req_addr = virtio_blk_request(alloc, dev, &req, 512);

        g_free(req.data);

        free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
        qvirtqueue_add(vq, req_addr + 16, 512, true, true);
        qvirtqueue_add(vq, req_addr + 528, 1, true, false);

        qvirtqueue_kick(dev, vq, free_head);

        qvirtio_wait_used_elem(dev, vq, free_head, NULL,
                               QVIRTIO_BLK_TIMEOUT_US);
        status = readb(req_addr + 528);
        g_assert_cmpint(status, ==, 0);

        data = g_malloc(512);
        expected = g_malloc0(512);
        memread(req_addr + 16, data, 512);
        g_assert_cmpmem(data, 512, expected, 512);
        g_free(expected);
        g_free(data);

        guest_free(alloc, req_addr);
    }

    if (features & (1u << VIRTIO_BLK_F_DISCARD)) {
        struct virtio_blk_discard_write_zeroes dwz_hdr;

        req.type = VIRTIO_BLK_T_DISCARD;
        req.data = (char *) &dwz_hdr;
        dwz_hdr.sector = 0;
        dwz_hdr.num_sectors = 1;
        dwz_hdr.flags = 0;

        virtio_blk_fix_dwz_hdr(dev, &dwz_hdr);

        req_addr = virtio_blk_request(alloc, dev, &req, sizeof(dwz_hdr));

        free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
        qvirtqueue_add(vq, req_addr + 16, sizeof(dwz_hdr), false, true);
        qvirtqueue_add(vq, req_addr + 16 + sizeof(dwz_hdr), 1, true, false);

        qvirtqueue_kick(dev, vq, free_head);

        qvirtio_wait_used_elem(dev, vq, free_head, NULL,
                               QVIRTIO_BLK_TIMEOUT_US);
        status = readb(req_addr + 16 + sizeof(dwz_hdr));
        g_assert_cmpint(status, ==, 0);

        guest_free(alloc, req_addr);
    }

    if (features & (1u << VIRTIO_F_ANY_LAYOUT)) {
        /* Write and read with 2 descriptor layout */
        /* Write request */
        req.type = VIRTIO_BLK_T_OUT;
        req.ioprio = 1;
        req.sector = 1;
        req.data = g_malloc0(512);
        strcpy(req.data, "TEST");

        req_addr = virtio_blk_request(alloc, dev, &req, 512);

        g_free(req.data);

        free_head = qvirtqueue_add(vq, req_addr, 528, false, true);
        qvirtqueue_add(vq, req_addr + 528, 1, true, false);
        qvirtqueue_kick(dev, vq, free_head);

        qvirtio_wait_used_elem(dev, vq, free_head, NULL,
                               QVIRTIO_BLK_TIMEOUT_US);
        status = readb(req_addr + 528);
        g_assert_cmpint(status, ==, 0);

        guest_free(alloc, req_addr);

        /* Read request */
        req.type = VIRTIO_BLK_T_IN;
        req.ioprio = 1;
        req.sector = 1;
        req.data = g_malloc0(512);

        req_addr = virtio_blk_request(alloc, dev, &req, 512);

        g_free(req.data);

        free_head = qvirtqueue_add(vq, req_addr, 16, false, true);
        qvirtqueue_add(vq, req_addr + 16, 513, true, false);

        qvirtqueue_kick(dev, vq, free_head);

        qvirtio_wait_used_elem(dev, vq, free_head, NULL,
                               QVIRTIO_BLK_TIMEOUT_US);
        status = readb(req_addr + 528);
        g_assert_cmpint(status, ==, 0);

        data = g_malloc0(512);
        memread(req_addr + 16, data, 512);
        g_assert_cmpstr(data, ==, "TEST");
        g_free(data);

        guest_free(alloc, req_addr);
    }