Test report

LICENSE: LGPL TESTS: 21 / 21 COVERAGE: 76% CODE REPOSITORY: GITHUB RELEASE: 0.1.0

Summary

text report
Log of Meson test suite run on 2024-08-06T23:19:18.566491

Inherited environment: SELENIUM_JAR_PATH=/usr/share/java/selenium-server.jar CONDA=/usr/share/miniconda GITHUB_WORKSPACE=/home/runner/work/rofi-blocks/rofi-blocks JAVA_HOME_11_X64=/usr/lib/jvm/temurin-11-jdk-amd64 GITHUB_PATH=/home/runner/work/_temp/_runner_file_commands/add_path_d3c43521-677c-4be9-8d21-6675a76ec7d2 GITHUB_ACTION=__run_2 JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64 GITHUB_RUN_NUMBER=36 RUNNER_NAME='GitHub Actions 3' GRADLE_HOME=/usr/share/gradle-8.9 GITHUB_REPOSITORY_OWNER_ID=1904134 ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE=/opt/actionarchivecache XDG_CONFIG_HOME=/home/runner/.config MEMORY_PRESSURE_WRITE=c29tZSAyMDAwMDAgMjAwMDAwMAA= DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 ANT_HOME=/usr/share/ant JAVA_HOME_8_X64=/usr/lib/jvm/temurin-8-jdk-amd64 GITHUB_TRIGGERING_ACTOR=OmarCastro GITHUB_REF_TYPE=branch HOMEBREW_CLEANUP_PERIODIC_FULL_DAYS=3650 ANDROID_NDK=/usr/local/lib/android/sdk/ndk/27.0.12077973 BOOTSTRAP_HASKELL_NONINTERACTIVE=1 PIPX_BIN_DIR=/opt/pipx_bin PWD=/home/runner/work/rofi-blocks/rofi-blocks STATS_TRP=true GOROOT_1_20_X64=/opt/hostedtoolcache/go/1.20.14/x64 DEPLOYMENT_BASEPATH=/opt/runner GITHUB_REPOSITORY_ID=228936954 GITHUB_ACTIONS=true STATS_VMD=true ANDROID_NDK_LATEST_HOME=/usr/local/lib/android/sdk/ndk/27.0.12077973 SYSTEMD_EXEC_PID=815 GITHUB_SHA=d75a9da1516daeef33a13714dfe19d2da9d6c819 GITHUB_WORKFLOW_REF=OmarCastro/rofi-blocks/.github/workflows/static.yml@refs/heads/master POWERSHELL_DISTRIBUTION_CHANNEL=GitHub-Actions-ubuntu24 RUNNER_ENVIRONMENT=github-hosted STATS_EXTP=https://provjobdsettingscdn.blob.core.windows.net/settings/provjobdsettings-0.5.181+6/provjobd.data DOTNET_MULTILEVEL_LOOKUP=0 GITHUB_REF=refs/heads/master RUNNER_OS=Linux CACHE_KEY=67331fee8be53f5ea5df43c67bb2cb41 GITHUB_REF_PROTECTED=false HOME=/home/runner GITHUB_API_URL=https://api.github.com LANG=C.UTF-8 RUNNER_TRACKING_ID=github_9fd21941-12d2-49f6-9bf0-a3b3bcf02ddb ACTIONS_ID_TOKEN_REQUEST_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ikh5cTROQVRBanNucUM3bWRydEFoaHJDUjJfUSJ9.eyJuYW1laWQiOiJkZGRkZGRkZC1kZGRkLWRkZGQtZGRkZC1kZGRkZGRkZGRkZGQiLCJzY3AiOiJBY3Rpb25zLkdlbmVyaWNSZWFkOjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCBBY3Rpb25zLlJlc3VsdHM6OTYzYjc4OWQtMzc1Ni00YTlkLTllNGUtMzQzMTJjODQzNTRlOmUwNzc0MmJkLTE4OWEtNTA3OS05MThiLTQzZjhiMmY5NGI4OSBBY3Rpb25zLlVwbG9hZEFydGlmYWN0czowMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAvMTpCdWlsZC9CdWlsZC8zNyBEaXN0cmlidXRlZFRhc2suR2VuZXJhdGVJZFRva2VuOjk2M2I3ODlkLTM3NTYtNGE5ZC05ZTRlLTM0MzEyYzg0MzU0ZTplMDc3NDJiZC0xODlhLTUwNzktOTE4Yi00M2Y4YjJmOTRiODkgTG9jYXRpb25TZXJ2aWNlLkNvbm5lY3QgUmVhZEFuZFVwZGF0ZUJ1aWxkQnlVcmk6MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwLzE6QnVpbGQvQnVpbGQvMzciLCJJZGVudGl0eVR5cGVDbGFpbSI6IlN5c3RlbTpTZXJ2aWNlSWRlbnRpdHkiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9zaWQiOiJERERERERERC1ERERELUREREQtRERERC1EREREREREREREREQiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3ByaW1hcnlzaWQiOiJkZGRkZGRkZC1kZGRkLWRkZGQtZGRkZC1kZGRkZGRkZGRkZGQiLCJhdWkiOiJhMzMzZmU1Yy1mYWJjLTRhZDktYWI0MC0yZDE2NWEwNGIyZDIiLCJzaWQiOiJkNjY2NWVlNy1jMmE0LTRkYmMtYWIxNy00ODcwMjc2YzEyNDEiLCJhYyI6Ilt7XCJTY29wZVwiOlwicmVmcy9oZWFkcy9tYXN0ZXJcIixcIlBlcm1pc3Npb25cIjozfV0iLCJhY3NsIjoiMTAiLCJvaWRjX2V4dHJhIjoie1wicmVmXCI6XCJyZWZzL2hlYWRzL21hc3RlclwiLFwic2hhXCI6XCJkNzVhOWRhMTUxNmRhZWVmMzNhMTM3MTRkZmUxOWQyZGE5ZDZjODE5XCIsXCJyZXBvc2l0b3J5XCI6XCJPbWFyQ2FzdHJvL3JvZmktYmxvY2tzXCIsXCJyZXBvc2l0b3J5X293bmVyXCI6XCJPbWFyQ2FzdHJvXCIsXCJyZXBvc2l0b3J5X293bmVyX2lkXCI6XCIxOTA0MTM0XCIsXCJydW5faWRcIjpcIjEwMjc1MzEwMjkyXCIsXCJydW5fbnVtYmVyXCI6XCIzNlwiLFwicnVuX2F0dGVtcHRcIjpcIjFcIixcInJlcG9zaXRvcnlfdmlzaWJpbGl0eVwiOlwicHVibGljXCIsXCJyZXBvc2l0b3J5X2lkXCI6XCIyMjg5MzY5NTRcIixcImFjdG9yX2lkXCI6XCIxOTA0MTM0XCIsXCJhY3RvclwiOlwiT21hckNhc3Ryb1wiLFwid29ya2Zsb3dcIjpcIkRlcGxveSBzdGF0aWMgY29udGVudCB0byBQYWdlc1wiLFwiaGVhZF9yZWZcIjpcIlwiLFwiYmFzZV9yZWZcIjpcIlwiLFwiZXZlbnRfbmFtZVwiOlwicHVzaFwiLFwicmVmX3Byb3RlY3RlZFwiOlwiZmFsc2VcIixcInJlZl90eXBlXCI6XCJicmFuY2hcIixcIndvcmtmbG93X3JlZlwiOlwiT21hckNhc3Ryby9yb2ZpLWJsb2Nrcy8uZ2l0aHViL3dvcmtmbG93cy9zdGF0aWMueW1sQHJlZnMvaGVhZHMvbWFzdGVyXCIsXCJ3b3JrZmxvd19zaGFcIjpcImQ3NWE5ZGExNTE2ZGFlZWYzM2ExMzcxNGRmZTE5ZDJkYTlkNmM4MTlcIixcImVudmlyb25tZW50XCI6XCJnaXRodWItcGFnZXNcIixcImVudmlyb25tZW50X25vZGVfaWRcIjpcIkVOX2t3RE9EYVZNLXM3UDhxX3BcIixcImpvYl93b3JrZmxvd19yZWZcIjpcIk9tYXJDYXN0cm8vcm9maS1ibG9ja3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3RhdGljLnltbEByZWZzL2hlYWRzL21hc3RlclwiLFwiam9iX3dvcmtmbG93X3NoYVwiOlwiZDc1YTlkYTE1MTZkYWVlZjMzYTEzNzE0ZGZlMTlkMmRhOWQ2YzgxOVwiLFwicnVubmVyX2Vudmlyb25tZW50XCI6XCJnaXRodWItaG9zdGVkXCJ9Iiwib2lkY19zdWIiOiJyZXBvOk9tYXJDYXN0cm8vcm9maS1ibG9ja3M6ZW52aXJvbm1lbnQ6Z2l0aHViLXBhZ2VzIiwib3JjaGlkIjoiOTYzYjc4OWQtMzc1Ni00YTlkLTllNGUtMzQzMTJjODQzNTRlLmRlcGxveS5fX2RlZmF1bHQiLCJpc3MiOiJ2c3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwiYXVkIjoidnN0b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbXx2c286Yjc5NmFlN2QtZjY0MC00NDEzLWE5OGMtYWRiZDhjMGQ1NDlhIiwibmJmIjoxNzIyOTg1NjU3LCJleHAiOjE3MjMwMDg0NTd9.UvWVoPjyUyFlECvdkZi56pXactQIpoxgU2YqtRg-7Fda-QhuhDcLKFGad6tjrxt8FI-IRl70ziCAAhxSMsTiHGAJxjklcYIKciMUwqfUzmRpsUE622Mu9aqFa10wrTMjg4JHfj8Qn6AgWlqTJ4gQKJp4iXvE6nqw9YJEvwkoHdhvvGwCtFTzJ_Q6CKf240EmaTCiQqiLLpARnzJUBb9N_rkPStl3jlhkRoYAbX31QyZ9b-hMlranfF9dIT2xlXKRHIFlz8SUD4bnLNJgNM6tTDmb-wAZUkfoGZXi_E_R08ELebcnNO-PzZ6-EAlHjB81iFmYYPglW87ALYBUpnaFGg RUNNER_ARCH=X64 GOROOT_1_21_X64=/opt/hostedtoolcache/go/1.21.12/x64 MEMORY_PRESSURE_WATCH=/sys/fs/cgroup/system.slice/runner-provisioner.service/memory.pressure RUNNER_TEMP=/home/runner/work/_temp GITHUB_STATE=/home/runner/work/_temp/_runner_file_commands/save_state_d3c43521-677c-4be9-8d21-6675a76ec7d2 JAVA_HOME_21_X64=/usr/lib/jvm/temurin-21-jdk-amd64 GITHUB_ENV=/home/runner/work/_temp/_runner_file_commands/set_env_d3c43521-677c-4be9-8d21-6675a76ec7d2 INVOCATION_ID=33c58b3f4b59476c9ac0baf16e5fdade GITHUB_EVENT_PATH=/home/runner/work/_temp/_github_workflow/event.json STATS_D=true GITHUB_EVENT_NAME=push GITHUB_RUN_ID=10275310292 JAVA_HOME_17_X64=/usr/lib/jvm/temurin-17-jdk-amd64 ANDROID_NDK_HOME=/usr/local/lib/android/sdk/ndk/27.0.12077973 GITHUB_STEP_SUMMARY=/home/runner/work/_temp/_runner_file_commands/step_summary_d3c43521-677c-4be9-8d21-6675a76ec7d2 HOMEBREW_NO_AUTO_UPDATE=1 GITHUB_ACTOR=OmarCastro SGX_AESM_ADDR=1 GITHUB_RUN_ATTEMPT=1 STATS_RDCL=true ANDROID_HOME=/usr/local/lib/android/sdk GITHUB_GRAPHQL_URL=https://api.github.com/graphql ACCEPT_EULA=Y RUNNER_USER=runner STATS_UE=true USER=runner GITHUB_SERVER_URL=https://github.com STATS_V3PS=true PIPX_HOME=/opt/pipx STATS_EXT=true CHROMEWEBDRIVER=/usr/local/share/chromedriver-linux64 SHLVL=2 ANDROID_SDK_ROOT=/usr/local/lib/android/sdk VCPKG_INSTALLATION_ROOT=/usr/local/share/vcpkg GITHUB_ACTOR_ID=1904134 RUNNER_TOOL_CACHE=/opt/hostedtoolcache ImageVersion=20240730.3.0 DOTNET_NOLOGO=1 GITHUB_WORKFLOW_SHA=d75a9da1516daeef33a13714dfe19d2da9d6c819 GITHUB_REF_NAME=master GITHUB_JOB=deploy XDG_RUNTIME_DIR=/run/user/1001 ACTIONS_ID_TOKEN_REQUEST_URL='https://pipelinesghubeus3.actions.githubusercontent.com/hXAbH2bP61nusgNdyAVe358rhDrNcOoaOBFetruNB8AGzhQZoO/00000000-0000-0000-0000-000000000000/_apis/distributedtask/hubs/Actions/plans/963b789d-3756-4a9d-9e4e-34312c84354e/jobs/e07742bd-189a-5079-918b-43f8b2f94b89/idtoken?api-version=2.0' AZURE_EXTENSION_DIR=/opt/az/azcliextensions PERFLOG_LOCATION_SETTING=RUNNER_PERFLOG STATS_VMFE=true GITHUB_REPOSITORY=OmarCastro/rofi-blocks GOROOT_1_22_X64=/opt/hostedtoolcache/go/1.22.5/x64 CHROME_BIN=/usr/bin/google-chrome ANDROID_NDK_ROOT=/usr/local/lib/android/sdk/ndk/27.0.12077973 GITHUB_RETENTION_DAYS=90 JOURNAL_STREAM=8:7289 RUNNER_WORKSPACE=/home/runner/work/rofi-blocks GITHUB_ACTION_REPOSITORY='' PATH=/opt/hostedtoolcache/node/22.5.1/x64/bin:/snap/bin:/home/runner/.local/bin:/opt/pipx_bin:/home/runner/.cargo/bin:/home/runner/.config/composer/vendor/bin:/usr/local/.ghcup/bin:/home/runner/.dotnet/tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin RUNNER_PERFLOG=/home/runner/perflog GITHUB_BASE_REF='' GHCUP_INSTALL_BASE_PREFIX=/usr/local CI=true ImageOS=ubuntu24 STATS_D_D=true GITHUB_REPOSITORY_OWNER=OmarCastro GITHUB_HEAD_REF='' GITHUB_ACTION_REF='' GITHUB_WORKFLOW='Deploy static content to Pages' DEBIAN_FRONTEND=noninteractive GITHUB_OUTPUT=/home/runner/work/_temp/_runner_file_commands/set_output_d3c43521-677c-4be9-8d21-6675a76ec7d2 AGENT_TOOLSDIRECTORY=/opt/hostedtoolcache OLDPWD=/home/runner/work/rofi-blocks/rofi-blocks/dev-tools _=/usr/bin/meson 

==================================== 1/2 =====================================
test:         test-suite-unit
start time:   23:19:18
duration:     0.59s
result:       exit status 0
command:      UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 LC_ALL=C MALLOC_PERTURB_=99 ASAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1 valgrind --leak-check=full /home/runner/work/rofi-blocks/rofi-blocks/build-test/rofi-blocks-unit
----------------------------------- stdout -----------------------------------
1..16
ok 1 [../tests/unit/entrypoint.test.c:12] page_data != NULL
ok 2 [../tests/unit/entrypoint.test.c:13] page_data->markup_default == false
ok 3 [../tests/unit/entrypoint.test.c:15] .result = page_data_get_number_of_lines(page_data), .expected = 0
ok 4 [../tests/unit/entrypoint.test.c:19] .result = page_data_get_line_by_index_or_else(page_data, 0, NULL)->text, .expected= "aaa"
ok 5 [../tests/unit/entrypoint.test.c:20] page_data_get_line_by_index_or_else(page_data, -1, NULL) == NULL
ok 6 [../tests/unit/entrypoint.test.c:21] page_data_get_line_by_index_or_else(NULL, 0, NULL) == NULL
ok 7 [../tests/unit/entrypoint.test.c:22] .result = page_data_get_number_of_lines(page_data), .expected = 1
ok 8 [../tests/unit/entrypoint.test.c:31] str_replace(NULL, NULL, NULL) == NULL
ok 9 [../tests/unit/entrypoint.test.c:32] str_replace("aaaa", NULL, NULL) == NULL
ok 10 [../tests/unit/entrypoint.test.c:33] str_replace("aaaa", "", "bbb") == NULL
ok 11 [../tests/unit/entrypoint.test.c:35] .result = str_replace("a{{aa}}a", "{{aa}}", "bb"), .expected = "abba"
ok 12 [../tests/unit/entrypoint.test.c:37] .result = str_replace("a{{aa}}a", "{{aa}}", NULL), .expected = "aa"
ok 13 [../tests/unit/entrypoint.test.c:41] .result = result, .expected = "a lorem {{bb}} c"
ok 14 [../tests/unit/entrypoint.test.c:42] .result = str_replace_in(&result, "{{bb}}", "ipsum"), .expected = "a lorem ipsum c"
ok 15 [../tests/unit/entrypoint.test.c:46] .result = result, .expected = "a lorem {{bb}} c",
ok 16 [../tests/unit/entrypoint.test.c:50] .result = str_replace_in_escaped(&result, "{{bb}}", "\\ \" \t \f \b \r\n a b"), .expected = "a lorem \\\\ \\\" \\t \\f \\b \\r\\n a b c",
----------------------------------- stderr -----------------------------------
==4685== Memcheck, a memory error detector
==4685== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==4685== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==4685== Command: /home/runner/work/rofi-blocks/rofi-blocks/build-test/rofi-blocks-unit
==4685== 
==4685== 
==4685== HEAP SUMMARY:
==4685==     in use at exit: 37,784 bytes in 256 blocks
==4685==   total heap usage: 416 allocs, 160 frees, 74,475 bytes allocated
==4685== 
==4685== LEAK SUMMARY:
==4685==    definitely lost: 0 bytes in 0 blocks
==4685==    indirectly lost: 0 bytes in 0 blocks
==4685==      possibly lost: 0 bytes in 0 blocks
==4685==    still reachable: 35,768 bytes in 235 blocks
==4685==         suppressed: 0 bytes in 0 blocks
==4685== Reachable blocks (those to which a pointer was found) are not shown.
==4685== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==4685== 
==4685== For lists of detected and suppressed errors, rerun with: -s
==4685== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==============================================================================

==================================== 2/2 =====================================
test:         test-suite-ui
start time:   23:19:18
duration:     4.46s
result:       exit status 0
command:      MALLOC_PERTURB_=134 LC_ALL=C ASAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1 UBSAN_OPTIONS=halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1 valgrind --leak-check=full /home/runner/work/rofi-blocks/rofi-blocks/tests/ui/test.sh
----------------------------------- stdout -----------------------------------
1..5
BlocksMode-Message: 23:19:21.618: Child 4717 exited normally
ok 1 - Rofi should open blocks modi correctly - screenshot 1 equal
BlocksMode-Message: 23:19:22.043: Child 4748 exited normally
ok 2 - Active entry should work on first paint - screenshot 1 equal
rm: cannot remove 'result-text-1.txt': No such file or directory
BlocksMode-Message: 23:19:22.774: Child 4779 exited normally
ok 3 - Writing on prompt should trigger input event - screenshot 1 equal
ok 4 - Writing on prompt should trigger input event - screenshot 2 equal
ok 5 - Writing on prompt should trigger input event - text 1 equal
----------------------------------- stderr -----------------------------------
==4686== Memcheck, a memory error detector
==4686== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==4686== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==4686== Command: /home/runner/work/rofi-blocks/rofi-blocks/tests/ui/test.sh
==4686== 
==============================================================================


Ok:                 2   
Expected Fail:      0   
Fail:               0   
Unexpected Pass:    0   
Skipped:            0   
Timeout:            0   

UI tests

️✅ Rofi should open blocks modi correctly

This test verifies that the modi works with basic functionality

Rofi script

#!/usr/bin/env bash

echo '{ "lines": [ "hello","world" ], "message": "lorem ipsum dolor sit amet", "prompt": "test prompt"}'

# END TEST SCRIPT
cd "$(dirname "${BASH_SOURCE[0]}")"
sleep 0.1
import -window root "./result-screenshot-1.png" >&2
sleep 0.1
Rofi block script

️✅ screenshot 1

Expected image.
expected screenshot
Result image.
result screenshot
visual image comaparator slider
result screenshot
Result image.
expected screenshot
Expected image.
diffence image
Pixel difference map image

️✅ Active entry should work on first paint

This test validates a bug fix related to Rofi custom script that on first paint, the "active entry" property is ignored, so the first entry is selected regardless of the "active entry" value

Rofi script

#!/usr/bin/env bash

echo '{ "lines": [ "one","two","three" ], "active entry": 1}'

# END TEST SCRIPT

cd "$(dirname "${BASH_SOURCE[0]}")"
sleep 0.1
import -window root "./result-screenshot-1.png" >&2
sleep 0.1
Rofi block script

️✅ screenshot 1

Expected image.
expected screenshot
Result image.
result screenshot
visual image comaparator slider
result screenshot
Result image.
expected screenshot
Expected image.
diffence image
Pixel difference map image

️✅ Writing on prompt should trigger input event

This test checks if input event is triggered

Rofi script

#!/usr/bin/env bash

cd "$(dirname "${BASH_SOURCE[0]}")"
rm result-text-1.txt

echo '{ "lines": [ "hello","world", "lorem", "ipsum", "lor" ], "message": "lorem ipsum dolor sit amet", "prompt": "test prompt", "input action": "send"}'


sleep 0.1;
import -window root "./result-screenshot-1.png" >&2


xdotool type lor

while IFS= read -t 0.1 -r line; do
printf '%s\n' "$line" >> result-text-1.txt
done

# END TEST SCRIPT
sleep 0.1
import -window root "./result-screenshot-2.png" >&2
sleep 0.1
Rofi block script

️✅ screenshot 1

Expected image.
expected screenshot
Result image.
result screenshot
visual image comaparator slider
result screenshot
Result image.
expected screenshot
Expected image.
diffence image
Pixel difference map image

️✅ screenshot 2

Expected image.
expected screenshot
Result image.
result screenshot
visual image comaparator slider
result screenshot
Result image.
expected screenshot
Expected image.
diffence image
Pixel difference map image

️✅ text 1

{"name":"input change", "value":"l", "data":""}
{"name":"input change", "value":"lo", "data":""}
{"name":"input change", "value":"lor", "data":""}
Result text
{"name":"input change", "value":"l", "data":""}
{"name":"input change", "value":"lo", "data":""}
{"name":"input change", "value":"lor", "data":""}
Expected text
Unified Diff