Go Library [DEPRECATED]

Overview

Tideland Go Library

Description

The Tideland Go Library contains a larger set of useful Google Go packages for different purposes.

ATTENTION: The cells package has been migrated into an own repository at https://github.com/tideland/gocells.

ATTENTION: The web package is now deprecated. It has been migrated and extended into the repository https://github.com/tideland/gorest.

I hope you like them. ;)

GitHub release GitHub license GoDoc Sourcegraph Go Report Card

Version

Version 4.24.2

Packages

Audit

Support for unit tests with mutliple different assertion types and functions to generate test data.

Cache

Individual caches for types implementing the Cacheable interface.

Collections

Different additional collection types like ring buffer, stack, tree, and more.

Errors

Detailed error values.

Etc

Reading and parsing of SML-formatted configurations including substituion of templates.

Feed

Atom and RSS feed client.

Generic JSON Processor

Instead of unmarshalling a JSON into a struct parse it and provide access to the content by path and value converters to native types. Also processing and comparing is possible.

Identifier

Identifier generation, like UUIDs (v1, v3, v4, v5) or composed values.

Logger

Logging with different levels to different backends and powerful extensions.

Loop

Control of goroutines and their possible errors. Additional option of recovering in case of an error or a panic. Sentinels can monitor multiple loops and restart them all in case of an abnormal end of one of them.

Map/Reduce

Map/Reduce for data analysis.

Monitoring

Monitoring of execution times, stay-set indicators, and configurable system variables.

Numerics

Different functions for statistical analysis.

Redis Client

Client for the Redis database.

Scene

Context-based shared data access, e.g. for web sessions or in cells.

Scroller

Continuous filtered reading/writing of data.

SML

Simple Markup Language, looking lispy, only with curly braces.

Sort

Parallel Quicksort.

Stringex

Helpful functions around strings extending the original strings package and help processing strings.

Timex

Helpful functions around dates and times.

Version

Documentation of semantic versions.

Contributors

License

Tideland Go Library is distributed under the terms of the BSD 3-Clause license.

Comments
  • Intermittent testsuite failures

    Intermittent testsuite failures

    Hello,

    I am seeing intermittent testsuite failures and I can't even see what is failing, as everything seems to pass.

    Any idea? This is against version 4.20.

    go test -v -p 1 -short github.com/tideland/golib/audit github.com/tideland/golib/cache github.com/tideland/golib/collections github.com/tideland/golib/errors github.com/tideland/golib/etc github.com/tideland/golib/feed/atom github.com/tideland/golib/feed/rss github.com/tideland/golib/feed/utils github.com/tideland/golib/identifier github.com/tideland/golib/logger github.com/tideland/golib/loop github.com/tideland/golib/mapreduce github.com/tideland/golib/monitoring github.com/tideland/golib/numerics github.com/tideland/golib/redis github.com/tideland/golib/scene github.com/tideland/golib/scroller github.com/tideland/golib/sml github.com/tideland/golib/sort github.com/tideland/golib/stringex github.com/tideland/golib/timex github.com/tideland/golib/version === RUN TestAssertTrue --- PASS: TestAssertTrue (0.00s) asserts_test.go:387: testing assert "true" failed: 'false' (bool) <> 'true' (bool) [should fail and be logged] === RUN TestAssertFalse --- PASS: TestAssertFalse (0.00s) asserts_test.go:387: testing assert "false" failed: 'true' (bool) <> 'false' (bool) [should fail and be logged] === RUN TestAssertNil --- PASS: TestAssertNil (0.00s) asserts_test.go:387: testing assert "nil" failed: 'not nil' (string) <> '' (invalid) [should fail and be logged] === RUN TestAssertNotNil --- PASS: TestAssertNotNil (0.00s) asserts_test.go:387: testing assert "not nil" failed: '' (invalid) <> '' (invalid) [should fail and be logged] === RUN TestAssertEqual --- PASS: TestAssertEqual (0.00s) asserts_test.go:387: testing assert "equal" failed: 'one' (string) <> '1' (int) [should fail and be logged] asserts_test.go:387: testing assert "equal" failed: 'two' (string) <> '2' (string) [should fail and be logged] === RUN TestAssertDifferent --- PASS: TestAssertDifferent (0.00s) asserts_test.go:387: testing assert "different" failed: 'one' (string) <> 'one' (string) [should fail and be logged] asserts_test.go:387: testing assert "different" failed: '2' (int) <> '2' (int) [should fail and be logged] === RUN TestAssertAbout --- PASS: TestAssertAbout (0.00s) asserts_test.go:387: testing assert "about" failed: '0.8' (float64) <> '1' (float64) [different, out of bounds of extent] asserts_test.go:387: testing assert "about" failed: '1.2' (float64) <> '1' (float64) [different, out of bounds of extent] === RUN TestAssertRange --- PASS: TestAssertRange (0.00s) asserts_test.go:387: testing assert "range" failed: '1' (uint8) <> '&{10 20}' (ptr to audit.lowHigh) [byte out of range] asserts_test.go:387: testing assert "range" failed: '1' (int) <> '&{10 20}' (ptr to audit.lowHigh) [int out of range] asserts_test.go:387: testing assert "range" failed: '1' (float64) <> '&{10 20}' (ptr to audit.lowHigh) [float64 out of range] asserts_test.go:387: testing assert "range" failed: '97' (int32) <> '&{120 122}' (ptr to audit.lowHigh) [rune out of range] asserts_test.go:387: testing assert "range" failed: 'aaa' (string) <> '&{uuuuu zzzzz}' (ptr to audit.lowHigh) [string out of range] asserts_test.go:387: testing assert "range" failed: '[1 2 3]' (slice of int) <> '&{5 10}' (ptr to audit.lowHigh) [slice length out of range] asserts_test.go:387: testing assert "range" failed: '[1 2 3]' (array of int) <> '&{5 10}' (ptr to audit.lowHigh) [array length out of range] asserts_test.go:387: testing assert "range" failed: 'map[1:3 3:1 2:2]' (map of int) <> '&{5 10}' (ptr to audit.lowHigh) [map length out of range] === RUN TestAssertContents --- PASS: TestAssertContents (0.00s) asserts_test.go:387: testing assert "contents" failed: '4711' (int) <> '12345-4711-67890' (string) asserts_test.go:387: testing assert "contents" failed: '4711' (int) <> 'foo' (string) asserts_test.go:387: testing assert "contents" failed: '4711' (int) <> '[1 2 3 4711 5 6 7 8 9]' (slice of interface {}) === RUN TestAssertSubstring --- PASS: TestAssertSubstring (0.00s) asserts_test.go:387: testing assert "substring" failed: 'foo' (string) <> 'this is assert test' (string) [should fail and be logged] asserts_test.go:387: testing assert "substring" failed: 'this is assert test' (string) <> 'this is assert test' (string) [should fail and be logged] === RUN TestAssertCase --- PASS: TestAssertCase (0.00s) asserts_test.go:387: testing assert "case" failed: 'Foo' (string) <> 'FOO' (string) [is mixed case] asserts_test.go:387: testing assert "case" failed: 'Foo' (string) <> 'foo' (string) [is mixed case] === RUN TestAssertMatch --- PASS: TestAssertMatch (0.00s) asserts_test.go:387: testing assert "match" failed: 'this is assert test' (string) <> 'foo' (string) [should fail and be logged] asserts_test.go:387: testing assert "match" failed: 'this is assert test' (string) <> 'this*test' (string) [should fail and be logged] === RUN TestAssertErrorMatch --- PASS: TestAssertErrorMatch (0.00s) asserts_test.go:387: testing assert "error match" failed: 'oops, an error' (ptr to errors.errorString) <> 'foo' (string) [should fail and be logged] === RUN TestAssertImplementor --- PASS: TestAssertImplementor (0.00s) asserts_test.go:387: testing assert "implementor" failed: 'string test' (string) <> '0xc4200c88d0' (ptr to error) [should fail and be logged] asserts_test.go:387: testing assert "implementor" failed: 'error test' (ptr to errors.errorString) <> '0xc4200c88e0' (ptr to io.Writer) [should fail and be logged] === RUN TestAssertAssignable --- PASS: TestAssertAssignable (0.00s) asserts_test.go:387: testing assert "assignable" failed: 'one' (string) <> '5' (int) [should fail and be logged] === RUN TestAssertUnassignable --- PASS: TestAssertUnassignable (0.00s) asserts_test.go:387: testing assert "unassignable" failed: '1' (int) <> '5' (int) [should fail and be logged] === RUN TestAssertEmpty --- PASS: TestAssertEmpty (0.00s) asserts_test.go:387: testing assert "empty" failed: '9' (int) <> '0' (int) [should fail and be logged] asserts_test.go:387: testing assert "empty" failed: '3' (int) <> '0' (int) [should also fail and be logged] asserts_test.go:387: testing assert "empty" failed: 'bool' (string) <> '0' (int) [obtained bool is no array, chan, map, slice, string or understands Len()] === RUN TestAsserNotEmpty --- PASS: TestAsserNotEmpty (0.00s) asserts_test.go:387: testing assert "not empty" failed: '0' (int) <> '0' (int) [should fail and be logged] asserts_test.go:387: testing assert "not empty" failed: '0' (int) <> '0' (int) [should also fail and be logged] asserts_test.go:387: testing assert "not empty" failed: 'bool' (string) <> '0' (int) [obtained bool is no array, chan, map, slice, string or understands Len()] === RUN TestAssertLength --- PASS: TestAssertLength (0.00s) asserts_test.go:387: testing assert "length" failed: '9' (int) <> '0' (int) [should fail and be logged] asserts_test.go:387: testing assert "length" failed: '3' (int) <> '10' (int) [should also fail and be logged] asserts_test.go:387: testing assert "length" failed: 'bool' (string) <> '1' (int) [obtained bool is no array, chan, map, slice, string or understands Len()] === RUN TestAssertPanics --- PASS: TestAssertPanics (0.00s) asserts_test.go:387: testing assert "panics" failed: 'func ()' (string) <> '' (invalid) [should not panic] === RUN TestAssertPathExists --- PASS: TestAssertPathExists (0.00s) asserts_test.go:387: testing assert "path exists" failed: '/this/path/will/hopefully/not/exist' (string) <> 'true' (bool) [illegal path] === RUN TestAssertWait --- PASS: TestAssertWait (0.20s) asserts_test.go:387: testing assert "wait" failed: 'false' (bool) <> 'true' (bool) [should be false] asserts_test.go:387: testing assert "wait" failed: 'timeout 100ms' (string) <> 'signal true' (string) [should timeout] === RUN TestAssertRetry --- PASS: TestAssertRetry (0.15s) asserts_test.go:387: testing assert "retry" failed: 'timeout after 107.422105ms and 10 retries' (string) <> 'successful call' (string) [should fail] === RUN TestAssertFail --- PASS: TestAssertFail (0.00s) asserts_test.go:387: testing assert "fail" failed: '' (invalid) <> '' (invalid) [this should fail] === RUN TestTestingAssertion

    asserts_test.go:338: Assert 'assignable' failed!

    Function...: TestTestingAssertion() Obtained...: func () Expected...: int Description: should fail (but not the test)


    asserts_test.go:339: Assert 'assignable' failed!

    Function...: TestTestingAssertion() Obtained...: func () Expected...: int


    asserts_test.go:340: Assert 'assignable' failed!

    Function...: TestTestingAssertion() Obtained...: func () Expected...: int Description: this should fail too

    --- PASS: TestTestingAssertion (0.00s) === RUN TestPanicAssert --- PASS: TestPanicAssert (0.00s) asserts_test.go:347: panic worked: 'assert 'assignable' failed: 'int' <> 'func ()' (should fail)' === RUN TestValidationAssertion --- PASS: TestValidationAssertion (0.00s) asserts_test.go:374: [0] assert 'true' failed: 'false' (sould fail) / [1] assert 'equal' failed: '1' <> '2' (should fail) === RUN TestTempDirCreate --- PASS: TestTempDirCreate (0.00s) === RUN TestTempDirRestore --- PASS: TestTempDirRestore (0.00s) === RUN TestEnvVarsSet --- PASS: TestEnvVarsSet (0.00s) === RUN TestEnvVarsRestore --- PASS: TestEnvVarsRestore (0.00s) === RUN TestBuildDate --- PASS: TestBuildDate (0.00s) === RUN TestInts --- PASS: TestInts (0.00s) === RUN TestOneOf --- PASS: TestOneOf (0.01s) === RUN TestWords --- PASS: TestWords (0.01s) === RUN TestPattern --- PASS: TestPattern (0.00s) === RUN TestText --- PASS: TestText (0.43s) === RUN TestName --- PASS: TestName (2.97s) === RUN TestDomain --- PASS: TestDomain (0.00s) === RUN TestURL --- PASS: TestURL (1.38s) === RUN TestEMail --- PASS: TestEMail (1.34s) === RUN TestTimes

    generators_test.go:318: Assert 'true' failed!

    Function...: TestTimes() Obtained...: false

    --- FAIL: TestTimes (0.32s) FAIL exit status 1 FAIL github.com/tideland/golib/audit 6.835s 2018-03-27 15:18:40 Z [INFO] [github.com/tideland/golib/loop] loop "2e036f23-385b-4ab6-800c-b29ecbd52f51" starts === RUN TestNormalRetrieve --- PASS: TestNormalRetrieve (0.20s) === RUN TestRetrieveError --- PASS: TestRetrieveError (0.00s) === RUN TestRetrievePanic --- PASS: TestRetrievePanic (0.00s) PASS ok github.com/tideland/golib/cache 0.211s === RUN TestRingBufferPush --- PASS: TestRingBufferPush (0.00s) === RUN TestRingBufferPop --- PASS: TestRingBufferPop (0.00s) === RUN TestRingBufferGrow --- PASS: TestRingBufferGrow (0.00s) === RUN TestSetsAddRemove --- PASS: TestSetsAddRemove (0.00s) === RUN TestSetsFindAll --- PASS: TestSetsFindAll (0.00s) === RUN TestSetsDoAll --- PASS: TestSetsDoAll (0.00s) === RUN TestStringSetsAddRemove --- PASS: TestStringSetsAddRemove (0.00s) === RUN TestStringSetsFindAll --- PASS: TestStringSetsFindAll (0.00s) === RUN TestStringSetsDoAll --- PASS: TestStringSetsDoAll (0.00s) === RUN TestStackPushPop --- PASS: TestStackPushPop (0.00s) === RUN TestStackAll --- PASS: TestStackAll (0.00s) === RUN TestStringStackPushPop --- PASS: TestStringStackPushPop (0.00s) === RUN TestTreeCreate --- PASS: TestTreeCreate (0.00s) === RUN TestTreeRemove --- PASS: TestTreeRemove (0.00s) === RUN TestTreeSetValue --- PASS: TestTreeSetValue (0.00s) === RUN TestTreeFind --- PASS: TestTreeFind (0.00s) === RUN TestTreeDo --- PASS: TestTreeDo (0.00s) === RUN TestTreeCopy --- PASS: TestTreeCopy (0.00s) === RUN TestStringTreeCreate --- PASS: TestStringTreeCreate (0.00s) === RUN TestStringTreeRemove --- PASS: TestStringTreeRemove (0.00s) === RUN TestStringTreeSetValue --- PASS: TestStringTreeSetValue (0.00s) === RUN TestStringTreeFind --- PASS: TestStringTreeFind (0.00s) === RUN TestStringTreeDo --- PASS: TestStringTreeDo (0.00s) === RUN TestStringTreeCopy --- PASS: TestStringTreeCopy (0.00s) === RUN TestKeyValueTreeCreate --- PASS: TestKeyValueTreeCreate (0.00s) === RUN TestKeyValueTreeRemove --- PASS: TestKeyValueTreeRemove (0.00s) === RUN TestKeyValueTreeSetKey --- PASS: TestKeyValueTreeSetKey (0.00s) === RUN TestKeyValueTreeSetValue --- PASS: TestKeyValueTreeSetValue (0.00s) === RUN TestKeyValueTreeFind --- PASS: TestKeyValueTreeFind (0.00s) === RUN TestKeyValueTreeDo --- PASS: TestKeyValueTreeDo (0.00s) === RUN TestKeyValueTreeCopy --- PASS: TestKeyValueTreeCopy (0.00s) === RUN TestKeyStringValueTreeCreate --- PASS: TestKeyStringValueTreeCreate (0.00s) === RUN TestKeyStringValueTreeRemove --- PASS: TestKeyStringValueTreeRemove (0.00s) === RUN TestKeyStringValueTreeSetKey --- PASS: TestKeyStringValueTreeSetKey (0.00s) === RUN TestKeyStringValueTreeSetValue --- PASS: TestKeyStringValueTreeSetValue (0.00s) === RUN TestKeyStringValueTreeFind --- PASS: TestKeyStringValueTreeFind (0.00s) === RUN TestKeyStringValueTreeDo --- PASS: TestKeyStringValueTreeDo (0.00s) === RUN TestKeyStringValueTreeCopy --- PASS: TestKeyStringValueTreeCopy (0.00s) PASS ok github.com/tideland/golib/collections 0.022s === RUN TestIsError --- PASS: TestIsError (0.00s) === RUN TestValidation --- PASS: TestValidation (0.00s) === RUN TestAnnotation --- PASS: TestAnnotation (0.00s) === RUN TestCollection --- PASS: TestCollection (0.00s) === RUN TestDoAll --- PASS: TestDoAll (0.00s) PASS ok github.com/tideland/golib/errors 0.009s === RUN TestRead --- PASS: TestRead (0.00s) === RUN TestReadFile --- PASS: TestReadFile (0.00s) === RUN TestWrite --- PASS: TestWrite (0.00s) === RUN TestTemplates --- PASS: TestTemplates (0.00s) === RUN TestHasPath --- PASS: TestHasPath (0.00s) === RUN TestValueSuccess --- PASS: TestValueSuccess (0.00s) === RUN TestGetFail --- PASS: TestGetFail (0.00s) === RUN TestSplit --- PASS: TestSplit (0.00s) === RUN TestDump --- PASS: TestDump (0.00s) === RUN TestApply --- PASS: TestApply (0.00s) === RUN TestContext --- PASS: TestContext (0.00s) PASS ok github.com/tideland/golib/etc 0.012s === RUN TestParseComposeTime --- PASS: TestParseComposeTime (0.00s) === RUN TestEncodeDecode --- PASS: TestEncodeDecode (0.00s) === RUN TestGet --- SKIP: TestGet (0.00s) atom_test.go:77: Network test skipped in short mode PASS ok github.com/tideland/golib/feed/atom 0.014s === RUN TestParseComposeTime --- PASS: TestParseComposeTime (0.00s) === RUN TestEncodeDecode --- PASS: TestEncodeDecode (0.00s) === RUN TestValidate --- PASS: TestValidate (0.00s) === RUN TestGet --- SKIP: TestGet (0.00s) rss_test.go:123: Network test skipped in short mode PASS ok github.com/tideland/golib/feed/rss 0.018s === RUN TestStripTags --- PASS: TestStripTags (0.00s) PASS ok github.com/tideland/golib/feed/utils 0.008s === RUN TestTypeAsIdentifierPart --- PASS: TestTypeAsIdentifierPart (0.00s) === RUN TestIdentifier --- PASS: TestIdentifier (0.00s) === RUN TestSepIdentifier --- PASS: TestSepIdentifier (0.00s) === RUN TestStandardUUID --- PASS: TestStandardUUID (5.71s) === RUN TestUUIDVersions uuid_test.go:62: UUID V1: ecc95828-d231-1801-9519-47372e2c5022 uuid_test.go:67: UUID V3: c4d91d8a-0d3e-3e3f-8dd6-924b8cc71909 uuid_test.go:72: UUID V4: a538c88f-afb3-4902-95ed-846ad04fa4e6 uuid_test.go:77: UUID V5: 479b560a-cc70-5da7-9009-dcda1e772b01 --- PASS: TestUUIDVersions (0.00s) === RUN TestUUIDByHex --- PASS: TestUUIDByHex (0.00s) PASS ok github.com/tideland/golib/identifier 5.768s === RUN TestGetSetLevel --- PASS: TestGetSetLevel (0.00s) === RUN TestGetSetLevelString --- PASS: TestGetSetLevelString (0.00s) === RUN TestFiltering --- PASS: TestFiltering (0.00s) === RUN TestGoLogger 2018/03/27 15:18:53 [DEBUG] [github.com/tideland/golib/logger_test] (logger_test.go:TestGoLogger:134) Debug. 2018/03/27 15:18:53 [INFO] [github.com/tideland/golib/logger_test] Info. 2018/03/27 15:18:53 [WARNING] [github.com/tideland/golib/logger_test] Warning. 2018/03/27 15:18:53 [ERROR] [github.com/tideland/golib/logger_test] Error. 2018/03/27 15:18:53 [CRITICAL] [github.com/tideland/golib/logger_test] (logger_test.go:TestGoLogger:138) Critical. --- PASS: TestGoLogger (0.00s) === RUN TestSysLogger --- SKIP: TestSysLogger (0.00s) logger_test.go:144: Network test skipped in short mode === RUN TestOwnLogger --- PASS: TestOwnLogger (0.00s) === RUN TestFatalExit --- PASS: TestFatalExit (0.00s) PASS ok github.com/tideland/golib/logger 0.007s === RUN TestSimpleStop 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-stop" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-stop" stopped --- PASS: TestSimpleStop (0.00s) === RUN TestSimpleRestart 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-restart" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-restart" stopped 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-restart" restarts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-restart" stopped --- PASS: TestSimpleRestart (0.00s) === RUN TestSimpleKill 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-kill" starts 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "simple-kill" stopped with error: ouch --- PASS: TestSimpleKill (0.00s) === RUN TestError 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "error" starts 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "error" stopped with error: timed out --- PASS: TestError (0.10s) === RUN TestDeferredError 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "deferred-error" starts 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "deferred-error" stopped with error: deferred error --- PASS: TestDeferredError (0.00s) === RUN TestStopRecoverings 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "stop-recoverings" starts 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "stop-recoverings" tries to recover 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "stop-recoverings" recovered 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "stop-recoverings" tries to recover 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "stop-recoverings" recovered 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "stop-recoverings" tries to recover 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "stop-recoverings" recovered 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "stop-recoverings" stopped --- PASS: TestStopRecoverings (0.10s) === RUN TestEndRecoverings 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "end-recoverings" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "end-recoverings" stopped --- PASS: TestEndRecoverings (0.10s) === RUN TestRecoveringsPanic 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "recoverings-panic" starts 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-panic" tries to recover 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "recoverings-panic" recovered 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-panic" tries to recover 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "recoverings-panic" recovered 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-panic" tries to recover 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "recoverings-panic" recovered 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-panic" tries to recover 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "recoverings-panic" recovered 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-panic" tries to recover 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-panic" stopped with error: too many panics --- PASS: TestRecoveringsPanic (0.15s) === RUN TestRecoveringsError 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "recoverings-error" starts 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-error" tries to recover 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "recoverings-error" stopped with error: timed out --- PASS: TestRecoveringsError (0.15s) === RUN TestDescription 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "one" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "two::three::four" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "72902774-a832-4613-94d6-8a0bebb3691e" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "two::three::four" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "72902774-a832-4613-94d6-8a0bebb3691e" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "one" stopped --- PASS: TestDescription (0.00s) === RUN TestSimpleSentinel 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-sentinel" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::c" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::c" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "simple-sentinel" stopped --- PASS: TestSimpleSentinel (0.00s) === RUN TestSentinelStoppingLoop 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-stopping-loop" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::c" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::c" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] stopped observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" stopped 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-stopping-loop" stopped --- PASS: TestSentinelStoppingLoop (0.00s) === RUN TestSentineForget 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-forget" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::c" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::d" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::c" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::d" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] stopped observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] stopped observing "loop::c" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-forget" stopped --- PASS: TestSentineForget (0.10s) === RUN TestSentinelKillingLoopNoHandler 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-no-handler" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::c" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::c" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "loop::b" stopped with error: bang! 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] sentinel "sentinel-killing-loop-no-handler" kills all observables after error: bang! 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop.(*sentinel).backendLoop] killing "loop::a" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop.(*sentinel).backendLoop] killing "loop::b" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop.(*sentinel).backendLoop] killing "loop::c" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-no-handler" stopped with error: [LOOP:002] error handling for "loop::b" failed: bang! --- PASS: TestSentinelKillingLoopNoHandler (0.00s) === RUN TestSentinelKillingLoopHandlerRestarts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-handler-restarts" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::c" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::c" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "loop::b" stopped with error: bang! 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" restarts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-handler-restarts" stopped --- PASS: TestSentinelKillingLoopHandlerRestarts (0.03s) === RUN TestSentinelKillingLoopHandlerStops 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-with-stops" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::c" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::c" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "loop::b" stopped with error: bang! 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] sentinel "sentinel-killing-loop-with-stops" kills all observables after error: oh no! 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop.(*sentinel).backendLoop] killing "loop::a" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop.(*sentinel).backendLoop] killing "loop::b" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop.(*sentinel).backendLoop] killing "loop::c" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-with-stops" stopped with error: [LOOP:002] error handling for "loop::b" failed: oh no! --- PASS: TestSentinelKillingLoopHandlerStops (0.03s) === RUN TestSentinelKillingLoopHandlerRestartAll 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-restarting-all" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::c" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::c" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "loop::b" stopped with error: bang! 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" restarts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-killing-loop-restarting-all" stopped --- PASS: TestSentinelKillingLoopHandlerRestartAll (0.03s) === RUN TestNestedSentinelKill 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "nested-sentinel-kill::top" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "nested-sentinel-kill::nested" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" starts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "nested-sentinel-kill::nested" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::b" 2018-03-27 15:18:54 Z [ERROR] [github.com/tideland/golib/loop] loop "nested-sentinel-kill::nested" stopped with error: bang! 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] sentinel "nested-sentinel-kill::nested" restarts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "nested-sentinel-kill::nested" restarts 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] stopped observing "loop::b" 2018-03-27 15:18:54 Z [INFO] [github.com/tideland/golib/loop] loop "loop::b" stopped --- PASS: TestNestedSentinelKill (0.18s) === RUN TestSentinelSwitch 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] loop "nested-sentinel-kill::top" stopped 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-switch::a" starts 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-switch::b" starts 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] loop "loop::a" starts 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] stopped observing "loop::a" 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] started observing "loop::a" 2018-03-27 15:18:55 Z [INFO] [github.com/tideland/golib/loop] loop "sentinel-switch::a" stopped --- PASS: TestSentinelSwitch (0.10s) PASS ok github.com/tideland/golib/loop 1.077s === RUN TestMapReduce --- PASS: TestMapReduce (4.68s) PASS ok github.com/tideland/golib/mapreduce 4.736s === RUN TestETMMonitor 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" starts --- PASS: TestETMMonitor (0.19s) === RUN TestSSIMonitor 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" starts 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" stopped --- PASS: TestSSIMonitor (0.00s) === RUN TestDSRMonitor 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" starts 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" stopped 2018-03-27 15:19:01 Z [ERROR] [github.com/tideland/golib/loop] loop "monitoring-backend" tries to recover 2018-03-27 15:19:01 Z [WARNING] [github.com/tideland/golib/monitoring] standard monitor recovered: runtime error: integer divide by zero 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" recovered --- PASS: TestDSRMonitor (0.00s) === RUN TestInternalPanic 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" starts 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" stopped 2018-03-27 15:19:01 Z [ERROR] [github.com/tideland/golib/loop] loop "monitoring-backend" tries to recover 2018-03-27 15:19:01 Z [WARNING] [github.com/tideland/golib/monitoring] standard monitor recovered: ouch 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" recovered --- PASS: TestInternalPanic (0.00s) === RUN TestBackendSwitch 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" starts 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" stopped 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" stopped 2018-03-27 15:19:01 Z [INFO] [github.com/tideland/golib/loop] loop "monitoring-backend" starts --- PASS: TestBackendSwitch (0.05s) PASS ok github.com/tideland/golib/monitoring 0.259s === RUN TestSimplePoint --- PASS: TestSimplePoint (0.00s) === RUN TestSimplePointArray --- PASS: TestSimplePointArray (0.00s) === RUN TestSimplePolynomialFunction --- PASS: TestSimplePolynomialFunction (0.00s) === RUN TestPolynomialFunctionPrinting --- PASS: TestPolynomialFunctionPrinting (0.00s) === RUN TestQuadraticPolynomialFunction --- PASS: TestQuadraticPolynomialFunction (0.00s) === RUN TestPolynomialFunctionDifferentiation --- PASS: TestPolynomialFunctionDifferentiation (0.00s) === RUN TestInterpolation --- PASS: TestInterpolation (0.00s) === RUN TestPointsEvaluation --- PASS: TestPointsEvaluation (0.00s) === RUN TestLeastSquaresFunction --- PASS: TestLeastSquaresFunction (0.00s) PASS ok github.com/tideland/golib/numerics 0.007s === RUN TestSimpleKeyOperations --- SKIP: TestSimpleKeyOperations (0.00s) commands_test.go:29: Redis test skipped in short mode === RUN TestScan --- SKIP: TestScan (0.00s) commands_test.go:90: Redis test skipped in short mode === RUN TestHash --- SKIP: TestHash (0.00s) commands_test.go:131: Redis test skipped in short mode === RUN TestHScan --- SKIP: TestHScan (0.00s) commands_test.go:172: Redis test skipped in short mode === RUN TestList --- SKIP: TestList (0.00s) commands_test.go:215: Redis test skipped in short mode === RUN TestSet --- SKIP: TestSet (0.00s) commands_test.go:233: Redis test skipped in short mode === RUN TestSScan --- SKIP: TestSScan (0.00s) commands_test.go:258: Redis test skipped in short mode === RUN TestSortedSet --- SKIP: TestSortedSet (0.00s) commands_test.go:298: Redis test skipped in short mode === RUN TestZScan --- SKIP: TestZScan (0.00s) commands_test.go:324: Redis test skipped in short mode === RUN TestTransactionConnection --- SKIP: TestTransactionConnection (0.00s) commands_test.go:367: Redis test skipped in short mode === RUN TestTransactionPipeline --- SKIP: TestTransactionPipeline (0.00s) commands_test.go:426: Redis test skipped in short mode === RUN TestTransactionPipelineWatch --- SKIP: TestTransactionPipelineWatch (0.00s) commands_test.go:464: Redis test skipped in short mode === RUN TestScripting --- SKIP: TestScripting (0.00s) commands_test.go:499: Redis test skipped in short mode === RUN TestPubSub --- SKIP: TestPubSub (0.00s) commands_test.go:540: Redis test skipped in short mode === RUN TestUnixSocketConnection --- SKIP: TestUnixSocketConnection (0.00s) redis_test.go:29: Redis test skipped in short mode === RUN TestTcpConnection --- SKIP: TestTcpConnection (0.00s) redis_test.go:58: Redis test skipped in short mode === RUN TestPipelining --- SKIP: TestPipelining (0.00s) redis_test.go:87: Redis test skipped in short mode === RUN TestOptions 2018-03-27 15:19:03 Z [INFO] [github.com/tideland/golib/loop] loop "redis::tmp-redis-sock::0" starts --- PASS: TestOptions (0.00s) === RUN TestConcurrency --- SKIP: TestConcurrency (0.00s) redis_test.go:145: Redis test skipped in short mode PASS ok github.com/tideland/golib/redis 0.084s === RUN TestSimpleNoTimeout 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::326537ab-3fb2-411d-8197-81e0270351d3" starts 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::326537ab-3fb2-411d-8197-81e0270351d3" stopped --- PASS: TestSimpleNoTimeout (0.00s) === RUN TestAccessAfterStopping 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::91333632-368b-4e2a-8025-889013867070" starts 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::91333632-368b-4e2a-8025-889013867070" stopped --- PASS: TestAccessAfterStopping (0.00s) === RUN TestCleanupNoError 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::1f9f9cf0-43f0-4dcc-8993-845b9c60af12" starts 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::1f9f9cf0-43f0-4dcc-8993-845b9c60af12" stopped --- PASS: TestCleanupNoError (0.00s) === RUN TestCleanupWithErrors 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::17d02096-13db-44e1-985b-11d31a367da7" starts 2018-03-27 15:19:04 Z [ERROR] [github.com/tideland/golib/loop] loop "scene::17d02096-13db-44e1-985b-11d31a367da7" stopped with error: [SCENE:005] cleanup of property "bar" failed: ouch --- PASS: TestCleanupWithErrors (0.00s) === RUN TestSimpleInactivityTimeout 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::5b024fcf-a180-434a-9ec6-9b21caf1a5d9" starts 2018-03-27 15:19:04 Z [ERROR] [github.com/tideland/golib/loop] loop "scene::5b024fcf-a180-434a-9ec6-9b21caf1a5d9" stopped with error: [SCENE:002] scene inactivity timeout reached at 2018-03-27 15:19:04.44364458 +0000 UTC --- PASS: TestSimpleInactivityTimeout (0.10s) === RUN TestSimpleAbsoluteTimeout 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::f794c354-2fa8-4ccb-8b25-cbcb0851c950" starts 2018-03-27 15:19:04 Z [ERROR] [github.com/tideland/golib/loop] loop "scene::f794c354-2fa8-4ccb-8b25-cbcb0851c950" stopped with error: [SCENE:002] scene absolute timeout reached at 2018-03-27 15:19:04.694321773 +0000 UTC --- PASS: TestSimpleAbsoluteTimeout (0.25s) === RUN TestCleanupAfterTimeout 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::8c720b81-d5ef-4eb3-847b-e6e499ef1dfe" starts 2018-03-27 15:19:04 Z [ERROR] [github.com/tideland/golib/loop] loop "scene::8c720b81-d5ef-4eb3-847b-e6e499ef1dfe" stopped with error: [SCENE:002] scene absolute timeout reached at 2018-03-27 15:19:04.794673859 +0000 UTC --- PASS: TestCleanupAfterTimeout (0.25s) === RUN TestAbort 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::8642b63e-fe4a-42ab-9c9b-dd17689e5142" starts 2018-03-27 15:19:04 Z [ERROR] [github.com/tideland/golib/loop] loop "scene::8642b63e-fe4a-42ab-9c9b-dd17689e5142" stopped with error: aborted --- PASS: TestAbort (0.00s) === RUN TestFlagNoTimeout 2018-03-27 15:19:04 Z [INFO] [github.com/tideland/golib/loop] loop "scene::ac52851c-c781-4f9c-86ea-829a2764ac41" starts 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::ac52851c-c781-4f9c-86ea-829a2764ac41" stopped --- PASS: TestFlagNoTimeout (0.35s) === RUN TestNoFlagDueToStop 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::d9bb47b4-aac4-49ee-9d1e-e998c2385aac" starts 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::d9bb47b4-aac4-49ee-9d1e-e998c2385aac" stopped --- PASS: TestNoFlagDueToStop (0.10s) === RUN TestStoreAndFlag 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::a14ecce5-a81c-4cee-9932-9174de0f78c4" starts 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::a14ecce5-a81c-4cee-9932-9174de0f78c4" stopped --- PASS: TestStoreAndFlag (0.11s) === RUN TestEarlyFlag 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::01797a12-60b8-4735-85ba-fe0bbb03c850" starts 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::01797a12-60b8-4735-85ba-fe0bbb03c850" stopped --- PASS: TestEarlyFlag (0.10s) === RUN TestFlagTimeout 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::19999d17-f12a-4567-9b6f-f7b3d9780313" starts 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::19999d17-f12a-4567-9b6f-f7b3d9780313" stopped --- PASS: TestFlagTimeout (0.10s) === RUN TestFlagUnflag 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::11379293-f0cf-4d65-9f3b-3f0ea6312fa6" starts 2018-03-27 15:19:05 Z [INFO] [github.com/tideland/golib/loop] loop "scene::11379293-f0cf-4d65-9f3b-3f0ea6312fa6" stopped --- PASS: TestFlagUnflag (0.05s) PASS ok github.com/tideland/golib/scene 1.429s === RUN TestScroller scroller_test.go:173: test #1/10: no lines existing; initially no lines scrolled 2018-03-27 15:19:06 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:08 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped scroller_test.go:173: test #2/10: no lines existing; initially five lines scrolled 2018-03-27 15:19:08 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:11 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped scroller_test.go:173: test #3/10: ten lines existing; initially no lines scrolled 2018-03-27 15:19:11 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:13 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped scroller_test.go:173: test #4/10: ten lines existing; initially five lines scrolled 2018-03-27 15:19:13 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:14 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped scroller_test.go:173: test #5/10: ten lines existing; initially twenty lines scrolled 2018-03-27 15:19:14 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:14 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped scroller_test.go:173: test #6/10: ten lines existing; initially twenty lines scrolled; buffer smaller than lines 2018-03-27 15:19:14 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:15 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped scroller_test.go:173: test #7/10: ten lines existing; initially three lines scrolled; filter lines with special prefix 2018-03-27 15:19:15 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts scroller_test.go:173: test #8/10: ten lines existing; initially five lines scrolled; error after further 25 lines 2018-03-27 15:19:15 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped 2018-03-27 15:19:15 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:15 Z [ERROR] [github.com/tideland/golib/loop] loop "scroller" stopped with error: ouch scroller_test.go:173: test #9/10: ten lines existing; initially five lines scrolled; simply stop after 25 lines 2018-03-27 15:19:15 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts 2018-03-27 15:19:16 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped scroller_test.go:173: test #10/10: unterminated last line is not scrolled 2018-03-27 15:19:16 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" starts --- PASS: TestScroller (9.67s) 2018-03-27 15:19:16 Z [INFO] [github.com/tideland/golib/loop] loop "scroller" stopped PASS ok github.com/tideland/golib/scroller 9.678s === RUN TestTagValidation --- PASS: TestTagValidation (0.00s) === RUN TestCreating --- PASS: TestCreating (0.00s) === RUN TestWriterProcessing sml_test.go:86: ===== WITH INDENT ===== sml_test.go:87: {root Text A Text B {# A first comment. #} {sub-a:1st:important Text A.A {# A second comment. #} } {sub-b:2nd Text B.A {text Any text with the special characters ^{, ^}, and ^^. } } {sub-c Before raw. {! func Test(i int) { println(i) } !} After raw. } }

    sml_test.go:88: ===== WITHOUT INDENT ===== sml_test.go:89: {root Text A Text B {# A first comment. #} {sub-a:1st:important Text A.A {# A second comment. #}} {sub-b:2nd Text B.A {text Any text with the special characters ^{, ^}, and ^^.}} {sub-c Before raw. {! func Test(i int) { println(i) } !} After raw.}} sml_test.go:90: ===== DONE ===== --- PASS: TestWriterProcessing (0.00s) === RUN TestPositiveNodeReading sml_test.go:112: ===== PARSED SML ===== sml_test.go:113: {foo:main {bar:1:first Yadda ^{Test^} 1 } {! Raw: }} { ! ^^^ !} {inbetween } {bar:2:last Yadda {test ^^ } 2 } }

    sml_test.go:114: ===== DONE ===== --- PASS: TestPositiveNodeReading (0.00s) === RUN TestNegativeNodeReading --- PASS: TestNegativeNodeReading (0.00s) === RUN TestPositiveTreeReading sml_test.go:135: [config = '' foo = '1'][bar = '2'][yadda = '' [up = 'down'][down = 'up']]] --- PASS: TestPositiveTreeReading (0.00s) === RUN TestNegativeTreeReading --- PASS: TestNegativeTreeReading (0.00s) === RUN TestSML2XML sml_test.go:178: ===== XML ===== sml_test.go:179: A test document

    A test document

    The is a simple sentence with an emphasized and a strong text. We'll see how it renders.

    • It should be nice.
    • It should be error free.
    • It should be fast.
    for foo := 0; foo < 42; foo++ {
    println(foo)
    }
    

    sml_test.go:180: ===== DONE ===== --- PASS: TestSML2XML (0.00s) PASS ok github.com/tideland/golib/sml 0.009s === RUN TestPivot --- PASS: TestPivot (0.00s) PASS ok github.com/tideland/golib/sort 0.006s === RUN TestAsString defaulter_test.go:54: test Defaulter{AsString} 0: value 'foo' without error and default bar defaulter_test.go:54: test Defaulter{AsString} 1: value 'foo' with error and default bar 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsString) value returned with error: foo --- PASS: TestAsString (0.00s) === RUN TestAsStringSlice defaulter_test.go:80: test Defaulter{AsStringSlice} 0: value 'a/b/c' without error and default [a] defaulter_test.go:80: test Defaulter{AsStringSlice} 1: value 'a/b/c' with error and default [a] 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsStringSlice) value returned with error: a/b/c defaulter_test.go:80: test Defaulter{AsStringSlice} 2: value 'a/b/c' without error and default [] defaulter_test.go:80: test Defaulter{AsStringSlice} 3: value 'a/b/c' with error and default [] 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsStringSlice) value returned with error: a/b/c defaulter_test.go:80: test Defaulter{AsStringSlice} 4: value '' without error and default [] defaulter_test.go:80: test Defaulter{AsStringSlice} 5: value '' with error and default [foo] 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsStringSlice) value returned with error: defaulter_test.go:80: test Defaulter{AsStringSlice} 6: value 'a/b/c' without error and default [a] --- PASS: TestAsStringSlice (0.00s) === RUN TestAsStringMap defaulter_test.go:107: test Defaulter{AsStringMap} 0: value 'a:1/b:2' without error and default map[a:1] defaulter_test.go:107: test Defaulter{AsStringMap} 1: value 'a:1/b:2' with error and default map[a:1] 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsStringMap) value returned with error: a:1/b:2 defaulter_test.go:107: test Defaulter{AsStringMap} 2: value 'a:1/b:2' without error and default map[] defaulter_test.go:107: test Defaulter{AsStringMap} 3: value 'a:1/b:2' with error and default map[] 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsStringMap) value returned with error: a:1/b:2 defaulter_test.go:107: test Defaulter{AsStringMap} 4: value '' without error and default map[] defaulter_test.go:107: test Defaulter{AsStringMap} 5: value '' with error and default map[a:1] 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsStringMap) value returned with error: defaulter_test.go:107: test Defaulter{AsStringMap} 6: value 'a:1/b:2' without error and default map[] --- PASS: TestAsStringMap (0.00s) === RUN TestAsBool defaulter_test.go:141: test Defaulter{AsBool} 0: value '1' without error and default false defaulter_test.go:141: test Defaulter{AsBool} 1: value 't' without error and default false defaulter_test.go:141: test Defaulter{AsBool} 2: value 'T' without error and default false defaulter_test.go:141: test Defaulter{AsBool} 3: value 'TRUE' without error and default false defaulter_test.go:141: test Defaulter{AsBool} 4: value 'true' without error and default false defaulter_test.go:141: test Defaulter{AsBool} 5: value 'True' without error and default false defaulter_test.go:141: test Defaulter{AsBool} 6: value 'wahr' without error and default true 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsBool) value has illegal format for "bool": strconv.ParseBool: parsing "wahr": invalid syntax defaulter_test.go:141: test Defaulter{AsBool} 7: value '' with error and default true 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsBool) value returned with error: defaulter_test.go:141: test Defaulter{AsBool} 8: value '0' without error and default true defaulter_test.go:141: test Defaulter{AsBool} 9: value 'f' without error and default true defaulter_test.go:141: test Defaulter{AsBool} 10: value 'F' without error and default true defaulter_test.go:141: test Defaulter{AsBool} 11: value 'FALSE' without error and default true defaulter_test.go:141: test Defaulter{AsBool} 12: value 'false' without error and default true defaulter_test.go:141: test Defaulter{AsBool} 13: value 'False' without error and default true defaulter_test.go:141: test Defaulter{AsBool} 14: value 'falsch' without error and default false 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsBool) value has illegal format for "bool": strconv.ParseBool: parsing "falsch": invalid syntax defaulter_test.go:141: test Defaulter{AsBool} 15: value '' with error and default false 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsBool) value returned with error: --- PASS: TestAsBool (0.00s) === RUN TestAsInt defaulter_test.go:171: test Defaulter{AsInt} 0: value '0' without error and default 0 defaulter_test.go:171: test Defaulter{AsInt} 1: value '1' without error and default 0 defaulter_test.go:171: test Defaulter{AsInt} 2: value '-1' without error and default 0 defaulter_test.go:171: test Defaulter{AsInt} 3: value '9223372036854775807' without error and default 0 defaulter_test.go:171: test Defaulter{AsInt} 4: value '-9223372036854775808' without error and default 0 defaulter_test.go:171: test Defaulter{AsInt} 5: value '999999999999999999999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt) value has illegal format for "int": strconv.ParseInt: parsing "999999999999999999999": value out of range defaulter_test.go:171: test Defaulter{AsInt} 6: value '-999999999999999999999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt) value has illegal format for "int": strconv.ParseInt: parsing "-999999999999999999999": value out of range defaulter_test.go:171: test Defaulter{AsInt} 7: value 'one two three' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt) value has illegal format for "int": strconv.ParseInt: parsing "one two three": invalid syntax defaulter_test.go:171: test Defaulter{AsInt} 8: value '1' with error and default 2 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt) value returned with error: 1 defaulter_test.go:171: test Defaulter{AsInt} 9: value '-1' with error and default -2 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt) value returned with error: -1 --- PASS: TestAsInt (0.00s) === RUN TestAsInt64 defaulter_test.go:201: test Defaulter{AsInt64} 0: value '0' without error and default 0 defaulter_test.go:201: test Defaulter{AsInt64} 1: value '1' without error and default 0 defaulter_test.go:201: test Defaulter{AsInt64} 2: value '-1' without error and default 0 defaulter_test.go:201: test Defaulter{AsInt64} 3: value '9223372036854775807' without error and default 0 defaulter_test.go:201: test Defaulter{AsInt64} 4: value '-9223372036854775808' without error and default 0 defaulter_test.go:201: test Defaulter{AsInt64} 5: value '999999999999999999999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt64) value has illegal format for "int64": strconv.ParseInt: parsing "999999999999999999999": value out of range defaulter_test.go:201: test Defaulter{AsInt64} 6: value '-999999999999999999999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt64) value has illegal format for "int64": strconv.ParseInt: parsing "-999999999999999999999": value out of range defaulter_test.go:201: test Defaulter{AsInt64} 7: value 'one two three' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt64) value has illegal format for "int64": strconv.ParseInt: parsing "one two three": invalid syntax defaulter_test.go:201: test Defaulter{AsInt64} 8: value '1' with error and default 2 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt64) value returned with error: 1 defaulter_test.go:201: test Defaulter{AsInt64} 9: value '-1' with error and default -2 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsInt64) value returned with error: -1 --- PASS: TestAsInt64 (0.00s) === RUN TestAsUint defaulter_test.go:226: test Defaulter{AsUint} 0: value '0' without error and default 0 defaulter_test.go:226: test Defaulter{AsUint} 1: value '1' without error and default 0 defaulter_test.go:226: test Defaulter{AsUint} 2: value '18446744073709551615' without error and default 0 defaulter_test.go:226: test Defaulter{AsUint} 3: value '999999999999999999999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsUint) value has illegal format for "uint": strconv.ParseUint: parsing "999999999999999999999": value out of range defaulter_test.go:226: test Defaulter{AsUint} 4: value 'one two three' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsUint) value has illegal format for "uint": strconv.ParseUint: parsing "one two three": invalid syntax defaulter_test.go:226: test Defaulter{AsUint} 5: value '-1' with error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsUint) value returned with error: -1 --- PASS: TestAsUint (0.00s) === RUN TestAsUInt64 defaulter_test.go:251: test Defaulter{AsUInt64} 0: value '0' without error and default 0 defaulter_test.go:251: test Defaulter{AsUInt64} 1: value '1' without error and default 0 defaulter_test.go:251: test Defaulter{AsUInt64} 2: value '18446744073709551615' without error and default 0 defaulter_test.go:251: test Defaulter{AsUInt64} 3: value '999999999999999999999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsUInt64) value has illegal format for "uint64": strconv.ParseUint: parsing "999999999999999999999": value out of range defaulter_test.go:251: test Defaulter{AsUInt64} 4: value 'one two three' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsUInt64) value has illegal format for "uint64": strconv.ParseUint: parsing "one two three": invalid syntax defaulter_test.go:251: test Defaulter{AsUInt64} 5: value '-1' with error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsUInt64) value returned with error: -1 --- PASS: TestAsUInt64 (0.00s) === RUN TestAsFloat64 defaulter_test.go:281: test Defaulter{AsFloat4} 0: value '0.0' without error and default 0 defaulter_test.go:281: test Defaulter{AsFloat4} 1: value '1.0' without error and default 0 defaulter_test.go:281: test Defaulter{AsFloat4} 2: value '-1.0' without error and default 0 defaulter_test.go:281: test Defaulter{AsFloat4} 3: value '1.7976931348623157e+308' without error and default 0 defaulter_test.go:281: test Defaulter{AsFloat4} 4: value '-1.7976931348623157e+308' without error and default 0 defaulter_test.go:281: test Defaulter{AsFloat4} 5: value '9e+999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsFloat4) value has illegal format for "float64": strconv.ParseFloat: parsing "9e+999": value out of range defaulter_test.go:281: test Defaulter{AsFloat4} 6: value '-9e+999' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsFloat4) value has illegal format for "float64": strconv.ParseFloat: parsing "-9e+999": value out of range defaulter_test.go:281: test Defaulter{AsFloat4} 7: value 'one.two' without error and default 1 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsFloat4) value has illegal format for "float64": strconv.ParseFloat: parsing "one.two": invalid syntax defaulter_test.go:281: test Defaulter{AsFloat4} 8: value '1.0' with error and default 2 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsFloat4) value returned with error: 1.0 defaulter_test.go:281: test Defaulter{AsFloat4} 9: value '-1.0' with error and default -2 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsFloat4) value returned with error: -1.0 --- PASS: TestAsFloat64 (0.00s) === RUN TestAsTime defaulter_test.go:307: test Defaulter{AsTime} 0: value '2018-03-27T15:19:17.830050534Z' without error and default 2000-01-01 00:00:00 +0000 UTC defaulter_test.go:307: test Defaulter{AsTime} 1: value '2018-03-27T15:19:17.830050534Z' with error and default 2000-01-01 00:00:00 +0000 UTC 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsTime) value returned with error: 2018-03-27T15:19:17.830050534Z defaulter_test.go:307: test Defaulter{AsTime} 2: value '2018-03-27T15:19:17.830050534Z' without error and default 2000-01-01 00:00:00 +0000 UTC 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsTime) value has illegal format for "time": parsing time "2018-03-27T15:19:17.830050534Z" as "any false layout": cannot parse "2018-03-27T15:19:17.830050534Z" as "any false layout" defaulter_test.go:307: test Defaulter{AsTime} 3: value '' without error and default 2000-01-01 00:00:00 +0000 UTC 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsTime) value has illegal format for "time": parsing time "" as "2006-01-02T15:04:05.999999999Z07:00": cannot parse "" as "2006" --- PASS: TestAsTime (0.00s) === RUN TestAsDuration defaulter_test.go:330: test Defaulter{AsDuration} 0: value '1s' without error and default 1s defaulter_test.go:330: test Defaulter{AsDuration} 1: value '1s' with error and default 1m0s 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsDuration) value returned with error: 1s defaulter_test.go:330: test Defaulter{AsDuration} 2: value '2' without error and default 1m0s 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsDuration) value has illegal format for "duration": time: missing unit in duration 2 defaulter_test.go:330: test Defaulter{AsDuration} 3: value '1 hour' without error and default 1m0s 2018-03-27 15:19:17 Z [ERROR] [github.com/tideland/golib/stringex] (AsDuration) value has illegal format for "duration": time: unknown unit hour in duration 1 hour defaulter_test.go:330: test Defaulter{AsDuration} 4: value '4711h' without error and default 1m0s --- PASS: TestAsDuration (0.00s) === RUN TestDefaulterString --- PASS: TestDefaulterString (0.00s) === RUN TestSplitFilter === RUN TestSplitFilter/all_fine stringex_test.go:80: splitfilter 0: all fine === RUN TestSplitFilter/filter_empty_parts stringex_test.go:80: splitfilter 1: filter empty parts === RUN TestSplitFilter/filter_all_parts stringex_test.go:80: splitfilter 2: filter all parts === RUN TestSplitFilter/filter_empty_input stringex_test.go:80: splitfilter 3: filter empty input === RUN TestSplitFilter/filter_not_splitted stringex_test.go:80: splitfilter 4: filter not splitted --- PASS: TestSplitFilter (0.00s) --- PASS: TestSplitFilter/all_fine (0.00s) --- PASS: TestSplitFilter/filter_empty_parts (0.00s) --- PASS: TestSplitFilter/filter_all_parts (0.00s) --- PASS: TestSplitFilter/filter_empty_input (0.00s) --- PASS: TestSplitFilter/filter_not_splitted (0.00s) === RUN TestSplitMap === RUN TestSplitMap/uppercase_all stringex_test.go:144: splitmap 0: uppercase all === RUN TestSplitMap/filter_empty_parts,_uppercase_the_rest stringex_test.go:144: splitmap 1: filter empty parts, uppercase the rest === RUN TestSplitMap/filter_all_parts stringex_test.go:144: splitmap 2: filter all parts === RUN TestSplitMap/encapsulate_even_empty_input stringex_test.go:144: splitmap 3: encapsulate even empty input === RUN TestSplitMap/uppercase_not_splitted stringex_test.go:144: splitmap 4: uppercase not splitted --- PASS: TestSplitMap (0.00s) --- PASS: TestSplitMap/uppercase_all (0.00s) --- PASS: TestSplitMap/filter_empty_parts,_uppercase_the_rest (0.00s) --- PASS: TestSplitMap/filter_all_parts (0.00s) --- PASS: TestSplitMap/encapsulate_even_empty_input (0.00s) --- PASS: TestSplitMap/uppercase_not_splitted (0.00s) PASS ok github.com/tideland/golib/stringex 0.009s === RUN TestTimeContainments --- PASS: TestTimeContainments (0.00s) === RUN TestBeginOf --- PASS: TestBeginOf (0.00s) === RUN TestEndOf --- PASS: TestEndOf (0.00s) === RUN TestCrontabKeep 2018-03-27 15:19:18 Z [INFO] [github.com/tideland/golib/loop] loop "crontab::10ms" starts --- PASS: TestCrontabKeep (0.05s) === RUN TestCrontabRemove 2018-03-27 15:19:18 Z [INFO] [github.com/tideland/golib/loop] loop "crontab::10ms" stopped 2018-03-27 15:19:18 Z [INFO] [github.com/tideland/golib/loop] loop "crontab::10ms" starts 2018-03-27 15:19:18 Z [INFO] [github.com/tideland/golib/loop] loop "crontab::10ms" stopped --- PASS: TestCrontabRemove (0.25s) === RUN TestCrontabError 2018-03-27 15:19:18 Z [INFO] [github.com/tideland/golib/loop] loop "crontab::10ms" starts 2018-03-27 15:19:18 Z [ERROR] [github.com/tideland/golib/timex.(*Crontab).do] job "remove" removed after error: failed 2018-03-27 15:19:19 Z [INFO] [github.com/tideland/golib/loop] loop "crontab::10ms" stopped --- PASS: TestCrontabError (0.25s) === RUN TestRetrySuccess --- PASS: TestRetrySuccess (0.20s) === RUN TestRetryFuncError --- PASS: TestRetryFuncError (0.00s) === RUN TestRetryTooLong --- PASS: TestRetryTooLong (0.05s) === RUN TestRetryTooOften --- PASS: TestRetryTooOften (0.08s) PASS ok github.com/tideland/golib/timex 0.892s === RUN TestNew version_test.go:98: new test #0: "1.2.3" version_test.go:98: new test #1: "1.0.3" version_test.go:98: new test #2: "1.2.3-alpha.2014-08-03" version_test.go:98: new test #3: "1.2.3-alphabeta.7.11" version_test.go:98: new test #4: "1.2.3+007.a" version_test.go:98: new test #5: "1.2.3-alpha+007.a" version_test.go:98: new test #6: "1.2.3-ALPHA+007.a" --- PASS: TestNew (0.00s) === RUN TestParse version_test.go:212: parse test #0: "1" version_test.go:212: parse test #1: "1.1" version_test.go:212: parse test #2: "1.2.3" version_test.go:212: parse test #3: "1.0.3" version_test.go:212: parse test #4: "1.2.3-alpha.2016-11-14" version_test.go:212: parse test #5: "1.2.3-alphabeta.7.11" version_test.go:212: parse test #6: "1.2.3+007.a" version_test.go:212: parse test #7: "1.2.3-alpha+007.a" version_test.go:212: parse test #8: "1.2.3-ALPHA+007.a" version_test.go:212: parse test #9: "" version_test.go:212: parse test #10: "a" version_test.go:212: parse test #11: "1.a" version_test.go:212: parse test #12: "1,1" version_test.go:212: parse test #13: "-1" version_test.go:212: parse test #14: "1.-1" version_test.go:212: parse test #15: "+" --- PASS: TestParse (0.00s) === RUN TestCompare version_test.go:320: compare test #0: "1.2.3" <> "1.2.3" -> 0 / all version_test.go:320: compare test #1: "1.2.3" <> "1.2.4" -> -1 / patch version_test.go:320: compare test #2: "1.2.3" <> "1.3.3" -> -1 / minor version_test.go:320: compare test #3: "1.2.3" <> "2.2.3" -> -1 / major version_test.go:320: compare test #4: "3.2.1" <> "1.2.3" -> 1 / major version_test.go:320: compare test #5: "1.2.3-alpha" <> "1.2.3" -> -1 / pre-release version_test.go:320: compare test #6: "1.2.3-alpha.1" <> "1.2.3-alpha" -> -1 / pre-release version_test.go:320: compare test #7: "1.2.3-alpha.1" <> "1.2.3-alpha.2" -> -1 / pre-release version_test.go:320: compare test #8: "1.2.3-alpha.4711" <> "1.2.3-alpha.471" -> 1 / pre-release version_test.go:320: compare test #9: "1.2.3-alpha.48" <> "1.2.3-alpha.4711" -> -1 / pre-release version_test.go:320: compare test #10: "1.2.3+alpha.1" <> "1.2.3+alpha.2" -> 0 / all version_test.go:320: compare test #11: "1.2.3+alpha.2" <> "1.2.3+alpha.1" -> 0 / all version_test.go:320: compare test #12: "1.2.3-alpha+alpha.2" <> "1.2.3-alpha+alpha.1" -> 0 / all version_test.go:320: compare test #13: "1.2.3-alpha.48+alpha.2" <> "1.2.3-alpha.4711+alpha.1" -> -1 / pre-release version_test.go:320: compare test #14: "1.2.3-alpha.2" <> "1.2.3-alpha.1b" -> 1 / pre-release --- PASS: TestCompare (0.00s) === RUN TestLess version_test.go:399: less test #0: "1.2.3" <> "1.2.3" -> false version_test.go:399: less test #1: "1.2.3" <> "1.2.4" -> true version_test.go:399: less test #2: "1.2.3" <> "1.3.3" -> true version_test.go:399: less test #3: "1.2.3" <> "2.2.3" -> true version_test.go:399: less test #4: "3.2.1" <> "1.2.3" -> false version_test.go:399: less test #5: "1.2.3-alpha" <> "1.2.3" -> true version_test.go:399: less test #6: "1.2.3-alpha.1" <> "1.2.3-alpha" -> true version_test.go:399: less test #7: "1.2.3-alpha.1" <> "1.2.3-alpha.2" -> true version_test.go:399: less test #8: "1.2.3-alpha.4711" <> "1.2.3-alpha.471" -> false version_test.go:399: less test #9: "1.2.3-alpha.48" <> "1.2.3-alpha.4711" -> true version_test.go:399: less test #10: "1.2.3+alpha.1" <> "1.2.3+alpha.2" -> false version_test.go:399: less test #11: "1.2.3+alpha.2" <> "1.2.3+alpha.1" -> false version_test.go:399: less test #12: "1.2.3-alpha+alpha.2" <> "1.2.3-alpha+alpha.1" -> false version_test.go:399: less test #13: "1.2.3-alpha.48+alpha.2" <> "1.2.3-alpha.4711+alpha.1" -> true version_test.go:399: less test #14: "1.2.3-alpha.2" <> "1.2.3-alpha.1b" -> false --- PASS: TestLess (0.00s) PASS ok github.com/tideland/golib/version 0.010s dh_auto_test: go test -v -p 1 -short github.com/tideland/golib/audit github.com/tideland/golib/cache github.com/tideland/golib/collections github.com/tideland/golib/errors github.com/tideland/golib/etc github.com/tideland/golib/feed/atom github.com/tideland/golib/feed/rss github.com/tideland/golib/feed/utils github.com/tideland/golib/identifier github.com/tideland/golib/logger github.com/tideland/golib/loop github.com/tideland/golib/mapreduce github.com/tideland/golib/monitoring github.com/tideland/golib/numerics github.com/tideland/golib/redis github.com/tideland/golib/scene github.com/tideland/golib/scroller github.com/tideland/golib/sml github.com/tideland/golib/sort github.com/tideland/golib/stringex github.com/tideland/golib/timex github.com/tideland/golib/version returned exit code 1

    opened by jmallach 22
  • cell.ProcessEvent

    cell.ProcessEvent

    https://github.com/tideland/golib/blob/master/cells/cell.go#L137

    This should probably use <-time.After(time.Second) rather than a straight time.Sleep(). I don't have a test case for it yet, but I did see in some of my code where if eventc got backed up a little then the ProcessEvent loop would pause for one second, even though it was able to continue processing after only a few milliseconds.

    func (c *cell) ProcessEvent(event Event) error {
        start := time.Now()
        for {
            select {
            case c.eventc <- event:
                return nil
            case <-c.loop.IsStopping():
                return errors.New(ErrInactive, errorMessages, c.id)
            case <-time.After(time.Second):
                now := time.Now()
                if now.Sub(start) > c.emitTimeout {
                    op := fmt.Sprintf("emitting %q to %q", event.Topic(), c.id)
                    return errors.New(ErrTimeout, errorMessages, op)
                }
            }
        }
    }
    
    opened by kung-foo 13
  • Redesign of bad and inflexible caching approach

    Redesign of bad and inflexible caching approach

    • Individual caches instead of a central one
    • Cacheable objects are defined by implementing interfaces
    • Loading is done asynchronously
    • Cached or loaded instance or error are delivered via channel inside of getter
    • Getter variant with timeout
    opened by themue 4
  • fix panic when stopping cell with bi-directional subscriptions

    fix panic when stopping cell with bi-directional subscriptions

    When A subscribes to B and B subscribes to A, and you stop A, and then B, the call to stop B panics because there is a leftover entry in its subscriptions field.

    The new test case will panic without the fix.

    opened by kung-foo 3
  • possible race condition on cell.subscribers

    possible race condition on cell.subscribers

    Using go build -race I noticed a race condition when using cell.SubscribersDo().

    In cell.backendLoop() there is a write to c.subscribers after reading from the subscriberc channel. The SubscribersDo should probably go through a ReadLock?

    opened by kung-foo 2
  • Basic usage information for getting started with logger

    Basic usage information for getting started with logger

    Today I got a little stuck when starting to use logger. I had to scan reference documentation to figure it out. A little getting started or basic usage guide would had helped me to save some time and get the concept of e.g. different loggers (like Gologger, StandardLogger, etc.).

    I've created very basic usage information for logger and pushed it to https://github.com/vondeetzen/golib in order to get some feedback. Thanks in advance.

    opened by vondeetzen 1
  • Integrate generation of names into generator of sentences

    Integrate generation of names into generator of sentences

    • Audit test data generator knows sentences and paragraphs
    • It also knows names
    • Sometimes integrates names make sentences and paragraphs look even more realistic
    Priority: Low Type: Enhancement Status: Abandoned 
    opened by themue 0
  • Provide a new reporting type/package

    Provide a new reporting type/package

    • Should be used instead of global logging
    • Reporter interface has to be retrieved from context
    • Reporter provides Log(id string) Logger, which knows standards like Debugf() to Fatalf()
    • Reporter provides Dump(id string) Dumper, which allows to store named data dumps
    • The IDs allow to configure individual logger and dumper
    • Go Library packages (and other depending ones) will be changed to use this reporter later
    • So step by step no Tideland package logs wildly
    Priority: Normal Type: Enhancement Status: Abandoned 
    opened by themue 0
  • Add Assertion.WaitTested()

    Add Assertion.WaitTested()

    • Like Assertion.Wait()
    • Second argument is a function having and interface for the received data as argument and an error as return value
    • WaitTested() runs the function passing the retrieved data and tests the returned error for nil
    • Inside the function the user can add more assertions
    opened by themue 0
  • Add query method to GJP document

    Add query method to GJP document

    • Query(query string) (PathValue, error)
    • query is a path with wildcard elements
    • PathValues is a slice of PathValue which are a combination of the matching path and its value
    opened by themue 0
  • Add Diff() to package GJP

    Add Diff() to package GJP

    Function gjp.Diff(a,b []byte, separator string) (Diff, error).

    Diff provides:

    • DocumentA()and DocumentB()
    • Differences() []string where the strings are the paths containing differences
    • DifferenceAt(path string) (Values, error) returns the different values at the given path

    Values provides:

    • ValueA() Value
    • ValueB() Value
    opened by themue 0
  • Color

    Color

    I can create this file:

    package main
    import (
       "github.com/tideland/golib/logger"
    )
    func main() {
       logger.Infof("aaaaa bbbbb")
    }
    

    but it outputs in black and white. Is color an option?

    opened by ghost 0
Releases(v4.24.2)
Owner
Tideland
Tideland Open-Source Software
Tideland
Simple and blazing fast lockfree logging library for golang

glg is simple golang logging library Requirement Go 1.11 Installation go get github.com/kpango/glg Example package main import ( "net/http" "time"

Yusuke Kato 175 Nov 28, 2022
Logging library for Golang

GLO Logging library for Golang Inspired by Monolog for PHP, severity levels are identical Install go get github.com/lajosbencz/glo Severity levels Deb

Lajos Bencz 15 Sep 26, 2022
The Simplest and worst logging library ever written

gologger A Simple Easy to use go logger library. Displays Colored log into console in any unix or windows platform. You can even store your logs in fi

Sadlil Rhythom 41 Sep 26, 2022
Gomol is a library for structured, multiple-output logging for Go with extensible logging outputs

gomol Gomol (Go Multi-Output Logger) is an MIT-licensed structured logging library for Go. Gomol grew from a desire to have a structured logging libra

Kristin Davidson 19 Sep 26, 2022
Minimalistic logging library for Go.

logger Minimalistic logging library for Go. Blog Post Features: Advanced output filters (package and/or level) Attributes Timers for measuring perform

Azer Koçulu 158 Nov 16, 2022
Seelog is a native Go logging library that provides flexible asynchronous dispatching, filtering, and formatting.

Seelog Seelog is a powerful and easy-to-learn logging framework that provides functionality for flexible dispatching, filtering, and formatting log me

Seelog project repository 1.6k Jan 3, 2023
A pure Go contextual logging library with "batteries included"

Cue Overview Cue implements contextual logging with "batteries included". It has thorough test coverage and supports logging to stdout/stderr, file, s

Bob Ziuchkovski 26 Sep 16, 2019
Golang logging library

Golang logging library Package logging implements a logging infrastructure for Go. Its output format is customizable and supports different logging ba

Örjan Fors 1.8k Dec 27, 2022
Library and program to parse and forward HAProxy logs

haminer Library and program to parse and forward HAProxy logs. Supported forwarder, Influxdb Requirements Go for building from source code git for dow

Shulhan 22 Aug 17, 2022
A flexible process data collection, metrics, monitoring, instrumentation, and tracing client library for Go

Package monkit is a flexible code instrumenting and data collection library. See documentation at https://godoc.org/gopkg.in/spacemonkeygo/monkit.v3 S

Space Monkey Go 470 Dec 14, 2022
Hierarchical, leveled, and structured logging library for Go

spacelog Please see http://godoc.org/github.com/spacemonkeygo/spacelog for info License Copyright (C) 2014 Space Monkey, Inc. Licensed under the Apach

Space Monkey Go 98 Apr 27, 2021
OpenTelemetry log collection library

opentelemetry-log-collection Status This project was originally developed by observIQ under the name Stanza. It has been contributed to the OpenTeleme

OpenTelemetry - CNCF 90 Sep 15, 2022
Simple and extensible monitoring agent / library for Kubernetes: https://gravitational.com/blog/monitoring_kubernetes_satellite/

Satellite Satellite is an agent written in Go for collecting health information in a kubernetes cluster. It is both a library and an application. As a

Teleport 197 Nov 10, 2022
Minimal structured logging library for Go

slog slog is a minimal structured logging library for Go. Install go get cdr.dev/slog Features Minimal API First class context.Context support First c

Coder 255 Dec 29, 2022
Litter is a pretty printer library for Go data structures to aid in debugging and testing.

Litter Litter is a pretty printer library for Go data structures to aid in debugging and testing. Litter is provided by Sanity: The Headless CMS Const

Sanity 1.4k Dec 28, 2022
User-friendly Go library for building Grafana dashboards

Grabana Grabana provides a developer-friendly way of creating Grafana dashboards. Whether you prefer writing code or YAML, if you are looking for a wa

Kévin Gomez 487 Dec 16, 2022
OS system statistics library for Go

OS system statistics library for Go This is a library to get system metrics like cpu load and memory usage. The library is created for mackerel-agent.

Mackerel 275 Dec 9, 2022
GoVector is a vector clock logging library written in Go.

GoVector is a vector clock logging library written in Go. The vector clock algorithm is used to order events in distributed systems in the absence of a centralized clock. GoVector implements the vector clock algorithm and provides feature-rich logging and encoding infrastructure.

Distributed clocks 165 Nov 28, 2022
Parametrized JSON logging library in Golang which lets you obfuscate sensitive data and marshal any kind of content.

Noodlog Summary Noodlog is a Golang JSON parametrized and highly configurable logging library. It allows you to: print go structs as JSON messages; pr

Gyoza Tech 42 Oct 27, 2022