KaotoIO / kaoto-backend

Backend for the Kaoto project to provide an easy to use integration framework based on Apache Camel.
Apache License 2.0
75 stars 32 forks source link

[BUG] Fix issue related to flaky test KameletStepParserServiceTest.checkEIP:220 #494

Open apupier opened 1 year ago

apupier commented 1 year ago

Describe the bug flaky test https://github.com/KaotoIO/kaoto-backend/actions/runs/4291690769/jobs/7478175953#step:5:11115

To Reproduce Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior A clear and concise description of what you expected to happen.

Logs

Error:  Failures: 
Error:    KameletStepParserServiceTest.checkEIP:220 
Expecting actual:
  "apiVersion: camel.apache.org/v1alpha1
kind: Kamelet
metadata:
  annotations:
    camel.apache.org/kamelet.support.level: Preview
    camel.apache.org/catalog.version: main-SNAPSHOT
    camel.apache.org/kamelet.icon: whatever
    camel.apache.org/provider: Apache Software Foundation
    camel.apache.org/kamelet.group: Kaoto
  labels:
    camel.apache.org/kamelet.type: action
  name: eip-action
spec:
  definition:
    title: EIP Kamelet
    description: Used to test all EIP we implement
    properties: {}
  dependencies:
  - camel:core
  - camel:kamelet
  template:
    from:
      uri: kamelet:source
      steps:
      - transacted:
          ref: required
      - loop:
          constant: '3'
          copy: true
          steps:
          - saga:
              completion:
                uri: direct:completion
              propagation: MANDATORY
              description:
                text: SAGA powered step
                lang: eng
              compensation:
                uri: direct:compensation
              completion-mode: MANUAL
              steps:
              - to:
                  uri: direct:something
              - sample:
                  description:
                    text: Message Sampler
                    lang: eng
                  sample-period: '1500'
                  message-frequency: 5
              - script:
                  expression:
                    simple: ${body}
              timeout: '500'
              option:
              - key: o1
                simple: ${body}
              - key: o2
                expression:
                  simple: ${body}
          - delay:
              expression:
                simple: ${body}
              async-delayed: true
          - throw-exception:
              exception-type: java.lang.IllegalArgumentException
              message: test
          - routing-slip:
              uri-delimiter: '|'
              simple: ${body}
      - choice:
          when:
          - simple: '{{?foo}}'
            steps:
            - dynamic-router:
                description:
                  text: Dynamic Routing
                  lang: eng
                simple: ${body}
            - set-header:
                name: bar
                simple: foo
            - marshal:
                json:
                  library: Gson
            - threads:
                pool-size: 5
                max-pool-size: 10
                description:
                  text: Hilos
                  lang: spa
                thread-name: threads
                max-queue-size: 12
                keep-alive-time: 5
            - circuit-breaker:
                configuration: config
                description:
                  text: Test circuit breaker
                  lang: eng
                steps:
                - to:
                    uri: dropbox:put
                    parameters:
                      remotePath: '{{remotePath}}'
                      clientIdentifier: '{{clientIdentifier}}'
                      uploadMode: '{{uploadMode}}'
                - poll-enrich:
                    expression:
                      simple: ${body}
                    aggregation-strategy: myStrategy
                on-fallback:
                  steps:
                  - log:
                      message: test
                      logging-level: INFO
                      log-name: yaml
                  - convert-body-to:
                      type: java.lang.String
                      charset: UTF8
                  - wire-tap:
                      allow-optimised-components: false
                      cache-size: 23
                      auto-start-components: true
                      ignore-invalid-endpoint: false
                      copy: true
                      uri: direct:somewhere
                      parameters:
                        bridgeErrorHandler: 'true'
          - simple: '{{?bar}}'
            steps:
            - unmarshal:
                json:
                  unmarshal-type-name: MyClass
            - set-property:
                name: property
                simple: bar
            - split:
                steps:
                - process:
                    ref: '{{myProcessor}}'
                - remove-property:
                    name: property
                tokenize: ','
          - simple: '{{?baz}}'
            steps:
            - throttle:
                caller-runs-when-rejected: false
                constant: '5'
                executor-service: myExecutor
                reject-execution: false
                async-delayed: true
            - recipient-list:
                stop-on-exception: true
                constant: direct:a,direct:b
                parallel-processing: true
            - remove-headers:
                exclude-pattern: toExclude
                pattern: toRemove
            - validate:
                simple: ${body} == 100
          otherwise:
            steps:
            - remove-header:
                name: removeme
            - rollback:
                mark-rollback-only: true
                message: test
            - stop: {}
      - filter:
          simple: '{{?foo}}'
          steps:
          - idempotent-consumer:
              idempotent-repository: myRepo
              simple: ${header.id}
              steps:
              - set-body:
                  simple: ola ke ase
          - sort:
              comparator: myComparator
      - do-try:
          steps:
          - set-body:
              simple: abc
          - set-exchange-pattern: InOut
          do-catch:
          - exception:
            - java.io.FileNotFoundException
            - java.io.IOException
            on-when:
              simple: ${body.size()} == 1
            steps:
            - log:
                message: test
                logging-level: INFO
                log-name: yaml
          do-finally:
            steps:
            - enrich:
                expression:
                  simple: ${body}
            - to-d:
                uri: direct
                parameters:
                  name: start
                pattern: InOptionalOut
                cache-size: 10
                ignore-invalid-endpoint: true
                allow-optimised-components: true
                auto-start-components: true
      - to:
          uri: kamelet:sink
"
to be equal to:
  "apiVersion: camel.apache.org/v1alpha1
kind: Kamelet
metadata:
  annotations:
    camel.apache.org/kamelet.support.level: Preview
    camel.apache.org/catalog.version: main-SNAPSHOT
    camel.apache.org/kamelet.icon: whatever
    camel.apache.org/provider: Apache Software Foundation
    camel.apache.org/kamelet.group: Kaoto
  labels:
    camel.apache.org/kamelet.type: action
  name: eip-action
spec:
  definition:
    title: EIP Kamelet
    description: Used to test all EIP we implement
    properties: {}
  dependencies:
  - camel:core
  - camel:kamelet
  template:
    from:
      uri: kamelet:source
      steps:
      - transacted:
          ref: required
      - loop:
          constant: '3'
          copy: true
          steps:
          - saga:
              completion:
                uri: direct:completion
              propagation: MANDATORY
              description:
                text: SAGA powered step
                lang: eng
              compensation:
                uri: direct:compensation
              completion-mode: MANUAL
              steps:
              - to:
                  uri: direct:something
              - sample:
                  description:
                    text: Message Sampler
                    lang: eng
                  sample-period: '1500'
                  message-frequency: 5
              - script:
                  expression:
                    simple: ${body}
              timeout: '500'
              option:
              - key: o1
                simple: ${body}
              - key: o2
                expression:
                  simple: ${body}
          - delay:
              expression:
                simple: ${body}
              async-delayed: true
          - throw-exception:
              exception-type: java.lang.IllegalArgumentException
              message: test
          - routing-slip:
              uri-delimiter: '|'
              simple: ${body}
      - choice:
          when:
          - simple: '{{?foo}}'
            steps:
            - dynamic-router:
                description:
                  text: Dynamic Routing
                  lang: eng
                simple: ${body}
            - set-header:
                name: bar
                simple: foo
            - marshal:
                json:
                  library: Gson
            - threads:
                pool-size: 5
                max-pool-size: 10
                description:
                  text: Hilos
                  lang: spa
                thread-name: threads
                max-queue-size: 12
                keep-alive-time: 5
            - circuit-breaker:
                configuration: config
                description:
                  text: Test circuit breaker
                  lang: eng
                steps:
                - to:
                    uri: dropbox:put
                    parameters:
                      remotePath: '{{remotePath}}'
                      clientIdentifier: '{{clientIdentifier}}'
                      uploadMode: '{{uploadMode}}'
                - poll-enrich:
                    expression:
                      simple: ${body}
                    aggregation-strategy: myStrategy
                on-fallback:
                  steps:
                  - log:
                      message: test
                      logging-level: INFO
                      log-name: yaml
                  - convert-body-to:
                      type: java.lang.String
                      charset: UTF8
                  - wire-tap:
                      allow-optimised-components: false
                      cache-size: 23
                      auto-start-components: true
                      ignore-invalid-endpoint: false
                      copy: true
                      uri: direct:somewhere
                      parameters:
                        bridgeErrorHandler: 'true'
          - simple: '{{?bar}}'
            steps:
            - unmarshal:
                json:
                  unmarshal-type-name: MyClass
            - set-property:
                name: property
                simple: bar
            - split:
                steps:
                - process:
                    ref: '{{myProcessor}}'
                - remove-property:
                    name: property
                tokenize: ','
            - multicast:
                stop-on-exception: true
                parallel-processing: true
                steps:
                - pipeline:
                    steps:
                    - split:
                        simple: ${body}
                        steps:
                        - marshal:
                            json: {}
                - pipeline:
                    steps:
                    - claim-check:
                        operation: Get
                        key: foo
                        filter: header:(foo|bar)
          - simple: '{{?baz}}'
            steps:
            - throttle:
                caller-runs-when-rejected: false
                constant: '5'
                executor-service: myExecutor
                reject-execution: false
                async-delayed: true
            - recipient-list:
                stop-on-exception: true
                constant: direct:a,direct:b
                parallel-processing: true
            - remove-headers:
                exclude-pattern: toExclude
                pattern: toRemove
            - validate:
                simple: ${body} == 100
            - resequence:
                simple: ${in.header.seqnum}
                stream-config:
                  capacity: '5000'
                  timeout: '4000'
                steps:
                - transform:
                    simple: baz
                - remove-properties:
                    exclude-pattern: toExclude
                    pattern: toRemove
            - load-balance:
                weighted:
                  distribution-ratio: 2,1
                  round-robin: false
                steps:
                - aggregate:
                    correlation-expression:
                      simple: ${header.StockSymbol}
                    aggregation-strategy: myAggregatorStrategy
                    completion-size: 2
                - service-call:
                    blacklist-service-filter:
                      servers:
                      - service2@host1
                    name: sc
                    static-service-discovery:
                      servers:
                      - service1@host1
                      - service1@host2
          otherwise:
            steps:
            - remove-header:
                name: removeme
            - rollback:
                mark-rollback-only: true
                message: test
            - stop: {}
      - filter:
          simple: '{{?foo}}'
          steps:
          - idempotent-consumer:
              idempotent-repository: myRepo
              simple: ${header.id}
              steps:
              - set-body:
                  simple: ola ke ase
          - sort:
              comparator: myComparator
      - do-try:
          steps:
          - set-body:
              simple: abc
          - set-exchange-pattern: InOut
          do-catch:
          - exception:
            - java.io.FileNotFoundException
            - java.io.IOException
            on-when:
              simple: ${body.size()} == 1
            steps:
            - log:
                message: test
                logging-level: INFO
                log-name: yaml
          do-finally:
            steps:
            - enrich:
                expression:
                  simple: ${body}
            - to-d:
                uri: direct
                parameters:
                  name: start
                pattern: InOptionalOut
                cache-size: 10
                ignore-invalid-endpoint: true
                allow-optimised-components: true
                auto-start-components: true
      - to:
          uri: kamelet:sink
"
when ignoring newline differences ('\r\n' == '\n')

Environment (please complete the following information):

Additional context Add any other context about the problem here.

stale[bot] commented 1 year ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.