001
014
015 package com.liferay.portal.tools;
016
017 import com.liferay.portal.kernel.util.CharPool;
018 import com.liferay.portal.kernel.util.FileUtil;
019 import com.liferay.portal.kernel.util.GetterUtil;
020 import com.liferay.portal.kernel.util.IntegerWrapper;
021 import com.liferay.portal.kernel.util.ObjectValuePair;
022 import com.liferay.portal.kernel.util.StringBundler;
023 import com.liferay.portal.kernel.util.StringComparator;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.kernel.util.UnicodeFormatter;
027 import com.liferay.portal.tools.servicebuilder.ServiceBuilder;
028 import com.liferay.portal.util.InitUtil;
029
030 import jargs.gnu.CmdLineParser;
031
032 import java.io.File;
033
034 import java.util.ArrayList;
035 import java.util.Collections;
036 import java.util.Comparator;
037 import java.util.HashMap;
038 import java.util.List;
039 import java.util.Map;
040 import java.util.Set;
041 import java.util.TreeSet;
042
043 import org.apache.tools.ant.DirectoryScanner;
044
045
048 public class SeleneseToJavaBuilder {
049
050 public static void main(String[] args) throws Exception {
051 InitUtil.initWithSpring();
052
053 new SeleneseToJavaBuilder(args);
054 }
055
056 public SeleneseToJavaBuilder(String[] args) throws Exception {
057 CmdLineParser cmdLineParser = new CmdLineParser();
058
059 CmdLineParser.Option basedirOption = cmdLineParser.addStringOption(
060 "basedir");
061 CmdLineParser.Option minimizeOption = cmdLineParser.addStringOption(
062 "minimize");
063 CmdLineParser.Option reportDuplicatesOption =
064 cmdLineParser.addStringOption("reportDuplicates");
065
066 cmdLineParser.parse(args);
067
068 _basedir = (String)cmdLineParser.getOptionValue(basedirOption);
069
070 String minimizeTestFileName = (String)cmdLineParser.getOptionValue(
071 minimizeOption);
072
073 minimizeTestFileName = normalizeFileName(minimizeTestFileName);
074
075 String minimizeTestContent = getNormalizedContent(minimizeTestFileName);
076
077 _reportDuplicates = GetterUtil.getBoolean(
078 (String)cmdLineParser.getOptionValue(reportDuplicatesOption));
079
080 int testHtmlCount = 0;
081
082 Map<String, ObjectValuePair<String, IntegerWrapper>> testHtmlMap =
083 new HashMap<String, ObjectValuePair<String, IntegerWrapper>>();
084
085 Set<String> fileNames = getFileNames();
086
087 for (String fileName : fileNames) {
088 if (fileName.length() > 161) {
089 System.out.println(
090 "Exceeds 177 characters: portal-web/test/" + fileName);
091 }
092
093 if (fileName.endsWith("Test.html")) {
094 testHtmlCount++;
095
096 String content = getNormalizedContent(fileName);
097
098 if ((content != null) && content.equals(minimizeTestContent)) {
099 minimizeTestCase(fileName, minimizeTestFileName);
100 }
101
102 ObjectValuePair<String, IntegerWrapper> testHtmlOVP =
103 testHtmlMap.get(content);
104
105 if (testHtmlOVP == null) {
106 testHtmlOVP = new ObjectValuePair<String, IntegerWrapper>(
107 fileName, new IntegerWrapper());
108
109 testHtmlMap.put(content, testHtmlOVP);
110 }
111 else {
112 IntegerWrapper integerWrapper = testHtmlOVP.getValue();
113
114 integerWrapper.increment();
115 }
116
117 translateTestCase(fileName);
118 }
119 else if (fileName.endsWith("Tests.html")) {
120 translateTestSuite(fileName);
121 }
122 else if (fileName.endsWith("Test.java") ||
123 fileName.endsWith("Tests.java")) {
124
125 if (!fileNames.contains(
126 fileName.substring(0, fileName.length() - 5) +
127 ".html")) {
128
129 System.out.println("Unused: " + fileName);
130 }
131 }
132 }
133
134 List<ObjectValuePair<String, IntegerWrapper>> testHtmlOVPs =
135 new ArrayList<ObjectValuePair<String, IntegerWrapper>>();
136
137 int duplicateTestHtmlCount = 0;
138
139 for (Map.Entry<String, ObjectValuePair<String, IntegerWrapper>> entry :
140 testHtmlMap.entrySet()) {
141
142 ObjectValuePair<String, IntegerWrapper> testHtmlOVP =
143 entry.getValue();
144
145 testHtmlOVPs.add(testHtmlOVP);
146
147 IntegerWrapper integerWrapper = testHtmlOVP.getValue();
148
149 duplicateTestHtmlCount += integerWrapper.getValue();
150 }
151
152 Collections.sort(testHtmlOVPs, new TestHtmlCountComparator());
153
154 StringBundler sb = new StringBundler();
155
156 for (ObjectValuePair<String, IntegerWrapper> testHtmlOVP :
157 testHtmlOVPs) {
158
159 String fileName = testHtmlOVP.getKey();
160 IntegerWrapper integerWrapper = testHtmlOVP.getValue();
161
162 if (integerWrapper.getValue() > 0) {
163 sb.append(fileName);
164 sb.append(",");
165 sb.append(integerWrapper.getValue());
166 sb.append("\n");
167 }
168 }
169
170 if (_reportDuplicates && (sb.index() > 0)) {
171 System.out.println(
172 "There are " + duplicateTestHtmlCount +
173 " duplicate tests out of " + testHtmlCount +
174 ". See duplicate_selenium_tests.txt.");
175
176 FileUtil.write("duplicate_selenium_tests.txt", sb.toString());
177 }
178 }
179
180 protected String fixParam(String param) {
181 StringBuilder sb = new StringBuilder();
182
183 char[] array = param.toCharArray();
184
185 for (int i = 0; i < array.length; ++i) {
186 char c = array[i];
187
188 if (c == CharPool.BACK_SLASH) {
189 sb.append("\\\\");
190 }
191 else if (c == CharPool.QUOTE) {
192 sb.append("\\\"");
193 }
194 else if (Character.isWhitespace(c)) {
195 sb.append(c);
196 }
197 else if ((c < 0x0020) || (c > 0x007e)) {
198 sb.append("\\u");
199 sb.append(UnicodeFormatter.charToHex(c));
200 }
201 else {
202 sb.append(c);
203 }
204 }
205
206 return StringUtil.replace(
207 sb.toString(), _FIX_PARAM_OLD_SUBS, _FIX_PARAM_NEW_SUBS);
208 }
209
210 protected String formatTestSuite(String fileName, String oldContent)
211 throws Exception {
212
213 if (!oldContent.contains("..")) {
214 return oldContent;
215 }
216
217 String newContent = oldContent;
218
219 int x = 0;
220 int y = 0;
221
222 while (oldContent.indexOf("<a href=\"", x) != -1) {
223 x = oldContent.indexOf("<a href=\"", x) + 9;
224 y = oldContent.indexOf("\">", x);
225
226 String testCaseName = oldContent.substring(x, y);
227
228 if (!testCaseName.contains("..")) {
229 continue;
230 }
231
232 int z = fileName.lastIndexOf(StringPool.SLASH);
233
234 String importClassName = fileName.substring(0, z);
235
236 if (!FileUtil.exists(
237 _basedir + "/" + importClassName + "/" + testCaseName)) {
238
239 throw new IllegalArgumentException(
240 fileName + " has improper relative path");
241 }
242
243 if (testCaseName.contains("../portalweb/")) {
244 continue;
245 }
246
247 int count = StringUtil.count(testCaseName, "..");
248
249 for (int i = 0; i < count; i++) {
250 z = importClassName.lastIndexOf(StringPool.SLASH);
251
252 importClassName = fileName.substring(0, z);
253 }
254
255 z = testCaseName.lastIndexOf("../", z);
256
257 importClassName += testCaseName.substring(z + 2);
258
259 count = StringUtil.count(fileName, "/") - 2;
260
261 String relativePath = "" ;
262
263 for (int i = 0; i < count; i++) {
264 relativePath += "../";
265 }
266
267 importClassName = StringUtil.replace(
268 importClassName, "com/liferay/", relativePath);
269
270 newContent = StringUtil.replace(
271 newContent, testCaseName, importClassName);
272 }
273
274 if (!oldContent.equals(newContent)) {
275 writeFile(fileName, newContent, false);
276 }
277
278 return newContent;
279 }
280
281 protected Set<String> getFileNames() throws Exception {
282 DirectoryScanner directoryScanner = new DirectoryScanner();
283
284 directoryScanner.setBasedir(_basedir);
285 directoryScanner.setExcludes(
286 new String[] {
287 "**\\EvaluateLogTest.java", "**\\EvaluateUserCSVFileTest.java",
288 "**\\IterateThemeTest.java", "**\\StopSeleniumTest.java",
289 "**\\WaitForSystemShutdownTest.java"
290 });
291 directoryScanner.setIncludes(
292 new String[] {
293 "**\\*Test.html", "**\\*Test.java", "**\\*Tests.html",
294 "**\\*Tests.java", "**\\*TestSuite.java"
295 });
296
297 directoryScanner.scan();
298
299 Set<String> fileNames = new TreeSet<String>(
300 new StringComparator() {
301
302 @Override
303 public int compare(String s1, String s2) {
304 if (s1.endsWith("Test.html") && s2.contains("Tests.html")) {
305 return -1;
306 }
307
308 if (s1.endsWith("Tests.html") && s2.contains("Test.html")) {
309 return 1;
310 }
311
312 if (s1.endsWith(".html") && s2.contains(".java")) {
313 return -1;
314 }
315
316 if (s1.endsWith(".java") && s2.contains(".html")) {
317 return 1;
318 }
319
320 return super.compare(s1, s2);
321 }
322
323 });
324
325 for (String fileName : directoryScanner.getIncludedFiles()) {
326 fileName = normalizeFileName(fileName);
327
328 fileNames.add(fileName);
329 }
330
331 if (false) {
332 StringBundler sb = new StringBundler();
333
334 for (String fileName : fileNames) {
335 sb.append(fileName);
336 sb.append("\n");
337 }
338
339 writeFile("selenium_included_files.txt", sb.toString(), false);
340 }
341
342 return fileNames;
343 }
344
345 protected String getNormalizedContent(String fileName) throws Exception {
346 String content = readFile(fileName);
347
348 if (content != null) {
349 content = content.trim();
350 content = StringUtil.replace(content, "\n", "");
351 content = StringUtil.replace(content, "\r\n", "");
352 }
353
354 return content;
355 }
356
357 protected String[] getParams(String step) throws Exception {
358 String[] params = new String[3];
359
360 int x = 0;
361 int y = 0;
362
363 for (int i = 0; i < 3; i++) {
364 x = step.indexOf("<td>", x) + 4;
365 y = step.indexOf("\n", x);
366 y = step.lastIndexOf("</td>", y);
367
368 params[i] = step.substring(x, y);
369 }
370
371 return params;
372 }
373
374 protected void minimizeTestCase(
375 String fileName, String minimizeTestFileName)
376 throws Exception {
377
378 int x = fileName.lastIndexOf(StringPool.SLASH);
379
380 String dirName = fileName.substring(0, x);
381
382 x = minimizeTestFileName.lastIndexOf(StringPool.SLASH);
383
384 String minimizeTestDirName = minimizeTestFileName.substring(0, x);
385
386 if (dirName.equals(minimizeTestDirName)) {
387 return;
388 }
389
390 String minimizeTestName = minimizeTestFileName.substring(x + 1);
391
392 x = fileName.indexOf("portalweb");
393
394 int count = StringUtil.count(fileName.substring(x), StringPool.SLASH);
395
396 String relativeMinimizeTestFileName = "";
397
398 while (count > 0) {
399 relativeMinimizeTestFileName += "../";
400
401 count--;
402 }
403
404 relativeMinimizeTestFileName += minimizeTestFileName.substring(
405 minimizeTestFileName.lastIndexOf("/", x) + 1);
406
407 File minimizeTestFile = new File(
408 _basedir + "/" + dirName + "/" + relativeMinimizeTestFileName);
409
410 if (!minimizeTestFile.exists()) {
411 throw new IllegalArgumentException(
412 minimizeTestFile.toString() + " does not exist");
413 }
414
415 String[] subfileNames = FileUtil.listFiles(_basedir + "/" + dirName);
416
417 for (String subfileName : subfileNames) {
418 if (!subfileName.endsWith("Tests.html")) {
419 continue;
420 }
421
422 File subfile = new File(
423 _basedir + "/" + dirName + "/" + subfileName);
424
425 String content = FileUtil.read(subfile);
426
427 content = StringUtil.replace(
428 content, "\"" + minimizeTestName + "\"",
429 "\"" + relativeMinimizeTestFileName + "\"");
430
431 FileUtil.write(subfile, content);
432 }
433
434 FileUtil.delete(_basedir + "/" + fileName);
435 FileUtil.delete(
436 _basedir + "/" + fileName.substring(0, fileName.length() - 5) +
437 ".java");
438 }
439
440 protected String normalizeFileName(String fileName) {
441 return StringUtil.replace(
442 fileName, StringPool.BACK_SLASH, StringPool.SLASH);
443 }
444
445 protected String readFile(String fileName) throws Exception {
446 return FileUtil.read(_basedir + "/" + fileName);
447 }
448
449 protected void translateTestCase(String fileName) throws Exception {
450 if (!FileUtil.exists(_basedir + "/" + fileName)) {
451 return;
452 }
453
454 int x = fileName.lastIndexOf(StringPool.SLASH);
455 int y = fileName.indexOf(CharPool.PERIOD);
456
457 String testPackagePath = StringUtil.replace(
458 fileName.substring(0, x), StringPool.SLASH, StringPool.PERIOD);
459 String testName = fileName.substring(x + 1, y);
460 String testMethodName =
461 "test" + testName.substring(0, testName.length() - 4);
462 String testFileName = fileName.substring(0, y) + ".java";
463
464 StringBundler sb = new StringBundler();
465
466 sb.append("package ");
467 sb.append(testPackagePath);
468 sb.append(";\n");
469
470 sb.append("import com.liferay.portal.kernel.util.FileUtil;\n");
471 sb.append("import com.liferay.portal.kernel.util.StringPool;\n");
472 sb.append("import com.liferay.portalweb.portal.BaseTestCase;\n");
473 sb.append(
474 "import com.liferay.portalweb.portal.util.BrowserCommands;\n");
475 sb.append(
476 "import com.liferay.portalweb.portal.util.RuntimeVariables;\n");
477
478 sb.append("public class ");
479 sb.append(testName);
480 sb.append(" extends BaseTestCase {");
481
482 sb.append("public void ");
483 sb.append(testMethodName);
484 sb.append("() throws Exception {");
485
486 String content = readFile(fileName);
487
488 if (!content.contains("<title>" + testName + "</title>") ||
489 !content.contains("colspan=\"3\">" + testName + "</td>")) {
490
491 System.out.println(testName + " has an invalid test name");
492 }
493
494 if (content.contains("&")) {
495 content = StringUtil.replace(content, "&", "&");
496
497 writeFile(fileName, content, false);
498 }
499
500 if (content.contains(">")) {
501 content = StringUtil.replace(content, ">", ">");
502
503 writeFile(fileName, content, false);
504 }
505
506 if (content.contains("<")) {
507 content = StringUtil.replace(content, "<", "<");
508
509 writeFile(fileName, content, false);
510 }
511
512 if (content.contains(""")) {
513 content = StringUtil.replace(content, """, "\"");
514
515 writeFile(fileName, content, false);
516 }
517
518 x = content.indexOf("<tbody>");
519 y = content.indexOf("</tbody>");
520
521 content = content.substring(x, y + 8);
522
523 Map<String, String> labels = new HashMap<String, String>();
524
525 int labelCount = 1;
526
527 Map<Integer, Boolean> takeScreenShots = new HashMap<Integer, Boolean>();
528
529 x = 0;
530 y = 0;
531
532 while (true) {
533 x = content.indexOf("<tr>", y);
534 y = content.indexOf("\n</tr>", x);
535
536 if ((x == -1) || (y == -1)) {
537 break;
538 }
539
540 x += 6;
541 y++;
542
543 String step = content.substring(x, y);
544
545 String[] params = getParams(step);
546
547 String param1 = params[0];
548 String param2 = fixParam(params[1]);
549
550 if (param1.equals("assertConfirmation")) {
551 int previousX = x - 6;
552
553 previousX = content.lastIndexOf("<tr>", previousX - 1);
554 previousX += 6;
555
556 takeScreenShots.put(previousX, Boolean.FALSE);
557 }
558 else if (param1.equals("label")) {
559 String label = labels.get(param2);
560
561 if (label == null) {
562 labelCount++;
563
564 label = labels.put(param2, String.valueOf(labelCount));
565 }
566 }
567 }
568
569 if (labels.size() > 0) {
570 sb.append("int label = 1;");
571
572 sb.append("while (label >= 1) {");
573 sb.append("switch (label) {");
574 sb.append("case 1:");
575 }
576
577 x = 0;
578 y = 0;
579
580 sb.append("selenium.selectWindow(\"null\");");
581 sb.append("selenium.selectFrame(\"relative=top\");");
582
583 while (true) {
584 x = content.indexOf("<tr>", y);
585 y = content.indexOf("\n</tr>", x);
586
587 if ((x == -1) || (y == -1)) {
588 break;
589 }
590
591 x += 6;
592 y++;
593
594 String step = content.substring(x, y);
595
596 String[] params = getParams(step);
597
598 String param1 = params[0];
599 String param2 = fixParam(params[1]);
600 String param3 = fixParam(params[2]);
601
602 if (param1.equals("addSelection") || param1.equals("clickAt") ||
603 param1.equals("doubleClickAt") || param1.equals("keyDown") ||
604 param1.equals("keyPress") || param1.equals("keyUp") ||
605 param1.equals("mouseMoveAt") || param1.equals("openWindow") ||
606 param1.equals("select") || param1.equals("sendKeys") ||
607 param1.equals("type") || param1.equals("typeFrame") ||
608 param1.equals("typeKeys") ||
609 param1.equals("uploadCommonFile") ||
610 param1.equals("uploadFile") ||
611 param1.equals("uploadTempFile") ||
612 param1.equals("waitForPopUp")) {
613
614 sb.append("selenium.");
615 sb.append(param1);
616 sb.append("(");
617
618 if (param2.startsWith("${")) {
619 sb.append("RuntimeVariables.getValue(\"");
620
621 String text = param2.substring(2, param2.length() - 1);
622
623 sb.append(text);
624 sb.append("\")");
625 }
626 else {
627 sb.append("\"");
628 sb.append(param2);
629 sb.append("\"");
630 }
631
632 sb.append(", RuntimeVariables.replace(");
633
634 if (param3.startsWith("${")) {
635 sb.append("RuntimeVariables.getValue(\"");
636
637 String text = param3.substring(2, param3.length() - 1);
638
639 sb.append(text);
640 sb.append("\")");
641 }
642 else if (param3.startsWith("value=${")) {
643 sb.append("\"value=\" + RuntimeVariables.getValue(\"");
644
645 String text = param3.substring(8, param3.length() - 1);
646
647 sb.append(text);
648 sb.append("\")");
649 }
650 else {
651 sb.append("\"");
652 sb.append(param3);
653 sb.append("\"");
654 }
655
656 sb.append("));");
657 }
658 else if (param1.equals("assertAlert") ||
659 param1.equals("assertNotAlert")) {
660
661 if (param1.equals("assertAlert")) {
662 sb.append("assertEquals");
663 }
664 else if (param1.equals("assertNotAlert")) {
665 sb.append("assertNotEquals");
666 }
667
668 sb.append("(\"");
669 sb.append(param2);
670 sb.append("\", selenium.getAlert());");
671 }
672 else if (param1.equals("assertChecked") ||
673 param1.equals("assertNotChecked")) {
674
675 if (param1.equals("assertChecked")) {
676 sb.append("assertTrue");
677 }
678 else if (param1.equals("assertNotChecked")) {
679 sb.append("assertFalse");
680 }
681
682 sb.append("(selenium.isChecked(\"");
683 sb.append(param2);
684 sb.append("\"));");
685 }
686 else if (param1.equals("assertConfirmation")) {
687 param2 = StringUtil.replace(param2, "?", "[\\\\s\\\\S]");
688
689 sb.append("assertTrue(selenium.getConfirmation().matches(\"^");
690 sb.append(param2);
691 sb.append("$\"));");
692 }
693 else if (param1.equals("assertLocation") ||
694 param1.equals("assertNotLocation")) {
695
696 if (param1.equals("assertLocation")) {
697 sb.append("assertEquals");
698 }
699 else if (param1.equals("assertNotLocation")) {
700 sb.append("assertNotEquals");
701 }
702
703 sb.append("(RuntimeVariables.replace(\"");
704 sb.append(param2);
705 sb.append("\"), selenium.getLocation());");
706 }
707 else if (param1.equals("assertElementNotPresent") ||
708 param1.equals("assertElementPresent")) {
709
710 sb.append("assertTrue(selenium.");
711
712 if (param1.equals("assertElementNotPresent")) {
713 sb.append("isElementNotPresent");
714 }
715 else if (param1.equals("assertElementPresent")) {
716 sb.append("isElementPresent");
717 }
718
719 sb.append("(\"");
720 sb.append(param2);
721 sb.append("\"));");
722 }
723 else if (param1.equals("assertNotPartialText") ||
724 param1.equals("assertPartialText")) {
725
726 if (param1.equals("assertNotPartialText")) {
727 sb.append("assertFalse");
728 }
729 else if (param1.equals("assertPartialText")) {
730 sb.append("assertTrue");
731 }
732
733 sb.append("(selenium.isPartialText(\"");
734 sb.append(param2);
735 sb.append("\", ");
736
737 if (param3.startsWith("${")) {
738 sb.append("RuntimeVariables.getValue(\"");
739
740 String text = param3.substring(2, param3.length() - 1);
741
742 sb.append(text);
743 sb.append("\")");
744 }
745 else {
746 sb.append("\"");
747 sb.append(param3);
748 sb.append("\"");
749 }
750
751 sb.append("));");
752 }
753 else if (param1.equals("assertNotSelectedLabel") ||
754 param1.equals("assertSelectedLabel")) {
755
756 if (param1.equals("assertNotSelectedLabel")) {
757 sb.append("assertNotEquals");
758 }
759 else if (param1.equals("assertSelectedLabel")) {
760 sb.append("assertEquals");
761 }
762
763 sb.append("(");
764
765 if (param3.startsWith("${")) {
766 sb.append("RuntimeVariables.getValue(\"");
767
768 String text = param3.substring(2, param3.length() - 1);
769
770 sb.append(text);
771 sb.append("\")");
772 }
773 else {
774 sb.append("\"");
775 sb.append(param3);
776 sb.append("\"");
777 }
778
779 sb.append(", selenium.getSelectedLabel(\"");
780 sb.append(param2);
781 sb.append("\"));");
782 }
783 else if (param1.equals("assertNotSelectedLabels") ||
784 param1.equals("assertSelectedLabels")) {
785
786 if (param1.equals("assertNotSelectedLabels")) {
787 sb.append("assertNotEquals");
788 }
789 else if (param1.equals("assertSelectedLabels")) {
790 sb.append("assertEquals");
791 }
792
793 sb.append("(\"");
794 sb.append(param3);
795 sb.append("\", join(selenium.getSelectedLabels(\"");
796 sb.append(param2);
797 sb.append("\"), \',\'));");
798 }
799 else if (param1.equals("assertNotText") ||
800 param1.equals("assertText")) {
801
802 if (param1.equals("assertNotText")) {
803 sb.append("assertNotEquals");
804 }
805 else if (param1.equals("assertText")) {
806 sb.append("assertEquals");
807 }
808
809 sb.append("(RuntimeVariables.replace(\"");
810 sb.append(param3);
811 sb.append("\"), selenium.getText(\"");
812 sb.append(param2);
813 sb.append("\"));");
814 }
815 else if (param1.equals("assertNotValue") ||
816 param1.equals("assertValue")) {
817
818 if (param1.equals("assertNotValue")) {
819 sb.append("assertNotEquals");
820 }
821 else if (param1.equals("assertValue")) {
822 sb.append("assertEquals");
823 }
824
825 sb.append("(\"");
826 sb.append(param3);
827 sb.append("\", selenium.getValue(\"");
828 sb.append(param2);
829 sb.append("\"));");
830 }
831 else if (param1.equals("assertNotVisible") ||
832 param1.equals("assertVisible")) {
833
834 if (param1.equals("assertNotVisible")) {
835 sb.append("assertFalse");
836 }
837 else if (param1.equals("assertVisible")) {
838 sb.append("assertTrue");
839 }
840
841 sb.append("(");
842 sb.append("selenium.isVisible(\"");
843 sb.append(param2);
844 sb.append("\"));");
845 }
846 else if (param1.equals("assertSelectOptions")) {
847 String[] expectedArray = StringUtil.split(param3);
848
849 sb.append("String[] actualArray = ");
850 sb.append("selenium.getSelectOptions(\"");
851 sb.append(param2);
852 sb.append("\");");
853
854 sb.append("assertEquals(");
855 sb.append(expectedArray.length);
856 sb.append(", actualArray.length);");
857
858 for (int i = 0; i < expectedArray.length; i++) {
859 sb.append("assertEquals(\"");
860 sb.append(expectedArray[i]);
861 sb.append("\", actualArray[");
862 sb.append(i);
863 sb.append("]);");
864 }
865 }
866 else if (param1.equals("assertTextNotPresent") ||
867 param1.equals("assertTextPresent")) {
868
869 if (param1.equals("assertTextNotPresent")) {
870 sb.append("assertFalse");
871 }
872 else if (param1.equals("assertTextPresent")) {
873 sb.append("assertTrue");
874 }
875
876 sb.append("(selenium.isTextPresent(\"");
877 sb.append(param2);
878 sb.append("\"));");
879 }
880 else if (param1.equals("captureEntirePageScreenshot")) {
881 int pos = param2.lastIndexOf("\\");
882
883 String dirName = param2.substring(0, pos + 1);
884
885 sb.append("FileUtil.mkdirs(RuntimeVariables.replace(\"");
886 sb.append(dirName);
887 sb.append("\"));");
888 sb.append("selenium.captureEntirePageScreenshot(");
889 sb.append("RuntimeVariables.replace(\"");
890 sb.append(param2);
891 sb.append("\"), \"\");");
892 }
893 else if (param1.equals("check") || param1.equals("click") ||
894 param1.equals("doubleClick") ||
895 param1.equals("downloadTempFile") ||
896 param1.equals("makeVisible") ||
897 param1.equals("mouseDown") || param1.equals("mouseMove") ||
898 param1.equals("mouseOver") || param1.equals("mouseUp") ||
899 param1.equals("open") || param1.equals("runScript") ||
900 param1.equals("selectFrame") ||
901 param1.equals("selectPopUp") ||
902 param1.equals("selectWindow") ||
903 param1.equals("setTimeout") ||
904 param1.equals("setTimeoutImplicit") ||
905 param1.equals("uncheck") ||
906 param1.equals("waitForConfirmation") ||
907 param1.equals("waitForElementPresent") ||
908 param1.equals("waitForElementNotPresent") ||
909 param1.equals("waitForNotVisible") ||
910 param1.equals("waitForTextNotPresent") ||
911 param1.equals("waitForTextPresent") ||
912 param1.equals("waitForVisible")) {
913
914 if (param1.equals("downloadTempFile")) {
915 sb.append("BrowserCommands.");
916 }
917 else {
918 sb.append("selenium.");
919 }
920
921 sb.append(param1);
922 sb.append("(");
923
924 if (param2.startsWith("${")) {
925 sb.append("RuntimeVariables.getValue(\"");
926
927 String text = param2.substring(2, param2.length() - 1);
928
929 sb.append(text);
930 sb.append("\")");
931 }
932 else {
933 sb.append("\"");
934 sb.append(param2);
935 sb.append("\"");
936 }
937
938 sb.append(");");
939 }
940 else if (param1.equals("clickAndWait")) {
941 sb.append("selenium.click(RuntimeVariables.replace(\"");
942 sb.append(param2);
943 sb.append("\"));");
944 sb.append("selenium.waitForPageToLoad(\"30000\");");
945 }
946 else if (param1.equals("clickAtAndWait") ||
947 param1.equals("keyDownAndWait") ||
948 param1.equals("keyPressAndWait") ||
949 param1.equals("keyUpAndWait") ||
950 param1.equals("selectAndWait")) {
951
952 sb.append("selenium.");
953
954 String text = param1.substring(0, param1.length() - 7);
955
956 sb.append(text);
957 sb.append("(\"");
958 sb.append(param2);
959 sb.append("\", RuntimeVariables.replace(\"");
960 sb.append(param3);
961 sb.append("\"));");
962 sb.append("selenium.waitForPageToLoad(\"30000\");");
963 }
964 else if (param1.equals("close") || param1.equals("goBack") ||
965 param1.equals("refresh") ||
966 param1.equals("setBrowserOption") ||
967 param1.equals("setDefaultTimeout") ||
968 param1.equals("setDefaultTimeoutImplicit") ||
969 param1.equals("windowFocus") ||
970 param1.equals("windowMaximize")) {
971
972 if (param1.equals("setBrowserOption")) {
973 sb.append("BrowserCommands.");
974 }
975 else {
976 sb.append("selenium.");
977 }
978
979 sb.append(param1);
980 sb.append("();");
981 }
982 else if (param1.equals("dragAndDropToObject")) {
983 sb.append("selenium.");
984 sb.append("dragAndDropToObject(\"");
985 sb.append(param2);
986 sb.append("\", \"");
987 sb.append(param3);
988 sb.append("\");");
989 }
990 else if (param1.equals("echo")) {
991 sb.append("System.out.println(");
992
993 if (param2.startsWith("${")) {
994 sb.append("RuntimeVariables.getValue(\"");
995
996 String text = param2.substring(2, param2.length() - 1);
997
998 sb.append(text);
999 sb.append("\")");
1000 }
1001 else {
1002 sb.append("\"");
1003 sb.append(param2);
1004 sb.append("\"");
1005 }
1006
1007 sb.append(");");
1008 }
1009 else if (param1.equals("goBackAndWait") ||
1010 param1.equals("refreshAndWait") ||
1011 param1.equals("windowMaximizeAndWait")) {
1012
1013 String text = param1.substring(0, param1.length() - 7);
1014
1015 sb.append("selenium.");
1016 sb.append(text);
1017 sb.append("();");
1018 sb.append("selenium.waitForPageToLoad(\"30000\");");
1019 }
1020 else if (param1.equals("gotoIf")) {
1021 String conditional = StringUtil.replace(
1022 param2, new String[] {"${", "}"}, new String[] {"", ""});
1023
1024 sb.append("if (");
1025 sb.append(conditional);
1026 sb.append(") {");
1027 sb.append("label =");
1028 sb.append(labels.get(param3));
1029 sb.append(";");
1030 sb.append("continue;");
1031 sb.append("}");
1032 }
1033 else if (param1.equals("label")) {
1034 String label = labels.get(param2);
1035
1036 sb.append("case ");
1037 sb.append(label);
1038 sb.append(":");
1039 }
1040 else if (param1.equals("pause")) {
1041 sb.append("Thread.sleep(");
1042 sb.append(param2);
1043 sb.append(");");
1044 }
1045 else if (param1.equals("store")) {
1046 sb.append("boolean ");
1047 sb.append(param3);
1048 sb.append(" = ");
1049
1050 if (param2.startsWith("eval(")) {
1051 String eval = param2.substring(5, param2.length() - 1);
1052
1053 eval = StringUtil.replace(eval, "'", "\"");
1054
1055 sb.append(eval);
1056 }
1057
1058 sb.append(";");
1059 }
1060 else if (param1.equals("storeAttribute")) {
1061 sb.append("String ");
1062 sb.append(param3);
1063 sb.append(" = selenium.getAttribute(\"");
1064 sb.append(param2);
1065 sb.append("\");");
1066
1067 sb.append("RuntimeVariables.setValue(\"");
1068 sb.append(param3);
1069 sb.append("\", ");
1070 sb.append(param3);
1071 sb.append(");");
1072 }
1073 else if (param1.equals("storeChecked")) {
1074 sb.append("boolean ");
1075 sb.append(param3);
1076 sb.append(" = selenium.isChecked(\"");
1077 sb.append(param2);
1078 sb.append("\");");
1079 }
1080 else if (param1.equals("storeCurrentDay")) {
1081 sb.append("String ");
1082 sb.append(param2);
1083 sb.append(" = selenium.getCurrentDay();");
1084
1085 sb.append("RuntimeVariables.setValue(\"");
1086 sb.append(param2);
1087 sb.append("\", ");
1088 sb.append(param2);
1089 sb.append(");");
1090 }
1091 else if (param1.equals("storeCurrentMonth")) {
1092 sb.append("String ");
1093 sb.append(param2);
1094 sb.append(" = selenium.getCurrentMonth();");
1095
1096 sb.append("RuntimeVariables.setValue(\"");
1097 sb.append(param2);
1098 sb.append("\", ");
1099 sb.append(param2);
1100 sb.append(");");
1101 }
1102 else if (param1.equals("storeCurrentYear")) {
1103 sb.append("String ");
1104 sb.append(param2);
1105 sb.append(" = selenium.getCurrentYear();");
1106
1107 sb.append("RuntimeVariables.setValue(\"");
1108 sb.append(param2);
1109 sb.append("\", ");
1110 sb.append(param2);
1111 sb.append(");");
1112 }
1113 else if (param1.equals("storeElementPresent")) {
1114 sb.append("boolean ");
1115 sb.append(param3);
1116 sb.append(" = selenium.isElementPresent(\"");
1117 sb.append(param2);
1118 sb.append("\");");
1119 }
1120 else if (param1.equals("storeFirstNumber")) {
1121 sb.append("String ");
1122 sb.append(param3);
1123 sb.append(" = selenium.getFirstNumber(\"");
1124 sb.append(param2);
1125 sb.append("\");");
1126
1127 sb.append("RuntimeVariables.setValue(\"");
1128 sb.append(param3);
1129 sb.append("\", ");
1130 sb.append(param3);
1131 sb.append(");");
1132 }
1133 else if (param1.equals("storeFirstNumberIncrement")) {
1134 sb.append("String ");
1135 sb.append(param3);
1136 sb.append(" = selenium.getFirstNumberIncrement(\"");
1137 sb.append(param2);
1138 sb.append("\");");
1139
1140 sb.append("RuntimeVariables.setValue(\"");
1141 sb.append(param3);
1142 sb.append("\", ");
1143 sb.append(param3);
1144 sb.append(");");
1145 }
1146 else if (param1.equals("storeLocation")) {
1147 sb.append("String ");
1148 sb.append(param2);
1149 sb.append(" = selenium.getLocation();");
1150
1151 sb.append("RuntimeVariables.setValue(\"");
1152 sb.append(param2);
1153 sb.append("\", ");
1154 sb.append(param2);
1155 sb.append(");");
1156 }
1157 else if (param1.equals("storeNumberIncrement")) {
1158 sb.append("String ");
1159 sb.append(param3);
1160 sb.append(" = selenium.getNumberIncrement(");
1161 sb.append("RuntimeVariables.getValue(\"");
1162
1163 String expression = param2.substring(2, param2.length() - 1);
1164
1165 sb.append(expression);
1166 sb.append("\"));");
1167
1168 sb.append("RuntimeVariables.setValue(\"");
1169 sb.append(param3);
1170 sb.append("\", ");
1171 sb.append(param3);
1172 sb.append(");");
1173 }
1174 else if (param1.equals("storeNumberDecrement")) {
1175 sb.append("String ");
1176 sb.append(param3);
1177 sb.append(" = selenium.getNumberDecrement(");
1178 sb.append("RuntimeVariables.getValue(\"");
1179
1180 String expression = param2.substring(2, param2.length() - 1);
1181
1182 sb.append(expression);
1183 sb.append("\"));");
1184
1185 sb.append("RuntimeVariables.setValue(\"");
1186 sb.append(param3);
1187 sb.append("\", ");
1188 sb.append(param3);
1189 sb.append(");");
1190 }
1191 else if (param1.equals("storeText")) {
1192 sb.append("String ");
1193 sb.append(param3);
1194 sb.append(" = selenium.getText(\"");
1195 sb.append(param2);
1196 sb.append("\");");
1197
1198 sb.append("RuntimeVariables.setValue(\"");
1199 sb.append(param3);
1200 sb.append("\", ");
1201 sb.append(param3);
1202 sb.append(");");
1203 }
1204 else if (param1.equals("storeValue")) {
1205 sb.append("String ");
1206 sb.append(param3);
1207 sb.append(" = selenium.getValue(\"");
1208 sb.append(param2);
1209 sb.append("\");");
1210
1211 sb.append("RuntimeVariables.setValue(\"");
1212 sb.append(param3);
1213 sb.append("\", ");
1214 sb.append(param3);
1215 sb.append(");");
1216 }
1217 else if (param1.equals("storeVisible")) {
1218 sb.append("boolean ");
1219 sb.append(param3);
1220 sb.append(" = selenium.isVisible(\"");
1221 sb.append(param2);
1222 sb.append("\");");
1223 }
1224 else if (param1.equals("verifyElementNotPresent") ||
1225 param1.equals("verifyElementPresent")) {
1226
1227 if (param1.equals("verifyElementNotPresent")) {
1228 sb.append("verifyFalse");
1229 }
1230 else if (param1.equals("verifyElementPresent")) {
1231 sb.append("verifyTrue");
1232 }
1233
1234 sb.append("(selenium.isElementPresent(\"");
1235 sb.append(param2);
1236 sb.append("\"));");
1237 }
1238 else if (param1.equals("verifyTextNotPresent") ||
1239 param1.equals("verifyTextPresent")) {
1240
1241 if (param1.equals("verifyTextNotPresent")) {
1242 sb.append("verifyFalse");
1243 }
1244 else if (param1.equals("verifyTextPresent")) {
1245 sb.append("verifyTrue");
1246 }
1247
1248 sb.append("(selenium.isTextPresent(\"");
1249 sb.append(param2);
1250 sb.append("\"));");
1251 }
1252 else if (param1.equals("verifyTitle")) {
1253 sb.append("verifyEquals(\"");
1254 sb.append(param2);
1255 sb.append("\", selenium.getTitle());");
1256 }
1257 else if (param1.equals("waitForNotPartialText") ||
1258 param1.equals("waitForNotSelectedLabel") ||
1259 param1.equals("waitForNotText") ||
1260 param1.equals("waitForNotValue") ||
1261 param1.equals("waitForPartialText") ||
1262 param1.equals("waitForSelectedLabel") ||
1263 param1.equals("waitForText") ||
1264 param1.equals("waitForValue")) {
1265
1266 sb.append("selenium.");
1267 sb.append(param1);
1268 sb.append("(\"");
1269 sb.append(param2);
1270 sb.append("\",");
1271
1272 if (param3.startsWith("${")) {
1273 sb.append("RuntimeVariables.getValue(\"");
1274
1275 String text = param3.substring(2, param3.length() - 1);
1276
1277 sb.append(text);
1278 sb.append("\")");
1279 }
1280 else {
1281 sb.append("\"");
1282 sb.append(param3);
1283 sb.append("\"");
1284 }
1285
1286 sb.append(");");
1287 }
1288 else {
1289 System.out.println(
1290 testFileName + " has an unknown command " + param1);
1291 }
1292 }
1293
1294 if (labels.size() > 0) {
1295 sb.append("case 100:");
1296 sb.append("label = -1;");
1297 sb.append("}");
1298 sb.append("}");
1299 }
1300
1301 sb.append("}");
1302 sb.append("}");
1303
1304 writeFile(testFileName, sb.toString(), true);
1305 }
1306
1307 protected void translateTestSuite(String fileName) throws Exception {
1308 int x = fileName.lastIndexOf(StringPool.SLASH);
1309 int y = fileName.indexOf(StringPool.PERIOD);
1310
1311 String testPackagePath = StringUtil.replace(
1312 fileName.substring(0, x), StringPool.SLASH, StringPool.PERIOD);
1313 String testName = fileName.substring(x + 1, y);
1314 String testFileName = fileName.substring(0, y) + ".java";
1315
1316 StringBundler sb = new StringBundler();
1317
1318 sb.append("package ");
1319 sb.append(testPackagePath);
1320 sb.append(";\n");
1321
1322 sb.append("import com.liferay.portalweb.portal.BaseTestSuite;\n");
1323 sb.append("import com.liferay.portalweb.portal.StopSeleniumTest;\n");
1324
1325 String content = readFile(fileName);
1326
1327 content = formatTestSuite(fileName, content);
1328
1329 x = 0;
1330 y = 0;
1331
1332 while (content.indexOf("<a href=\"", x) != -1) {
1333 x = content.indexOf("<a href=\"", x) + 9;
1334 y = content.indexOf("\">", x);
1335
1336 String testCaseName = content.substring(x, y);
1337
1338 if (!testCaseName.contains("..")) {
1339 continue;
1340 }
1341
1342 if (!testCaseName.contains("../portalweb/")) {
1343 throw new IllegalArgumentException(
1344 fileName + " has improper relative path");
1345 }
1346
1347 testCaseName = StringUtil.replace(
1348 testCaseName, "../../portalweb/", "../");
1349
1350 int z = fileName.lastIndexOf(StringPool.SLASH);
1351
1352 String importClassName = fileName.substring(0, z);
1353
1354 int count = StringUtil.count(testCaseName, "..");
1355
1356 for (int i = 0; i < count; i++) {
1357 z = importClassName.lastIndexOf(StringPool.SLASH);
1358
1359 importClassName = fileName.substring(0, z);
1360 }
1361
1362 z = testCaseName.lastIndexOf("../", z);
1363
1364 importClassName += testCaseName.substring(
1365 z + 2, testCaseName.length() -5);
1366 importClassName = StringUtil.replace(
1367 importClassName, StringPool.SLASH, StringPool.PERIOD);
1368
1369 sb.append("import ");
1370 sb.append(importClassName);
1371 sb.append(";\n");
1372 }
1373
1374 sb.append("import junit.framework.Test;\n");
1375 sb.append("import junit.framework.TestSuite;\n");
1376
1377 sb.append("public class ");
1378 sb.append(testName);
1379 sb.append(" extends BaseTestSuite {");
1380
1381 sb.append("public static Test suite() {");
1382
1383 sb.append("TestSuite testSuite = new TestSuite();");
1384
1385 x = content.indexOf("</b></td></tr>");
1386 y = content.indexOf("</tbody>");
1387
1388 content = content.substring(x + 15, y);
1389
1390 x = 0;
1391 y = 0;
1392
1393 while (true) {
1394 x = content.indexOf("\">", x);
1395 y = content.indexOf("</a>", x);
1396
1397 if ((x == -1) || (y == -1)) {
1398 break;
1399 }
1400
1401 String className = content.substring(x + 2, y);
1402
1403 x += className.length();
1404
1405 sb.append("testSuite.addTestSuite(");
1406 sb.append(className);
1407 sb.append(".class);");
1408 }
1409
1410 sb.append("return testSuite;");
1411 sb.append("}");
1412 sb.append("}");
1413
1414 writeFile(testFileName, sb.toString(), true);
1415 }
1416
1417 protected void writeFile(String fileName, String content, boolean format)
1418 throws Exception {
1419
1420 File file = new File(_basedir + "/" + fileName);
1421
1422 if (format) {
1423 ServiceBuilder.writeFile(file, content);
1424 }
1425 else {
1426 System.out.println("Writing " + file);
1427
1428 FileUtil.write(file, content);
1429 }
1430 }
1431
1432 private static final String[] _FIX_PARAM_NEW_SUBS = {"\\n", "\\n"};
1433
1434 private static final String[] _FIX_PARAM_OLD_SUBS = {"\\\\n", "<br />"};
1435
1436 private String _basedir;
1437 private boolean _reportDuplicates;
1438
1439 private class TestHtmlCountComparator
1440 implements Comparator<ObjectValuePair<String, IntegerWrapper>> {
1441
1442 @Override
1443 public int compare(
1444 ObjectValuePair<String, IntegerWrapper> object1,
1445 ObjectValuePair<String, IntegerWrapper> object2) {
1446
1447 IntegerWrapper integerWrapper1 = object1.getValue();
1448 IntegerWrapper integerWrapper2 = object2.getValue();
1449
1450 if (integerWrapper1.getValue() > integerWrapper2.getValue()) {
1451 return -1;
1452 }
1453 else if (integerWrapper1.getValue() < integerWrapper2.getValue()) {
1454 return 1;
1455 }
1456 else {
1457 return 0;
1458 }
1459 }
1460
1461 }
1462
1463 }