Skip to main content
  • Home
  • login
  • Browse the archive

    swh mirror partner logo
swh logo
SoftwareHeritage
Software
Heritage
Mirror
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

swh:1:snp:dc2a5002442a00b1c0eda7c65d04ea7455e166cd
  • Code
  • Branches (204)
  • Releases (207)
    • Branches
    • Releases
    • HEAD
    • refs/heads/OpenSSL-engine-0_9_6-stable
    • refs/heads/OpenSSL-fips-0_9_7-stable
    • refs/heads/OpenSSL-fips-0_9_8-stable
    • refs/heads/OpenSSL-fips-1_2-stable
    • refs/heads/OpenSSL-fips-2_0-dev
    • refs/heads/OpenSSL-fips-2_0-stable
    • refs/heads/OpenSSL-fips2-0_9_7-stable
    • refs/heads/OpenSSL_0_9_6-stable
    • refs/heads/OpenSSL_0_9_7-stable
    • refs/heads/OpenSSL_0_9_8-stable
    • refs/heads/OpenSSL_0_9_8fg-stable
    • refs/heads/OpenSSL_1_0_0-stable
    • refs/heads/OpenSSL_1_0_1-stable
    • refs/heads/OpenSSL_1_0_2-stable
    • refs/heads/OpenSSL_1_1_0-stable
    • refs/heads/OpenSSL_1_1_1-stable
    • refs/heads/SSLeay
    • refs/heads/feature/dtls-1.3
    • refs/heads/feature/ech
    • refs/heads/feature/quic-server
    • refs/heads/master
    • refs/heads/openssl-3.0
    • refs/heads/openssl-3.1
    • refs/heads/openssl-3.2
    • refs/heads/openssl-3.3
    • refs/heads/openssl-3.4
    • refs/heads/tls1.3-draft-18
    • refs/heads/tls1.3-draft-19
    • refs/tags/AFTER_COMPAQ_PATCH
    • refs/tags/BEFORE_COMPAQ_PATCH
    • refs/tags/BEFORE_engine
    • refs/tags/BEN_FIPS_TEST_1
    • refs/tags/BEN_FIPS_TEST_2
    • refs/tags/BEN_FIPS_TEST_3
    • refs/tags/BEN_FIPS_TEST_4
    • refs/tags/BEN_FIPS_TEST_5
    • refs/tags/BEN_FIPS_TEST_6
    • refs/tags/BEN_FIPS_TEST_7
    • refs/tags/BEN_FIPS_TEST_8
    • refs/tags/FIPS_098_TEST_1
    • refs/tags/FIPS_098_TEST_2
    • refs/tags/FIPS_098_TEST_3
    • refs/tags/FIPS_098_TEST_4
    • refs/tags/FIPS_098_TEST_5
    • refs/tags/FIPS_098_TEST_6
    • refs/tags/FIPS_098_TEST_7
    • refs/tags/FIPS_098_TEST_8
    • refs/tags/FIPS_TEST_10
    • refs/tags/FIPS_TEST_9
    • refs/tags/LEVITTE_after_const
    • refs/tags/LEVITTE_before_const
    • refs/tags/OpenSSL-engine-0_9_6
    • refs/tags/OpenSSL-engine-0_9_6-beta1
    • refs/tags/OpenSSL-engine-0_9_6-beta2
    • refs/tags/OpenSSL-engine-0_9_6-beta3
    • refs/tags/OpenSSL-engine-0_9_6a
    • refs/tags/OpenSSL-engine-0_9_6a-beta1
    • refs/tags/OpenSSL-engine-0_9_6a-beta2
    • refs/tags/OpenSSL-engine-0_9_6a-beta3
    • refs/tags/OpenSSL-engine-0_9_6b
    • refs/tags/OpenSSL-engine-0_9_6c
    • refs/tags/OpenSSL-engine-0_9_6d
    • refs/tags/OpenSSL-engine-0_9_6d-beta1
    • refs/tags/OpenSSL-engine-0_9_6e
    • refs/tags/OpenSSL-engine-0_9_6f
    • refs/tags/OpenSSL-engine-0_9_6g
    • refs/tags/OpenSSL-engine-0_9_6h
    • refs/tags/OpenSSL-engine-0_9_6i
    • refs/tags/OpenSSL-engine-0_9_6j
    • refs/tags/OpenSSL-engine-0_9_6k
    • refs/tags/OpenSSL-engine-0_9_6l
    • refs/tags/OpenSSL-engine-0_9_6m
    • refs/tags/OpenSSL-fips-1_2_0
    • refs/tags/OpenSSL-fips-1_2_1
    • refs/tags/OpenSSL-fips-1_2_2
    • refs/tags/OpenSSL-fips-1_2_3
    • refs/tags/OpenSSL-fips-2_0
    • refs/tags/OpenSSL-fips-2_0-pl1
    • refs/tags/OpenSSL-fips-2_0-rc1
    • refs/tags/OpenSSL-fips-2_0-rc2
    • refs/tags/OpenSSL-fips-2_0-rc3
    • refs/tags/OpenSSL-fips-2_0-rc4
    • refs/tags/OpenSSL-fips-2_0-rc5
    • refs/tags/OpenSSL-fips-2_0-rc6
    • refs/tags/OpenSSL-fips-2_0-rc7
    • refs/tags/OpenSSL-fips-2_0-rc8
    • refs/tags/OpenSSL-fips-2_0-rc9
    • refs/tags/OpenSSL-fips-2_0_1
    • refs/tags/OpenSSL_0_9_1c
    • refs/tags/OpenSSL_0_9_2b
    • refs/tags/OpenSSL_0_9_3
    • refs/tags/OpenSSL_0_9_3a
    • refs/tags/OpenSSL_0_9_3beta1
    • refs/tags/OpenSSL_0_9_3beta2
    • refs/tags/OpenSSL_0_9_4
    • refs/tags/OpenSSL_0_9_5
    • refs/tags/OpenSSL_0_9_5a
    • refs/tags/OpenSSL_0_9_5a-beta1
    • refs/tags/OpenSSL_0_9_5a-beta2
    • refs/tags/OpenSSL_0_9_5beta1
    • refs/tags/OpenSSL_0_9_5beta2
    • refs/tags/OpenSSL_0_9_6
    • refs/tags/OpenSSL_0_9_6-beta1
    • refs/tags/OpenSSL_0_9_6-beta2
    • refs/tags/OpenSSL_0_9_6-beta3
    • refs/tags/OpenSSL_0_9_6a
    • refs/tags/OpenSSL_0_9_6a-beta1
    • refs/tags/OpenSSL_0_9_6a-beta2
    • refs/tags/OpenSSL_0_9_6a-beta3
    • refs/tags/OpenSSL_0_9_6b
    • refs/tags/OpenSSL_0_9_6c
    • refs/tags/OpenSSL_0_9_6d
    • refs/tags/OpenSSL_0_9_6d-beta1
    • refs/tags/OpenSSL_0_9_6e
    • refs/tags/OpenSSL_0_9_6f
    • refs/tags/OpenSSL_0_9_6g
    • refs/tags/OpenSSL_0_9_6h
    • refs/tags/OpenSSL_0_9_6i
    • refs/tags/OpenSSL_0_9_6j
    • refs/tags/OpenSSL_0_9_6k
    • refs/tags/OpenSSL_0_9_6l
    • refs/tags/OpenSSL_0_9_6m
    • refs/tags/OpenSSL_0_9_7
    • refs/tags/OpenSSL_0_9_7-beta1
    • refs/tags/OpenSSL_0_9_7-beta2
    • refs/tags/OpenSSL_0_9_7-beta3
    • refs/tags/OpenSSL_0_9_7-beta4
    • refs/tags/OpenSSL_0_9_7-beta5
    • refs/tags/OpenSSL_0_9_7-beta6
    • refs/tags/OpenSSL_0_9_7a
    • refs/tags/OpenSSL_0_9_7b
    • refs/tags/OpenSSL_0_9_7c
    • refs/tags/OpenSSL_0_9_7d
    • refs/tags/OpenSSL_0_9_7e
    • refs/tags/OpenSSL_0_9_7f
    • refs/tags/OpenSSL_0_9_7g
    • refs/tags/OpenSSL_0_9_7h
    • refs/tags/OpenSSL_0_9_7i
    • refs/tags/OpenSSL_0_9_7j
    • refs/tags/OpenSSL_0_9_7k
    • refs/tags/OpenSSL_0_9_7l
    • refs/tags/OpenSSL_0_9_7m
    • refs/tags/OpenSSL_0_9_8
    • refs/tags/OpenSSL_0_9_8-beta1
    • refs/tags/OpenSSL_0_9_8-beta2
    • refs/tags/OpenSSL_0_9_8-beta3
    • refs/tags/OpenSSL_0_9_8-beta4
    • refs/tags/OpenSSL_0_9_8-beta5
    • refs/tags/OpenSSL_0_9_8-beta6
    • refs/tags/OpenSSL_0_9_8a
    • refs/tags/OpenSSL_0_9_8b
    • refs/tags/OpenSSL_0_9_8c
    • refs/tags/OpenSSL_0_9_8d
    • refs/tags/OpenSSL_0_9_8e
    • refs/tags/OpenSSL_0_9_8f
    • refs/tags/OpenSSL_0_9_8g
    • refs/tags/OpenSSL_0_9_8h
    • refs/tags/OpenSSL_0_9_8i
    • refs/tags/OpenSSL_0_9_8j
    • refs/tags/OpenSSL_0_9_8k
    • refs/tags/OpenSSL_0_9_8l
    • refs/tags/OpenSSL_0_9_8m
    • refs/tags/OpenSSL_0_9_8m-beta1
    • refs/tags/OpenSSL_0_9_8n
    • refs/tags/OpenSSL_0_9_8o
    • refs/tags/OpenSSL_0_9_8p
    • refs/tags/OpenSSL_0_9_8q
    • refs/tags/OpenSSL_0_9_8r
    • refs/tags/OpenSSL_0_9_8s
    • refs/tags/OpenSSL_0_9_8t
    • refs/tags/OpenSSL_0_9_8u
    • refs/tags/OpenSSL_0_9_8v
    • refs/tags/OpenSSL_0_9_8w
    • refs/tags/OpenSSL_0_9_8x
    • refs/tags/OpenSSL_1_0_0
    • refs/tags/OpenSSL_1_0_0-beta1
    • refs/tags/OpenSSL_1_0_0-beta2
    • refs/tags/OpenSSL_1_0_0-beta3
    • refs/tags/OpenSSL_1_0_0-beta4
    • refs/tags/OpenSSL_1_0_0-beta5
    • refs/tags/OpenSSL_1_0_0a
    • refs/tags/OpenSSL_1_0_0b
    • refs/tags/OpenSSL_1_0_0c
    • refs/tags/OpenSSL_1_0_0d
    • refs/tags/OpenSSL_1_0_0e
    • refs/tags/OpenSSL_1_0_0f
    • refs/tags/OpenSSL_1_0_0g
    • refs/tags/OpenSSL_1_0_0h
    • refs/tags/OpenSSL_1_0_0i
    • refs/tags/OpenSSL_1_0_0j
    • refs/tags/OpenSSL_1_0_1
    • refs/tags/OpenSSL_1_0_1-beta1
    • refs/tags/OpenSSL_1_0_1-beta2
    • refs/tags/OpenSSL_1_0_1-beta3
    • refs/tags/OpenSSL_1_0_1a
    • refs/tags/OpenSSL_1_0_1b
    • refs/tags/OpenSSL_1_0_1c
    • refs/tags/OpenSSL_FIPS_1_0
    • refs/tags/SSLeay_0_8_1b
    • refs/tags/SSLeay_0_9_0b
    • refs/tags/SSLeay_0_9_1b
    • refs/tags/STATE_after_zlib
    • refs/tags/STATE_before_zlib
    • refs/tags/rsaref
    • openssl-3.4.0-alpha1
    • openssl-3.3.2
    • openssl-3.3.1
    • openssl-3.3.0-beta1
    • openssl-3.3.0-alpha1
    • openssl-3.3.0
    • openssl-3.2.3
    • openssl-3.2.2
    • openssl-3.2.1
    • openssl-3.2.0-beta1
    • openssl-3.2.0-alpha2
    • openssl-3.2.0-alpha1
    • openssl-3.2.0
    • openssl-3.1.7
    • openssl-3.1.6
    • openssl-3.1.5
    • openssl-3.1.4
    • openssl-3.1.3
    • openssl-3.1.2
    • openssl-3.1.1
    • openssl-3.1.0-beta1
    • openssl-3.1.0-alpha1
    • openssl-3.1.0
    • openssl-3.0.9
    • openssl-3.0.8
    • openssl-3.0.7
    • openssl-3.0.6
    • openssl-3.0.5
    • openssl-3.0.4
    • openssl-3.0.3
    • openssl-3.0.2
    • openssl-3.0.15
    • openssl-3.0.14
    • openssl-3.0.13
    • openssl-3.0.12
    • openssl-3.0.11
    • openssl-3.0.10
    • openssl-3.0.1
    • openssl-3.0.0-beta2
    • openssl-3.0.0-beta1
    • openssl-3.0.0-alpha9
    • openssl-3.0.0-alpha8
    • openssl-3.0.0-alpha7
    • openssl-3.0.0-alpha6
    • openssl-3.0.0-alpha5
    • openssl-3.0.0-alpha4
    • openssl-3.0.0-alpha3
    • openssl-3.0.0-alpha2
    • openssl-3.0.0-alpha17
    • openssl-3.0.0-alpha16
    • openssl-3.0.0-alpha15
    • openssl-3.0.0-alpha14
    • openssl-3.0.0-alpha13
    • openssl-3.0.0-alpha12
    • openssl-3.0.0-alpha11
    • openssl-3.0.0-alpha10
    • openssl-3.0.0-alpha1
    • openssl-3.0.0
    • master-pre-reformat
    • master-pre-auto-reformat
    • master-post-reformat
    • master-post-auto-reformat
    • OpenSSL_1_1_1w
    • OpenSSL_1_1_1v
    • OpenSSL_1_1_1u
    • OpenSSL_1_1_1t
    • OpenSSL_1_1_1s
    • OpenSSL_1_1_1r
    • OpenSSL_1_1_1q
    • OpenSSL_1_1_1p
    • OpenSSL_1_1_1o
    • OpenSSL_1_1_1n
    • OpenSSL_1_1_1m
    • OpenSSL_1_1_1l
    • OpenSSL_1_1_1k
    • OpenSSL_1_1_1j
    • OpenSSL_1_1_1i
    • OpenSSL_1_1_1h
    • OpenSSL_1_1_1g
    • OpenSSL_1_1_1f
    • OpenSSL_1_1_1e
    • OpenSSL_1_1_1d
    • OpenSSL_1_1_1c
    • OpenSSL_1_1_1b
    • OpenSSL_1_1_1a
    • OpenSSL_1_1_1-pre9
    • OpenSSL_1_1_1-pre8
    • OpenSSL_1_1_1-pre7
    • OpenSSL_1_1_1-pre6
    • OpenSSL_1_1_1-pre5
    • OpenSSL_1_1_1-pre4
    • OpenSSL_1_1_1-pre3
    • OpenSSL_1_1_1-pre2
    • OpenSSL_1_1_1-pre1
    • OpenSSL_1_1_1
    • OpenSSL_1_1_0l
    • OpenSSL_1_1_0k
    • OpenSSL_1_1_0j
    • OpenSSL_1_1_0i
    • OpenSSL_1_1_0h
    • OpenSSL_1_1_0g
    • OpenSSL_1_1_0f
    • OpenSSL_1_1_0e
    • OpenSSL_1_1_0d
    • OpenSSL_1_1_0c
    • OpenSSL_1_1_0b
    • OpenSSL_1_1_0a
    • OpenSSL_1_1_0-pre6
    • OpenSSL_1_1_0-pre5
    • OpenSSL_1_1_0-pre4
    • OpenSSL_1_1_0-pre3
    • OpenSSL_1_1_0-pre2
    • OpenSSL_1_1_0-pre1
    • OpenSSL_1_1_0
    • OpenSSL_1_0_2u
    • OpenSSL_1_0_2t
    • OpenSSL_1_0_2s
    • OpenSSL_1_0_2r
    • OpenSSL_1_0_2q
    • OpenSSL_1_0_2p
    • OpenSSL_1_0_2o
    • OpenSSL_1_0_2n
    • OpenSSL_1_0_2m
    • OpenSSL_1_0_2l
    • OpenSSL_1_0_2k
    • OpenSSL_1_0_2j
    • OpenSSL_1_0_2i
    • OpenSSL_1_0_2h
    • OpenSSL_1_0_2g
    • OpenSSL_1_0_2f
    • OpenSSL_1_0_2e
    • OpenSSL_1_0_2d
    • OpenSSL_1_0_2c
    • OpenSSL_1_0_2b
    • OpenSSL_1_0_2a
    • OpenSSL_1_0_2-pre-reformat
    • OpenSSL_1_0_2-pre-auto-reformat
    • OpenSSL_1_0_2-post-reformat
    • OpenSSL_1_0_2-post-auto-reformat
    • OpenSSL_1_0_2-beta3
    • OpenSSL_1_0_2-beta2
    • OpenSSL_1_0_2-beta1
    • OpenSSL_1_0_2
    • OpenSSL_1_0_1u
    • OpenSSL_1_0_1t
    • OpenSSL_1_0_1s
    • OpenSSL_1_0_1r
    • OpenSSL_1_0_1q
    • OpenSSL_1_0_1p
    • OpenSSL_1_0_1o
    • OpenSSL_1_0_1n
    • OpenSSL_1_0_1m
    • OpenSSL_1_0_1l
    • OpenSSL_1_0_1k
    • OpenSSL_1_0_1j
    • OpenSSL_1_0_1i
    • OpenSSL_1_0_1h
    • OpenSSL_1_0_1g
    • OpenSSL_1_0_1f
    • OpenSSL_1_0_1e
    • OpenSSL_1_0_1d
    • OpenSSL_1_0_1-pre-reformat
    • OpenSSL_1_0_1-pre-auto-reformat
    • OpenSSL_1_0_1-post-reformat
    • OpenSSL_1_0_1-post-auto-reformat
    • OpenSSL_1_0_0t
    • OpenSSL_1_0_0s
    • OpenSSL_1_0_0r
    • OpenSSL_1_0_0q
    • OpenSSL_1_0_0p
    • OpenSSL_1_0_0o
    • OpenSSL_1_0_0n
    • OpenSSL_1_0_0m
    • OpenSSL_1_0_0l
    • OpenSSL_1_0_0k
    • OpenSSL_1_0_0-pre-reformat
    • OpenSSL_1_0_0-pre-auto-reformat
    • OpenSSL_1_0_0-post-reformat
    • OpenSSL_1_0_0-post-auto-reformat
    • OpenSSL_0_9_8zh
    • OpenSSL_0_9_8zg
    • OpenSSL_0_9_8zf
    • OpenSSL_0_9_8ze
    • OpenSSL_0_9_8zd
    • OpenSSL_0_9_8zc
    • OpenSSL_0_9_8zb
    • OpenSSL_0_9_8za
    • OpenSSL_0_9_8y
    • OpenSSL_0_9_8-pre-reformat
    • OpenSSL_0_9_8-pre-auto-reformat
    • OpenSSL_0_9_8-post-reformat
    • OpenSSL_0_9_8-post-auto-reformat
    • OpenSSL-fips-2_0_9
    • OpenSSL-fips-2_0_8
    • OpenSSL-fips-2_0_7
    • OpenSSL-fips-2_0_6
    • OpenSSL-fips-2_0_5
    • OpenSSL-fips-2_0_4
    • OpenSSL-fips-2_0_3
    • OpenSSL-fips-2_0_2
    • OpenSSL-fips-2_0_16
    • OpenSSL-fips-2_0_15
    • OpenSSL-fips-2_0_14
    • OpenSSL-fips-2_0_13
    • OpenSSL-fips-2_0_12
    • OpenSSL-fips-2_0_11
    • OpenSSL-fips-2_0_10
  • 59e02e5
  • /
  • test
  • /
  • json_test.c
Raw File
Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
  • revision
  • snapshot
content badge Iframe embedding
swh:1:cnt:33d9522dd07b6429256f44d897b1730a78e71db0
directory badge Iframe embedding
swh:1:dir:20de198b0d9346a12082acdbeebb0b7299d2b27a
revision badge
swh:1:rev:0fdf965bf0b1f87d4a5d52c71994ffdda5235718
snapshot badge
swh:1:snp:dc2a5002442a00b1c0eda7c65d04ea7455e166cd
Tip revision: 0fdf965bf0b1f87d4a5d52c71994ffdda5235718 authored by Neil Horman on 11 September 2024, 13:53:49 UTC
review fixups for quic-hq-interop
Tip revision: 0fdf965
json_test.c
/*
 * Copyright 2022-2024 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <stdio.h>
#include <string.h>

#include "testutil.h"
#include "internal/json_enc.h"

struct helper {
    OSSL_JSON_ENC   j;
    int             init;
    uint32_t        flags;
    BIO             *mem_bio;
};

static int helper_ensure(struct helper *h)
{
    if (h->init)
        return 1;

    if (!TEST_ptr(h->mem_bio = BIO_new(BIO_s_mem())))
        return 0;

    if (!ossl_json_init(&h->j, h->mem_bio, h->flags)) {
        BIO_free_all(h->mem_bio);
        h->mem_bio = NULL;
        return 0;
    }

    h->init = 1;
    return 1;
}

static void helper_cleanup(struct helper *h)
{
    BIO_free_all(h->mem_bio);
    h->mem_bio = NULL;

    if (h->init) {
        ossl_json_cleanup(&h->j);
        h->init = 0;
    }
}

static void helper_set_flags(struct helper *h, uint32_t flags)
{
    helper_cleanup(h);
    h->flags = flags;
}

struct script_word {
    void        *p;
    uint64_t    u64;
    int64_t     i64;
    double      d;
    void        (*fp)(void);
};

#define OP_P(x)     { (x) },
#define OP_U64(x)   { NULL, (x) },
#define OP_I64(x)   { NULL, 0, (x) },
#define OP_D(x)     { NULL, 0, 0, (x) },
#define OP_FP(x)    { NULL, 0, 0, 0, (void (*)(void))(x) },

struct script_info {
    const char                  *name, *title;
    const struct script_word    *words;
    size_t                      num_words;
    const char                  *expected_output;
    size_t                      expected_output_len;
};

typedef const struct script_info *(*info_func)(void);

enum {
    OPK_END,
    OPK_CALL,           /* (OSSL_JSON_ENC *) */
    OPK_CALL_P,         /* (OSSL_JSON_ENC *, const void *) */
    OPK_CALL_I,         /* (OSSL_JSON_ENC *, int) */
    OPK_CALL_U64,       /* (OSSL_JSON_ENC *, uint64_t) */
    OPK_CALL_I64,       /* (OSSL_JSON_ENC *, int64_t) */
    OPK_CALL_D,         /* (OSSL_JSON_ENC *, double) */
    OPK_CALL_PZ,        /* (OSSL_JSON_ENC *, const void *, size_t) */
    OPK_ASSERT_ERROR,   /* (OSSL_JSON_ENC *, int expect_error) */
    OPK_INIT_FLAGS      /* (uint32_t flags) */
};

typedef void (*fp_type)(OSSL_JSON_ENC *);
typedef void (*fp_p_type)(OSSL_JSON_ENC *, const void *);
typedef void (*fp_i_type)(OSSL_JSON_ENC *, int);
typedef void (*fp_u64_type)(OSSL_JSON_ENC *, uint64_t);
typedef void (*fp_i64_type)(OSSL_JSON_ENC *, int64_t);
typedef void (*fp_d_type)(OSSL_JSON_ENC *, double);
typedef void (*fp_pz_type)(OSSL_JSON_ENC *, const void *, size_t);

#define OP_END()              OP_U64(OPK_END)
#define OP_CALL(f)            OP_U64(OPK_CALL)     OP_FP(f)
#define OP_CALL_P(f, x)       OP_U64(OPK_CALL_P)   OP_FP(f) OP_P  (x)
#define OP_CALL_I(f, x)       OP_U64(OPK_CALL_I)   OP_FP(f) OP_I64(x)
#define OP_CALL_U64(f, x)     OP_U64(OPK_CALL_U64) OP_FP(f) OP_U64(x)
#define OP_CALL_I64(f, x)     OP_U64(OPK_CALL_I64) OP_FP(f) OP_I64(x)
#define OP_CALL_D(f, x)       OP_U64(OPK_CALL_D)   OP_FP(f) OP_D  (x)
#define OP_CALL_PZ(f, x, xl)  OP_U64(OPK_CALL_PZ)  OP_FP(f) OP_P  (x) OP_U64(xl)
#define OP_ASSERT_ERROR(err)  OP_U64(OPK_ASSERT_ERROR) OP_U64(err)
#define OP_INIT_FLAGS(flags)  OP_U64(OPK_INIT_FLAGS)   OP_U64(flags)

#define OPJ_BEGIN_O()         OP_CALL(ossl_json_object_begin)
#define OPJ_END_O()           OP_CALL(ossl_json_object_end)
#define OPJ_BEGIN_A()         OP_CALL(ossl_json_array_begin)
#define OPJ_END_A()           OP_CALL(ossl_json_array_end)
#define OPJ_NULL()            OP_CALL(ossl_json_null)
#define OPJ_BOOL(x)           OP_CALL_I(ossl_json_bool, (x))
#define OPJ_U64(x)            OP_CALL_U64(ossl_json_u64, (x))
#define OPJ_I64(x)            OP_CALL_I64(ossl_json_i64, (x))
#define OPJ_F64(x)            OP_CALL_D(ossl_json_f64, (x))
#define OPJ_KEY(x)            OP_CALL_P(ossl_json_key, (x))
#define OPJ_STR(x)            OP_CALL_P(ossl_json_str, (x))
#define OPJ_STR_LEN(x, xl)    OP_CALL_PZ(ossl_json_str_len, (x), (xl))
#define OPJ_STR_HEX(x, xl)    OP_CALL_PZ(ossl_json_str_hex, (x), (xl))

#define BEGIN_SCRIPT(name, title, flags)                                       \
    static const struct script_info *get_script_##name(void)                   \
    {                                                                          \
        static const char script_name[] = #name;                               \
        static const char script_title[] = #title;                             \
                                                                               \
        static const struct script_word script_words[] = {                     \
            OP_INIT_FLAGS(flags)

#define END_SCRIPT_EXPECTING(s, slen)                                          \
            OP_END()                                                           \
        };                                                                     \
        static const struct script_info script_info = {                        \
            script_name, script_title, script_words, OSSL_NELEM(script_words), \
            (s), (slen)                                                        \
        };                                                                     \
        return &script_info;                                                   \
    }

#ifdef OPENSSL_SYS_VMS
/*
 * The VMS C compiler recognises \u in strings, and emits a warning, which
 * stops the build.  Because we think we know what we're doing, we change that
 * particular message to be merely informational.
 */
# pragma message informational UCNNOMAP
#endif

#define END_SCRIPT_EXPECTING_S(s)   END_SCRIPT_EXPECTING(s, SIZE_MAX)
#define END_SCRIPT_EXPECTING_Q(s)   END_SCRIPT_EXPECTING(#s, sizeof(#s) - 1)

#define SCRIPT(name) get_script_##name,

BEGIN_SCRIPT(null, "serialize a single null", 0)
    OPJ_NULL()
END_SCRIPT_EXPECTING_Q(null)

BEGIN_SCRIPT(obj_empty, "serialize an empty object", 0)
    OPJ_BEGIN_O()
    OPJ_END_O()
END_SCRIPT_EXPECTING_Q({})

BEGIN_SCRIPT(array_empty, "serialize an empty array", 0)
    OPJ_BEGIN_A()
    OPJ_END_A()
END_SCRIPT_EXPECTING_Q([])

BEGIN_SCRIPT(bool_false, "serialize false", 0)
    OPJ_BOOL(0)
END_SCRIPT_EXPECTING_Q(false)

BEGIN_SCRIPT(bool_true, "serialize true", 0)
    OPJ_BOOL(1)
END_SCRIPT_EXPECTING_Q(true)

BEGIN_SCRIPT(u64_0, "serialize u64(0)", 0)
    OPJ_U64(0)
END_SCRIPT_EXPECTING_Q(0)

BEGIN_SCRIPT(u64_1, "serialize u64(1)", 0)
    OPJ_U64(1)
END_SCRIPT_EXPECTING_Q(1)

BEGIN_SCRIPT(u64_10, "serialize u64(10)", 0)
    OPJ_U64(10)
END_SCRIPT_EXPECTING_Q(10)

BEGIN_SCRIPT(u64_12345, "serialize u64(12345)", 0)
    OPJ_U64(12345)
END_SCRIPT_EXPECTING_Q(12345)

BEGIN_SCRIPT(u64_18446744073709551615, "serialize u64(18446744073709551615)", 0)
    OPJ_U64(18446744073709551615ULL)
END_SCRIPT_EXPECTING_Q(18446744073709551615)

BEGIN_SCRIPT(i64_0, "serialize i64(0)", 0)
    OPJ_I64(0)
END_SCRIPT_EXPECTING_Q(0)

BEGIN_SCRIPT(i64_1, "serialize i64(1)", 0)
    OPJ_I64(1)
END_SCRIPT_EXPECTING_Q(1)

BEGIN_SCRIPT(i64_2, "serialize i64(2)", 0)
    OPJ_I64(2)
END_SCRIPT_EXPECTING_Q(2)

BEGIN_SCRIPT(i64_10, "serialize i64(10)", 0)
    OPJ_I64(10)
END_SCRIPT_EXPECTING_Q(10)

BEGIN_SCRIPT(i64_12345, "serialize i64(12345)", 0)
    OPJ_I64(12345)
END_SCRIPT_EXPECTING_Q(12345)

BEGIN_SCRIPT(i64_9223372036854775807, "serialize i64(9223372036854775807)", 0)
    OPJ_I64(9223372036854775807LL)
END_SCRIPT_EXPECTING_Q(9223372036854775807)

BEGIN_SCRIPT(i64_m1, "serialize i64(-1)", 0)
    OPJ_I64(-1)
END_SCRIPT_EXPECTING_Q(-1)

BEGIN_SCRIPT(i64_m2, "serialize i64(-2)", 0)
    OPJ_I64(-2)
END_SCRIPT_EXPECTING_Q(-2)

BEGIN_SCRIPT(i64_m10, "serialize i64(-10)", 0)
    OPJ_I64(-10)
END_SCRIPT_EXPECTING_Q(-10)

BEGIN_SCRIPT(i64_m12345, "serialize i64(-12345)", 0)
    OPJ_I64(-12345)
END_SCRIPT_EXPECTING_Q(-12345)

BEGIN_SCRIPT(i64_m9223372036854775807, "serialize i64(-9223372036854775807)", 0)
    OPJ_I64(-9223372036854775807LL)
END_SCRIPT_EXPECTING_Q(-9223372036854775807)

BEGIN_SCRIPT(i64_m9223372036854775808, "serialize i64(-9223372036854775808)", 0)
    OPJ_I64(-9223372036854775807LL - 1LL)
END_SCRIPT_EXPECTING_Q(-9223372036854775808)

BEGIN_SCRIPT(str_empty, "serialize \"\"", 0)
    OPJ_STR("")
END_SCRIPT_EXPECTING_Q("")

BEGIN_SCRIPT(str_a, "serialize \"a\"", 0)
    OPJ_STR("a")
END_SCRIPT_EXPECTING_Q("a")

BEGIN_SCRIPT(str_abc, "serialize \"abc\"", 0)
    OPJ_STR("abc")
END_SCRIPT_EXPECTING_Q("abc")

BEGIN_SCRIPT(str_quote, "serialize with quote", 0)
    OPJ_STR("abc\"def")
END_SCRIPT_EXPECTING_Q("abc\"def")

BEGIN_SCRIPT(str_quote2, "serialize with quote", 0)
    OPJ_STR("abc\"\"def")
END_SCRIPT_EXPECTING_Q("abc\"\"def")

BEGIN_SCRIPT(str_escape, "serialize with various escapes", 0)
    OPJ_STR("abc\"\"de'f\r\n\t\b\f\\\x01\v\x7f\\")
END_SCRIPT_EXPECTING_Q("abc\"\"de'f\r\n\t\b\f\\\u0001\u000b\u007f\\")

BEGIN_SCRIPT(str_len, "length-signalled string", 0)
    OPJ_STR_LEN("abcdef", 6)
END_SCRIPT_EXPECTING_Q("abcdef")

BEGIN_SCRIPT(str_len0, "0-length-signalled string", 0)
    OPJ_STR_LEN("", 0)
END_SCRIPT_EXPECTING_Q("")

BEGIN_SCRIPT(str_len_nul, "string with NUL", 0)
    OPJ_STR_LEN("x\0y", 3)
END_SCRIPT_EXPECTING_Q("x\u0000y")

BEGIN_SCRIPT(hex_data0, "zero-length hex data", 0)
    OPJ_STR_HEX("", 0)
END_SCRIPT_EXPECTING_Q("")

BEGIN_SCRIPT(hex_data, "hex data", 0)
    OPJ_STR_HEX("\x00\x01\x5a\xfb\xff", 5)
END_SCRIPT_EXPECTING_Q("00015afbff")

BEGIN_SCRIPT(array_nest1, "serialize nested empty arrays", 0)
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_END_A()
END_SCRIPT_EXPECTING_Q([[]])

BEGIN_SCRIPT(array_nest2, "serialize nested empty arrays", 0)
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
END_SCRIPT_EXPECTING_Q([[[]]])

BEGIN_SCRIPT(array_nest3, "serialize nested empty arrays", 0)
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_END_A()
END_SCRIPT_EXPECTING_S("[[[],[],[]],[]]")

BEGIN_SCRIPT(array_nest4, "deep nested arrays", 0)
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_END_A()
    OPJ_NULL()
    OPJ_END_A()
END_SCRIPT_EXPECTING_S("[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]],null]")

BEGIN_SCRIPT(obj_nontrivial1, "serialize nontrivial object", 0)
    OPJ_BEGIN_O()
    OPJ_KEY("")
    OPJ_NULL()
    OPJ_END_O()
END_SCRIPT_EXPECTING_S("{\"\":null}")

BEGIN_SCRIPT(obj_nontrivial2, "serialize nontrivial object", 0)
    OPJ_BEGIN_O()
    OPJ_KEY("")
    OPJ_NULL()
    OPJ_KEY("x")
    OPJ_NULL()
    OPJ_END_O()
END_SCRIPT_EXPECTING_S("{\"\":null,\"x\":null}")

BEGIN_SCRIPT(obj_nest1, "serialize nested objects", 0)
    OPJ_BEGIN_O()
    OPJ_KEY("")
    OPJ_BEGIN_O()
    OPJ_KEY("x")
    OPJ_U64(42)
    OPJ_END_O()
    OPJ_KEY("x")
    OPJ_BEGIN_A()
    OPJ_U64(42)
    OPJ_U64(101)
    OPJ_END_A()
    OPJ_KEY("y")
    OPJ_NULL()
    OPJ_KEY("z")
    OPJ_BEGIN_O()
    OPJ_KEY("z0")
    OPJ_I64(-1)
    OPJ_KEY("z1")
    OPJ_I64(-2)
    OPJ_END_O()
    OPJ_END_O()
END_SCRIPT_EXPECTING_S("{\"\":{\"x\":42},\"x\":[42,101],\"y\":null,\"z\":{\"z0\":-1,\"z1\":-2}}")

BEGIN_SCRIPT(err_obj_no_key, "error test: object item without key", 0)
    OPJ_BEGIN_O()
    OP_ASSERT_ERROR(0)
    OPJ_NULL()
    OP_ASSERT_ERROR(1)
    OPJ_END_O()
    OP_ASSERT_ERROR(1)
END_SCRIPT_EXPECTING_S("{")

BEGIN_SCRIPT(err_obj_multi_key, "error test: object item with repeated key", 0)
    OPJ_BEGIN_O()
    OPJ_KEY("x")
    OP_ASSERT_ERROR(0)
    OPJ_KEY("y")
    OP_ASSERT_ERROR(1)
    OPJ_NULL()
    OP_ASSERT_ERROR(1)
END_SCRIPT_EXPECTING_S("{\"x\":")

BEGIN_SCRIPT(err_obj_no_value, "error test: object item with no value", 0)
    OPJ_BEGIN_O()
    OPJ_KEY("x")
    OP_ASSERT_ERROR(0)
    OPJ_END_O()
    OP_ASSERT_ERROR(1)
END_SCRIPT_EXPECTING_S("{\"x\":")

BEGIN_SCRIPT(err_utf8, "error test: only basic ASCII supported", 0)
    OPJ_STR("\x80")
    OP_ASSERT_ERROR(0)
END_SCRIPT_EXPECTING_S("\"\\u0080\"")

BEGIN_SCRIPT(utf8_2, "test: valid UTF-8 2byte supported", 0)
    OPJ_STR("low=\xc2\x80, high=\xdf\xbf")
    OP_ASSERT_ERROR(0)
END_SCRIPT_EXPECTING_S("\"low=\xc2\x80, high=\xdf\xbf\"")

BEGIN_SCRIPT(utf8_3, "test: valid UTF-8 3byte supported", 0)
    OPJ_STR("low=\xe0\xa0\x80, high=\xef\xbf\xbf")
    OP_ASSERT_ERROR(0)
END_SCRIPT_EXPECTING_S("\"low=\xe0\xa0\x80, high=\xef\xbf\xbf\"")

BEGIN_SCRIPT(utf8_4, "test: valid UTF-8 4byte supported", 0)
    OPJ_STR("low=\xf0\x90\xbf\xbf, high=\xf4\x8f\xbf\xbf")
    OP_ASSERT_ERROR(0)
END_SCRIPT_EXPECTING_S("\"low=\xf0\x90\xbf\xbf, high=\xf4\x8f\xbf\xbf\"")

BEGIN_SCRIPT(ijson_int, "I-JSON: large integer", OSSL_JSON_FLAG_IJSON)
    OPJ_BEGIN_A()
    OPJ_U64(1)
    OPJ_I64(-1)
    OPJ_U64(9007199254740991)
    OPJ_U64(9007199254740992)
    OPJ_I64(-9007199254740991)
    OPJ_I64(-9007199254740992)
    OPJ_END_A()
END_SCRIPT_EXPECTING_S("[1,-1,9007199254740991,\"9007199254740992\",-9007199254740991,\"-9007199254740992\"]")

BEGIN_SCRIPT(multi_item, "multiple top level items", 0)
    OPJ_NULL()
    OPJ_NULL()
    OPJ_BEGIN_A()
    OPJ_END_A()
    OPJ_BEGIN_A()
    OPJ_END_A()
END_SCRIPT_EXPECTING_S("nullnull[][]")

BEGIN_SCRIPT(seq, "JSON-SEQ", OSSL_JSON_FLAG_SEQ)
    OPJ_NULL()
    OPJ_NULL()
    OPJ_NULL()
    OPJ_BEGIN_O()
    OPJ_KEY("x")
    OPJ_U64(1)
    OPJ_KEY("y")
    OPJ_BEGIN_O()
    OPJ_END_O()
    OPJ_END_O()
END_SCRIPT_EXPECTING_S("\x1Enull\n" "\x1Enull\n" "\x1Enull\n" "\x1E{\"x\":1,\"y\":{}}\n")

static const info_func scripts[] = {
    SCRIPT(null)
    SCRIPT(obj_empty)
    SCRIPT(array_empty)
    SCRIPT(bool_false)
    SCRIPT(bool_true)
    SCRIPT(u64_0)
    SCRIPT(u64_1)
    SCRIPT(u64_10)
    SCRIPT(u64_12345)
    SCRIPT(u64_18446744073709551615)
    SCRIPT(i64_0)
    SCRIPT(i64_1)
    SCRIPT(i64_2)
    SCRIPT(i64_10)
    SCRIPT(i64_12345)
    SCRIPT(i64_9223372036854775807)
    SCRIPT(i64_m1)
    SCRIPT(i64_m2)
    SCRIPT(i64_m10)
    SCRIPT(i64_m12345)
    SCRIPT(i64_m9223372036854775807)
    SCRIPT(i64_m9223372036854775808)
    SCRIPT(str_empty)
    SCRIPT(str_a)
    SCRIPT(str_abc)
    SCRIPT(str_quote)
    SCRIPT(str_quote2)
    SCRIPT(str_escape)
    SCRIPT(str_len)
    SCRIPT(str_len0)
    SCRIPT(str_len_nul)
    SCRIPT(hex_data0)
    SCRIPT(hex_data)
    SCRIPT(array_nest1)
    SCRIPT(array_nest2)
    SCRIPT(array_nest3)
    SCRIPT(array_nest4)
    SCRIPT(obj_nontrivial1)
    SCRIPT(obj_nontrivial2)
    SCRIPT(obj_nest1)
    SCRIPT(err_obj_no_key)
    SCRIPT(err_obj_multi_key)
    SCRIPT(err_obj_no_value)
    SCRIPT(err_utf8)
    SCRIPT(utf8_2)
    SCRIPT(utf8_3)
    SCRIPT(utf8_4)
    SCRIPT(ijson_int)
    SCRIPT(multi_item)
    SCRIPT(seq)
};

/* Test runner. */
static int run_script(const struct script_info *info)
{
    int ok = 0, asserted = -1;
    const struct script_word *words = info->words;
    size_t wp = 0;
    struct script_word w;
    struct helper h = {0};
    BUF_MEM *bufp = NULL;

    TEST_info("running script '%s' (%s)", info->name, info->title);

#define GET_WORD()  (w = words[wp++])
#define GET_U64()   (GET_WORD().u64)
#define GET_I64()   (GET_WORD().i64)
#define GET_FP()    (GET_WORD().fp)
#define GET_P()     (GET_WORD().p)

    for (;;)
        switch (GET_U64()) {
        case OPK_END:
            goto stop;
        case OPK_INIT_FLAGS:
            helper_set_flags(&h, (uint32_t)GET_U64());
            break;
        case OPK_CALL:
        {
            fp_type f = (fp_type)GET_FP();

            if (!TEST_true(helper_ensure(&h)))
                goto err;

            f(&h.j);
            break;
        }
        case OPK_CALL_I:
        {
            fp_i_type f = (fp_i_type)GET_FP();

            if (!TEST_true(helper_ensure(&h)))
                goto err;

            f(&h.j, (int)GET_I64());
            break;
        }
        case OPK_CALL_U64:
        {
            fp_u64_type f = (fp_u64_type)GET_FP();

            if (!TEST_true(helper_ensure(&h)))
                goto err;

            f(&h.j, GET_U64());
            break;
        }
        case OPK_CALL_I64:
        {
            fp_i64_type f = (fp_i64_type)GET_FP();

            if (!TEST_true(helper_ensure(&h)))
                goto err;

            f(&h.j, GET_I64());
            break;
        }
        case OPK_CALL_P:
        {
            fp_p_type f = (fp_p_type)GET_FP();

            if (!TEST_true(helper_ensure(&h)))
                goto err;

            f(&h.j, GET_P());
            break;
        }
        case OPK_CALL_PZ:
        {
            fp_pz_type f = (fp_pz_type)GET_FP();
            void *p;
            uint64_t u64;

            if (!TEST_true(helper_ensure(&h)))
                goto err;

            p   = GET_P();
            u64 = GET_U64();
            f(&h.j, p, (size_t)u64);
            break;
        }
        case OPK_ASSERT_ERROR:
        {
            if (!TEST_true(helper_ensure(&h)))
                goto err;

            asserted = (int)GET_U64();
            if (!TEST_int_eq(ossl_json_in_error(&h.j), asserted))
                goto err;

            break;
        }
#define OP_ASSERT_ERROR(err)  OP_U64(OPK_ASSERT_ERROR) OP_U64(err)

        default:
            TEST_error("unknown opcode");
            goto err;
        }
stop:

    if (!TEST_true(helper_ensure(&h)))
        goto err;

    if (!TEST_true(ossl_json_flush(&h.j)))
        goto err;

    /* Implicit error check if not done explicitly. */
    if (asserted < 0 && !TEST_false(ossl_json_in_error(&h.j)))
        goto err;

    if (!TEST_true(BIO_get_mem_ptr(h.mem_bio, &bufp)))
        goto err;

    if (!TEST_mem_eq(bufp->data, bufp->length,
                     info->expected_output,
                     info->expected_output_len == SIZE_MAX
                        ? strlen(info->expected_output)
                        : info->expected_output_len))
        goto err;

    ok = 1;
err:
    if (!ok)
        TEST_error("script '%s' failed", info->name);

    helper_cleanup(&h);
    return ok;
}

static int test_json_enc(void)
{
    int ok = 1;
    size_t i;

    for (i = 0; i < OSSL_NELEM(scripts); ++i)
        if (!TEST_true(run_script(scripts[i]())))
            ok = 0;

    return ok;
}

int setup_tests(void)
{
    ADD_TEST(test_json_enc);
    return 1;
}

ENEA — Copyright (C), ENEA. License: GNU AGPLv3+.
Legal notes  ::  JavaScript license information ::  Web API

back to top