--
-- 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.
--

local lu = require('luaunit')
local correlationContext = require('skywalking.correlation_context')
local TC = require('skywalking.tracing_context')

TestCorelationContext = {}
    function TestCorelationContext:testFromSW8Value()
        -- simple analyze
        local context = correlationContext.fromSW8Value('dGVzdDE=:dDE=,dGVzdDI=:dDI=')
        lu.assertNotNil(context)
        lu.assertEquals(context["test1"], "t1")
        lu.assertEquals(context["test2"], "t2")

        -- analyze with empty value
        context = correlationContext.fromSW8Value('dGVzdDE=:')
        lu.assertNotNil(context)
        lu.assertNil(context["test1"])

        -- analyze with empty header
        context = correlationContext.fromSW8Value('')
        lu.assertNotNil(context)
        lu.assertNotNil(#context == 0)
    end

    function TestCorelationContext:testSerialize()
        -- serialize empty correlation
        local context = correlationContext.fromSW8Value('')
        local encode_context = correlationContext.serialize(context)
        lu.assertNotNil(encode_context)
        lu.assertEquals(encode_context, "")

        -- serialize with multiple value
        context = correlationContext.fromSW8Value('')
        correlationContext.put(context, "test1", "t1")
        correlationContext.put(context, "test2", "t2")
        encode_context = correlationContext.serialize(context)
        lu.assertNotNil(encode_context)
        context = correlationContext.fromSW8Value(encode_context)
        lu.assertNotNil(context)
        lu.assertEquals(context["test1"], "t1")
        lu.assertEquals(context["test2"], "t2")

        -- serialize with empty value
        context = correlationContext.fromSW8Value('')
        correlationContext.put(context, "test1", "")
        encode_context = correlationContext.serialize(context)
        lu.assertNotNil(encode_context)
        lu.assertEquals(encode_context, "")
    end

    function TestCorelationContext:testPut()
        -- put with empty key and value
        local context = correlationContext.fromSW8Value('')
        correlationContext.put(context, nil, nil)
        lu.assertEquals(correlationContext.serialize(context), '')

        -- put nil to remove key
        correlationContext.put(context, "test1", "t1")
        correlationContext.put(context, "test1", nil)
        lu.assertEquals(correlationContext.serialize(context), '')

        -- overflow put
        correlationContext.put(context, "test1", "t1")
        correlationContext.put(context, "test2", "t2")
        correlationContext.put(context, "test3", "t3")
        correlationContext.put(context, "test4", "t4")
        local encode_context = correlationContext.serialize(context)
        lu.assertNotNil(encode_context)
        local context = correlationContext.fromSW8Value(encode_context)
        lu.assertEquals(context["test1"], "t1")
        lu.assertEquals(context["test2"], "t2")
        lu.assertEquals(context["test3"], "t3")
    end

    function TestCorelationContext:testTracingContext()
        -- transform data
        local context = TC.new("service", "instance")
        local header = {}
        header["sw8-correlation"] = 'dGVzdDI=:dDI=,dGVzdDE=:dDE=,dGVzdDM=:dDM='
        TC.createEntrySpan(context, 'operation_name', nil, header)
        lu.assertNotNil(context.correlation)
        local contextCarrier = {}
        TC.createExitSpan(context, 'operation_name', nil, 'peer', contextCarrier)
        lu.assertNotNil(contextCarrier['sw8-correlation'])
        local correlation = correlationContext.fromSW8Value(contextCarrier['sw8-correlation'])
        lu.assertEquals(correlation["test1"], "t1")
        lu.assertEquals(correlation["test2"], "t2")

        -- transform data with adding data
        TC.createExitSpan(context, 'operation_name', nil, 'peer', contextCarrier, {
            test3 = "t3"
        })
        lu.assertNotNil(contextCarrier['sw8-correlation'])
        correlation = correlationContext.fromSW8Value(contextCarrier['sw8-correlation'])
        lu.assertEquals(correlation["test1"], "t1")
        lu.assertEquals(correlation["test2"], "t2")
        lu.assertEquals(correlation["test3"], "t3")
    end

-- end TestTracingContext


os.exit( lu.LuaUnit.run() )
