#!/usr/bin/python
"""Fake loguploader for unit tests.

"""

import BaseHTTPServer
import cgi
import socket
import subprocess
import sys
import zlib


g = {}


class LogHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def do_GET(self):
    self.send_response(200)
    self.send_header('Content-type','text/plain')
    self.end_headers()
    self.wfile.write(g['url'])

  def do_POST(self):
    form = cgi.FieldStorage(
        fp=self.rfile,
        headers=self.headers,
        environ={'REQUEST_METHOD': 'POST',
            'CONTENT_TYPE': self.headers['Content-Type'],
        })
    post_data = form['file'].file.read()
    g['post_body'] = zlib.decompress(post_data)
    self.send_response(302)
    self.end_headers()


def upload_logs(text):
  s = BaseHTTPServer.HTTPServer(('localhost', 0), LogHandler)
  sn = s.socket.getsockname()
  port = sn[1]
  g['url'] = url = 'http://127.0.0.1:%d/' % port

  up = subprocess.Popen(['./upload-logs', '--consensus_key=ABCDEFG',
      '--server=' + url, '--stdin=dmesg'], bufsize=8192,
      stdin=subprocess.PIPE)
  up.stdin.write(text)
  up.stdin.close()
  s.handle_request()
  s.handle_request()
  s.server_close()
  up.wait()
  return g['post_body']


def main():
  assert('00:11:22:33:44:55' not in upload_logs('foo 00:11:22:33:44:55 bar'))
  assert('00-11-22-33-44-55' not in upload_logs('foo 00-11-22-33-44-55'))
  assert('00_11_22_33_44_55' not in upload_logs('00_11_22_33_44_55 bar'))
  assert('00_11_22_33_44_55' not in upload_logs('00_11_22_33_44_55 foo\n'))
  assert(upload_logs('00:11:22:33:44:55') == 'XOMWAQ')
  assert(upload_logs('00-11-22-33-44-55') == 'XOMWAQ')
  assert(upload_logs('00_11_22_33_44_55') == 'XOMWAQ')
  assert('not_a_mac_address' in upload_logs('not_a_mac_address'))


if __name__ == '__main__':
  main()
