summaryrefslogtreecommitdiff
path: root/cask/actor/test/src-jvm/JvmActorsTest.scala
blob: 9cfb0d57581a7fcbc395dafffb462fb492c7d723 (plain) (blame)
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
package cask.actor

import utest._
object JvmActorsTest extends TestSuite{
  def tests = Tests{
    os.remove.all(os.pwd / "out" / "scratch")
    test("lock"){
      val rotateSize = 50
      val logPath = os.pwd / "out" / "scratch" / "log.txt"
      val oldPath = os.pwd / "out" / "scratch" / "log-old.txt"

      var logSize = 0

      def logLine(s: String): Unit = {
        val newLogSize = logSize + s.length + 1
        if (newLogSize <= rotateSize) logSize = newLogSize
        else {
          logSize = 0
          os.move(logPath, oldPath, replaceExisting = true)
        }

        os.write.append(logPath, s + "\n", createFolders = true)
      }

      logLine("I am cow")
      logLine("hear me moo")
      logLine("I weight twice as much as you")
      logLine("And I look good on the barbecue")
      logLine("Yoghurt curds cream cheese and butter")
      logLine("Comes from liquids from my udder")
      logLine("I am cow, I am cow")
      logLine("Hear me moo, moooo")

      os.read(oldPath).trim() ==> "Yoghurt curds cream cheese and butter\nComes from liquids from my udder"
      os.read(logPath).trim() ==> "I am cow, I am cow\nHear me moo, moooo"
    }

    test("actor"){
      class Logger(log: os.Path, old: os.Path, rotateSize: Int)
                  (implicit ac: Context) extends SimpleActor[String]{
        def run(s: String) = {
          val newLogSize = logSize + s.length + 1
          if (newLogSize <= rotateSize) logSize = newLogSize
          else {
            logSize = s.length
            os.move(log, old, replaceExisting = true)
          }
          os.write.append(log, s + "\n", createFolders = true)
        }
        private var logSize = 0
      }

      implicit val ac = new Context.Test()

      val logPath = os.pwd / "out" / "scratch" / "log.txt"
      val oldPath  = os.pwd / "out" / "scratch" / "log-old.txt"

      val logger = new Logger(logPath, oldPath, rotateSize = 50)

      logger.send("I am cow")
      logger.send("hear me moo")
      logger.send("I weight twice as much as you")
      logger.send("And I look good on the barbecue")
      logger.send("Yoghurt curds cream cheese and butter")
      logger.send("Comes from liquids from my udder")
      logger.send("I am cow, I am cow")
      logger.send("Hear me moo, moooo")

      ac.waitForInactivity()

      os.read.lines(oldPath) ==> Seq("Comes from liquids from my udder")
      os.read.lines(logPath) ==> Seq("I am cow, I am cow", "Hear me moo, moooo")
    }

    test("pipeline"){
      class Writer(log: os.Path, old: os.Path, rotateSize: Int)
                  (implicit ac: Context) extends SimpleActor[String]{
        def run(s: String) = {
          val newLogSize = logSize + s.length + 1
          if (newLogSize <= rotateSize) logSize = newLogSize
          else {
            logSize = s.length
            os.move(log, old, replaceExisting = true)
          }
          os.write.append(log, s + "\n", createFolders = true)
        }
        private var logSize = 0
      }

      class Logger(dest: Actor[String])(implicit ac: Context) extends SimpleActor[String]{
        def run(s: String) = dest.send(java.util.Base64.getEncoder.encodeToString(s.getBytes))
      }

      implicit val ac = new Context.Test()

      val logPath = os.pwd / "out" / "scratch" / "log.txt"
      val oldPath  = os.pwd / "out" / "scratch" / "log-old.txt"

      val writer = new Writer(logPath, oldPath, rotateSize = 50)
      val logger = new Logger(writer)

      logger.send("I am cow")
      logger.send("hear me moo")
      logger.send("I weight twice as much as you")
      logger.send("And I look good on the barbecue")
      logger.send("Yoghurt curds cream cheese and butter")
      logger.send("Comes from liquids from my udder")
      logger.send("I am cow, I am cow")
      logger.send("Hear me moo, moooo")

      ac.waitForInactivity()

      os.read(oldPath) ==> "Q29tZXMgZnJvbSBsaXF1aWRzIGZyb20gbXkgdWRkZXI=\n"
      os.read(logPath) ==> "SSBhbSBjb3csIEkgYW0gY293\nSGVhciBtZSBtb28sIG1vb29v\n"

      def decodeFile(p: os.Path) = {
        os.read.lines(p).map(s => new String(java.util.Base64.getDecoder.decode(s)))
      }

      decodeFile(oldPath) ==> Seq("Comes from liquids from my udder")
      decodeFile(logPath) ==> Seq("I am cow, I am cow", "Hear me moo, moooo")
    }
  }
}