# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

cases:
  # layer list
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql layer ls
    expected: expected/layer.yml
  # service list
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service layer GENERAL
    expected: expected/service.yml
  # service metrics
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
    expected: expected/metrics-has-value.yml
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics top --name service_sla 5
    expected: expected/metrics-top-service-sla.yml
  # service endpoint
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
    expected: expected/service-endpoint.yml
  # service endpoint metrics
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
    expected: expected/metrics-has-value.yml
  #  dependency service
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
    expected: expected/dependency-services.yml
  # service instance list
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
    expected: expected/service-instance.yml
  # service instance jvm metrics
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
    expected: expected/metrics-has-value.yml

  # trace segment list
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
    expected: expected/traces-list.yml
  # native tracing: trace detail
  - query: |
      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
          | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
      )
    expected: expected/trace-info-detail.yml

  # native event: event list
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
    expected: expected/event-list.yml

  # native profile: create task
  - query: |
      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
        profiling trace create --service-name=e2e-service-provider \
          --endpoint-name=POST:/info \
          --start-time=$((($(date +%s)+5)*1000)) \
          --duration=1 --min-duration-threshold=0 \
          --dump-period=10 --max-sampling-count=9
    expected: expected/profile-create.yml
  # native profile: sleep to wait agent notices and query profile list
  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace list -service-name=e2e-service-provider --endpoint-name=POST:/info
    expected: expected/profile-list.yml

  # native profile: sleep to wait segment report and query profiled segment list
  - query: |
      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace segment-list --task-id=$( \
        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
      )
    expected: expected/profile-segment-list.yml

  # native profile: query profiled segment
  - query: |
      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace profiled-segment --segment-id=$( \
        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace segment-list --task-id=$( \
          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
        ) | yq e '.[0].segmentid' - \
      )
    expected: expected/profile-segment-detail.yml

  # native profile: query profiled segment analyze
  - query: |
      segmentid=$( \
        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace segment-list --task-id=$( \
          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
        ) | yq e '.[0].segmentid' - \
      );
      start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
      end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profiling trace analysis --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
    expected: expected/profile-segment-analyze.yml

  - query: |
      curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
      sleep 5;
      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
          | yq e '.traces[0].traceids[0]' - \
      )
    expected: expected/trace-users-detail.yml
