Skip to content

Commit 561db4d

Browse files
authored
fix: Поддержка эмуляции X64 на MacOS arm64 (Stivo182#3)
1 parent de80847 commit 561db4d

5 files changed

+141
-20
lines changed

src/internal/Классы/ДетекторПроцессораMacOS.os

+15-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
ВызватьИсключение "Детектор доступен только на MacOS";
1414
КонецЕсли;
1515

16-
Возврат ПарсерИнформацииОПроцессореSysctl.Распарсить(ВыводSysctl());
16+
Возврат ПарсерИнформацииОПроцессореSysctl.Распарсить(ВыводSysctl(), ЭтоЭмуляцияX64());
1717

1818
КонецФункции
1919

@@ -26,4 +26,17 @@
2626

2727
Возврат Команда.ПолучитьВывод();
2828

29-
КонецФункции
29+
КонецФункции
30+
31+
Функция ЭтоЭмуляцияX64()
32+
33+
Команда = Новый Команда;
34+
Команда.УстановитьКоманду("sysctl");
35+
Команда.ДобавитьПараметр("-n");
36+
Команда.ДобавитьПараметр("sysctl.proc_translated");
37+
Команда.Исполнить();
38+
39+
Возврат СокрЛП(Команда.ПолучитьВывод()) = "1";
40+
41+
КонецФункции
42+

src/internal/Модули/ПарсерИнформацииОПроцессореSysctl.os

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
Функция Распарсить(ВыводSysctl) Экспорт
1+
Функция Распарсить(Sysctl, ЭтоЭмуляцияX64 = Ложь) Экспорт
22

33
ИнформацияОПроцессоре = Новый ИнформацияОПроцессоре(Ложь);
44

5-
Процессор = ПарсерСекцийИнформацииОПроцессоре.РаспарситьСекцию(ВыводSysctl, ":");
5+
Процессор = ПарсерСекцийИнформацииОПроцессоре.РаспарситьСекцию(Sysctl, ":");
66

77
ИмяПроцессора = Процессор["machdep.cpu.brand_string"];
88
Если ЗначениеЗаполнено(ИмяПроцессора) Тогда
@@ -14,21 +14,25 @@
1414
ИнформацияОПроцессоре.КоличествоЛогическихПроцессоров = КонвертацияЗначенийCpuInfo.СтрокаВЧисло(Процессор["hw.logicalcpu"]);
1515
ИнформацияОПроцессоре.НоминальнаяЧастота = КонвертацияЗначенийCpuInfo.СтрокаВЧисло(Процессор["hw.cpufrequency"]);
1616
ИнформацияОПроцессоре.МаксимальнаяЧастота = КонвертацияЗначенийCpuInfo.СтрокаВЧисло(Процессор["hw.cpufrequency_max"]);
17-
ИнформацияОПроцессоре.Архитектура = ОпределитьАрхитектуру(Процессор["hw.cputype"], Процессор["hw.cpu64bit_capable"]);
17+
ИнформацияОПроцессоре.Архитектура = ОпределитьАрхитектуру(Процессор["hw.cputype"], Процессор["hw.cpu64bit_capable"], ЭтоЭмуляцияX64);
1818

1919
Возврат ИнформацияОПроцессоре;
2020

2121
КонецФункции
2222

23-
Функция ОпределитьАрхитектуру(Cputype, Cpu64bit_capable)
23+
Функция ОпределитьАрхитектуру(CpuType, Cpu64bit_capable, ЭтоЭмуляцияX64)
2424

25-
Если Cputype = "7" Или Cputype = "16777223" Тогда
25+
Если ЭтоЭмуляцияX64 Тогда
26+
Возврат АрхитектурыПроцессоров.ARM64;
27+
КонецЕсли;
28+
29+
Если CpuType = "7" Или CpuType = "16777223" Тогда
2630
Если Cpu64bit_capable = "1" Тогда
2731
Возврат АрхитектурыПроцессоров.X64;
2832
Иначе
2933
Возврат АрхитектурыПроцессоров.X86;
3034
КонецЕсли;
31-
ИначеЕсли Cputype = "12" Или Cputype = "16777228" Тогда
35+
ИначеЕсли CpuType = "12" Или CpuType = "16777228" Тогда
3236
Если Cpu64bit_capable = "1" Тогда
3337
Возврат АрхитектурыПроцессоров.ARM64;
3438
Иначе

tests/helpers/Модули/ТестированиеИнформацииОПроцессоре.os

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
#Использовать asserts
22
#Использовать "../../../src"
33

4-
Процедура ПроверитьРавенство(ПроверяемоеЗначение, ОжидаемоеЗначение) Экспорт
4+
Процедура ПроверитьРавенство(ПроверяемоеЗначение, ОжидаемоеЗначение, Описание = "") Экспорт
55

6+
Если ЗначениеЗаполнено(Описание) Тогда
7+
Описание = Описание + "
8+
|Проверяемое поле: ";
9+
Иначе
10+
Описание = "";
11+
КонецЕсли;
12+
613
Ожидаем.Что(ТипЗнч(ПроверяемоеЗначение)).Равно(Тип("ИнформацияОПроцессоре"));
7-
Ожидаем.Что(ПроверяемоеЗначение.ИмяПроцессора, "Имя процессора").Равно(ОжидаемоеЗначение.ИмяПроцессора);
8-
Ожидаем.Что(ПроверяемоеЗначение.КоличествоПроцессоров, "Количество процессоров").Равно(ОжидаемоеЗначение.КоличествоПроцессоров);
9-
Ожидаем.Что(ПроверяемоеЗначение.КоличествоЯдер, "Количество ядер").Равно(ОжидаемоеЗначение.КоличествоЯдер);
10-
Ожидаем.Что(ПроверяемоеЗначение.КоличествоЛогическихПроцессоров, "Количество логических процессоров").Равно(ОжидаемоеЗначение.КоличествоЛогическихПроцессоров);
11-
Ожидаем.Что(ПроверяемоеЗначение.НоминальнаяЧастота, "Номинальная частота").Равно(ОжидаемоеЗначение.НоминальнаяЧастота);
12-
Ожидаем.Что(ПроверяемоеЗначение.МаксимальнаяЧастота, "Максимальная частота").Равно(ОжидаемоеЗначение.МаксимальнаяЧастота);
13-
Ожидаем.Что(ПроверяемоеЗначение.Архитектура, "Архитектура").Равно(ОжидаемоеЗначение.Архитектура);
14+
Ожидаем.Что(ПроверяемоеЗначение.ИмяПроцессора, Описание + "Имя процессора").Равно(ОжидаемоеЗначение.ИмяПроцессора);
15+
Ожидаем.Что(ПроверяемоеЗначение.КоличествоПроцессоров, Описание + "Количество процессоров").Равно(ОжидаемоеЗначение.КоличествоПроцессоров);
16+
Ожидаем.Что(ПроверяемоеЗначение.КоличествоЯдер, Описание + "Количество ядер").Равно(ОжидаемоеЗначение.КоличествоЯдер);
17+
Ожидаем.Что(ПроверяемоеЗначение.КоличествоЛогическихПроцессоров, Описание + "Количество логических процессоров").Равно(ОжидаемоеЗначение.КоличествоЛогическихПроцессоров);
18+
Ожидаем.Что(ПроверяемоеЗначение.НоминальнаяЧастота, Описание + "Номинальная частота").Равно(ОжидаемоеЗначение.НоминальнаяЧастота);
19+
Ожидаем.Что(ПроверяемоеЗначение.МаксимальнаяЧастота, Описание + "Максимальная частота").Равно(ОжидаемоеЗначение.МаксимальнаяЧастота);
20+
Ожидаем.Что(ПроверяемоеЗначение.Архитектура, Описание + "Архитектура").Равно(ОжидаемоеЗначение.Архитектура);
1421

1522
КонецПроцедуры
1623

tests/Тесты_ПарсерИнформацииОПроцессореSysctl.os

+74-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,80 @@
3434
ОжидаемоеЗначение.МаксимальнаяЧастота = 2200000000;
3535
ОжидаемоеЗначение.Архитектура = АрхитектурыПроцессоров.X64;
3636

37-
CpuInfo = ТестированиеИнформацииОПроцессоре.ПрочитатьФайл("SysctlRealOneProcessorFourCores.txt");
38-
ПроверяемоеЗначение = ПарсерИнформацииОПроцессореSysctl.Распарсить(CpuInfo);
37+
Sysctl = ТестированиеИнформацииОПроцессоре.ПрочитатьФайл("SysctlRealOneProcessorFourCores.txt");
38+
ПроверяемоеЗначение = ПарсерИнформацииОПроцессореSysctl.Распарсить(Sysctl);
3939

4040
ТестированиеИнформацииОПроцессоре.ПроверитьРавенство(ПроверяемоеЗначение, ОжидаемоеЗначение);
4141

42-
КонецПроцедуры
42+
КонецПроцедуры
43+
44+
&Тест
45+
Процедура ТестАрхитектуры() Экспорт
46+
47+
ТестовыеСлучаи = Новый Соответствие();
48+
ТестовыеСлучаи.Вставить(
49+
"hw.cputype: 16777223
50+
|hw.cpu64bit_capable: 1", АрхитектурыПроцессоров.X64);
51+
52+
ТестовыеСлучаи.Вставить(
53+
"hw.cputype: 7
54+
|hw.cpu64bit_capable: 0", АрхитектурыПроцессоров.X86);
55+
56+
ТестовыеСлучаи.Вставить(
57+
"hw.cputype: 7
58+
|hw.cpu64bit_capable: 1", АрхитектурыПроцессоров.X64);
59+
60+
ТестовыеСлучаи.Вставить(
61+
"hw.cputype: 16777228
62+
|hw.cpu64bit_capable: 1", АрхитектурыПроцессоров.ARM64);
63+
64+
ТестовыеСлучаи.Вставить(
65+
"hw.cputype: 12
66+
|hw.cpu64bit_capable: 0", АрхитектурыПроцессоров.ARM);
67+
68+
ТестовыеСлучаи.Вставить(
69+
"hw.cputype: 12
70+
|hw.cpu64bit_capable: 1", АрхитектурыПроцессоров.ARM64);
71+
72+
ТестовыеСлучаи.Вставить("", Неопределено);
73+
74+
ПризнакиЭмуляцииX64 = Новый Массив();
75+
ПризнакиЭмуляцииX64.Добавить(Истина);
76+
ПризнакиЭмуляцииX64.Добавить(Ложь);
77+
78+
Для Каждого ТестовыйСлучай Из ТестовыеСлучаи Цикл
79+
80+
Sysctl = ТестовыйСлучай.Ключ;
81+
82+
Для Каждого ЭмуляцияX64 Из ПризнакиЭмуляцииX64 Цикл
83+
84+
Если ЭмуляцияX64 Тогда
85+
ОжидаемаяАрхитектура = АрхитектурыПроцессоров.ARM64;
86+
Иначе
87+
ОжидаемаяАрхитектура = ТестовыйСлучай.Значение;
88+
КонецЕсли;
89+
90+
ОжидаемоеЗначение = Новый ИнформацияОПроцессоре(Ложь);
91+
ОжидаемоеЗначение.Архитектура = ОжидаемаяАрхитектура;
92+
93+
ПроверяемоеЗначение = ПарсерИнформацииОПроцессореSysctl.Распарсить(Sysctl, ЭмуляцияX64);
94+
95+
Описание = СтрШаблон("Sysctl: %1
96+
|Эмуляция X64: %2", Sysctl, ЭмуляцияX64);
97+
98+
ТестированиеИнформацииОПроцессоре.ПроверитьРавенство(ПроверяемоеЗначение, ОжидаемоеЗначение, Описание);
99+
100+
КонецЦикла;
101+
КонецЦикла
102+
103+
КонецПроцедуры
104+
105+
Функция ТестовыйСлучайАрхитектуры(Sysctl, ЭтоЭмуляцияX64, Архитектура)
106+
107+
ТестовыйСлучай = Новый Структура();
108+
ТестовыйСлучай.Вставить("Sysctl", Sysctl);
109+
ТестовыйСлучай.Вставить("ЭтоЭмуляцияX64", ЭтоЭмуляцияX64);
110+
ТестовыйСлучай.Вставить("Архитектура", Архитектура);
111+
Возврат ТестовыйСлучай;
112+
113+
КонецФункции

tests/Тесты_ПарсерИнформацииОПроцессореWindows.os

+27-1
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,30 @@
113113

114114
ТестированиеИнформацииОПроцессоре.ПроверитьРавенство(ПроверяемоеЗначение, ОжидаемоеЗначение);
115115

116-
КонецПроцедуры
116+
КонецПроцедуры
117+
118+
&Тест
119+
Процедура ТестАрхитектуры() Экспорт
120+
121+
ТестовыеСлучаи = Новый Соответствие();
122+
ТестовыеСлучаи.Вставить("Architecture=0", АрхитектурыПроцессоров.X86);
123+
ТестовыеСлучаи.Вставить("Architecture=5", АрхитектурыПроцессоров.ARM);
124+
ТестовыеСлучаи.Вставить("Architecture=9", АрхитектурыПроцессоров.X64);
125+
ТестовыеСлучаи.Вставить("Architecture=12", АрхитектурыПроцессоров.ARM64);
126+
ТестовыеСлучаи.Вставить("", Неопределено);
127+
ТестовыеСлучаи.Вставить("Architecture=99", Неопределено);
128+
129+
Для Каждого ТестовыйСлучай Из ТестовыеСлучаи Цикл
130+
131+
ВыводWmic = ТестовыйСлучай.Ключ;
132+
133+
ОжидаемоеЗначение = Новый ИнформацияОПроцессоре(Ложь);
134+
ОжидаемоеЗначение.Архитектура = ТестовыйСлучай.Значение;
135+
136+
ПроверяемоеЗначение = ПарсерИнформацииОПроцессореWmic.Распарсить(ВыводWmic);
137+
138+
ТестированиеИнформацииОПроцессоре.ПроверитьРавенство(ПроверяемоеЗначение, ОжидаемоеЗначение, ВыводWmic);
139+
140+
КонецЦикла;
141+
142+
КонецПроцедуры;

0 commit comments

Comments
 (0)