From patchwork Sun Jan 12 22:55:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Petr_=C5=A0tetiar?= X-Patchwork-Id: 1221903 X-Patchwork-Delegate: ynezz@true.cz Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.openwrt.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=true.cz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=KZ11s4mL; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47wsXL74QQz9s29 for ; Mon, 13 Jan 2020 09:56:18 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Subject:MIME-Version:References: In-Reply-To:Message-Id:Date:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Tu3W7NE+pGieZ349bIYknTy2k1VtAzygbETpoUNN8YU=; b=KZ11s4mLhL7Eb1 rK4rFOv7w7YPCHu9euHWYuQMgRImk3kGtJ9rFTL4vyZ/cXFcDDEyhLINM0ouG9rjU10UJMy7bscST Ze080liVBoLlHPM18MKeEjx4qtlYKZp8ndKG/u2FJ1WqtzPXccESZv4CeKIq0SIPDRqlfrCP45WoB ot4mawxDFRr4stfDfbsKdMo/JKea/aKYsVMIM1pwVYuF3/Qy3zRxa63stGJ2syfvABBpK32E14oUK ezugpr1KKJponVgpSvIEAmeDEarCCckeMMPP95UjIYthsYo9i4P8EwgkYpLRMHtRk8n5DHiDjYjIO wX4wrRnqgeadialY54jA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm9W-000293-SE; Sun, 12 Jan 2020 22:56:14 +0000 Received: from smtp-out.xnet.cz ([178.217.244.18]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm8m-0001CX-L9 for openwrt-devel@lists.openwrt.org; Sun, 12 Jan 2020 22:55:34 +0000 Received: from meh.true.cz (meh.true.cz [108.61.167.218]) (Authenticated sender: petr@true.cz) by smtp-out.xnet.cz (Postfix) with ESMTPSA id 03F723789; Sun, 12 Jan 2020 23:55:21 +0100 (CET) Received: by meh.true.cz (OpenSMTPD) with ESMTP id 8f20fcc7; Sun, 12 Jan 2020 23:55:11 +0100 (CET) From: =?utf-8?q?Petr_=C5=A0tetiar?= To: openwrt-devel@lists.openwrt.org Date: Sun, 12 Jan 2020 23:55:12 +0100 Message-Id: <20200112225515.11654-2-ynezz@true.cz> In-Reply-To: <20200112225515.11654-1-ynezz@true.cz> References: <20200112225515.11654-1-ynezz@true.cz> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200112_145529_013436_5CC2E291 X-CRM114-Status: GOOD ( 13.97 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [178.217.244.18 listed in list.dnswl.org] 0.0 SPF_NONE SPF: sender does not publish an SPF Record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record Subject: [OpenWrt-Devel] [PATCH libubox 1/4] tests: include json script shunit2 based testing X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?utf-8?q?Petr_=C5=A0tetiar?= Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org Include shunit2 based tests into unit testing pipeline until (eventually) it's converted to cram based unit tests. Signed-off-by: Petr Štetiar --- tests/CMakeLists.txt | 1 + tests/shunit2/CMakeLists.txt | 7 + tests/shunit2/shunit2/shunit2 | 1040 +++++++++++++++++++++++++++++++++ tests/shunit2/tests.sh | 287 +++++++++ 4 files changed, 1335 insertions(+) create mode 100644 tests/shunit2/CMakeLists.txt create mode 100644 tests/shunit2/shunit2/shunit2 create mode 100755 tests/shunit2/tests.sh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0cb33427e45a..6258beeb241e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,5 @@ ADD_SUBDIRECTORY(cram) +ADD_SUBDIRECTORY(shunit2) MACRO(ADD_UNIT_TEST name) ADD_EXECUTABLE(${name} ${name}.c) diff --git a/tests/shunit2/CMakeLists.txt b/tests/shunit2/CMakeLists.txt new file mode 100644 index 000000000000..74c2134cf3c8 --- /dev/null +++ b/tests/shunit2/CMakeLists.txt @@ -0,0 +1,7 @@ +ADD_TEST( + NAME shunit2 + COMMAND tests.sh + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +SET_PROPERTY(TEST shunit2 APPEND PROPERTY ENVIRONMENT "TEST_JSON_SCRIPT=$") diff --git a/tests/shunit2/shunit2/shunit2 b/tests/shunit2/shunit2/shunit2 new file mode 100644 index 000000000000..eef19d410146 --- /dev/null +++ b/tests/shunit2/shunit2/shunit2 @@ -0,0 +1,1040 @@ +# $Id: shunit2 189 2008-07-11 11:46:54Z kate.ward@forestent.com $ +# vim:et:ft=sh:sts=2:sw=2 +# vim:foldmethod=marker:foldmarker=/**,*/ +# +#/** +# +# +# +# shUnit 2.1.4 +# Shell Unit Test Framework +# +# http://shunit2.sourceforge.net/ +# +# written by Kate Ward <kate.ward@forestent.com> +# released under the LGPL +# +# this module implements a xUnit based unit test framework similar to JUnit +# +#*/ + +SHUNIT_VERSION='2.1.4' + +_shunit_warn() { echo "shunit2:WARN $@" >&2; } +_shunit_error() { echo "shunit2:ERROR $@" >&2; } +_shunit_fatal() { echo "shunit2:FATAL $@" >&2; } + +SHUNIT_TRUE=0 +SHUNIT_FALSE=1 +SHUNIT_ERROR=2 + +# specific shell checks +if [ -n "${ZSH_VERSION:-}" ]; then + setopt |grep "^shwordsplit$" >/dev/null + if [ $? -ne ${SHUNIT_TRUE} ]; then + _shunit_fatal 'zsh shwordsplit option is required for proper operation' + exit ${SHUNIT_ERROR} + fi + if [ -z "${SHUNIT_PARENT:-}" ]; then + _shunit_fatal "zsh does not pass \$0 through properly. please declare \ +\"SHUNIT_PARENT=\$0\" before calling shUnit2" + exit ${SHUNIT_ERROR} + fi +fi + +# shell flags for shunit2: +# u - treat unset variables as an error when performing parameter expansion +__SHUNIT_SHELL_FLAGS='u' + +# save the current set of shell flags, and then set some for ourself +shunit_shellFlags_="$-" +for shunit_shellFlag_ in `echo "${__SHUNIT_SHELL_FLAGS}" |sed 's/\(.\)/\1 /g'` +do + set -${shunit_shellFlag_} +done + +# +# constants +# + +__SHUNIT_ASSERT_MSG_PREFIX='ASSERT:' +__SHUNIT_PARENT=${SHUNIT_PARENT:-$0} + +# set the constants readonly +shunit_constants_=`set |grep "^__SHUNIT_" |cut -d= -f1` +echo "${shunit_constants_}" |grep "^Binary file" >/dev/null +if [ $? -eq 0 ]; then + # deal with binary junk in 'set' output + shunit_constants_=`set |grep -a "^__SHUNIT_" |cut -d= -f1` +fi +for shunit_const_ in ${shunit_constants_}; do + shunit_ro_opts_='' + if [ -n "${ZSH_VERSION:-}" ]; then + case ${ZSH_VERSION} in + [123].*) ;; + *) shunit_ro_opts_='-g' ;; # declare readonly constants globally + esac + fi + readonly ${shunit_ro_opts_} ${shunit_const_} +done +unset shunit_const_ shunit_constants_ shunit_ro_opts_ + +# variables +__shunit_skip=${SHUNIT_FALSE} +__shunit_suite='' + +__shunit_testsPassed=0 +__shunit_testsFailed=0 +__shunit_testsSkipped=0 +__shunit_testsTotal=0 + +# macros +_SHUNIT_LINENO_='eval if [ "${1:-}" = "--lineno" ]; then [ -n "$2" ] && shunit_message_="[$2]"; shift 2; fi' + +#----------------------------------------------------------------------------- +# assert functions +# + +#/** +# +# +# void +# +# +# +# +# assertEquals +# string [message] +# string expected +# string actual +# +# +# Asserts that expected and +# actual are equal to one another. The message is +# optional. +# +# +#*/ +assertEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error 'assertEquals() requires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_expected_=$1 + shunit_actual_=$2 + + shunit_return=${SHUNIT_TRUE} + if [ "${shunit_expected_}" = "${shunit_actual_}" ]; then + _shunit_testPassed + else + failNotEquals "${shunit_message_}" "${shunit_expected_}" "${shunit_actual_}" + shunit_return=${SHUNIT_FALSE} + fi + + unset shunit_message_ shunit_expected_ shunit_actual_ __shunit_lineno + return ${shunit_return} +} +_ASSERT_EQUALS_='eval assertEquals --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# assertNull +# string [message] +# string value +# +# +# Asserts that value is null, +# or in shell terms a zero-length string. The message is optional. +# +# +#*/ +assertNull() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error 'assertNull() requires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + if [ $# -eq 2 ]; then + assertTrue "${shunit_message_}$1" "[ -z '$2' ]" + else + assertTrue "[ -z '$1' ]" + fi +} +_ASSERT_NULL_='eval assertNull --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# assertNotNull +# string [message] +# string value +# +# +# Asserts that value is not null, or in shell terms not +# a zero-length string. The message is optional. +# +# +#*/ +assertNotNull() +{ + ${_SHUNIT_LINENO_} + if [ $# -gt 2 ]; then # allowing 0 arguments as $1 might actually be null + _shunit_error 'assertNotNull() requires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + if [ $# -eq 2 ]; then + assertTrue "$1" "[ -n '$2' ]" + else + assertTrue "[ -n '${1:-}' ]" + fi +} +_ASSERT_NOT_NULL_='eval assertNotNull --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# assertSame +# string [message] +# string expected +# string actual +# +# +# This function is functionally equivalent to +# assertEquals. +# +# +#*/ +assertSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error 'assertSame() requires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + if [ $# -eq 2 ]; then + assertEquals "$1" "$2" + else + assertEquals "$1" "$2" "$3" + fi +} +_ASSERT_SAME_='eval assertSame --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# assertNotSame +# string [message] +# string unexpected +# string actual +# +# +# Asserts that unexpected and +# actual are not +# equal to one another. The message is optional. +# +# +#*/ +assertNotSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error 'assertNotSame() requires two or three arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_unexpected_=$1 + shunit_actual_=$2 + + shunit_return=${SHUNIT_TRUE} + if [ "${shunit_unexpected_}" != "${shunit_actual_}" ]; then + _shunit_testPassed + else + failSame "${shunit_message_}" "$@" + shunit_return=${SHUNIT_FALSE} + fi + + unset shunit_message_ shunit_unexpected_ shunit_actual_ + return ${shunit_return} +} +_ASSERT_NOT_SAME_='eval assertNotSame --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# assertTrue +# string [message] +# string condition +# +# +# Asserts that a given shell test condition is true. The message is +# optional. +# Testing whether something is true or false is easy enough by using +# the assertEquals/assertNotSame functions. Shell supports much more +# complicated tests though, and a means to support them was needed. As such, +# this function tests that conditions are true or false through evaluation +# rather than just looking for a true or false. +# +# The following test will succeed: assertTrue "[ 34 -gt 23 ]" +# The folloing test will fail with a message: assertTrue "test failed" "[ -r '/non/existant/file' ]" +# +# +# +#*/ +assertTrue() +{ + ${_SHUNIT_LINENO_} + if [ $# -gt 2 ]; then + _shunit_error 'assertTrue() takes one two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_condition_=$1 + + # see if condition is an integer, i.e. a return value + shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'` + shunit_return=${SHUNIT_TRUE} + if [ -z "${shunit_condition_}" ]; then + # null condition + shunit_return=${SHUNIT_FALSE} + elif [ "${shunit_condition_}" = "${shunit_match_}" ]; then + # possible return value. treating 0 as true, and non-zero as false. + [ ${shunit_condition_} -ne 0 ] && shunit_return=${SHUNIT_FALSE} + else + # (hopefully) a condition + ( eval ${shunit_condition_} ) >/dev/null 2>&1 + [ $? -ne 0 ] && shunit_return=${SHUNIT_FALSE} + fi + + # record the test + if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then + _shunit_testPassed + else + _shunit_testFailed "${shunit_message_}" + fi + + unset shunit_message_ shunit_condition_ shunit_match_ + return ${shunit_return} +} +_ASSERT_TRUE_='eval assertTrue --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# assertFalse +# string [message] +# string condition +# +# +# Asserts that a given shell test condition is false. The message is +# optional. +# Testing whether something is true or false is easy enough by using +# the assertEquals/assertNotSame functions. Shell supports much more +# complicated tests though, and a means to support them was needed. As such, +# this function tests that conditions are true or false through evaluation +# rather than just looking for a true or false. +# +# The following test will succeed: assertFalse "[ 'apples' = 'oranges' ]" +# The folloing test will fail with a message: assertFalse "test failed" "[ 1 -eq 1 -a 2 -eq 2 ]" +# +# +# +#*/ +assertFalse() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 1 -o $# -gt 2 ]; then + _shunit_error 'assertFalse() quires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 2 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_condition_=$1 + + # see if condition is an integer, i.e. a return value + shunit_match_=`expr "${shunit_condition_}" : '\([0-9]*\)'` + shunit_return=${SHUNIT_TRUE} + if [ -z "${shunit_condition_}" ]; then + # null condition + shunit_return=${SHUNIT_FALSE} + elif [ "${shunit_condition_}" = "${shunit_match_}" ]; then + # possible return value. treating 0 as true, and non-zero as false. + [ ${shunit_condition_} -eq 0 ] && shunit_return=${SHUNIT_FALSE} + else + # (hopefully) a condition + ( eval ${shunit_condition_} ) >/dev/null 2>&1 + [ $? -eq 0 ] && shunit_return=${SHUNIT_FALSE} + fi + + # record the test + if [ ${shunit_return} -eq ${SHUNIT_TRUE} ]; then + _shunit_testPassed + else + _shunit_testFailed "${shunit_message_}" + fi + + unset shunit_message_ shunit_condition_ shunit_match_ + return ${shunit_return} +} +_ASSERT_FALSE_='eval assertFalse --lineno "${LINENO:-}"' + +#----------------------------------------------------------------------------- +# failure functions +# + +#/** +# +# +# void +# +# +# +# +# fail +# string [message] +# +# +# Fails the test immediately, with the optional message. +# +# +#*/ +fail() +{ + ${_SHUNIT_LINENO_} + if [ $# -gt 1 ]; then + _shunit_error 'fail() requires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 1 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + + _shunit_testFailed "${shunit_message_}" + + unset shunit_message_ + return ${SHUNIT_FALSE} +} +_FAIL_='eval fail --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# failNotEquals +# string [message] +# string unexpected +# string actual +# +# +# Fails the test if unexpected and +# actual are not +# equal to one another. The message is optional. +# +# +#*/ +failNotEquals() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error 'failNotEquals() requires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + shunit_unexpected_=$1 + shunit_actual_=$2 + + _shunit_testFailed "${shunit_message_:+${shunit_message_} }expected:<${shunit_unexpected_}> but was:<${shunit_actual_}>" + + unset shunit_message_ shunit_unexpected_ shunit_actual_ + return ${SHUNIT_FALSE} +} +_FAIL_NOT_EQUALS_='eval failNotEquals --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# failSame +# string [message] +# +# +# Indicate test failure because arguments were not the same. The +# message is optional. +# +# +#*/ +failSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error 'failSame() requires two or three arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + [ -z "${shunit_message_:-}" ] && shunit_message_='' + if [ $# -eq 3 ]; then + shunit_message_="${shunit_message_}$1" + shift + fi + + _shunit_testFailed "${shunit_message_:+${shunit_message_} }expected not same" + + unset shunit_message_ + return ${SHUNIT_FALSE} +} +_FAIL_SAME_='eval failSame --lineno "${LINENO:-}"' + +#/** +# +# +# void +# +# +# +# +# failNotSame +# string [message] +# string expected +# string actual +# +# +# Fails the test if expected and +# actual are equal to one another. The message is +# optional. +# +# +#*/ +failNotSame() +{ + ${_SHUNIT_LINENO_} + if [ $# -lt 2 -o $# -gt 3 ]; then + _shunit_error 'failNotEquals() requires one or two arguments' + return ${SHUNIT_ERROR} + fi + _shunit_shouldSkip && return ${SHUNIT_TRUE} + + if [ $# -eq 2 ]; then + failNotEquals "$1" "$2" + else + failNotEquals "$1" "$2" "$3" + fi +} +_FAIL_NOT_SAME_='eval failNotSame --lineno "${LINENO:-}"' + +#----------------------------------------------------------------------------- +# skipping functions +# + +#/** +# +# +# void +# +# +# +# +# startSkipping +# +# +# +# This function forces the remaining assert and fail functions to be +# "skipped", i.e. they will have no effect. Each function skipped will be +# recorded so that the total of asserts and fails will not be altered. +# +# +#*/ +startSkipping() +{ + __shunit_skip=${SHUNIT_TRUE} +} + +#/** +# +# +# void +# +# +# +# +# endSkipping +# +# +# +# This function returns calls to the assert and fail functions to their +# default behavior, i.e. they will be called. +# +# +#*/ +endSkipping() +{ + __shunit_skip=${SHUNIT_FALSE} +} + +#/** +# +# +# boolean +# +# +# +# +# isSkipping +# +# +# +# This function returns the state of skipping. +# +# +#*/ +isSkipping() +{ + return ${__shunit_skip} +} + +#----------------------------------------------------------------------------- +# suite functions +# + +#/** +# +# +# void +# +# +# +# +# suite +# +# +# +# This function can be optionally overridden by the user in their test +# suite. +# If this function exists, it will be called when +# shunit2 is sourced. If it does not exist, shUnit2 will +# search the parent script for all functions beginning with the word +# test, and they will be added dynamically to the test +# suite. +# +# +#*/ +# Note: see _shunit_mktempFunc() for actual implementation +# suite() { :; } + +#/** +# +# +# void +# +# +# +# +# suite_addTest +# string function +# +# +# This function adds a function name to the list of tests scheduled for +# execution as part of this test suite. This function should only be called +# from within the suite() function. +# +# +#*/ +suite_addTest() +{ + _su_func=${1:-} + + __shunit_suite="${__shunit_suite:+${__shunit_suite} }${_su_func}" + + unset _su_func +} + +#/** +# +# +# void +# +# +# +# +# oneTimeSetUp +# +# +# +# This function can be be optionally overridden by the user in their +# test suite. +# If this function exists, it will be called once before any tests are +# run. It is useful to prepare a common environment for all tests. +# +# +#*/ +# Note: see _shunit_mktempFunc() for actual implementation +# oneTimeSetUp() { :; } + +#/** +# +# +# void +# +# +# +# +# oneTimeTearDown +# +# +# +# This function can be be optionally overridden by the user in their +# test suite. +# If this function exists, it will be called once after all tests are +# completed. It is useful to clean up the environment after all tests. +# +# +#*/ +# Note: see _shunit_mktempFunc() for actual implementation +# oneTimeTearDown() { :; } + +#/** +# +# +# void +# +# +# +# +# setUp +# +# +# +# This function can be be optionally overridden by the user in their +# test suite. +# If this function exists, it will be called before each test is run. +# It is useful to reset the environment before each test. +# +# +#*/ +# Note: see _shunit_mktempFunc() for actual implementation +# setUp() { :; } + +#/** +# +# +# void +# +# +# +# +# tearDown +# +# +# +# This function can be be optionally overridden by the user in their +# test suite. +# If this function exists, it will be called after each test completes. +# It is useful to clean up the environment after each test. +# +# +#*/ +# Note: see _shunit_mktempFunc() for actual implementation +# tearDown() { :; } + +#------------------------------------------------------------------------------ +# internal shUnit2 functions +# + +_shunit_cleanup() +{ + name=$1 + + case ${name} in + EXIT) signal=0 ;; + INT) signal=2 ;; + TERM) signal=15 ;; + *) + _shunit_warn "unrecognized trap value (${name})" + signal=0 + ;; + esac + + # do our work + rm -fr "${__shunit_tmpDir}" + + # exit for all non-EXIT signals + if [ ${name} != 'EXIT' ]; then + _shunit_warn "trapped and now handling the (${name}) signal" + _shunit_generateReport + # disable EXIT trap + trap 0 + # add 128 to signal and exit + exit `expr ${signal} + 128` + fi +} + +_shunit_execSuite() +{ + echo '#' + echo '# Performing tests' + echo '#' + for _su_func in ${__shunit_suite}; do + # disable skipping + endSkipping + + # execute the per-test setup function + setUp + + # execute the test + echo "${_su_func}" + eval ${_su_func} + + # execute the per-test tear-down function + tearDown + done + + unset _su_func +} + +_shunit_generateReport() +{ + _su__awkPercent='{printf("%4d %3.0f%%", $1, $1*100/$2)}' + if [ ${__shunit_testsTotal:-0} -gt 0 ]; then + _su__passed=`echo ${__shunit_testsPassed} ${__shunit_testsTotal} |\ + awk "${_su__awkPercent}"` + _su__failed=`echo ${__shunit_testsFailed} ${__shunit_testsTotal} |\ + awk "${_su__awkPercent}"` + _su__skipped=`echo ${__shunit_testsSkipped} ${__shunit_testsTotal} |\ + awk "${_su__awkPercent}"` + _su__total=`echo ${__shunit_testsTotal} 100 |\ + awk '{printf("%4d %3d%%", $1, $2)}'` + else + _su__passed=`echo 0 0 |awk '{printf("%4d %3d%%", $1, $2)}'` + _su__failed=${_su__passed} + _su__skipped=${_su__passed} + _su__total=${_su__passed} + fi + + cat </dev/null ) && return + + # the standard mktemp didn't work. doing our own. + if [ -r '/dev/urandom' ]; then + _su__random=`od -vAn -N4 -tx4 &2 + exit 1 + } + + echo ${_su__tmpDir} + unset _su__date _su__random _su__tmpDir +} + +# this function is here to work around issues in Cygwin +_shunit_mktempFunc() +{ + for _su__func in oneTimeSetUp oneTimeTearDown setUp tearDown suite; do + _su__file="${__shunit_tmpDir}/${_su__func}" + cat <"${_su__file}" +#! /bin/sh +exit 0 +EOF + chmod +x "${_su__file}" + done + + unset _su__file +} + +_shunit_shouldSkip() +{ + [ ${__shunit_skip} -eq ${SHUNIT_FALSE} ] && return ${SHUNIT_FALSE} + _shunit_testSkipped +} + +_shunit_testPassed() +{ + __shunit_testsPassed=`expr ${__shunit_testsPassed} + 1` + __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1` +} + +_shunit_testFailed() +{ + _su__msg=$1 + + __shunit_testsFailed=`expr ${__shunit_testsFailed} + 1` + __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1` + echo "${__SHUNIT_ASSERT_MSG_PREFIX}${_su__msg}" >&2 + + unset _su__msg +} + +_shunit_testSkipped() +{ + __shunit_testsSkipped=`expr ${__shunit_testsSkipped} + 1` + __shunit_testsTotal=`expr ${__shunit_testsTotal} + 1` +} + +#------------------------------------------------------------------------------ +# main +# + +# create a temporary storage location +__shunit_tmpDir=`_shunit_mktempDir` + +# setup traps to clean up after ourselves +trap '_shunit_cleanup EXIT' 0 +trap '_shunit_cleanup INT' 2 +trap '_shunit_cleanup TERM' 15 + +# create phantom functions to work around issues with Cygwin +_shunit_mktempFunc +PATH="${__shunit_tmpDir}:${PATH}" + +# execute the oneTimeSetUp function (if it exists) +oneTimeSetUp + +# execute the suite function defined in the parent test script +# deprecated as of 2.1.0 +suite + +# if no suite function was defined, dynamically build a list of functions +if [ -z "${__shunit_suite}" ]; then + shunit_funcs_=`grep "^[ \t]*test[A-Za-z0-9_]* *()" ${__SHUNIT_PARENT} \ + |sed 's/[^A-Za-z0-9_]//g'` + for shunit_func_ in ${shunit_funcs_}; do + suite_addTest ${shunit_func_} + done +fi +unset shunit_func_ shunit_funcs_ + +# execute the tests +_shunit_execSuite + +# execute the oneTimeTearDown function (if it exists) +oneTimeTearDown + +# generate report +_shunit_generateReport + +# restore the previous set of shell flags +for shunit_shellFlag_ in ${__SHUNIT_SHELL_FLAGS}; do + echo ${shunit_shellFlags_} |grep ${shunit_shellFlag_} >/dev/null \ + || set +${shunit_shellFlag_} +done +unset shunit_shellFlag_ shunit_shellFlags_ + +[ ${__shunit_testsFailed} -eq 0 ] || exit 1 + +#/** +# +#*/ diff --git a/tests/shunit2/tests.sh b/tests/shunit2/tests.sh new file mode 100755 index 000000000000..b27775a6b128 --- /dev/null +++ b/tests/shunit2/tests.sh @@ -0,0 +1,287 @@ +JSON_SCRIPT=tests.json +JSON_SCRIPT_BIN=${TEST_JSON_SCRIPT=:-./json_script-example} +FILE_STDOUT=tests.stdout +FILE_STDERR=tests.stderr +FILE_EXPECTED=tests.expected + +call_json_script() { + #export LD_PRELOAD=../libjson_script.so + $JSON_SCRIPT_BIN "$@" "$JSON_SCRIPT" >"$FILE_STDOUT" 2>"$FILE_STDERR" +} + +assertStdioEquals() { + local expected="$1" + local file_stdio="$2" + + echo "$expected" >"$FILE_EXPECTED" + if [ -z "$expected" ]; then + # we are expecting empty output, but we deliberately added a newline + # with echo above, so adding another echo to compensate for that + echo >>"$file_stdio" + fi + diff -up "$FILE_EXPECTED" "$file_stdio" >/dev/null 2>&1 || { + cat >&2 <"$JSON_SCRIPT" <<-EOF + [ + [ ] + [ ] + ] + EOF + call_json_script + assertStderrEquals "load JSON data from $JSON_SCRIPT failed." +} + +test_expr_eq() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "eq", "VAR", "foo" ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "VAR=foo" + assertStdoutEquals "echo bar" + call_json_script "VAR=xxx" + assertStdoutEquals "echo baz" +} + +test_expr_has() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "has", "VAR" ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "VAR=foo" + assertStdoutEquals "echo bar" + call_json_script + assertStdoutEquals "echo baz" +} + +test_expr_regex_single() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "regex", "VAR", ".ell." ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "VAR=hello" + assertStdoutEquals "echo bar" + call_json_script "VAR=.ell." + assertStdoutEquals "echo bar" + call_json_script + assertStdoutEquals "echo baz" + call_json_script "VAR=" + assertStdoutEquals "echo baz" + call_json_script "VAR=hell" + assertStdoutEquals "echo baz" +} + +test_expr_regex_multi() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "regex", "VAR", [ ".ell.", "w.rld" ] ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "VAR=hello" + assertStdoutEquals "echo bar" + call_json_script "VAR=world" + assertStdoutEquals "echo bar" + call_json_script "VAR=.ell." + assertStdoutEquals "echo bar" + call_json_script "VAR=w.rld" + assertStdoutEquals "echo bar" + call_json_script + assertStdoutEquals "echo baz" + call_json_script "VAR=" + assertStdoutEquals "echo baz" + call_json_script "VAR=hell" + assertStdoutEquals "echo baz" +} + +test_expr_not() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "not", [ "has", "VAR" ] ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "VAR=foo" + assertStdoutEquals "echo baz" + call_json_script + assertStdoutEquals "echo bar" +} + +test_expr_and() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "and", [ "eq", "EQVAR", "eqval" ], + [ "regex", "REGEXVAR", "regex..." ] + ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "EQVAR=eqval" "REGEXVAR=regexval" + assertStdoutEquals "echo bar" + call_json_script "EQVAR=foo" + assertStdoutEquals "echo baz" + call_json_script "REGEXVAR=regex***" + assertStdoutEquals "echo baz" + call_json_script + assertStdoutEquals "echo baz" +} + +test_expr_or() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "or", [ "not", [ "eq", "EQVAR", "eqval" ] ], + [ "regex", "REGEXVAR", [ "regexva.[0-9]", "regexva.[a-z]" ] ] + ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "EQVAR=eqval" "REGEXVAR=regexval1" + assertStdoutEquals "echo bar" + call_json_script "EQVAR=neq" "REGEXVAR=sxc" + assertStdoutEquals "echo bar" + call_json_script "REGEXVAR=sxc" + assertStdoutEquals "echo bar" + call_json_script "EQVAR=foo" + assertStdoutEquals "echo bar" + call_json_script + assertStdoutEquals "echo bar" + call_json_script "EQVAR=eqval" "REGEXVAR=regexval" + assertStdoutEquals "echo baz" +} + +test_expr_isdir() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "isdir", "%VAR%" ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "VAR=/" + assertStdoutEquals "echo bar" + call_json_script "VAR=$(mktemp -u)" + assertStdoutEquals "echo baz" + call_json_script + assertStdoutEquals "echo baz" +} + +test_cmd_case() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "case", "CASEVAR", { + "0": [ "echo", "foo" ], + "1": [ + [ "echo", "bar" ], + [ "echo", "baz" ] + ], + "%VAR%": [ "echo", "quz" ] + } ] + ] + EOF + call_json_script "CASEVAR=0" + assertStdoutEquals "echo foo" + call_json_script "CASEVAR=1" + assertStdoutEquals "echo bar +echo baz" + call_json_script "CASEVAR=%VAR%" + assertStdoutEquals "echo quz" + call_json_script "CASEVAR=" + assertStdoutEquals "" + call_json_script + assertStdoutEquals "" + call_json_script "CASEVAR=xxx" "VAR=xxx" + assertStdoutEquals "" +} + +test_cmd_if() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "if", + [ "eq", "VAR", "foo" ], + [ "echo", "bar" ], + [ "echo", "baz" ] + ] + ] + EOF + call_json_script "VAR=foo" + assertStdoutEquals "echo bar" + call_json_script "VAR=xxx" + assertStdoutEquals "echo baz" +} + +test_cmd_cb() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "exec", "%VAR%", "/%VAS%%%/" ] + ] + EOF + call_json_script + assertStdoutEquals "exec /%/" + call_json_script "VAR=" + assertStdoutEquals "exec /%/" + call_json_script "VAR=qux" "VAS=3" + assertStdoutEquals "exec qux /3%/" +} + +test_cmd_return() { + cat >"$JSON_SCRIPT" <<-EOF + [ + [ "heh", "%HEHVAR%" ], + [ "%VAR%", "%VAR%" ], + [ "return" ], + [ "exec_non_reachable", "Arghhh" ] + ] + EOF + call_json_script "HEHVAR=dude" "VAR=ow" + assertStdoutEquals "heh dude +%VAR% ow" +} + +. ./shunit2/shunit2 From patchwork Sun Jan 12 22:55:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Petr_=C5=A0tetiar?= X-Patchwork-Id: 1221902 X-Patchwork-Delegate: ynezz@true.cz Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.openwrt.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=true.cz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=YHDihUID; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47wsX46R10z9s29 for ; Mon, 13 Jan 2020 09:56:04 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Subject:MIME-Version:References: In-Reply-To:Message-Id:Date:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=biBLZXLFIDkShMTYy/XzIxeOVgDUTqHRnQZqNHXlb2c=; b=YHDihUIDpvc8TN /cHB9PZKt/A7y0D46pE6Yte+Mz8a4kIIH93Do4myo9KgnwhiE8htuArkyM1yhwb1GJpM8V04Ah5A9 lHL4hu9SyGH82j/Av6NZ/XukbKYnQz5N35/pt00/+bpGsJdKCGlJ+dtJeQpxAhu9lh2OcfbFPUoOH zubrYOvFA9c9fOlSkNi4e6MUl8y+sm5m+ioFybCJALm3sDpRC9A6zd+tdCzRRBnhbb6G53TL2WudG hJnHD+eXWRVcX/1dqvqhNQQZiopksFVA2Hk5jse1OFrCPBq3D922mP/OPVn9S/IYUSVj9YsbGXSV4 0ZuQf1v9f2A+Xq6+GM4w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm9J-0001st-Fy; Sun, 12 Jan 2020 22:56:01 +0000 Received: from smtp-out.xnet.cz ([178.217.244.18]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm8m-0001CY-LC for openwrt-devel@lists.openwrt.org; Sun, 12 Jan 2020 22:55:32 +0000 Received: from meh.true.cz (meh.true.cz [108.61.167.218]) (Authenticated sender: petr@true.cz) by smtp-out.xnet.cz (Postfix) with ESMTPSA id 56F77378A; Sun, 12 Jan 2020 23:55:22 +0100 (CET) Received: by meh.true.cz (OpenSMTPD) with ESMTP id 54e3bce3; Sun, 12 Jan 2020 23:55:11 +0100 (CET) From: =?utf-8?q?Petr_=C5=A0tetiar?= To: openwrt-devel@lists.openwrt.org Date: Sun, 12 Jan 2020 23:55:13 +0100 Message-Id: <20200112225515.11654-3-ynezz@true.cz> In-Reply-To: <20200112225515.11654-1-ynezz@true.cz> References: <20200112225515.11654-1-ynezz@true.cz> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200112_145529_006553_4C5481D0 X-CRM114-Status: UNSURE ( 9.41 ) X-CRM114-Notice: Please train this message. X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [178.217.244.18 listed in list.dnswl.org] 0.0 SPF_NONE SPF: sender does not publish an SPF Record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record Subject: [OpenWrt-Devel] [PATCH libubox 2/4] tests: blobmsg/json: add more test cases X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?utf-8?q?Petr_=C5=A0tetiar?= Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org * add missing test with sanitizers * add test case for blobmsg_add_json_from_string * add test cases for all numeric types * print types for each variable Signed-off-by: Petr Štetiar --- tests/cram/test_blobmsg.t | 255 +++++++++++++++++++++++++++++++++++--- tests/test-blobmsg.c | 47 +++++-- 2 files changed, 275 insertions(+), 27 deletions(-) diff --git a/tests/cram/test_blobmsg.t b/tests/cram/test_blobmsg.t index 3a5801a5a0f4..9ab2acf6e2d8 100644 --- a/tests/cram/test_blobmsg.t +++ b/tests/cram/test_blobmsg.t @@ -1,32 +1,255 @@ check that blobmsg is producing expected results: $ [ -n "$TEST_BIN_DIR" ] && export PATH="$TEST_BIN_DIR:$PATH" + $ valgrind --quiet --leak-check=full test-blobmsg + [*] blobmsg dump: + Message: Hello, world! + List: { + 0 (i8) + 100 (i8) + -128 (i8) + 127 (i8) + -32768 (i16) + 32767 (i16) + -2147483648 (i32) + 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) + 133.700000 (dbl) + } + Testdata: { + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 100 (i8) (esc) + \tmoo-min : -128 (i8) (esc) + \tmoo-max : 127 (i8) (esc) + \tbar-min : -32768 (i16) (esc) + \tbar-max : 32767 (i16) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) + \tworld : 2 (str) (esc) + } + + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + + [*] blobmsg from json: + Message: Hello, world! + List: { + 0 (i8) + 1 (i8) + 1 (i8) + 1 (i8) + 32768 (i32) + 32767 (i32) + -2147483648 (i32) + 2147483647 (i32) + -2147483648 (i32) + 2147483647 (i32) + 133.700000 (dbl) + } + Testdata: { + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 1 (i8) (esc) + \tmoo-min : 1 (i8) (esc) + \tmoo-max : 1 (i8) (esc) + \tbar-min : 32768 (i32) (esc) + \tbar-max : 32767 (i32) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -2147483648 (i32) (esc) + \ttaz-max : 2147483647 (i32) (esc) + \tworld : 2 (str) (esc) + } + + $ test-blobmsg-san + [*] blobmsg dump: + Message: Hello, world! + List: { + 0 (i8) + 100 (i8) + -128 (i8) + 127 (i8) + -32768 (i16) + 32767 (i16) + -2147483648 (i32) + 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) + 133.700000 (dbl) + } + Testdata: { + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 100 (i8) (esc) + \tmoo-min : -128 (i8) (esc) + \tmoo-max : 127 (i8) (esc) + \tbar-min : -32768 (i16) (esc) + \tbar-max : 32767 (i16) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) + \tworld : 2 (str) (esc) + } + + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + + [*] blobmsg from json: Message: Hello, world! List: { - 0 - 1 - 2 - 133.700000 + 0 (i8) + 1 (i8) + 1 (i8) + 1 (i8) + 32768 (i32) + 32767 (i32) + -2147483648 (i32) + 2147483647 (i32) + -2147483648 (i32) + 2147483647 (i32) + 133.700000 (dbl) } Testdata: { - \tdouble : 133.700000 (esc) - \thello : 1 (esc) - \tworld : 2 (esc) + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 1 (i8) (esc) + \tmoo-min : 1 (i8) (esc) + \tmoo-max : 1 (i8) (esc) + \tbar-min : 32768 (i32) (esc) + \tbar-max : 32767 (i32) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -2147483648 (i32) (esc) + \ttaz-max : 2147483647 (i32) (esc) + \tworld : 2 (str) (esc) } - json: {"message":"Hello, world!","testdata":{"double":133.700000,"hello":1,"world":"2"},"list":[0,1,2,133.700000]} $ test-blobmsg-san + [*] blobmsg dump: + Message: Hello, world! + List: { + 0 (i8) + 100 (i8) + -128 (i8) + 127 (i8) + -32768 (i16) + 32767 (i16) + -2147483648 (i32) + 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) + 133.700000 (dbl) + } + Testdata: { + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 100 (i8) (esc) + \tmoo-min : -128 (i8) (esc) + \tmoo-max : 127 (i8) (esc) + \tbar-min : -32768 (i16) (esc) + \tbar-max : 32767 (i16) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) + \tworld : 2 (str) (esc) + } + + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + + [*] blobmsg from json: + Message: Hello, world! + List: { + 0 (i8) + 1 (i8) + 1 (i8) + 1 (i8) + 32768 (i32) + 32767 (i32) + -2147483648 (i32) + 2147483647 (i32) + -2147483648 (i32) + 2147483647 (i32) + 133.700000 (dbl) + } + Testdata: { + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 1 (i8) (esc) + \tmoo-min : 1 (i8) (esc) + \tmoo-max : 1 (i8) (esc) + \tbar-min : 32768 (i32) (esc) + \tbar-max : 32767 (i32) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -2147483648 (i32) (esc) + \ttaz-max : 2147483647 (i32) (esc) + \tworld : 2 (str) (esc) + } + + $ test-blobmsg-san + [*] blobmsg dump: + Message: Hello, world! + List: { + 0 (i8) + 100 (i8) + -128 (i8) + 127 (i8) + -32768 (i16) + 32767 (i16) + -2147483648 (i32) + 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) + 133.700000 (dbl) + } + Testdata: { + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 100 (i8) (esc) + \tmoo-min : -128 (i8) (esc) + \tmoo-max : 127 (i8) (esc) + \tbar-min : -32768 (i16) (esc) + \tbar-max : 32767 (i16) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) + \tworld : 2 (str) (esc) + } + + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + + [*] blobmsg from json: Message: Hello, world! List: { - 0 - 1 - 2 - 133.700000 + 0 (i8) + 1 (i8) + 1 (i8) + 1 (i8) + 32768 (i32) + 32767 (i32) + -2147483648 (i32) + 2147483647 (i32) + -2147483648 (i32) + 2147483647 (i32) + 133.700000 (dbl) } Testdata: { - \tdouble : 133.700000 (esc) - \thello : 1 (esc) - \tworld : 2 (esc) + \tdouble : 133.700000 (dbl) (esc) + \tfoo : 0 (i8) (esc) + \tpoo : 1 (i8) (esc) + \tmoo-min : 1 (i8) (esc) + \tmoo-max : 1 (i8) (esc) + \tbar-min : 32768 (i32) (esc) + \tbar-max : 32767 (i32) (esc) + \tbaz-min : -2147483648 (i32) (esc) + \tbaz-max : 2147483647 (i32) (esc) + \ttaz-min : -2147483648 (i32) (esc) + \ttaz-max : 2147483647 (i32) (esc) + \tworld : 2 (str) (esc) } - json: {"message":"Hello, world!","testdata":{"double":133.700000,"hello":1,"world":"2"},"list":[0,1,2,133.700000]} diff --git a/tests/test-blobmsg.c b/tests/test-blobmsg.c index 5e99dc2a42a6..58b0bc4eb574 100644 --- a/tests/test-blobmsg.c +++ b/tests/test-blobmsg.c @@ -1,4 +1,5 @@ #include +#include #include #include "blobmsg.h" @@ -35,22 +36,22 @@ static void dump_attr_data(struct blob_attr *data, int indent, int next_indent) int type = blobmsg_type(data); switch(type) { case BLOBMSG_TYPE_STRING: - indent_printf(indent, "%s\n", blobmsg_get_string(data)); + indent_printf(indent, "%s (str)\n", blobmsg_get_string(data)); break; case BLOBMSG_TYPE_INT8: - indent_printf(indent, "%d\n", blobmsg_get_u8(data)); + indent_printf(indent, "%d (i8)\n", (int8_t) blobmsg_get_u8(data)); break; case BLOBMSG_TYPE_INT16: - indent_printf(indent, "%d\n", blobmsg_get_u16(data)); + indent_printf(indent, "%d (i16)\n", (int16_t) blobmsg_get_u16(data)); break; case BLOBMSG_TYPE_INT32: - indent_printf(indent, "%d\n", blobmsg_get_u32(data)); + indent_printf(indent, "%d (i32)\n", (int32_t) blobmsg_get_u32(data)); break; case BLOBMSG_TYPE_INT64: - indent_printf(indent, "%"PRIu64"\n", blobmsg_get_u64(data)); + indent_printf(indent, "%"PRId64" (i64)\n", (int64_t) blobmsg_get_u64(data)); break; case BLOBMSG_TYPE_DOUBLE: - indent_printf(indent, "%lf\n", blobmsg_get_double(data)); + indent_printf(indent, "%lf (dbl)\n", blobmsg_get_double(data)); break; case BLOBMSG_TYPE_TABLE: case BLOBMSG_TYPE_ARRAY: @@ -117,14 +118,30 @@ fill_message(struct blob_buf *buf) tbl = blobmsg_open_table(buf, "testdata"); blobmsg_add_double(buf, "double", 1.337e2); - blobmsg_add_u32(buf, "hello", 1); + blobmsg_add_u8(buf, "foo", 0); + blobmsg_add_u8(buf, "poo", 100); + blobmsg_add_u8(buf, "moo-min", INT8_MIN); + blobmsg_add_u8(buf, "moo-max", INT8_MAX); + blobmsg_add_u16(buf, "bar-min", INT16_MIN); + blobmsg_add_u16(buf, "bar-max", INT16_MAX); + blobmsg_add_u32(buf, "baz-min", INT32_MIN); + blobmsg_add_u32(buf, "baz-max", INT32_MAX); + blobmsg_add_u64(buf, "taz-min", INT64_MIN); + blobmsg_add_u64(buf, "taz-max", INT64_MAX); blobmsg_add_string(buf, "world", "2"); blobmsg_close_table(buf, tbl); tbl = blobmsg_open_array(buf, "list"); - blobmsg_add_u32(buf, NULL, 0); - blobmsg_add_u32(buf, NULL, 1); - blobmsg_add_u32(buf, NULL, 2); + blobmsg_add_u8(buf, NULL, 0); + blobmsg_add_u8(buf, NULL, 100); + blobmsg_add_u8(buf, NULL, INT8_MIN); + blobmsg_add_u8(buf, NULL, INT8_MAX); + blobmsg_add_u16(buf, NULL, INT16_MIN); + blobmsg_add_u16(buf, NULL, INT16_MAX); + blobmsg_add_u32(buf, NULL, INT32_MIN); + blobmsg_add_u32(buf, NULL, INT32_MAX); + blobmsg_add_u64(buf, NULL, INT64_MIN); + blobmsg_add_u64(buf, NULL, INT64_MAX); blobmsg_add_double(buf, "double", 1.337e2); blobmsg_close_table(buf, tbl); } @@ -136,13 +153,21 @@ int main(int argc, char **argv) blobmsg_buf_init(&buf); fill_message(&buf); + fprintf(stderr, "[*] blobmsg dump:\n"); dump_message(&buf); json = blobmsg_format_json(buf.head, true); if (!json) exit(EXIT_FAILURE); - fprintf(stderr, "json: %s\n", json); + fprintf(stderr, "\n[*] blobmsg to json: %s\n", json); + + blobmsg_buf_init(&buf); + if (!blobmsg_add_json_from_string(&buf, json)) + exit(EXIT_FAILURE); + + fprintf(stderr, "\n[*] blobmsg from json:\n"); + dump_message(&buf); if (buf.buf) free(buf.buf); From patchwork Sun Jan 12 22:55:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Petr_=C5=A0tetiar?= X-Patchwork-Id: 1221900 X-Patchwork-Delegate: ynezz@true.cz Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.openwrt.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=true.cz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=Fxq11EoG; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47wsWd47JSz9sPW for ; Mon, 13 Jan 2020 09:55:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Subject:MIME-Version:References: In-Reply-To:Message-Id:Date:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=3LJW1H1SoK5NoHdQV3D7VWFCwYSLixAvJrsTGXQOSi8=; b=Fxq11EoGeSxNtL lGP5UdSH2AF6gOHI7vBGrAIeWlIza20wKl+j0ylAfaK7u8dhmmOL8uqagVdgwWsadZwS+kAQh8aHg zHGRUcT8fMmWnxKiZBcXhqAZmK7X+g7f8nt5C9+g7wvVYWyowYpaIEdAVeRzJdaJHQnQk5SfHQvYk GWxTnnYRJCcMND8AQ55eXRrcaScw1S868prm8CISb2vAxyKA4dy7I6BtP1UG6+758rs9Tm9/kuttd 4N20HR6JeyfOWGK3QlkckNslHjfmPOUVNUo8WlyQ0hOHIXd8aN1Tj/gHMM6ozGnLxJLoBqwKz3WBQ 8NfR56vAwGO7lKgWg5/Q==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm8x-0001Mo-Nn; Sun, 12 Jan 2020 22:55:39 +0000 Received: from smtp-out.xnet.cz ([178.217.244.18]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm8m-0001Cb-LB for openwrt-devel@lists.openwrt.org; Sun, 12 Jan 2020 22:55:30 +0000 Received: from meh.true.cz (meh.true.cz [108.61.167.218]) (Authenticated sender: petr@true.cz) by smtp-out.xnet.cz (Postfix) with ESMTPSA id A5754378B; Sun, 12 Jan 2020 23:55:22 +0100 (CET) Received: by meh.true.cz (OpenSMTPD) with ESMTP id 9f47090c; Sun, 12 Jan 2020 23:55:12 +0100 (CET) From: =?utf-8?q?Petr_=C5=A0tetiar?= To: openwrt-devel@lists.openwrt.org Date: Sun, 12 Jan 2020 23:55:14 +0100 Message-Id: <20200112225515.11654-4-ynezz@true.cz> In-Reply-To: <20200112225515.11654-1-ynezz@true.cz> References: <20200112225515.11654-1-ynezz@true.cz> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200112_145528_846074_0EC72856 X-CRM114-Status: UNSURE ( 7.70 ) X-CRM114-Notice: Please train this message. X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [178.217.244.18 listed in list.dnswl.org] 0.0 SPF_NONE SPF: sender does not publish an SPF Record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record Subject: [OpenWrt-Devel] [PATCH libubox 3/4] blobmsg_json: fix int16 serialization X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?utf-8?q?Petr_=C5=A0tetiar?= Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org int16 blobmsg type is currently being serialized as uint16_t due to missing cast during JSON output. Following blobmsg content: bar-min: -32768 (i16) bar-max: 32767 (i16) Produces following JSON: { "bar-min":32768,"bar-max":32767 } Whereas one would expect: { "bar-min":-32768,"bar-max":32767 } Signed-off-by: Petr Štetiar --- blobmsg_json.c | 2 +- tests/cram/test_blobmsg.t | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blobmsg_json.c b/blobmsg_json.c index 18592111b4dd..aee7a64fbca7 100644 --- a/blobmsg_json.c +++ b/blobmsg_json.c @@ -249,7 +249,7 @@ static void blobmsg_format_element(struct strbuf *s, struct blob_attr *attr, boo sprintf(buf, "%s", *(uint8_t *)data ? "true" : "false"); break; case BLOBMSG_TYPE_INT16: - sprintf(buf, "%d", be16_to_cpu(*(uint16_t *)data)); + sprintf(buf, "%d", (int16_t) be16_to_cpu(*(uint16_t *)data)); break; case BLOBMSG_TYPE_INT32: sprintf(buf, "%d", (int32_t) be32_to_cpu(*(uint32_t *)data)); diff --git a/tests/cram/test_blobmsg.t b/tests/cram/test_blobmsg.t index 9ab2acf6e2d8..84ec143d6ff1 100644 --- a/tests/cram/test_blobmsg.t +++ b/tests/cram/test_blobmsg.t @@ -33,7 +33,7 @@ check that blobmsg is producing expected results: \tworld : 2 (str) (esc) } - [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":-32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,-32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} [*] blobmsg from json: Message: Hello, world! @@ -42,7 +42,7 @@ check that blobmsg is producing expected results: 1 (i8) 1 (i8) 1 (i8) - 32768 (i32) + -32768 (i32) 32767 (i32) -2147483648 (i32) 2147483647 (i32) @@ -56,7 +56,7 @@ check that blobmsg is producing expected results: \tpoo : 1 (i8) (esc) \tmoo-min : 1 (i8) (esc) \tmoo-max : 1 (i8) (esc) - \tbar-min : 32768 (i32) (esc) + \tbar-min : -32768 (i32) (esc) \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) @@ -96,7 +96,7 @@ check that blobmsg is producing expected results: \tworld : 2 (str) (esc) } - [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":-32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,-32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} [*] blobmsg from json: Message: Hello, world! @@ -105,7 +105,7 @@ check that blobmsg is producing expected results: 1 (i8) 1 (i8) 1 (i8) - 32768 (i32) + -32768 (i32) 32767 (i32) -2147483648 (i32) 2147483647 (i32) @@ -119,7 +119,7 @@ check that blobmsg is producing expected results: \tpoo : 1 (i8) (esc) \tmoo-min : 1 (i8) (esc) \tmoo-max : 1 (i8) (esc) - \tbar-min : 32768 (i32) (esc) + \tbar-min : -32768 (i32) (esc) \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) @@ -159,7 +159,7 @@ check that blobmsg is producing expected results: \tworld : 2 (str) (esc) } - [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":-32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,-32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} [*] blobmsg from json: Message: Hello, world! @@ -168,7 +168,7 @@ check that blobmsg is producing expected results: 1 (i8) 1 (i8) 1 (i8) - 32768 (i32) + -32768 (i32) 32767 (i32) -2147483648 (i32) 2147483647 (i32) @@ -182,7 +182,7 @@ check that blobmsg is producing expected results: \tpoo : 1 (i8) (esc) \tmoo-min : 1 (i8) (esc) \tmoo-max : 1 (i8) (esc) - \tbar-min : 32768 (i32) (esc) + \tbar-min : -32768 (i32) (esc) \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) @@ -222,7 +222,7 @@ check that blobmsg is producing expected results: \tworld : 2 (str) (esc) } - [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} + [*] blobmsg to json: {"message":"Hello, world!","testdata":{"double":133.700000,"foo":false,"poo":true,"moo-min":true,"moo-max":true,"bar-min":-32768,"bar-max":32767,"baz-min":-2147483648,"baz-max":2147483647,"taz-min":-9223372036854775808,"taz-max":9223372036854775807,"world":"2"},"list":[false,true,true,true,-32768,32767,-2147483648,2147483647,-9223372036854775808,9223372036854775807,133.700000]} [*] blobmsg from json: Message: Hello, world! @@ -231,7 +231,7 @@ check that blobmsg is producing expected results: 1 (i8) 1 (i8) 1 (i8) - 32768 (i32) + -32768 (i32) 32767 (i32) -2147483648 (i32) 2147483647 (i32) @@ -245,7 +245,7 @@ check that blobmsg is producing expected results: \tpoo : 1 (i8) (esc) \tmoo-min : 1 (i8) (esc) \tmoo-max : 1 (i8) (esc) - \tbar-min : 32768 (i32) (esc) + \tbar-min : -32768 (i32) (esc) \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) From patchwork Sun Jan 12 22:55:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Petr_=C5=A0tetiar?= X-Patchwork-Id: 1221901 X-Patchwork-Delegate: ynezz@true.cz Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.openwrt.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=true.cz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=WMdfqLYX; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47wsWs40RMz9s29 for ; Mon, 13 Jan 2020 09:55:53 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Subject:MIME-Version:References: In-Reply-To:Message-Id:Date:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=0a3bKCo6ejd3EEKPNLSHe29ehq7sQXfC/CsUuDpsx+U=; b=WMdfqLYX4NaqbL 5oZXFzAagSD11PchzuNcRNN7oCxHqbRcJdBFHrYVDIO1UBc16Jqo0rs3S3/Tuim5GYpkgfIdWBwT+ kQ5KcCZtEReV4aqNEkM1SDN3xM/IvprQi3Twb5IbH0Q0t1lFwH2r53rbja22zNwYde8nDnfGnnr1a e4GqprQOF1drf0qh4wxHmLbycIxsM2um+SkCo6UYUsdNCQN9b+COebnCQgACtIrIsuNOIp9C8Q53j 0hjrcyvApaYOduyxrKo2Jjfe29sWAyopxaax7iEbMytuHtF0bt21IylTupQpzDgBO1FP0s1F72Aix c105Rw3ViMrH/MnkFsDA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm98-0001d6-8G; Sun, 12 Jan 2020 22:55:50 +0000 Received: from smtp-out.xnet.cz ([178.217.244.18]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqm8m-0001Cl-LC for openwrt-devel@lists.openwrt.org; Sun, 12 Jan 2020 22:55:31 +0000 Received: from meh.true.cz (meh.true.cz [108.61.167.218]) (Authenticated sender: petr@true.cz) by smtp-out.xnet.cz (Postfix) with ESMTPSA id F2995378D; Sun, 12 Jan 2020 23:55:22 +0100 (CET) Received: by meh.true.cz (OpenSMTPD) with ESMTP id fa2145ee; Sun, 12 Jan 2020 23:55:12 +0100 (CET) From: =?utf-8?q?Petr_=C5=A0tetiar?= To: openwrt-devel@lists.openwrt.org Date: Sun, 12 Jan 2020 23:55:15 +0100 Message-Id: <20200112225515.11654-5-ynezz@true.cz> In-Reply-To: <20200112225515.11654-1-ynezz@true.cz> References: <20200112225515.11654-1-ynezz@true.cz> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200112_145529_006085_46FB7DF1 X-CRM114-Status: UNSURE ( 7.17 ) X-CRM114-Notice: Please train this message. X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [178.217.244.18 listed in list.dnswl.org] 0.0 SPF_NONE SPF: sender does not publish an SPF Record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record Subject: [OpenWrt-Devel] [PATCH libubox 4/4] blobmsg: blobmsg_add_json_element() 64-bit values X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dainis Jonitis , =?utf-8?q?Petr_=C5=A0tetiar?= Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org From: Dainis Jonitis libjson-c json_type_int values are stored as int64_t. Use json_object_get_int64() instead of json_object_get_int() to avoid clamping to INT32_MAX. Signed-off-by: Dainis Jonitis [fixed author to match SoB, added unit test results] Signed-off-by: Petr Štetiar --- blobmsg_json.c | 10 ++++++++-- tests/cram/test_blobmsg.t | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/blobmsg_json.c b/blobmsg_json.c index aee7a64fbca7..aedc2da22ebc 100644 --- a/blobmsg_json.c +++ b/blobmsg_json.c @@ -66,9 +66,15 @@ bool blobmsg_add_json_element(struct blob_buf *b, const char *name, json_object case json_type_boolean: blobmsg_add_u8(b, name, json_object_get_boolean(obj)); break; - case json_type_int: - blobmsg_add_u32(b, name, json_object_get_int(obj)); + case json_type_int: { + int64_t i64 = json_object_get_int64(obj); + if (i64 >= INT32_MIN && i64 <= INT32_MAX) { + blobmsg_add_u32(b, name, (uint32_t)i64); + } else { + blobmsg_add_u64(b, name, (uint64_t)i64); + } break; + } case json_type_double: blobmsg_add_double(b, name, json_object_get_double(obj)); break; diff --git a/tests/cram/test_blobmsg.t b/tests/cram/test_blobmsg.t index 84ec143d6ff1..74ad326931fe 100644 --- a/tests/cram/test_blobmsg.t +++ b/tests/cram/test_blobmsg.t @@ -46,8 +46,8 @@ check that blobmsg is producing expected results: 32767 (i32) -2147483648 (i32) 2147483647 (i32) - -2147483648 (i32) - 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) 133.700000 (dbl) } Testdata: { @@ -60,8 +60,8 @@ check that blobmsg is producing expected results: \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) - \ttaz-min : -2147483648 (i32) (esc) - \ttaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) \tworld : 2 (str) (esc) } @@ -109,8 +109,8 @@ check that blobmsg is producing expected results: 32767 (i32) -2147483648 (i32) 2147483647 (i32) - -2147483648 (i32) - 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) 133.700000 (dbl) } Testdata: { @@ -123,8 +123,8 @@ check that blobmsg is producing expected results: \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) - \ttaz-min : -2147483648 (i32) (esc) - \ttaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) \tworld : 2 (str) (esc) } @@ -172,8 +172,8 @@ check that blobmsg is producing expected results: 32767 (i32) -2147483648 (i32) 2147483647 (i32) - -2147483648 (i32) - 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) 133.700000 (dbl) } Testdata: { @@ -186,8 +186,8 @@ check that blobmsg is producing expected results: \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) - \ttaz-min : -2147483648 (i32) (esc) - \ttaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) \tworld : 2 (str) (esc) } @@ -235,8 +235,8 @@ check that blobmsg is producing expected results: 32767 (i32) -2147483648 (i32) 2147483647 (i32) - -2147483648 (i32) - 2147483647 (i32) + -9223372036854775808 (i64) + 9223372036854775807 (i64) 133.700000 (dbl) } Testdata: { @@ -249,7 +249,7 @@ check that blobmsg is producing expected results: \tbar-max : 32767 (i32) (esc) \tbaz-min : -2147483648 (i32) (esc) \tbaz-max : 2147483647 (i32) (esc) - \ttaz-min : -2147483648 (i32) (esc) - \ttaz-max : 2147483647 (i32) (esc) + \ttaz-min : -9223372036854775808 (i64) (esc) + \ttaz-max : 9223372036854775807 (i64) (esc) \tworld : 2 (str) (esc) }