def test_save_to_file(self): save_to_file(self.tmp_file, "foo") self.assertEqual("\n".join(read_from_file(self.tmp_file)), "foo") save_to_file(self.tmp_file, "\nbar", append=True, mode=600) self.assertEqual("\n".join(read_from_file(self.tmp_file)), "foo\nbar") # append doesn't modify existing perms self.assertEqual(os.stat(self.tmp_file).st_mode & 0o777, 0o644) os.unlink(self.tmp_file) save_to_file(self.tmp_file, "foo", append=True, mode=0o600) self.assertEqual(os.stat(self.tmp_file).st_mode & 0o777, 0o600)
def __getitem__(self, name): """Get full content of named log, as a byte string. This method reads (and caches) the entire uncompressed content of the log file, thus may cause memory issues if log files are expected to be large. To limit the amount of memory used at once, use the get_chunk method instead.""" name = self._get_relative_log_path(name) if name not in self.cache: # task.id is still not set. Return empty string. if self.task.id is None: return "" log_path = self._get_absolute_log_path(name) if os.path.isfile(log_path): self.cache[name] = b"\n".join( read_from_file(log_path, mode='rb')) elif os.path.isfile(log_path + ".gz"): fo = gzip.open(log_path + ".gz", "rb") self.cache[name] = fo.read() fo.close() else: self.cache[name] = "" self.changed[name] = False return self.cache[name]
def __getitem__(self, name): """Get full content of named log, as a byte string. This method reads (and caches) the entire uncompressed content of the log file, thus may cause memory issues if log files are expected to be large. To limit the amount of memory used at once, use the get_chunk method instead.""" name = self._get_relative_log_path(name) if name not in self.cache: # task.id is still not set. Return empty string. if self.task.id is None: return "" log_path = self._get_absolute_log_path(name) if os.path.isfile(log_path): self.cache[name] = b"\n".join(read_from_file(log_path, mode='rb')) elif os.path.isfile(log_path + ".gz"): fo = gzip.open(log_path + ".gz", "rb") self.cache[name] = fo.read() fo.close() else: self.cache[name] = "" self.changed[name] = False return self.cache[name]
def test_run(self): ret, out = run("echo hello") self.assertEqual(ret, 0) self.assertEqual(out, b"hello\n") ret, out = run(["echo", "'hello'"]) self.assertEqual(ret, 0) self.assertEqual(out, b"'hello'\n") ret, out = run(["echo", "\" ' "]) self.assertEqual(ret, 0) self.assertEqual(out, b"\" ' \n") # test a longer output that needs to be read in several chunks ret, out = run("echo -n '%s'; sleep 0.2; echo -n '%s'" % (10000 * "x", 10 * "a"), logfile=self.tmp_file, can_fail=True) self.assertEqual(ret, 0) self.assertEqual(out, 10000 * b"x" + 10 * b"a") # check if log file is written properly; it is supposed to append data to existing content self.assertEqual("\n".join(read_from_file(self.tmp_file)), "test" + 10000 * "x" + 10 * "a") ret, out = run("exit 1", can_fail=True) self.assertEqual(ret, 1) self.assertRaises(RuntimeError, run, "exit 1") # stdin test ret, out = run("xargs -0 echo -n", stdin_data=b"\0".join( [str(i).encode() for i in range(10000)])) self.assertEqual(out, b" ".join([str(i).encode() for i in range(10000)])) # return None ret, out = run("xargs echo", stdin_data=b"\n".join( [str(i).encode() for i in range(1000000)]), return_stdout=False) self.assertEqual(out, None) # log file with absolute path log_file = os.path.join(self.tmp_dir, "a.log") ret, out = run("echo XXX", logfile=log_file) self.assertEqual(open(log_file, "r").read(), "XXX\n") # log file with relative path log_file = "b.log" cwd = os.getcwd() os.chdir(self.tmp_dir) ret, out = run("echo XXX", logfile=log_file) self.assertEqual(open(log_file, "r").read(), "XXX\n") os.chdir(cwd) self.assertRaises(RuntimeError, run, "commanddoesnotexists") # bashism - output redirection to subshells run("echo foo | tee >(md5sum -b) >/dev/null", executable="/bin/bash")
def test_run(self): ret, out = run("echo hello") self.assertEqual(ret, 0) self.assertEqual(out, b"hello\n") ret, out = run(["echo", "'hello'"]) self.assertEqual(ret, 0) self.assertEqual(out, b"'hello'\n") ret, out = run(["echo", "\" ' "]) self.assertEqual(ret, 0) self.assertEqual(out, b"\" ' \n") # test a longer output that needs to be read in several chunks ret, out = run("echo -n '%s'; sleep 0.2; echo -n '%s'" % (10000 * "x", 10 * "a"), logfile=self.tmp_file, can_fail=True) self.assertEqual(ret, 0) self.assertEqual(out, 10000 * b"x" + 10 * b"a") # check if log file is written properly; it is supposed to append data to existing content self.assertEqual("\n".join(read_from_file(self.tmp_file)), "test" + 10000 * "x" + 10 * "a") ret, out = run("exit 1", can_fail=True) self.assertEqual(ret, 1) self.assertRaises(RuntimeError, run, "exit 1") # stdin test ret, out = run("xargs -0 echo -n", stdin_data=b"\0".join([str(i).encode() for i in range(10000)])) self.assertEqual(out, b" ".join([str(i).encode() for i in range(10000)])) # return None ret, out = run("xargs echo", stdin_data=b"\n".join([str(i).encode() for i in range(1000000)]), return_stdout=False) self.assertEqual(out, None) # log file with absolute path log_file = os.path.join(self.tmp_dir, "a.log") ret, out = run("echo XXX", logfile=log_file) self.assertEqual(open(log_file, "r").read(), "XXX\n") # log file with relative path log_file = "b.log" cwd = os.getcwd() os.chdir(self.tmp_dir) ret, out = run("echo XXX", logfile=log_file) self.assertEqual(open(log_file, "r").read(), "XXX\n") os.chdir(cwd) # bashism - output redirection to subshells # fails in default shell (/bin/sh) self.assertRaises(RuntimeError, run, "echo foo | tee >(md5sum -b) >/dev/null") # passes in bash run("echo foo | tee >(md5sum -b) >/dev/null", executable="/bin/bash")
def __getitem__(self, name): name = self._get_relative_log_path(name) if name not in self.cache: # task.id is still not set. Return empty string. if self.task.id is None: return "" log_path = self._get_absolute_log_path(name) if os.path.isfile(log_path): self.cache[name] = "\n".join(read_from_file(log_path)) elif os.path.isfile(log_path + ".gz"): fo = gzip.open(log_path + ".gz", "rb") self.cache[name] = fo.read() fo.close() else: self.cache[name] = "" self.changed[name] = False return self.cache[name]