sysmodelmgr/com.symbian.pde.test.utils/src/com/symbian/pde/test/utils/PDETestListener.java
author terytkon
Thu, 11 Mar 2010 19:08:43 +0200
changeset 0 522a326673b6
permissions -rw-r--r--
Moved swconfigapps content under oss repository.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     1
// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     2
// All rights reserved.
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     3
// This component and the accompanying materials are made available
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     5
// which accompanies this distribution, and is available
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     7
//
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     8
// Initial Contributors:
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    10
//
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    11
// Contributors:
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    12
//
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    13
// Description:
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    14
//
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    15
package com.symbian.pde.test.utils;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    16
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    17
import java.io.File;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    18
import java.io.FileNotFoundException;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    19
import java.io.FileOutputStream;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    20
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    21
import junit.framework.AssertionFailedError;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    22
import junit.framework.TestCase;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    23
import junit.framework.TestResult;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    24
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    25
import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    26
import org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    27
import org.eclipse.jdt.internal.junit.model.ITestRunListener2;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    28
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    29
public class PDETestListener implements ITestRunListener2 {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    30
    private Object resultsCollector;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    31
    private int totalNumberOfTests;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    32
    private int testsRunCount;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    33
    private int numberOfTestsPassed;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    34
    private int numberOfTestsFailed;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    35
    private int numberOfTestsWithError;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    36
    private boolean testRunEnded = false;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    37
    private XMLJUnitResultFormatter xmlResultsFormatter;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    38
    private File outputFile;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    39
    private String suiteName;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    40
    private JUnitTest junitTestSuite;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    41
    private TestCase currentTest;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    42
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    43
    public PDETestListener(Object collector, String suite) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    44
        resultsCollector = collector;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    45
        suiteName = suite;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    46
        junitTestSuite = new JUnitTest(suiteName);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    47
        junitTestSuite.setProperties(System.getProperties());
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    48
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    49
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    50
    public void setOutputFile(String filename) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    51
        outputFile = new File(filename);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    52
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    53
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    54
    public File getOutputFile() {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    55
        if (outputFile == null) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    56
            setOutputFile("TEST-" + suiteName + ".xml");
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    57
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    58
        return outputFile;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    59
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    60
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    61
    public boolean failed() {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    62
        return ((numberOfTestsFailed + numberOfTestsWithError) > 0) || (testRunEnded && (testsRunCount == 0));
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    63
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    64
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    65
    public int count() {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    66
        return testsRunCount;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    67
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    68
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    69
    private XMLJUnitResultFormatter getXMLJUnitResultFormatter() {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    70
        if (xmlResultsFormatter == null) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    71
            xmlResultsFormatter = new XMLJUnitResultFormatter();
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    72
            try {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    73
                xmlResultsFormatter.setOutput(new FileOutputStream(getOutputFile()));
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    74
            } catch (FileNotFoundException e) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    75
                e.printStackTrace();
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    76
            }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    77
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    78
        return xmlResultsFormatter;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    79
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    80
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    81
    public synchronized void testRunStarted(int testCount) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    82
        totalNumberOfTests = testCount;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    83
        testsRunCount = 0;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    84
        numberOfTestsPassed = 0;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    85
        numberOfTestsFailed = 0;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    86
        numberOfTestsWithError = 0;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    87
        testRunEnded = false;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    88
        getXMLJUnitResultFormatter().startTestSuite(junitTestSuite);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    89
        System.out.println("PDE Test Run Started - running " + totalNumberOfTests + " tests ...");
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    90
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    91
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    92
    public synchronized void testRunEnded(long elapsedTime) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    93
        testRunEnded = true;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    94
        junitTestSuite.setCounts(testsRunCount, numberOfTestsFailed, numberOfTestsWithError);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    95
        junitTestSuite.setRunTime(elapsedTime);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    96
        getXMLJUnitResultFormatter().endTestSuite(junitTestSuite);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    97
        System.out.println("Test Run Ended   - " + (failed() ? "FAILED" : "PASSED") + " - Total: " + totalNumberOfTests
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    98
                + " (Errors: " + numberOfTestsWithError
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
    99
                + ", Failed: " + numberOfTestsFailed
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   100
                + ", Passed: " + numberOfTestsPassed + "), duration " + elapsedTime + "ms.");
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   101
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   102
        synchronized (resultsCollector) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   103
            resultsCollector.notifyAll();
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   104
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   105
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   106
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   107
    public synchronized void testRunStopped(long elapsedTime) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   108
        System.out.println("Test Run Stopped");
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   109
        testRunEnded(elapsedTime);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   110
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   111
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   112
    public synchronized void testRunTerminated() {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   113
        System.out.println("Test Run Terminated");
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   114
        testRunEnded(0);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   115
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   116
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   117
    public synchronized void testStarted(String testId, String testName) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   118
        testsRunCount++;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   119
        currentTest = new WrapperTestCase(testName);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   120
        getXMLJUnitResultFormatter().startTest(currentTest);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   121
        System.out.println("  Test Started - " + count() + " - " + testName);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   122
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   123
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   124
    public synchronized void testEnded(String testId, String testName) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   125
        numberOfTestsPassed = count() - (numberOfTestsFailed + numberOfTestsWithError);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   126
        getXMLJUnitResultFormatter().endTest(currentTest);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   127
        System.out.println("  Test Ended   - " + count() + " - " + testName);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   128
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   129
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   130
    public synchronized void testFailed(int status, String testId, String testName, String trace, String expected, String actual) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   131
        String statusMessage = String.valueOf(status);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   132
        if (status == ITestRunListener2.STATUS_OK) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   133
            numberOfTestsPassed++;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   134
            statusMessage = "OK";
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   135
        } else if (status == ITestRunListener2.STATUS_FAILURE) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   136
            numberOfTestsFailed++;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   137
            statusMessage = "FAILED";
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   138
            getXMLJUnitResultFormatter().addFailure(currentTest, new AssertionFailedError(trace));
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   139
        } else if (status == ITestRunListener2.STATUS_ERROR) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   140
            numberOfTestsWithError++;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   141
            statusMessage = "ERROR";
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   142
            getXMLJUnitResultFormatter().addError(currentTest, new Exception(trace));
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   143
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   144
        System.out.println("  Test Failed  - " + count() + " - " + testName + " - status: " + statusMessage
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   145
                + ", trace: " + trace + ", expected: " + expected + ", actual: " + actual);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   146
	}
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   147
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   148
	public synchronized void testReran(String testId, String testClass, String testName, int status, String trace, String expected, String actual) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   149
        String statusMessage = String.valueOf(status);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   150
        if (status == ITestRunListener2.STATUS_OK) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   151
            statusMessage = "OK";
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   152
        } else if (status == ITestRunListener2.STATUS_FAILURE) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   153
            statusMessage = "FAILED";
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   154
        } else if (status == ITestRunListener2.STATUS_ERROR) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   155
            statusMessage = "ERROR";
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   156
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   157
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   158
        System.out.println("  Test ReRan   - " + testName + " - test class: " + testClass + ", status: " + statusMessage
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   159
                + ", trace: " + trace + ", expected: " + expected + ", actual: " + actual);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   160
	}
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   161
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   162
	public synchronized void testTreeEntry(String description) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   163
        System.out.println("Test Tree Entry - Description: " + description);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   164
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   165
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   166
	class WrapperTestCase extends TestCase {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   167
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   168
        public WrapperTestCase(String name) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   169
            super(name);
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   170
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   171
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   172
        public int countTestCases() {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   173
            return 1;
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   174
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   175
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   176
        public void run(TestResult result) {
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   177
        }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   178
    }
522a326673b6 Moved swconfigapps content under oss repository.
terytkon
parents:
diff changeset
   179
}