@@ -864,6 +864,85 @@ void main() {
864
864
});
865
865
});
866
866
867
+ // The output of vswhere.exe is known to contain bad UTF8.
868
+ // See: https://github.com/flutter/flutter/issues/102451
869
+ group ('Correctly handles bad UTF-8 from vswhere.exe output' , () {
870
+ late VisualStudioFixture fixture;
871
+ late VisualStudio visualStudio;
872
+
873
+ setUp (() {
874
+ fixture = setUpVisualStudio ();
875
+ visualStudio = fixture.visualStudio;
876
+ });
877
+
878
+ testWithoutContext ('Ignores unicode replacement char in unused properties' , () {
879
+ final Map <String , dynamic > response = Map <String , dynamic >.of (_defaultResponse)
880
+ ..['unused' ] = 'Bad UTF8 \u {FFFD}' ;
881
+
882
+ setMockCompatibleVisualStudioInstallation (
883
+ response,
884
+ fixture.fileSystem,
885
+ fixture.processManager,
886
+ );
887
+
888
+ expect (visualStudio.isInstalled, true );
889
+ expect (visualStudio.isAtLeastMinimumVersion, true );
890
+ expect (visualStudio.hasNecessaryComponents, true );
891
+ expect (visualStudio.cmakePath, equals (cmakePath));
892
+ expect (visualStudio.cmakeGenerator, equals ('Visual Studio 16 2019' ));
893
+ });
894
+
895
+ testWithoutContext ('Throws ToolExit on bad UTF-8 in installationPath' , () {
896
+ final Map <String , dynamic > response = Map <String , dynamic >.of (_defaultResponse)
897
+ ..['installationPath' ] = '\u {FFFD}' ;
898
+
899
+ setMockCompatibleVisualStudioInstallation (response, fixture.fileSystem, fixture.processManager);
900
+
901
+ expect (() => visualStudio.isInstalled,
902
+ throwsToolExit (message: 'Bad UTF-8 encoding (U+FFFD; REPLACEMENT CHARACTER) found in string' ));
903
+ });
904
+
905
+ testWithoutContext ('Throws ToolExit on bad UTF-8 in installationVersion' , () {
906
+ final Map <String , dynamic > response = Map <String , dynamic >.of (_defaultResponse)
907
+ ..['installationVersion' ] = '\u {FFFD}' ;
908
+
909
+ setMockCompatibleVisualStudioInstallation (response, fixture.fileSystem, fixture.processManager);
910
+
911
+ expect (() => visualStudio.isInstalled,
912
+ throwsToolExit (message: 'Bad UTF-8 encoding (U+FFFD; REPLACEMENT CHARACTER) found in string' ));
913
+ });
914
+
915
+ testWithoutContext ('Ignores bad UTF-8 in displayName' , () {
916
+ final Map <String , dynamic > response = Map <String , dynamic >.of (_defaultResponse)
917
+ ..['displayName' ] = '\u {FFFD}' ;
918
+
919
+ setMockCompatibleVisualStudioInstallation (response, fixture.fileSystem, fixture.processManager);
920
+
921
+ expect (visualStudio.isInstalled, true );
922
+ expect (visualStudio.isAtLeastMinimumVersion, true );
923
+ expect (visualStudio.hasNecessaryComponents, true );
924
+ expect (visualStudio.cmakePath, equals (cmakePath));
925
+ expect (visualStudio.cmakeGenerator, equals ('Visual Studio 16 2019' ));
926
+ expect (visualStudio.displayName, equals ('\u {FFFD}' ));
927
+ });
928
+
929
+ testWithoutContext ("Ignores bad UTF-8 in catalog's productDisplayVersion" , () {
930
+ final Map <String , dynamic > catalog = Map <String , dynamic >.of (_defaultResponse['catalog' ] as Map <String , dynamic >)
931
+ ..['productDisplayVersion' ] = '\u {FFFD}' ;
932
+ final Map <String , dynamic > response = Map <String , dynamic >.of (_defaultResponse)
933
+ ..['catalog' ] = catalog;
934
+
935
+ setMockCompatibleVisualStudioInstallation (response, fixture.fileSystem, fixture.processManager);
936
+
937
+ expect (visualStudio.isInstalled, true );
938
+ expect (visualStudio.isAtLeastMinimumVersion, true );
939
+ expect (visualStudio.hasNecessaryComponents, true );
940
+ expect (visualStudio.cmakePath, equals (cmakePath));
941
+ expect (visualStudio.cmakeGenerator, equals ('Visual Studio 16 2019' ));
942
+ expect (visualStudio.displayVersion, equals ('\u {FFFD}' ));
943
+ });
944
+ });
945
+
867
946
group (VswhereDetails , () {
868
947
test ('Accepts empty JSON' , () {
869
948
const bool meetsRequirements = true ;
0 commit comments