-
Notifications
You must be signed in to change notification settings - Fork 108
/
Copy pathprocess.os
272 lines (187 loc) · 12.9 KB
/
process.os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
Перем юТест;
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
СИ = Новый СистемнаяИнформация;
Сообщить(СИ.ВерсияОС);
Если Найти(СИ.ВерсияОС, "Windows") > 0 Тогда
ВсеТесты.Добавить("ТестДолжен_ПрочитатьВыводOscriptСразу");
ВсеТесты.Добавить("ТестДолжен_ПрочитатьВыводOscriptПострочно");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМетодПрочитатьНаПустомПотокеВернетНеопределено");
ВсеТесты.Добавить("ТестДолжен_ЗаписатьВоВходнойПотокПроцесса");
ВсеТесты.Добавить("ТестДолжен_НайтиПроцессПоИмени");
ВсеТесты.Добавить("ТестДолжен_НайтиПроцессПоPID");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапускСАргументамиСодержащимиПробелы");
ВсеТесты.Добавить("ТестДолжен_ЗапуститьПроцессСПередачейПеременныхСреды");
ВсеТесты.Добавить("ТестДолжен_ЗапуститьПроцессСПередачейПеременныхСредыИКодировкой");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСобственныйPIDПроцессаСуществует");
КонецЕсли;
Возврат ВсеТесты;
КонецФункции
Процедура ТестДолжен_ПрочитатьВыводOscriptСразу() Экспорт
Путь = ПутьОСкрипт();
Процесс = СоздатьПроцесс(Путь,,Истина);
Процесс.Запустить();
Поток = Процесс.ПотокВывода;
Процесс.ОжидатьЗавершения();
Стр = НормализоватьПереводыСтрок(Поток.Прочитать());
юТест.ПроверитьРавенство(ШтатныйВыводOscript(), Стр);
КонецПроцедуры
Процедура ТестДолжен_ПрочитатьВыводOscriptПострочно() Экспорт
Путь = ПутьОСкрипт();
Процесс = СоздатьПроцесс(Путь,,Истина);
Процесс.Запустить();
Поток = Процесс.ПотокВывода;
Стр = "";
Пока Не Процесс.Завершен ИЛИ Поток.ЕстьДанные Цикл
СтрокаПотока = Поток.ПрочитатьСтроку();
Если СтрокаПотока = Неопределено Тогда
Приостановить(20);
Продолжить;
КонецЕсли;
Стр = Стр + СтрокаПотока + "
|";
КонецЦикла;
Стр = СокрП(Стр);
юТест.ПроверитьРавенство(ШтатныйВыводOscript(), НормализоватьПереводыСтрок(Стр));
КонецПроцедуры
Процедура ТестДолжен_ЗаписатьВоВходнойПотокПроцесса() Экспорт
КодировкаПоУмолчанию = Консоль.КодировкаВходногоПотока;
Если Консоль.КодировкаВходногоПотока = КодировкаТекста.UTF8 Тогда
Консоль.КодировкаВходногоПотока = КодировкаТекста.UTF8NoBOM;
КонецЕсли;
Процесс = СоздатьПроцесс("sort",,Истина, Истина);
Процесс.Запустить();
Процесс.ПотокВвода.ЗаписатьСтроку("2");
Процесс.ПотокВвода.ЗаписатьСтроку("1");
Процесс.ПотокВвода.ЗаписатьСтроку("3");
Процесс.ПотокВвода.Закрыть();
Консоль.КодировкаВходногоПотока = КодировкаПоУмолчанию;
Процесс.ОжидатьЗавершения();
Вывод = Процесс.ПотокВывода.Прочитать();
Эталон = НормализоватьПереводыСтрок("1
|2
|3");
юТест.ПроверитьРавенство(Эталон, НормализоватьПереводыСтрок(Вывод));
КонецПроцедуры
Функция ИмяПроцесса()
Возврат ТекущийПроцесс().Имя;
КонецФункции
Процедура ТестДолжен_НайтиПроцессПоИмени() Экспорт
МассивПроцессов = НайтиПроцессыПоИмени(ИмяПроцесса());
юТест.ПроверитьБольшеИлиРавно(МассивПроцессов.Количество(), 1);
КонецПроцедуры
Процедура ТестДолжен_НайтиПроцессПоPID() Экспорт
МассивПроцессов = НайтиПроцессыПоИмени(ИмяПроцесса());
ИД = МассивПроцессов[0].Идентификатор;
Процесс = НайтиПроцессПоИдентификатору(ИД);
юТест.ПроверитьРавенство(Процесс.Идентификатор, ИД);
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСобственныйPIDПроцессаСуществует() Экспорт
МассивПроцессов = НайтиПроцессыПоИмени(ИмяПроцесса());
юТест.ПроверитьНеравенство(0, МассивПроцессов.Количество());
СобственныйPID = ТекущийПроцесс().Идентификатор;
PIDПроцесса = Неопределено;
Для Каждого ТекПроцесс Из МассивПроцессов Цикл
Если ТекПроцесс.Идентификатор = СобственныйPID Тогда
PIDПроцесса = ТекПроцесс.Идентификатор;
Прервать;
КонецЕсли;
КонецЦикла;
юТест.ПроверитьРавенство(СобственныйPID, PIDПроцесса);
КонецПроцедуры
Функция ШтатныйВыводOscript()
СИ = Новый СистемнаяИнформация;
Текст =
"1Script Execution Engine. Version " + СИ.Версия + "
|
|Usage:
|
|I. Script execution: oscript.exe <script_path> [script arguments..]
|
|II. Special mode: oscript.exe <mode> <script_path> [script arguments..]
|Mode can be one of these:
| -measure measures execution time
| -compile shows compiled module without execution
| -check [-env=<entrypoint-file>]provides syntax check
| -check -cgi provides syntax check in CGI-mode
| -version output version string
|
| -encoding=<encoding-name> set output encoding
| -codestat=<filename> write code statistics
|
|III. Run as CGI application: oscript.exe -cgi <script_path> [script arguments..]
| Runs as CGI application under HTTP-server (Apache/Nginx/IIS/etc...)";
Возврат НормализоватьПереводыСтрок(Текст);
КонецФункции
Функция ПутьОСкрипт()
Возврат "dotnet """ + КаталогПрограммы() + "/oscript.dll""";
КонецФункции
Функция НормализоватьПереводыСтрок(Знач ИсходнаяСтрока)
Возврат СтрЗаменить(ИсходнаяСтрока, Символы.ВК, "");
КонецФункции
Процедура ТестДолжен_ПроверитьЗапускСАргументамиСодержащимиПробелы() Экспорт
ФайлЗапускаемогоСкрипта = ЗаписатьТестовыйСкрипт();
ФайлВывода = ИмяФайлаВыводаТестовогоСкрипта();
УдалитьФайлы(ФайлВывода);
ПриложениеДляЗапуска = ПутьОСкрипт(); //TODO: для Mono должно быть иначе
ЗапуститьПриложение(ПриложениеДляЗапуска + " """ + ФайлЗапускаемогоСкрипта + """ """ + ФайлВывода + """ ""арг у мент1"" аргумент2", КаталогВременныхФайлов(), Истина);
УдалитьФайлы(ФайлЗапускаемогоСкрипта);
ФайлВыводаОбъект = Новый Файл(ФайлВывода);
юТест.ПроверитьИстину(ФайлВыводаОбъект.Существует(), "должен был быть создан файл с результатами");
ЧтениеТекста = Новый ЧтениеТекста(ФайлВывода, "utf-8");
Данные = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ФайлВывода);
юТест.ПроверитьРавенство(ФайлВывода
+ ","
+ "арг у мент1" + ","
+ "аргумент2" + ","
,Данные);
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоМетодПрочитатьНаПустомПотокеВернетНеопределено() Экспорт
Путь = ПутьОСкрипт();
Процесс = СоздатьПроцесс(Путь,,Истина);
Процесс.Запустить();
Процесс.ОжидатьЗавершения();
Стр = Процесс.ПотокВывода.Прочитать();
юТест.ПроверитьРавенство(Тип("Строка"), ТипЗнч(Стр), "Сначала должен был прочитать строку");
юТест.ПроверитьЛожь(ПустаяСтрока(Стр), "Вывод не должен быть пустым");
Стр = Процесс.ПотокВывода.Прочитать();
юТест.ПроверитьРавенство(Тип("Неопределено"), ТипЗнч(Стр), "После должен был прочитать Неопределено");
юТест.ПроверитьИстину(ПустаяСтрока(Стр), "Вывод должен быть пустым");
КонецПроцедуры
Процедура ТестДолжен_ЗапуститьПроцессСПередачейПеременныхСреды() Экспорт
Путь = ПутьОСкрипт();
Процесс = СоздатьПроцесс(Путь,,Истина, Ложь,, ПеременныеСреды());
Процесс.Запустить();
Поток = Процесс.ПотокВывода;
Процесс.ОжидатьЗавершения();
Стр = НормализоватьПереводыСтрок(Поток.Прочитать());
юТест.ПроверитьРавенство(ШтатныйВыводOscript(), Стр);
КонецПроцедуры
Процедура ТестДолжен_ЗапуститьПроцессСПередачейПеременныхСредыИКодировкой() Экспорт
Путь = ПутьОСкрипт();
Процесс = СоздатьПроцесс(Путь,,Истина, Ложь, КодировкаТекста.UTF8, ПеременныеСреды());
Процесс.Запустить();
Поток = Процесс.ПотокВывода;
Процесс.ОжидатьЗавершения();
Стр = НормализоватьПереводыСтрок(Поток.Прочитать());
юТест.ПроверитьРавенство(ШтатныйВыводOscript(), Стр);
КонецПроцедуры
Функция ЗаписатьТестовыйСкрипт()
ТекстСкрипта = "
|Запись = Новый ЗаписьТекста(АргументыКоманднойСтроки[0], ""utf-8"");
|Для Каждого Аргумент Из АргументыКоманднойСтроки Цикл
| Запись.Записать(Аргумент + "","");
|КонецЦикла;
|Запись.Закрыть();";
ИмяФайла = КаталогВременныхФайлов() + "/" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-"," ");
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
ЗаписьТекста.Записать(ТекстСкрипта);
ЗаписьТекста.Закрыть();
Возврат ИмяФайла;
КонецФункции
Функция ИмяФайлаВыводаТестовогоСкрипта()
Возврат юТест.ИмяВременногоФайла();
КонецФункции