// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/**
 * @fileoverview Tests for the vtrace library.
 */

var test = require('tape');
var context = require('../../src/context');
var vtrace = require('../../src/vtrace');
var vdl = require('../../src/gen-vdl/v.io/v23/vtrace');
var uniqueid = require('../../src/lib/uniqueid');
var uidvdl = require('../../src/gen-vdl/v.io/v23/uniqueid');
var typeutil = require('../../src/vdl/type-util');
// We need the native-types registered for vtrace to work.
require('../../src/vom/native-types');

// Normally uniqueid generates random ids.  That makes testing hard.
// We inject this function to cause it to generate predictable ids.
var nextid;
function consecutive() {
  var out = new uidvdl.Id();
  var val = typeutil.unwrap(out);
  val[15] = nextid;
  nextid = (nextid + 1) % 256;
  return out;
}

// Normally vtrace marks many events with the current time.  That
// makes testing hard.  We inject this function to make time advance
// at a predictable rate (every time you call it, the time is 1s later).
var nextSeconds;
function fakeNow() {
  var ret = new Date(nextSeconds * 1000);
  nextSeconds += 1;
  return ret;
}

// This function is called for each test to ensure that tests are
// independent of each other.
function reset() {
  nextid = 1;
  nextSeconds = 1;
}

function setup(assert, f) {
  reset();
  var orig = uniqueid.random;
  uniqueid.random = consecutive;
  assert.on('end', function() {
    uniqueid.random = orig;    
  });
  var ctx = context.Context();
  ctx = vtrace.withNewStore(ctx);
  var store = vtrace.getStore(ctx);
  store._now = fakeNow;
  store.setCollectRegexp('.*');
  ctx = vtrace.withNewTrace(ctx);
  f(ctx, vtrace.getSpan(ctx), store);
}

test('Basic Span', function(assert) {
  setup(assert, function(ctx, span, store) {
    ctx = vtrace.withNewSpan(ctx, 'span1');
    span = vtrace.getSpan(ctx);
    span.annotate('annotation in span1');
    span.finish();
    var records = store.traceRecords();
    assert.equal(records.length, 1);
    var trace = records[0];
    assert.equal(trace.spans.length, 2);
    assert.equal(trace.spans[0].name, '');
    span = trace.spans[1];
    assert.equal(span.name, 'span1');
    assert.equal(span.annotations.length, 1);
    assert.equal(span.annotations[0].message, 'annotation in span1');
    assert.end();
  });
});

test('formatTraces', function(assert) {
  setup(assert, function(ctx, span, store) {
    span.annotate('a1');
    span.annotate('a2');
    ctx = vtrace.withNewSpan(ctx, 'span2');
    var span2 = vtrace.getSpan(ctx);
    span2.annotate('a3');
    span2.annotate('a4');
    span2.finish();
    var got = vtrace.formatTraces(store.traceRecords());
    var expected = 'Vtrace traces:\n' +
      'Trace - 00000000000000000000000000000002' +
      ' (1970-01-01T00:00:01.000Z, ??)\n' +
      '    @1s a1\n' +
      '    @2s a2\n' +
      '    Span - span2 [id: 00000003 parent: 00000001] (3s, 6s)\n' +
      '        @4s a3\n' +
      '        @5s a4\n';
    assert.equal(got, expected);
    assert.end();
  });
});

test('formatTraces - multiple', function(assert) {
  setup(assert, function(ctx, span, store) {
    var ctx2 = vtrace.withNewTrace(ctx);

    span.annotate('a1');
    span.annotate('a2');
    ctx = vtrace.withNewSpan(ctx, 'span2');
    var span2 = vtrace.getSpan(ctx);
    span2.annotate('a3');
    span2.annotate('a4');
    span2.finish();

    var span3 = vtrace.getSpan(ctx2);
    span3.annotate('a5');
    span3.annotate('a6');
    span3.finish();
    ctx2 = vtrace.withNewSpan(ctx2, 'span4');
    var span4 = vtrace.getSpan(ctx2);
    span4.annotate('a7');
    span4.annotate('a8');
    span4.finish();

    var got = vtrace.formatTraces(store.traceRecords());
    var expected = 'Vtrace traces:\n' +
      'Trace - 00000000000000000000000000000002' +
      ' (1970-01-01T00:00:01.000Z, ??)\n' +
      '    @2s a1\n' +
      '    @3s a2\n' +
      '    Span - span2 [id: 00000005 parent: 00000001] (4s, 7s)\n' +
      '        @5s a3\n' +
      '        @6s a4\n' +
      'Trace - 00000000000000000000000000000004 '+
      '(1970-01-01T00:00:02.000Z, 1970-01-01T00:00:11.000Z)\n' +
      '    @7s a5\n' +
      '    @8s a6\n' +
      '    Span - span4 [id: 00000006 parent: 00000003] (10s, 13s)\n' +
      '        @11s a7\n' +
      '        @12s a8\n';
    assert.equal(got, expected);
    assert.end();
  });
});

test('formatTraces - missing data', function(assert) {
  setup(assert, function(ctx, span, store) {
    span.annotate('a1');
    span.annotate('a2');
    var missingId = consecutive();
    ctx = vtrace.withContinuedTrace(ctx, 'span2', vdl.Request({
      spanId: missingId,
      traceId: span.trace,
      flags: vdl.CollectInMemory
    }));
    var span2 = vtrace.getSpan(ctx);
    span2.annotate('a3');
    span2.annotate('a4');
    span2.finish();
    span.finish();
    var got = vtrace.formatTraces(store.traceRecords());
    var expected = 'Vtrace traces:\n' +
      'Trace - 00000000000000000000000000000002 ' +
      '(1970-01-01T00:00:01.000Z, 1970-01-01T00:00:08.000Z)\n' +
      '    @1s a1\n' +
      '    @2s a2\n' +
      '    Span - Missing Data [id: 00000000 parent: 00000000] (??, ??)\n' +
      '        Span - span2 [id: 00000004 parent: 00000003] (3s, 6s)\n' +
      '            @4s a3\n' +
      '            @5s a4\n';
    assert.equal(got, expected);
    assert.end();
  });
});
