Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
f530b809
Unverified
Commit
f530b809
authored
Jun 10, 2019
by
Jonah Williams
Committed by
GitHub
Jun 10, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reland: More verification on flutter build web, add tests and cleanup (#34173)
parent
7a877f62
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
236 additions
and
51 deletions
+236
-51
application_package.dart
packages/flutter_tools/lib/src/application_package.dart
+3
-0
project.dart
packages/flutter_tools/lib/src/project.dart
+5
-2
resident_web_runner.dart
packages/flutter_tools/lib/src/resident_web_runner.dart
+10
-2
compile.dart
packages/flutter_tools/lib/src/web/compile.dart
+3
-0
build_linux_test.dart
packages/flutter_tools/test/commands/build_linux_test.dart
+23
-14
build_macos_test.dart
packages/flutter_tools/test/commands/build_macos_test.dart
+25
-15
build_web_test.dart
packages/flutter_tools/test/commands/build_web_test.dart
+98
-0
build_windows_test.dart
packages/flutter_tools/test/commands/build_windows_test.dart
+28
-17
testbed.dart
packages/flutter_tools/test/src/testbed.dart
+41
-1
No files found.
packages/flutter_tools/lib/src/application_package.dart
View file @
f530b809
...
...
@@ -57,6 +57,9 @@ class ApplicationPackageFactory {
?
MacOSApp
.
fromMacOSProject
(
FlutterProject
.
current
().
macos
)
:
MacOSApp
.
fromPrebuiltApp
(
applicationBinary
);
case
TargetPlatform
.
web_javascript
:
if
(!
FlutterProject
.
current
().
web
.
existsSync
())
{
return
null
;
}
return
WebApplicationPackage
(
FlutterProject
.
current
());
case
TargetPlatform
.
linux_x64
:
return
applicationBinary
==
null
...
...
packages/flutter_tools/lib/src/project.dart
View file @
f530b809
...
...
@@ -580,11 +580,14 @@ class WebProject {
/// Whether this flutter project has a web sub-project.
bool
existsSync
()
{
return
parent
.
directory
.
childDirectory
(
'web'
).
existsSync
();
return
parent
.
directory
.
childDirectory
(
'web'
).
existsSync
()
&&
indexFile
.
existsSync
();
}
/// The html file used to host the flutter web application.
File
get
indexFile
=>
parent
.
directory
.
childDirectory
(
'web'
).
childFile
(
'index.html'
);
File
get
indexFile
=>
parent
.
directory
.
childDirectory
(
'web'
)
.
childFile
(
'index.html'
);
Future
<
void
>
ensureReadyForPlatformSpecificTooling
()
async
{}
}
...
...
packages/flutter_tools/lib/src/resident_web_runner.dart
View file @
f530b809
...
...
@@ -7,6 +7,7 @@ import 'dart:async';
import
'package:meta/meta.dart'
;
import
'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
;
import
'application_package.dart'
;
import
'asset.dart'
;
import
'base/common.dart'
;
import
'base/file_system.dart'
;
...
...
@@ -112,7 +113,14 @@ class ResidentWebRunner extends ResidentRunner {
String
route
,
bool
shouldBuild
=
true
,
})
async
{
final
FlutterProject
currentProject
=
FlutterProject
.
current
();
final
ApplicationPackage
package
=
await
ApplicationPackageFactory
.
instance
.
getPackageForPlatform
(
TargetPlatform
.
web_javascript
,
applicationBinary:
null
,
);
if
(
package
==
null
)
{
printError
(
'No application found for TargetPlatform.web_javascript'
);
return
1
;
}
if
(!
fs
.
isFileSync
(
mainPath
))
{
String
message
=
'Tried to run
$mainPath
, but that file does not exist.'
;
if
(
target
==
null
)
{
...
...
@@ -124,7 +132,7 @@ class ResidentWebRunner extends ResidentRunner {
}
// Start the web compiler and build the assets.
await
webCompilationProxy
.
initialize
(
projectDirectory:
currentProject
.
directory
,
projectDirectory:
FlutterProject
.
current
()
.
directory
,
targets:
<
String
>[
target
],
);
_lastCompiled
=
DateTime
.
now
();
...
...
packages/flutter_tools/lib/src/web/compile.dart
View file @
f530b809
...
...
@@ -19,6 +19,9 @@ import '../usage.dart';
WebCompilationProxy
get
webCompilationProxy
=>
context
.
get
<
WebCompilationProxy
>();
Future
<
void
>
buildWeb
(
FlutterProject
flutterProject
,
String
target
,
BuildInfo
buildInfo
)
async
{
if
(!
flutterProject
.
web
.
existsSync
())
{
throwToolExit
(
'Missing index.html.'
);
}
final
Status
status
=
logger
.
startProgress
(
'Compiling
$target
for the Web...'
,
timeout:
null
);
final
Stopwatch
sw
=
Stopwatch
()..
start
();
final
Directory
outputDir
=
fs
.
directory
(
getWebBuildDirectory
())
...
...
packages/flutter_tools/test/commands/build_linux_test.dart
View file @
f530b809
...
...
@@ -19,23 +19,32 @@ import '../src/context.dart';
import
'../src/mocks.dart'
;
void
main
(
)
{
Cache
.
disableLocking
();
final
MockProcessManager
mockProcessManager
=
MockProcessManager
();
final
MockProcess
mockProcess
=
MockProcess
();
final
MockPlatform
linuxPlatform
=
MockPlatform
();
final
MockPlatform
notLinuxPlatform
=
MockPlatform
();
MockProcessManager
mockProcessManager
;
MockProcess
mockProcess
;
MockPlatform
linuxPlatform
;
MockPlatform
notLinuxPlatform
;
when
(
mockProcess
.
exitCode
).
thenAnswer
((
Invocation
invocation
)
async
{
return
0
;
setUpAll
(()
{
Cache
.
disableLocking
()
;
});
when
(
mockProcess
.
stderr
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
mockProcess
.
stdout
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
setUp
(()
{
mockProcessManager
=
MockProcessManager
();
mockProcess
=
MockProcess
();
linuxPlatform
=
MockPlatform
();
notLinuxPlatform
=
MockPlatform
();
when
(
mockProcess
.
exitCode
).
thenAnswer
((
Invocation
invocation
)
async
{
return
0
;
});
when
(
mockProcess
.
stderr
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
mockProcess
.
stdout
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
linuxPlatform
.
isLinux
).
thenReturn
(
true
);
when
(
notLinuxPlatform
.
isLinux
).
thenReturn
(
false
);
});
when
(
linuxPlatform
.
isLinux
).
thenReturn
(
true
);
when
(
notLinuxPlatform
.
isLinux
).
thenReturn
(
false
);
testUsingContext
(
'Linux build fails when there is no linux project'
,
()
async
{
final
BuildCommand
command
=
BuildCommand
();
...
...
packages/flutter_tools/test/commands/build_macos_test.dart
View file @
f530b809
...
...
@@ -19,24 +19,34 @@ import '../src/context.dart';
import
'../src/mocks.dart'
;
void
main
(
)
{
Cache
.
disableLocking
();
final
MockProcessManager
mockProcessManager
=
MockProcessManager
();
final
MemoryFileSystem
memoryFilesystem
=
MemoryFileSystem
();
final
MockProcess
mockProcess
=
MockProcess
();
final
MockPlatform
macosPlatform
=
MockPlatform
();
final
MockPlatform
notMacosPlatform
=
MockPlatform
();
MockProcessManager
mockProcessManager
;
MemoryFileSystem
memoryFilesystem
;
MockProcess
mockProcess
;
MockPlatform
macosPlatform
;
MockPlatform
notMacosPlatform
;
when
(
mockProcess
.
exitCode
).
thenAnswer
((
Invocation
invocation
)
async
{
return
0
;
});
when
(
mockProcess
.
stderr
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
setUpAll
(()
{
Cache
.
disableLocking
();
});
when
(
mockProcess
.
stdout
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
setUp
(()
{
mockProcessManager
=
MockProcessManager
();
memoryFilesystem
=
MemoryFileSystem
();
mockProcess
=
MockProcess
();
macosPlatform
=
MockPlatform
();
notMacosPlatform
=
MockPlatform
();
when
(
mockProcess
.
exitCode
).
thenAnswer
((
Invocation
invocation
)
async
{
return
0
;
});
when
(
mockProcess
.
stderr
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
mockProcess
.
stdout
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
macosPlatform
.
isMacOS
).
thenReturn
(
true
);
when
(
notMacosPlatform
.
isMacOS
).
thenReturn
(
false
);
});
when
(
macosPlatform
.
isMacOS
).
thenReturn
(
true
);
when
(
notMacosPlatform
.
isMacOS
).
thenReturn
(
false
);
testUsingContext
(
'macOS build fails when there is no macos project'
,
()
async
{
final
BuildCommand
command
=
BuildCommand
();
...
...
packages/flutter_tools/test/commands/build_web_test.dart
0 → 100644
View file @
f530b809
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'package:flutter_tools/src/base/common.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:flutter_tools/src/build_info.dart'
;
import
'package:flutter_tools/src/cache.dart'
;
import
'package:flutter_tools/src/device.dart'
;
import
'package:flutter_tools/src/project.dart'
;
import
'package:flutter_tools/src/resident_runner.dart'
;
import
'package:flutter_tools/src/resident_web_runner.dart'
;
import
'package:flutter_tools/src/version.dart'
;
import
'package:flutter_tools/src/web/compile.dart'
;
import
'package:mockito/mockito.dart'
;
import
'../src/common.dart'
;
import
'../src/testbed.dart'
;
void
main
(
)
{
MockWebCompilationProxy
mockWebCompilationProxy
;
Testbed
testbed
;
MockPlatform
mockPlatform
;
setUpAll
(()
{
Cache
.
disableLocking
();
});
setUp
(()
{
mockWebCompilationProxy
=
MockWebCompilationProxy
();
testbed
=
Testbed
(
setup:
()
{
fs
.
file
(
'pubspec.yaml'
)
..
createSync
()
..
writeAsStringSync
(
'name: foo
\n
'
);
fs
.
file
(
'.packages'
).
createSync
();
fs
.
file
(
fs
.
path
.
join
(
'web'
,
'index.html'
)).
createSync
(
recursive:
true
);
fs
.
file
(
fs
.
path
.
join
(
'lib'
,
'main.dart'
)).
createSync
(
recursive:
true
);
when
(
mockWebCompilationProxy
.
initialize
(
projectDirectory:
anyNamed
(
'projectDirectory'
),
targets:
anyNamed
(
'targets'
),
release:
anyNamed
(
'release'
)
)).
thenAnswer
((
Invocation
invocation
)
{
final
String
path
=
fs
.
path
.
join
(
'.dart_tool'
,
'build'
,
'flutter_web'
,
'foo'
,
'lib'
,
'main_web_entrypoint.dart.js'
);
fs
.
file
(
path
).
createSync
(
recursive:
true
);
fs
.
file
(
'
$path
.map'
).
createSync
();
return
Future
<
bool
>.
value
(
true
);
});
},
overrides:
<
Type
,
Generator
>{
WebCompilationProxy:
()
=>
mockWebCompilationProxy
,
Platform:
()
=>
mockPlatform
,
FlutterVersion:
()
=>
MockFlutterVersion
(),
});
});
test
(
'Refuses to build for web when missing index.html'
,
()
=>
testbed
.
run
(()
async
{
fs
.
file
(
fs
.
path
.
join
(
'web'
,
'index.html'
)).
deleteSync
();
expect
(
buildWeb
(
FlutterProject
.
current
(),
fs
.
path
.
join
(
'lib'
,
'main.dart'
),
BuildInfo
.
debug
,
),
throwsA
(
isInstanceOf
<
ToolExit
>()));
}));
test
(
'Refuses to build using runner when missing index.html'
,
()
=>
testbed
.
run
(()
async
{
fs
.
file
(
fs
.
path
.
join
(
'web'
,
'index.html'
)).
deleteSync
();
final
ResidentWebRunner
runner
=
ResidentWebRunner
(
<
FlutterDevice
>[],
flutterProject:
FlutterProject
.
current
(),
ipv6:
false
,
debuggingOptions:
DebuggingOptions
.
enabled
(
BuildInfo
.
debug
),
);
expect
(
await
runner
.
run
(),
1
);
}));
test
(
'Can build for web'
,
()
=>
testbed
.
run
(()
async
{
await
buildWeb
(
FlutterProject
.
current
(),
fs
.
path
.
join
(
'lib'
,
'main.dart'
),
BuildInfo
.
debug
,
);
}));
}
class
MockWebCompilationProxy
extends
Mock
implements
WebCompilationProxy
{}
class
MockPlatform
extends
Mock
implements
Platform
{
@override
Map
<
String
,
String
>
environment
=
<
String
,
String
>{
'FLUTTER_ROOT'
:
'/'
,
};
}
class
MockFlutterVersion
extends
Mock
implements
FlutterVersion
{
@override
bool
get
isStable
=>
false
;
}
packages/flutter_tools/test/commands/build_windows_test.dart
View file @
f530b809
...
...
@@ -19,29 +19,40 @@ import '../src/context.dart';
import
'../src/mocks.dart'
;
void
main
(
)
{
Cache
.
disableLocking
();
final
MockProcessManager
mockProcessManager
=
MockProcessManager
();
final
MemoryFileSystem
memoryFilesystem
=
MemoryFileSystem
(
style:
FileSystemStyle
.
windows
);
final
MockProcess
mockProcess
=
MockProcess
();
final
MockPlatform
windowsPlatform
=
MockPlatform
()
..
environment
[
'PROGRAMFILES(X86)'
]
=
r'C:\Program Files (x86)\'
;
final
MockPlatform
notWindowsPlatform
=
MockPlatform
();
final
MockVisualStudio
mockVisualStudio
=
MockVisualStudio
();
MockProcessManager
mockProcessManager
;
MemoryFileSystem
memoryFilesystem
;
MockProcess
mockProcess
;
MockPlatform
windowsPlatform
;
MockPlatform
notWindowsPlatform
;
MockVisualStudio
mockVisualStudio
;
const
String
solutionPath
=
r'C:\windows\Runner.sln'
;
const
String
visualStudioPath
=
r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community'
;
const
String
vcvarsPath
=
visualStudioPath
+
r'\VC\Auxiliary\Build\vcvars64.bat'
;
when
(
mockProcess
.
exitCode
).
thenAnswer
((
Invocation
invocation
)
async
{
return
0
;
setUpAll
(()
{
Cache
.
disableLocking
()
;
});
when
(
mockProcess
.
stderr
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
mockProcess
.
stdout
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
setUp
(()
{
mockProcessManager
=
MockProcessManager
();
memoryFilesystem
=
MemoryFileSystem
(
style:
FileSystemStyle
.
windows
);
mockProcess
=
MockProcess
();
windowsPlatform
=
MockPlatform
()
..
environment
[
'PROGRAMFILES(X86)'
]
=
r'C:\Program Files (x86)\'
;
notWindowsPlatform
=
MockPlatform
();
mockVisualStudio
=
MockVisualStudio
();
when
(
mockProcess
.
exitCode
).
thenAnswer
((
Invocation
invocation
)
async
{
return
0
;
});
when
(
mockProcess
.
stderr
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
mockProcess
.
stdout
).
thenAnswer
((
Invocation
invocation
)
{
return
const
Stream
<
List
<
int
>>.
empty
();
});
when
(
windowsPlatform
.
isWindows
).
thenReturn
(
true
);
when
(
notWindowsPlatform
.
isWindows
).
thenReturn
(
false
);
});
when
(
windowsPlatform
.
isWindows
).
thenReturn
(
true
);
when
(
notWindowsPlatform
.
isWindows
).
thenReturn
(
false
);
testUsingContext
(
'Windows build fails when there is no vcvars64.bat'
,
()
async
{
final
BuildCommand
command
=
BuildCommand
();
...
...
packages/flutter_tools/test/src/testbed.dart
View file @
f530b809
...
...
@@ -11,6 +11,7 @@ import 'package:flutter_tools/src/base/logger.dart';
import
'package:flutter_tools/src/base/terminal.dart'
;
import
'package:flutter_tools/src/cache.dart'
;
import
'package:flutter_tools/src/context_runner.dart'
;
import
'package:flutter_tools/src/usage.dart'
;
import
'context.dart'
;
...
...
@@ -24,6 +25,7 @@ final Map<Type, Generator> _testbedDefaults = <Type, Generator>{
FileSystem:
()
=>
MemoryFileSystem
(),
// Keeps tests fast by avoid actual file system.
Logger:
()
=>
BufferLogger
(),
// Allows reading logs and prevents stdout.
OutputPreferences:
()
=>
OutputPreferences
(
showColor:
false
),
// configures BufferLogger to avoid color codes.
Usage:
()
=>
NoOpUsage
(),
// prevent addition of analytics from burdening test mocks
};
/// Manages interaction with the tool injection and runner system.
...
...
@@ -60,7 +62,7 @@ class Testbed {
/// `overrides` provides more overrides in addition to the test defaults.
/// `setup` may be provided to apply mocks within the tool managed zone,
/// including any specified overrides.
Testbed
({
Future
<
void
>
Function
()
setup
,
Map
<
Type
,
Generator
>
overrides
})
Testbed
({
Future
Or
<
void
>
Function
()
setup
,
Map
<
Type
,
Generator
>
overrides
})
:
_setup
=
setup
,
_overrides
=
overrides
;
...
...
@@ -101,3 +103,41 @@ class Testbed {
});
}
}
/// A no-op implementation of [Usage] for testing.
class
NoOpUsage
implements
Usage
{
@override
bool
enabled
=
false
;
@override
bool
suppressAnalytics
=
true
;
@override
String
get
clientId
=>
'test'
;
@override
Future
<
void
>
ensureAnalyticsSent
()
{
return
null
;
}
@override
bool
get
isFirstRun
=>
false
;
@override
Stream
<
Map
<
String
,
Object
>>
get
onSend
=>
const
Stream
<
Object
>.
empty
();
@override
void
printWelcome
()
{}
@override
void
sendCommand
(
String
command
,
{
Map
<
String
,
String
>
parameters
})
{}
@override
void
sendEvent
(
String
category
,
String
parameter
,
{
Map
<
String
,
String
>
parameters
})
{}
@override
void
sendException
(
dynamic
exception
,
StackTrace
trace
)
{}
@override
void
sendTiming
(
String
category
,
String
variableName
,
Duration
duration
,
{
String
label
})
{}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment