AT_BANNER([OVSDB -- logging])

AT_SETUP([create empty, reread])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([log])
AT_CHECK(
  [test-ovsdb log-io file create], [0], 
  [file: open successful
], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read], [0], 
  [file: open successful
file: read: end of log
], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write one, reread])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}']], [0],
  [[file: open successful
file: write:{"x":0} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([check that create fails if file exists])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":1}']], [0],
  [[file: open successful
file: write:{"x":1} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read], [0], 
  [[file: open successful
file: read: {"x":1}
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file create-excl read], [1],
  [], [test-ovsdb: I/O error: file: create failed (File exists)
])
AT_CHECK(
  [test-ovsdb log-io file create read], [0],
  [file: open successful
file: read: {"x":1}
])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write one, reread])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write one, replace, commit])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
for option in '' --no-rename-open-files; do
    rm -f file
    AT_CHECK(
      [[test-ovsdb $option log-io file create \
          'write:{"x":0}' \
          'replace_start' \
          'new-write:{"x":1}' \
          'new-write:{"x":2}' \
          'old-write:{"x":4}' \
          'replace_commit' \
          'read' \
          'write:{"x":3}']], [0],
      [[file: open successful
file: write:{"x":0} successful
file: replace_start successful
(temp): write:{"x":1} successful
(temp): write:{"x":2} successful
file: write:{"x":4} successful
file: replace_commit successful
file: read: end of log
file: write:{"x":3} successful
]])
    AT_CHECK(
      [test-ovsdb log-io file read-only read read read read], [0],
      [[file: open successful
file: read: {"x":1}
file: read: {"x":2}
file: read: {"x":3}
file: read: end of log
]], [ignore])
done
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write one, replace, abort])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
for option in '' --no-rename-open-files; do
    rm -f file
    AT_CHECK(
      [[test-ovsdb $option log-io file create \
          'write:{"x":0}' \
          'replace_start' \
          'new-write:{"x":1}' \
          'new-write:{"x":2}' \
          'old-write:{"x":4}' \
          'replace_abort' \
          'read' \
          'write:{"x":3}']], [0],
      [[file: open successful
file: write:{"x":0} successful
file: replace_start successful
(temp): write:{"x":1} successful
(temp): write:{"x":2} successful
file: write:{"x":4} successful
file: replace_abort successful
file: read: end of log
file: write:{"x":3} successful
]])
    AT_CHECK(
      [test-ovsdb log-io file read-only read read read read], [0],
      [[file: open successful
file: read: {"x":0}
file: read: {"x":4}
file: read: {"x":3}
file: read: end of log
]], [ignore])
done
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write one, reread - alternative magic])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
# Sometimes you just need more magic:
# http://www.catb.org/jargon/html/magic-story.html
AT_CHECK(
  [[test-ovsdb --magic="MORE_MAGIC" log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb --magic="MORE_MAGIC" log-io file read-only read read read read], [0],
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read: end of log
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only], [1], [],
  [test-ovsdb: ovsdb error: file: cannot identify file type
])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write one, reread, append])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK(
  [[test-ovsdb log-io file read/write read read read 'write:{"append":0}']], [0],
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: write:{"append":0} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read: {"append":0}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write, reread one, overwrite])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK(
  [[test-ovsdb log-io file read/write read 'write:{"more data":0}']], [0],
  [[file: open successful
file: read: {"x":0}
file: write:{"more data":0} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"more data":0}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write, add corrupted data, read])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK([echo 'xxx' >> file])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read failed: syntax error: file: parse error at offset 186 in header line "xxx"
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write, add corrupted data, read, overwrite])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK([echo 'xxx' >> file])
AT_CHECK(
  [[test-ovsdb log-io file read/write read read read read 'write:{"x":3}']], [0],
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read failed: syntax error: file: parse error at offset 186 in header line "xxx"
file: write:{"x":3} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read: {"x":3}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write, corrupt some data, read, overwrite])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK([[sed 's/{"x":2}/{"x":3}/' < file > file.tmp]])
AT_CHECK([mv file.tmp file])
AT_CHECK([[grep -c '{"x":3}' file]], [0], [1
])
AT_CHECK(
  [[test-ovsdb log-io file read/write read read read 'write:{"longer data":0}']], [0],
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read failed: syntax error: file: 8 bytes starting at offset 178 have SHA-1 hash 2683fd63b5b9fd49df4f2aa25bf7db5cbbebbe6f but should have hash 3d8ed30f471ad1b7b4b571cb0c7d5ed3e81350aa
file: write:{"longer data":0} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"longer data":0}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write, truncate file, read, overwrite])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK([[sed 's/{"x":2}/2/' < file > file.tmp]])
AT_CHECK([mv file.tmp file])
AT_CHECK([[grep -c '^2$' file]], [0], [1
])
AT_CHECK(
  [[test-ovsdb log-io file read/write read read read 'write:{"longer data":0}']], [0],
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read failed: I/O error: file: error reading 8 bytes starting at offset 178 (End of file)
file: write:{"longer data":0} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"longer data":0}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP

AT_SETUP([write bad JSON, read, overwrite])
AT_KEYWORDS([ovsdb log])
AT_CAPTURE_FILE([file])
AT_CHECK(
  [[test-ovsdb log-io file create 'write:{"x":0}' 'write:{"x":1}' 'write:{"x":2}']], [0],
  [[file: open successful
file: write:{"x":0} successful
file: write:{"x":1} successful
file: write:{"x":2} successful
]], [ignore])
AT_CHECK([[printf '%s\n%s\n' 'OVSDB JSON 5 d910b02871075d3156ec8675dfc95b7d5d640aa6' 'null' >> file]])
AT_CHECK(
  [[test-ovsdb log-io file read/write read read read read 'write:{"replacement data":0}']], [0],
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read failed: syntax error: file: 5 bytes starting at offset 240 are not valid JSON (line 0, column 4, byte 4: syntax error at beginning of input)
file: write:{"replacement data":0} successful
]], [ignore])
AT_CHECK(
  [test-ovsdb log-io file read-only read read read read read], [0], 
  [[file: open successful
file: read: {"x":0}
file: read: {"x":1}
file: read: {"x":2}
file: read: {"replacement data":0}
file: read: end of log
]], [ignore])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP
