2017-06-26 23:46:34 +02:00
|
|
|
// Copyright 2016-2017, Pulumi Corporation. All rights reserved.
|
2016-11-17 02:52:14 +01:00
|
|
|
|
|
|
|
package diag
|
|
|
|
|
|
|
|
import (
|
2017-02-23 03:53:36 +01:00
|
|
|
"io"
|
2016-11-17 02:52:14 +01:00
|
|
|
"io/ioutil"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
2017-06-03 03:35:53 +02:00
|
|
|
func discardSink() Sink {
|
2016-11-17 02:52:14 +01:00
|
|
|
// Create a new default sink with /dev/null writers to avoid spamming the test log.
|
2017-12-14 20:53:02 +01:00
|
|
|
return newDefaultSink(FormatOptions{Color: Always}, map[Severity]io.Writer{
|
2017-07-14 02:09:46 +02:00
|
|
|
Debug: ioutil.Discard,
|
2017-02-23 03:53:36 +01:00
|
|
|
Info: ioutil.Discard,
|
Improve output formatting
This change improves our output formatting by generally adding
fewer prefixes. As shown in pulumi/pulumi#359, we were being
excessively verbose in many places, including prefixing every
console.out with "langhost[nodejs].stdout: ", displaying full
stack traces for simple errors like missing configuration, etc.
Overall, this change includes the following:
* Don't prefix stdout and stderr output from the program, other
than the standard "info:" prefix. I experimented with various
schemes here, but they all felt gratuitous. Simply emitting
the output seems fine, especially as it's closer to what would
happen if you just ran the program under node.
* Do NOT make writes to stderr fail the plan/deploy. Previously
we assumed that any console.errors, for instance, meant that
the overall program should fail. This simply isn't how stderr
is treated generally and meant you couldn't use certain
logging techniques and libraries, among other things.
* Do make sure that stderr writes in the program end up going to
stderr in the Pulumi CLI output, however, so that redirection
works as it should. This required a new Infoerr log level.
* Make a small fix to the planning logic so we don't attempt to
print the summary if an error occurs.
* Finally, add a new error type, RunError, that when thrown and
uncaught does not result in a full stack trace being printed.
Anyone can use this, however, we currently use it for config
errors so that we can terminate with a pretty error message,
rather than the monstrosity shown in pulumi/pulumi#359.
2017-09-23 14:20:11 +02:00
|
|
|
Infoerr: ioutil.Discard,
|
2017-02-23 03:53:36 +01:00
|
|
|
Error: ioutil.Discard,
|
|
|
|
Warning: ioutil.Discard,
|
|
|
|
})
|
2017-06-03 03:35:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCounts(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
sink := discardSink()
|
2016-11-17 02:52:14 +01:00
|
|
|
|
|
|
|
const numEach = 10
|
|
|
|
|
|
|
|
for i := 0; i < numEach; i++ {
|
Introduce an interface to read config
This change adds an engine gRPC interface, and associated implementation,
so that plugins may do interesting things that require "phoning home".
Previously, the engine would fire up plugins and talk to them directly,
but there was no way for a plugin to ask the engine to do anything.
The motivation here is so that plugins can read evaluator state, such
as config information, but this change also allows richer logging
functionality than previously possible. We will still auto-log any
stdout/stderr writes; however, explicit errors, warnings, informational,
and even debug messages may be written over the Log API.
2017-06-21 04:45:07 +02:00
|
|
|
assert.Equal(t, sink.Debugs(), 0, "expected debugs pre to stay at zero")
|
2017-02-23 03:53:36 +01:00
|
|
|
assert.Equal(t, sink.Infos(), 0, "expected infos pre to stay at zero")
|
Improve output formatting
This change improves our output formatting by generally adding
fewer prefixes. As shown in pulumi/pulumi#359, we were being
excessively verbose in many places, including prefixing every
console.out with "langhost[nodejs].stdout: ", displaying full
stack traces for simple errors like missing configuration, etc.
Overall, this change includes the following:
* Don't prefix stdout and stderr output from the program, other
than the standard "info:" prefix. I experimented with various
schemes here, but they all felt gratuitous. Simply emitting
the output seems fine, especially as it's closer to what would
happen if you just ran the program under node.
* Do NOT make writes to stderr fail the plan/deploy. Previously
we assumed that any console.errors, for instance, meant that
the overall program should fail. This simply isn't how stderr
is treated generally and meant you couldn't use certain
logging techniques and libraries, among other things.
* Do make sure that stderr writes in the program end up going to
stderr in the Pulumi CLI output, however, so that redirection
works as it should. This required a new Infoerr log level.
* Make a small fix to the planning logic so we don't attempt to
print the summary if an error occurs.
* Finally, add a new error type, RunError, that when thrown and
uncaught does not result in a full stack trace being printed.
Anyone can use this, however, we currently use it for config
errors so that we can terminate with a pretty error message,
rather than the monstrosity shown in pulumi/pulumi#359.
2017-09-23 14:20:11 +02:00
|
|
|
assert.Equal(t, sink.Infoerrs(), 0, "expected infoerrs pre to stay at zero")
|
2016-11-17 02:52:14 +01:00
|
|
|
assert.Equal(t, sink.Errors(), 0, "expected errors pre to stay at zero")
|
|
|
|
assert.Equal(t, sink.Warnings(), i, "expected warnings pre to be at iteration count")
|
|
|
|
sink.Warningf(&Diag{Message: "A test of the emergency warning system: %v."}, i)
|
2017-02-23 03:53:36 +01:00
|
|
|
assert.Equal(t, sink.Infos(), 0, "expected infos post to stay at zero")
|
Improve output formatting
This change improves our output formatting by generally adding
fewer prefixes. As shown in pulumi/pulumi#359, we were being
excessively verbose in many places, including prefixing every
console.out with "langhost[nodejs].stdout: ", displaying full
stack traces for simple errors like missing configuration, etc.
Overall, this change includes the following:
* Don't prefix stdout and stderr output from the program, other
than the standard "info:" prefix. I experimented with various
schemes here, but they all felt gratuitous. Simply emitting
the output seems fine, especially as it's closer to what would
happen if you just ran the program under node.
* Do NOT make writes to stderr fail the plan/deploy. Previously
we assumed that any console.errors, for instance, meant that
the overall program should fail. This simply isn't how stderr
is treated generally and meant you couldn't use certain
logging techniques and libraries, among other things.
* Do make sure that stderr writes in the program end up going to
stderr in the Pulumi CLI output, however, so that redirection
works as it should. This required a new Infoerr log level.
* Make a small fix to the planning logic so we don't attempt to
print the summary if an error occurs.
* Finally, add a new error type, RunError, that when thrown and
uncaught does not result in a full stack trace being printed.
Anyone can use this, however, we currently use it for config
errors so that we can terminate with a pretty error message,
rather than the monstrosity shown in pulumi/pulumi#359.
2017-09-23 14:20:11 +02:00
|
|
|
assert.Equal(t, sink.Infoerrs(), 0, "expected infoerrs post to stay at zero")
|
2016-11-17 02:52:14 +01:00
|
|
|
assert.Equal(t, sink.Errors(), 0, "expected errors post to stay at zero")
|
|
|
|
assert.Equal(t, sink.Warnings(), i+1, "expected warnings post to be at iteration count+1")
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < numEach; i++ {
|
Introduce an interface to read config
This change adds an engine gRPC interface, and associated implementation,
so that plugins may do interesting things that require "phoning home".
Previously, the engine would fire up plugins and talk to them directly,
but there was no way for a plugin to ask the engine to do anything.
The motivation here is so that plugins can read evaluator state, such
as config information, but this change also allows richer logging
functionality than previously possible. We will still auto-log any
stdout/stderr writes; however, explicit errors, warnings, informational,
and even debug messages may be written over the Log API.
2017-06-21 04:45:07 +02:00
|
|
|
assert.Equal(t, sink.Debugs(), 0, "expected debugs pre to stay at zero")
|
2017-02-23 03:53:36 +01:00
|
|
|
assert.Equal(t, sink.Infos(), 0, "expected infos pre to stay at zero")
|
Improve output formatting
This change improves our output formatting by generally adding
fewer prefixes. As shown in pulumi/pulumi#359, we were being
excessively verbose in many places, including prefixing every
console.out with "langhost[nodejs].stdout: ", displaying full
stack traces for simple errors like missing configuration, etc.
Overall, this change includes the following:
* Don't prefix stdout and stderr output from the program, other
than the standard "info:" prefix. I experimented with various
schemes here, but they all felt gratuitous. Simply emitting
the output seems fine, especially as it's closer to what would
happen if you just ran the program under node.
* Do NOT make writes to stderr fail the plan/deploy. Previously
we assumed that any console.errors, for instance, meant that
the overall program should fail. This simply isn't how stderr
is treated generally and meant you couldn't use certain
logging techniques and libraries, among other things.
* Do make sure that stderr writes in the program end up going to
stderr in the Pulumi CLI output, however, so that redirection
works as it should. This required a new Infoerr log level.
* Make a small fix to the planning logic so we don't attempt to
print the summary if an error occurs.
* Finally, add a new error type, RunError, that when thrown and
uncaught does not result in a full stack trace being printed.
Anyone can use this, however, we currently use it for config
errors so that we can terminate with a pretty error message,
rather than the monstrosity shown in pulumi/pulumi#359.
2017-09-23 14:20:11 +02:00
|
|
|
assert.Equal(t, sink.Infoerrs(), 0, "expected infoerrs pre to stay at zero")
|
2016-11-17 02:52:14 +01:00
|
|
|
assert.Equal(t, sink.Errors(), i, "expected errors pre to be at iteration count")
|
|
|
|
assert.Equal(t, sink.Warnings(), numEach, "expected warnings pre to stay at numEach")
|
|
|
|
sink.Errorf(&Diag{Message: "A test of the emergency error system: %v."}, i)
|
Introduce an interface to read config
This change adds an engine gRPC interface, and associated implementation,
so that plugins may do interesting things that require "phoning home".
Previously, the engine would fire up plugins and talk to them directly,
but there was no way for a plugin to ask the engine to do anything.
The motivation here is so that plugins can read evaluator state, such
as config information, but this change also allows richer logging
functionality than previously possible. We will still auto-log any
stdout/stderr writes; however, explicit errors, warnings, informational,
and even debug messages may be written over the Log API.
2017-06-21 04:45:07 +02:00
|
|
|
assert.Equal(t, sink.Debugs(), 0, "expected deugs post to stay at zero")
|
2017-02-23 03:53:36 +01:00
|
|
|
assert.Equal(t, sink.Infos(), 0, "expected infos post to stay at zero")
|
Improve output formatting
This change improves our output formatting by generally adding
fewer prefixes. As shown in pulumi/pulumi#359, we were being
excessively verbose in many places, including prefixing every
console.out with "langhost[nodejs].stdout: ", displaying full
stack traces for simple errors like missing configuration, etc.
Overall, this change includes the following:
* Don't prefix stdout and stderr output from the program, other
than the standard "info:" prefix. I experimented with various
schemes here, but they all felt gratuitous. Simply emitting
the output seems fine, especially as it's closer to what would
happen if you just ran the program under node.
* Do NOT make writes to stderr fail the plan/deploy. Previously
we assumed that any console.errors, for instance, meant that
the overall program should fail. This simply isn't how stderr
is treated generally and meant you couldn't use certain
logging techniques and libraries, among other things.
* Do make sure that stderr writes in the program end up going to
stderr in the Pulumi CLI output, however, so that redirection
works as it should. This required a new Infoerr log level.
* Make a small fix to the planning logic so we don't attempt to
print the summary if an error occurs.
* Finally, add a new error type, RunError, that when thrown and
uncaught does not result in a full stack trace being printed.
Anyone can use this, however, we currently use it for config
errors so that we can terminate with a pretty error message,
rather than the monstrosity shown in pulumi/pulumi#359.
2017-09-23 14:20:11 +02:00
|
|
|
assert.Equal(t, sink.Infoerrs(), 0, "expected infoerrs post to stay at zero")
|
2016-11-17 02:52:14 +01:00
|
|
|
assert.Equal(t, sink.Errors(), i+1, "expected errors post to be at iteration count+1")
|
|
|
|
assert.Equal(t, sink.Warnings(), numEach, "expected warnings post to stay at numEach")
|
|
|
|
}
|
|
|
|
}
|
2017-06-03 03:35:53 +02:00
|
|
|
|
|
|
|
// TestEscape ensures that arguments containing format-like characters aren't interpreted as such.
|
|
|
|
func TestEscape(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
sink := discardSink()
|
|
|
|
|
|
|
|
// Passing % chars in the argument should not yield %!(MISSING)s.
|
Introduce an interface to read config
This change adds an engine gRPC interface, and associated implementation,
so that plugins may do interesting things that require "phoning home".
Previously, the engine would fire up plugins and talk to them directly,
but there was no way for a plugin to ask the engine to do anything.
The motivation here is so that plugins can read evaluator state, such
as config information, but this change also allows richer logging
functionality than previously possible. We will still auto-log any
stdout/stderr writes; however, explicit errors, warnings, informational,
and even debug messages may be written over the Log API.
2017-06-21 04:45:07 +02:00
|
|
|
s := sink.Stringify(Error, Message("%s"), "lots of %v %s %d chars")
|
2017-06-03 03:35:53 +02:00
|
|
|
assert.Equal(t, "error: lots of %v %s %d chars\n", s)
|
|
|
|
|
|
|
|
// Passing % chars in the format string, on the other hand, should.
|
Introduce an interface to read config
This change adds an engine gRPC interface, and associated implementation,
so that plugins may do interesting things that require "phoning home".
Previously, the engine would fire up plugins and talk to them directly,
but there was no way for a plugin to ask the engine to do anything.
The motivation here is so that plugins can read evaluator state, such
as config information, but this change also allows richer logging
functionality than previously possible. We will still auto-log any
stdout/stderr writes; however, explicit errors, warnings, informational,
and even debug messages may be written over the Log API.
2017-06-21 04:45:07 +02:00
|
|
|
smiss := sink.Stringify(Error, Message("lots of %v %s %d chars"))
|
2017-06-03 03:35:53 +02:00
|
|
|
assert.Equal(t, "error: lots of %!v(MISSING) %!s(MISSING) %!d(MISSING) chars\n", smiss)
|
|
|
|
}
|