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

package org.apache.htrace.impl;

import org.apache.htrace.HTraceConfiguration;
import org.apache.htrace.Span;
import org.apache.htrace.TraceCreator;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;

import java.io.IOException;

public class TestFlumeSpanReceiver {
  @Rule
  public TraceCreator traceCreator = new TraceCreator();
  @Rule
  public FakeFlume flumeServer = new FakeFlume();

  @Test
  public void testSimpleTraces() throws IOException, InterruptedException {
    traceCreator.addReceiver(new FlumeSpanReceiver(
        HTraceConfiguration.fromKeyValuePairs(
            FlumeSpanReceiver.FLUME_PORT_KEY, Integer.toString(flumeServer.getPort())
        )
    ));

    Span rootSpan = new MilliSpan.Builder().
        description("root").
        traceId(1).
        spanId(100).
        processId("test").
        begin(System.currentTimeMillis()).
        build();
    Span innerOne = rootSpan.child("Some good work");
    Span innerTwo = innerOne.child("Some more good work");
    innerTwo.stop();
    Assert.assertTrue(flumeServer.nextEventBodyAsString().contains(innerTwo.getDescription()));
    innerOne.stop();
    Assert.assertTrue(flumeServer.nextEventBodyAsString().contains(innerOne.getDescription()));
    rootSpan.addKVAnnotation("foo", "bar");
    rootSpan.addTimelineAnnotation("timeline");
    rootSpan.stop();
    Assert.assertTrue(flumeServer.nextEventBodyAsString().contains(rootSpan.getDescription()));
  }

  @Test
  public void testConcurrency() throws IOException {
    traceCreator.addReceiver(new FlumeSpanReceiver(
        HTraceConfiguration.fromKeyValuePairs(
            FlumeSpanReceiver.FLUME_PORT_KEY, Integer.toString(flumeServer.getPort())
        )
    ));

    flumeServer.alwaysOk();
    traceCreator.createThreadedTrace();
  }

  @Test
  public void testResilience() throws IOException {
    traceCreator.addReceiver(new FlumeSpanReceiver(
        HTraceConfiguration.fromKeyValuePairs(
            FlumeSpanReceiver.FLUME_PORT_KEY, Integer.toString(flumeServer.getPort())
        )
    ));

    flumeServer.alwaysFail();
    traceCreator.createThreadedTrace();
  }
}
