summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/tests/SimpleTest/MozillaLogger.js
blob: c184b48cf1c45bfb6c8089e166b6695f4791a51c (plain)
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
/**
 * MozillaLogger, a base class logger that just logs to stdout.
 */

"use strict";

function formatLogMessage(msg) {
  return msg.info.join(" ") + "\n";
}

function importJSM(jsm) {
  if (typeof ChromeUtils === "object") {
    return ChromeUtils.import(jsm);
  }
  /* globals SpecialPowers */
  let obj = {};
  SpecialPowers.Cu.import(jsm, obj);
  return SpecialPowers.wrap(obj);
}

// When running in release builds, we get a fake Components object in
// web contexts, so we need to check that the Components object is sane,
// too, not just that it exists.
let haveComponents =
  typeof Components === "object" &&
  typeof Components.Constructor === "function";

let CC = (haveComponents
  ? Components
  : SpecialPowers.wrap(SpecialPowers.Components)
).Constructor;

let ConverterOutputStream = CC(
  "@mozilla.org/intl/converter-output-stream;1",
  "nsIConverterOutputStream",
  "init"
);

class MozillaLogger {
  get logCallback() {
    return msg => {
      this.log(formatLogMessage(msg));
    };
  }

  log(msg) {
    dump(msg);
  }

  close() {}
}

/**
 * MozillaFileLogger, a log listener that can write to a local file.
 * intended to be run from chrome space
 */

/** Init the file logger with the absolute path to the file.
    It will create and append if the file already exists **/
class MozillaFileLogger extends MozillaLogger {
  constructor(aPath) {
    super();

    const { FileUtils } = importJSM("resource://gre/modules/FileUtils.jsm");

    this._file = FileUtils.File(aPath);
    this._foStream = FileUtils.openFileOutputStream(
      this._file,
      FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_APPEND
    );

    this._converter = ConverterOutputStream(this._foStream, "UTF-8");
  }

  get logCallback() {
    return msg => {
      if (this._converter) {
        var data = formatLogMessage(msg);
        this.log(data);

        if (data.includes("SimpleTest FINISH")) {
          this.close();
        }
      }
    };
  }

  log(msg) {
    if (this._converter) {
      this._converter.writeString(msg);
    }
  }

  close() {
    this._converter.flush();
    this._converter.close();

    this._foStream = null;
    this._converter = null;
    this._file = null;
  }
}

this.MozillaLogger = MozillaLogger;
this.MozillaFileLogger = MozillaFileLogger;