Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Null config for testing #73

Open
wants to merge 2 commits into
base: release-candidate
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"
A LaunchpadCommandLineHandlerTest is a test class for testing the behavior of LaunchpadCommandLineHandler
"
Class {
#name : 'LaunchpadZnHelloApplicationTest',
#superclass : 'LaunchpadTest',
#category : 'Launchpad-Commands-Tests',
#package : 'Launchpad-Commands-Tests'
}

{ #category : 'tests' }
LaunchpadZnHelloApplicationTest >> testConfigParsingInValidLogLevel [
"Verify the launchpad handler properly handles non numeric input"

| application mockContext config |

"Test passing a non-numeric log level parameter"
config := NullConfigurationProvider new
atName: #'log-level' putValue: 'false';
yourself.

application := LaunchpadZnHelloApplication
runningIn: DebuggingApplicationMode new
configuredBy: config
controlledBy: NullCommandServer new.

"Expect the Launchpad application to handle the error and substitute a loglevel of 0"
mockContext := MockObject new
on: #runZnHelloWithPort:debugLevel:
with: 8181
with: 0;
yourself.

application basicStartWithin: mockContext.

mockContext verifyIn: self
]

{ #category : 'tests' }
LaunchpadZnHelloApplicationTest >> testConfigParsingValidLogLevel [
"Verify the launchpad handler correctly parses the paramter to an integer"

| application mockContext config |

config := NullConfigurationProvider new
atName: #'log-level' putValue: '2';
yourself.

application := LaunchpadZnHelloApplication
runningIn: DebuggingApplicationMode new
configuredBy: config
controlledBy: NullCommandServer new.

mockContext := MockObject new
on: #runZnHelloWithPort:debugLevel:
with: 8181
with: 2;
yourself.

application basicStartWithin: mockContext.

mockContext verifyIn: self
]

{ #category : 'tests' }
LaunchpadZnHelloApplicationTest >> testDryRunApplication [

self
should: [
LaunchpadCommandLineHandler activateWithArguments:
#( 'launchpad' 'start' '--dry-run' 'znHello' )
]
raise: Exit
withExceptionDo: [ :exit | self assert: exit isSuccess ]

]
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,7 @@ LaunchpadCommandLineHandler >> activateWithContext: context [
StandardStreamLogger onStandardError startFor:
( LogRecord where: [ :record | record isInformational not ] ).

LogRecord emitInfo: 'Launchpad processing command line parameters'.

^ LaunchpadRootCommand new evaluateWithin: context
]
52 changes: 24 additions & 28 deletions source/Launchpad-Configuration/ApplicationConfiguration.class.st
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
Class {
#name : 'ApplicationConfiguration',
#superclass : 'Object',
#name : #ApplicationConfiguration,
#superclass : #Object,
#instVars : [
'parameters',
'provider',
'values'
],
#category : 'Launchpad-Configuration',
#package : 'Launchpad-Configuration',
#'gs_options' : [
'dbTransient'
]
#category : 'Launchpad-Configuration'
}

{ #category : 'instance creation' }
{ #category : #'instance creation' }
ApplicationConfiguration class >> forAll: parameters providedBy: aConfigurationProvider [

^ self new initializeForAll: parameters providedBy: aConfigurationProvider
]

{ #category : 'converting' }
{ #category : #converting }
ApplicationConfiguration >> asCommandLineOn: stream [

( parameters sorted: #commandLineArgumentName ascending ) do: [ :parameter |
Expand All @@ -32,7 +28,7 @@ ApplicationConfiguration >> asCommandLineOn: stream [
]
]

{ #category : 'converting' }
{ #category : #converting }
ApplicationConfiguration >> asEnvironmentOn: stream [

( parameters sorted: #environmentVariableName ascending ) do: [ :parameter |
Expand All @@ -48,7 +44,7 @@ ApplicationConfiguration >> asEnvironmentOn: stream [
]
]

{ #category : 'private' }
{ #category : #private }
ApplicationConfiguration >> asIniFile: aParameterCollection on: stream [

( aParameterCollection sorted: #attributeName ascending ) do: [ :parameter |
Expand All @@ -66,7 +62,7 @@ ApplicationConfiguration >> asIniFile: aParameterCollection on: stream [
]
]

{ #category : 'converting' }
{ #category : #converting }
ApplicationConfiguration >> asIniFileOn: stream [

| settingsInSection |
Expand All @@ -86,13 +82,13 @@ ApplicationConfiguration >> asIniFileOn: stream [
]
]

{ #category : 'converting' }
{ #category : #converting }
ApplicationConfiguration >> asJson [

^ String streamContents: [ :stream | self asJsonOn: stream ]
]

{ #category : 'converting' }
{ #category : #converting }
ApplicationConfiguration >> asJsonOn: stream [

^ ( NeoJSONWriterSortingKeys on: stream )
Expand All @@ -101,7 +97,7 @@ ApplicationConfiguration >> asJsonOn: stream [
nextPut: values
]

{ #category : 'private' }
{ #category : #private }
ApplicationConfiguration >> assert: section isNotInConflictWithParameterNamed: name [

"Sections in the configuration are instances of NeoJSONObject, if we get
Expand All @@ -112,7 +108,7 @@ ApplicationConfiguration >> assert: section isNotInConflictWithParameterNamed: n
raising: ConflictingObjectFound
]

{ #category : 'private' }
{ #category : #private }
ApplicationConfiguration >> containingSectionFor: parameter startingAt: resolvedValues [

| currentSection |
Expand All @@ -126,21 +122,21 @@ ApplicationConfiguration >> containingSectionFor: parameter startingAt: resolved
^ currentSection
]

{ #category : 'reflective operations' }
{ #category : #'reflective operations' }
ApplicationConfiguration >> doesNotUnderstand: message [

^ self valueAt: message selector ifAbsent: [ super doesNotUnderstand: message ]
]

{ #category : 'initialization' }
{ #category : #initialization }
ApplicationConfiguration >> initializeForAll: aParameterCollection providedBy: aConfigurationProvider [

parameters := aParameterCollection.
provider := aConfigurationProvider.
self resolveParameterValues
]

{ #category : 'private' }
{ #category : #private }
ApplicationConfiguration >> missingConfigurationFor: parameter [

LogRecord emitError:
Expand All @@ -149,20 +145,20 @@ ApplicationConfiguration >> missingConfigurationFor: parameter [
( '"<1s>" parameter not present.' expandMacrosWith: parameter name )
]

{ #category : 'accessing' }
{ #category : #accessing }
ApplicationConfiguration >> parameters [

^ parameters
]

{ #category : 'actions' }
{ #category : #actions }
ApplicationConfiguration >> reload [

provider reloadConfiguration.
self resolveParameterValues
]

{ #category : 'initialization' }
{ #category : #initialization }
ApplicationConfiguration >> resolveParameterValues [

| section resolvedValues |
Expand All @@ -181,39 +177,39 @@ ApplicationConfiguration >> resolveParameterValues [
self synchronizeValuesWith: resolvedValues
]

{ #category : 'reflective operations' }
{ #category : #'reflective operations' }
ApplicationConfiguration >> respondsTo: selector [

^ ( super respondsTo: selector ) or: [ values includesKey: selector ]
]

{ #category : 'private' }
{ #category : #private }
ApplicationConfiguration >> signalAsConflictingParameter: parameter [

ConflictingObjectFound signal: ( 'Conflicting parameter: "<1s>"' expandMacrosWith: parameter name )
]

{ #category : 'private' }
{ #category : #private }
ApplicationConfiguration >> synchronizeValuesWith: resolvedValues [

values := resolvedValues
]

{ #category : 'accessing' }
{ #category : #accessing }
ApplicationConfiguration >> valueAt: aKey [

^ self valueAt: aKey ifAbsent: [ KeyNotFound signalFor: aKey ]
]

{ #category : 'accessing' }
{ #category : #accessing }
ApplicationConfiguration >> valueAt: aKey ifAbsent: aBlock [
"For configuration access without DNU handling, provide standard Dictionary api.
With normal configuration parameters, there should never be an absent value, but provide the standard ifAbsent option for correctness"

^ values at: aKey ifAbsent: aBlock
]

{ #category : 'accessing' }
{ #category : #accessing }
ApplicationConfiguration >> valueFor: aParameter [

| section |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,40 +1,39 @@
Class {
#name : 'ConfigurationFromCommandLineProvider',
#superclass : 'ConfigurationProvider',
#name : #ConfigurationFromCommandLineProvider,
#superclass : #ConfigurationProvider,
#instVars : [
'commandLine',
'nextProvider'
],
#category : 'Launchpad-Configuration',
#package : 'Launchpad-Configuration'
#category : 'Launchpad-Configuration'
}

{ #category : 'instance creation' }
{ #category : #'instance creation' }
ConfigurationFromCommandLineProvider class >> over: aCommandLine [

^ self over: aCommandLine chainedWith: NullConfigurationProvider new
]

{ #category : 'instance creation' }
{ #category : #'instance creation' }
ConfigurationFromCommandLineProvider class >> over: aCommandLine chainedWith: aConfigurationProvider [

^ self new initializeOver: aCommandLine chainedWith: aConfigurationProvider
]

{ #category : 'initialization' }
{ #category : #initialization }
ConfigurationFromCommandLineProvider >> initializeOver: aCommandLine chainedWith: aConfigurationProvider [

commandLine := aCommandLine.
nextProvider := aConfigurationProvider
]

{ #category : 'initialization' }
{ #category : #initialization }
ConfigurationFromCommandLineProvider >> reloadConfiguration [

nextProvider reloadConfiguration
]

{ #category : 'resolving' }
{ #category : #resolving }
ConfigurationFromCommandLineProvider >> valueFor: aConfigurationParameter ifFound: aPresentBlock ifNone: aFailBlock [

^ commandLine optionAt: aConfigurationParameter commandLineArgumentName
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,37 @@
Class {
#name : 'ConfigurationFromEnvironmentProvider',
#superclass : 'ConfigurationProvider',
#name : #ConfigurationFromEnvironmentProvider,
#superclass : #ConfigurationProvider,
#instVars : [
'nextProvider'
],
#category : 'Launchpad-Configuration',
#package : 'Launchpad-Configuration'
#category : 'Launchpad-Configuration'
}

{ #category : 'instance creation' }
{ #category : #'instance creation' }
ConfigurationFromEnvironmentProvider class >> chainedWith: aConfigurationProvider [

^ super new initializeChainedWith: aConfigurationProvider
]

{ #category : 'instance creation' }
{ #category : #'instance creation' }
ConfigurationFromEnvironmentProvider class >> new [

^ self chainedWith: NullConfigurationProvider new
]

{ #category : 'initialization' }
{ #category : #initialization }
ConfigurationFromEnvironmentProvider >> initializeChainedWith: aConfigurationProvider [

nextProvider := aConfigurationProvider
]

{ #category : 'initialization' }
{ #category : #initialization }
ConfigurationFromEnvironmentProvider >> reloadConfiguration [

^ nextProvider reloadConfiguration
]

{ #category : 'resolving' }
{ #category : #resolving }
ConfigurationFromEnvironmentProvider >> valueFor: aConfigurationParameter ifFound: aPresentBlock ifNone: aFailBlock [

^ LanguagePlatform current os
Expand Down
Loading
Loading