code: def test_cbsc015_input_output_callback(dash_duo):
      lock = Lock()
  
      app = Dash(__name__)
      app.layout = html.Div(
          [
              html.Div("0", id="input-text"),
              dcc.Input(id="input", type="number", value=0),
          ]
      )
  
      @app.callback(
          Output("input", "value"),
          Input("input", "value"),
      )
      def circular_output(v):
          ctx = callback_context
          if not ctx.triggered:
              value = v
          else:
              value = v + 1
          return value
  
      call_count = Value("i", 0)
  
      @app.callback(
          Output("input-text", "children"),
          Input("input", "value"),
      )
      def follower_output(v):
          with lock:
              call_count.value = call_count.value + 1
              return str(v)
  
      dash_duo.start_server(app)
  
      input_ = dash_duo.find_element("#input")
      for key in "2":
          with lock:
              input_.send_keys(key)
  
      dash_duo.wait_for_text_to_equal("#input-text", "3")
  
      assert call_count.value == 2, "initial + changed once"
  
      assert not dash_duo.redux_state_is_loading
  
      assert dash_duo.get_logs() == []
  
imports: import json
  import os
  from multiprocessing import Lock, Value
  import pytest
  import time
  import numpy
  import werkzeug
  from dash_test_components import AsyncComponent, CollapseComponent, DelayedEventComponent, FragmentComponent
  from dash import Dash, Input, Output, State, html, dcc, dash_table, no_update, callback_context
  from dash.exceptions import PreventUpdate
  from tests.integration.utils import json_engine
label_desc: Use image node_id 15 for calling a global function with example usage: test_cbsc015_input_output_callback(dash_duo) and returns: value, str