def test_collector_submit(live_server, tmpdir, fm_user, monkeypatch): '''Test crash submission''' monkeypatch.setattr( os.path, 'expanduser', lambda path: tmpdir.strpath) # ensure fuzzmanager config is not used monkeypatch.setattr(time, 'sleep', lambda t: None) # create a collector url = urlsplit(live_server.url) collector = Collector(sigCacheDir=tmpdir.mkdir('sigcache').strpath, serverHost=url.hostname, serverPort=url.port, serverProtocol=url.scheme, serverAuthToken=fm_user.token, clientId='test-fuzzer1', tool='test-tool') testcase_path = tmpdir.mkdir('testcase').join('testcase.js').strpath with open(testcase_path, 'wb') as testcase_fp: testcase_fp.write(exampleTestCase) config = ProgramConfiguration('mozilla-central', 'x86-64', 'linux', version='ba0bc4f26681') crashInfo = CrashInfo.fromRawCrashData([], asanTraceCrash.splitlines(), config) # submit a crash to test server using collector result = collector.submit(crashInfo, testcase_path) # see that the issue was created in the server entry = CrashEntry.objects.get(pk=result['id']) assert entry.rawStdout == '' assert entry.rawStderr == asanTraceCrash assert entry.rawCrashData == '' assert entry.tool.name == 'test-tool' assert entry.client.name == 'test-fuzzer1' assert entry.product.name == config.product assert entry.product.version == config.version assert entry.platform.name == config.platform assert entry.os.name == config.os assert entry.testcase.quality == 0 assert not entry.testcase.isBinary assert entry.testcase.size == len(exampleTestCase) with open(entry.testcase.test.path, 'rb') as testcase_fp: assert testcase_fp.read() == exampleTestCase assert entry.metadata == '' assert entry.env == '' assert entry.args == '' # create a test config with open(tmpdir.join('.fuzzmanagerconf').strpath, 'w') as fp: fp.write('[Main]\n') fp.write('serverhost = %s\n' % url.hostname) fp.write('serverport = %d\n' % url.port) fp.write('serverproto = %s\n' % url.scheme) fp.write('serverauthtoken = %s\n' % fm_user.token) # try a binary testcase via cmd line testcase_path = tmpdir.join('testcase.bin').strpath with open(testcase_path, 'wb') as testcase_fp: testcase_fp.write(b'\0') stdout = tmpdir.join('stdout.txt').strpath with open(stdout, 'w') as fp: fp.write('stdout data') stderr = tmpdir.join('stderr.txt').strpath with open(stderr, 'w') as fp: fp.write('stderr data') crashdata = tmpdir.join('crashdata.txt').strpath with open(crashdata, 'w') as fp: fp.write(asanTraceCrash) result = main([ '--submit', '--tool', 'tool2', '--product', 'mozilla-inbound', '--productversion', '12345', '--os', 'minix', '--platform', 'pdp11', '--env', 'PATH=/home/ken', 'LD_PRELOAD=hack.so', '--metadata', 'var1=val1', 'var2=val2', '--args', './myprog', '--testcase', testcase_path, '--testcasequality', '5', '--stdout', stdout, '--stderr', stderr, '--crashdata', crashdata, ]) assert result == 0 entry = CrashEntry.objects.get( pk__gt=entry.id ) # newer than the last result, will fail if the test db is active assert entry.rawStdout == 'stdout data' assert entry.rawStderr == 'stderr data' assert entry.rawCrashData == asanTraceCrash assert entry.tool.name == 'tool2' assert entry.client.name == platform.node() assert entry.product.name == 'mozilla-inbound' assert entry.product.version == '12345' assert entry.platform.name == 'pdp11' assert entry.os.name == 'minix' assert entry.testcase.quality == 5 assert entry.testcase.isBinary assert entry.testcase.size == 1 with open(entry.testcase.test.path, 'rb') as testcase_fp: assert testcase_fp.read() == b'\0' assert json.loads(entry.metadata) == {'var1': 'val1', 'var2': 'val2'} assert json.loads(entry.env) == { 'PATH': '/home/ken', 'LD_PRELOAD': 'hack.so' } assert json.loads(entry.args) == ['./myprog'] class response_t(object): status_code = 500 text = "Error" def mypost(_session, _url, _data, headers=None): return response_t() monkeypatch.setattr(time, 'sleep', lambda t: None) monkeypatch.setattr(requests.Session, 'post', mypost) with pytest.raises(RuntimeError, match='Server unexpectedly responded'): collector.submit(crashInfo, testcase_path)
def test_collector_submit(live_server, tmpdir, fm_user, monkeypatch): '''Test crash submission''' monkeypatch.setattr(os.path, 'expanduser', lambda path: tmpdir.strpath) # ensure fuzzmanager config is not used monkeypatch.setattr(time, 'sleep', lambda t: None) # create a collector url = urlsplit(live_server.url) collector = Collector(sigCacheDir=tmpdir.mkdir('sigcache').strpath, serverHost=url.hostname, serverPort=url.port, serverProtocol=url.scheme, serverAuthToken=fm_user.token, clientId='test-fuzzer1', tool='test-tool') testcase_path = tmpdir.mkdir('testcase').join('testcase.js').strpath with open(testcase_path, 'wb') as testcase_fp: testcase_fp.write(exampleTestCase) config = ProgramConfiguration('mozilla-central', 'x86-64', 'linux', version='ba0bc4f26681') crashInfo = CrashInfo.fromRawCrashData([], asanTraceCrash.splitlines(), config) # submit a crash to test server using collector result = collector.submit(crashInfo, testcase_path) # see that the issue was created in the server entry = CrashEntry.objects.get(pk=result['id']) assert entry.rawStdout == '' assert entry.rawStderr == asanTraceCrash assert entry.rawCrashData == '' assert entry.tool.name == 'test-tool' assert entry.client.name == 'test-fuzzer1' assert entry.product.name == config.product assert entry.product.version == config.version assert entry.platform.name == config.platform assert entry.os.name == config.os assert entry.testcase.quality == 0 assert not entry.testcase.isBinary assert entry.testcase.size == len(exampleTestCase) with open(entry.testcase.test.path, 'rb') as testcase_fp: assert testcase_fp.read() == exampleTestCase assert entry.metadata == '' assert entry.env == '' assert entry.args == '' # create a test config with open(tmpdir.join('.fuzzmanagerconf').strpath, 'w') as fp: fp.write('[Main]\n') fp.write('serverhost = %s\n' % url.hostname) fp.write('serverport = %d\n' % url.port) fp.write('serverproto = %s\n' % url.scheme) fp.write('serverauthtoken = %s\n' % fm_user.token) # try a binary testcase via cmd line testcase_path = tmpdir.join('testcase.bin').strpath with open(testcase_path, 'wb') as testcase_fp: testcase_fp.write(b'\0') stdout = tmpdir.join('stdout.txt').strpath with open(stdout, 'w') as fp: fp.write('stdout data') stderr = tmpdir.join('stderr.txt').strpath with open(stderr, 'w') as fp: fp.write('stderr data') crashdata = tmpdir.join('crashdata.txt').strpath with open(crashdata, 'w') as fp: fp.write(asanTraceCrash) result = main([ '--submit', '--tool', 'tool2', '--product', 'mozilla-inbound', '--productversion', '12345', '--os', 'minix', '--platform', 'pdp11', '--env', 'PATH=/home/ken', 'LD_PRELOAD=hack.so', '--metadata', 'var1=val1', 'var2=val2', '--args', './myprog', '--testcase', testcase_path, '--testcasequality', '5', '--stdout', stdout, '--stderr', stderr, '--crashdata', crashdata, ]) assert result == 0 entry = CrashEntry.objects.get(pk__gt=entry.id) # newer than the last result, will fail if the test db is active assert entry.rawStdout == 'stdout data' assert entry.rawStderr == 'stderr data' assert entry.rawCrashData == asanTraceCrash assert entry.tool.name == 'tool2' assert entry.client.name == platform.node() assert entry.product.name == 'mozilla-inbound' assert entry.product.version == '12345' assert entry.platform.name == 'pdp11' assert entry.os.name == 'minix' assert entry.testcase.quality == 5 assert entry.testcase.isBinary assert entry.testcase.size == 1 with open(entry.testcase.test.path, 'rb') as testcase_fp: assert testcase_fp.read() == b'\0' assert json.loads(entry.metadata) == {'var1': 'val1', 'var2': 'val2'} assert json.loads(entry.env) == {'PATH': '/home/ken', 'LD_PRELOAD': 'hack.so'} assert json.loads(entry.args) == ['./myprog'] class response_t(object): status_code = 500 text = "Error" def mypost(_session, _url, _data, headers=None): return response_t() monkeypatch.setattr(time, 'sleep', lambda t: None) monkeypatch.setattr(requests.Session, 'post', mypost) with pytest.raises(RuntimeError, match='Server unexpectedly responded'): collector.submit(crashInfo, testcase_path)
def test_collector_help(capsys): '''Test that help prints without throwing''' with pytest.raises(SystemExit): main() _, err = capsys.readouterr() assert err.startswith('usage: ')