use Test::Nginx::Socket 'no_plan';

use Cwd qw(cwd);
my $pwd = cwd();

repeat_each(1);
no_long_string();
no_shuffle();
no_root_location();
log_level('info');

our $HttpConfig = qq{
    lua_package_path "$pwd/lib/skywalking/?.lua;;";
    error_log logs/error.log debug;
    resolver 114.114.114.114 8.8.8.8 ipv6=off;
    lua_shared_dict tracing_buffer 100m;
};

run_tests;

__DATA__

=== TEST 1: timestamp
--- http_config eval: $::HttpConfig
--- config
    location /t {
        content_by_lua_block {
            local util = require('util')
            local timestamp = util.timestamp()
            local regex = [[^\d+$]]
            local m = ngx.re.match(timestamp, regex)
            if m and tonumber(m[0]) == timestamp then
                ngx.say(true)
            else
                ngx.say(false)
            end
        }
    }
--- request
GET /t
--- response_body
true
--- no_error_log
[error]



=== TEST 2: newID
--- http_config eval: $::HttpConfig
--- config
    location /t {
        content_by_lua_block {
            local util = require('util')
            local new_id = util.newID()
            local regex = [[^\d+$]]
            ngx.say(#new_id)
            for i = 1, #new_id, 1 do
                local m = ngx.re.match(new_id[i], regex)
                if m and tonumber(m[0]) == new_id[i] then
                    ngx.say(i)
                end
            end
        }
    }
--- request
GET /t
--- response_body
3
1
2
3
--- no_error_log
[error]



=== TEST 3: id2String
--- http_config eval: $::HttpConfig
--- config
    location /t {
        content_by_lua_block {
            local util = require('util')
            local id = util.newID()
            local id_str = util.id2String(id)
            local regex = [[^\d+\.\d+\.\d+$]]
            local m = ngx.re.match(id_str, regex)
            if m then
                ngx.say(true)
            end
        }
    }
--- request
GET /t
--- response_body
true
--- no_error_log
[error]



=== TEST 4: formatID
--- http_config eval: $::HttpConfig
--- config
    location /t {
        content_by_lua_block {
            local util = require('util')
            local id = util.newID()
            local id_str = util.id2String(id)
            local parts = util.formatID(id_str)
            ngx.say(#parts)
        }
    }
--- request
GET /t
--- response_body
3
--- no_error_log
[error]
